Skip to content
reelspanDocs

After you post

Queue

Give each profile a posting schedule of days and times, then add posts with add_to_queue and they take the next free slot. Preview slots and block busy ones.

GETapi.reelspan.com/v1/queue/settingsTry it →

The queue saves you picking a time for every post. Each profile has a weekly schedule of slots; a post sent with add_to_queue=true takes the first slot that still has room.

Add a post to the queue

Send any post with add_to_queue=true instead of a scheduled_date:

curl -X POST https://api.reelspan.com/v1/posts/video \
  -H "Authorization: Bearer $REELSPAN_API_KEY" \
  -F "user=my-brand" \
  -F "platform[]=tiktok" \
  -F "platform[]=instagram" \
  -F "title=Behind the scenes" \
  -F "add_to_queue=true" \
  -F "[email protected]"
{
  "success": true,
  "job_id": "sched_7a2c9e4b1d6f40a8c3e5b9d2",
  "request_id": "6e3b9d1f7a2c4e8b0d5f3a1c9e7b2d4f",
  "scheduled_date": "2026-12-01T12:00:00.000Z",
  "queue_slot": "2026-12-01T12:00:00.000Z",
  "message": "Post added to queue"
}

The answer is 202, and from then on it is an ordinary scheduled post: edit or cancel it by job_id. Giving it a scheduled_date later takes it out of the queue.

  • add_to_queue and scheduled_date can't be used together (400).
  • max_posts_per_slot on the post overrides the profile's setting for this one post (1 to 100).
  • The queue looks 30 days ahead. With no free slot in that time the answer is 400 QUEUE_FULL.
  • Two posts sent at once never take the same last place in a slot.

The schedule

Until you set one, every profile has this schedule:

{
  "timezone": "America/New_York",
  "slots": [{ "hour": 9, "minute": 0 }, { "hour": 12, "minute": 0 }, { "hour": 17, "minute": 0 }],
  "days_of_week": [0, 1, 2, 3, 4, 5, 6],
  "max_posts_per_slot": 1,
  "full_slots": []
}
Setting What it is
timezone The IANA zone the slots are in.
slots Up to 24 times of day, as hour (0 to 23) and minute (0 to 59).
days_of_week The days the slots run, 0 = Monday to 6 = Sunday.
max_posts_per_slot How many posts one slot holds, 1 to 100.
full_slots Slots you marked full by hand (see below).

Read it with GET /v1/queue/settings?profile_username=my-brand. Change it with POST /v1/queue/settings; send only what changes, and the rest stays:

curl -X POST https://api.reelspan.com/v1/queue/settings \
  -H "Authorization: Bearer $REELSPAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "profile_username": "my-brand",
    "timezone": "Europe/London",
    "slots": [{ "hour": 8, "minute": 30 }, { "hour": 18, "minute": 0 }],
    "days_of_week": [0, 1, 2, 3, 4]
  }'

Duplicate slots are dropped and the list is sorted. Posts already in the queue keep their times when the schedule changes.

How full is each slot

GET /v1/queue/preview lists the next slots (10 by default, count up to 50) and how many posts each holds:

curl "https://api.reelspan.com/v1/queue/preview?profile_username=my-brand&count=3" \
  -H "Authorization: Bearer $REELSPAN_API_KEY"
{
  "success": true,
  "timezone": "Europe/London",
  "max_posts_per_slot": 1,
  "slots": [
    { "datetime_utc": "2026-12-01T08:30:00.000Z", "datetime_local": "2026-12-01T08:30:00", "available": false, "post_count": 1, "max_posts_per_slot": 1, "is_full": true, "manually_full": false },
    { "datetime_utc": "2026-12-01T18:00:00.000Z", "datetime_local": "2026-12-01T18:00:00", "available": true, "post_count": 0, "max_posts_per_slot": 1, "is_full": false, "manually_full": false },
    { "datetime_utc": "2026-12-02T08:30:00.000Z", "datetime_local": "2026-12-02T08:30:00", "available": true, "post_count": 0, "max_posts_per_slot": 1, "is_full": false, "manually_full": false }
  ],
  "next_available": "2026-12-01T18:00:00.000Z"
}

post_count counts every post of the profile scheduled for exactly that time, queued or not. A slot less than a minute away isn't offered.

For just the next free slot, GET /v1/queue/next-slot answers { "next_slot": { "datetime_utc", "datetime_local", "timezone" } }, or "next_slot": null when nothing is free in the next 30 days.

Keep a slot free

Mark a slot full and the queue skips it, for example to keep a launch slot for one hand-picked post. slot_datetime is the slot's time with an offset, as datetime_utc shows it:

curl -X POST https://api.reelspan.com/v1/queue/slot-full \
  -H "Authorization: Bearer $REELSPAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"profile_username": "my-brand", "slot_datetime": "2026-12-01T18:00:00Z"}'

Both answer with full_slots, the slots now marked. DELETE /v1/queue/slot-full with the same body opens a slot again. Past slots drop off the list on their own.

Keys and scopes

Reading the queue needs the read scope; changing the schedule or marking slots needs profiles; adding a post needs publish.

GETapi.reelspan.com/v1/queue/settingsTry it →

Parameters

  • profile_usernamestring · queryrequired

Responses

200 Settings

{
  "success": true,
  "queue_settings": {}
}

400 Invalid input

{
  "success": false,
  "message": "string",
  "error": "string",
  "error_code": "string"
}

404 Not found

{
  "success": false,
  "message": "string",
  "error": "string",
  "error_code": "string"
}
POSTapi.reelspan.com/v1/queue/settingsTry it →

Request body

application/json

  • profile_usernamestringrequired
  • timezonestring
  • slotsobject[]
    • hourintegerrequired
    • minuteintegerrequired
  • days_of_weekinteger[]

    0 = Monday

  • max_posts_per_slotinteger

Responses

200 Saved

{
  "success": true,
  "queue_settings": {}
}

400 Invalid input

{
  "success": false,
  "message": "string",
  "error": "string",
  "error_code": "string"
}

404 Not found

{
  "success": false,
  "message": "string",
  "error": "string",
  "error_code": "string"
}
GETapi.reelspan.com/v1/queue/previewTry it →

Parameters

  • profile_usernamestring · queryrequired
  • countinteger · query

Responses

200 Slots

{}

400 Invalid input

{
  "success": false,
  "message": "string",
  "error": "string",
  "error_code": "string"
}

404 Not found

{
  "success": false,
  "message": "string",
  "error": "string",
  "error_code": "string"
}
GETapi.reelspan.com/v1/queue/next-slotTry it →

Parameters

  • profile_usernamestring · queryrequired

Responses

200 Next slot

{}

400 Invalid input

{
  "success": false,
  "message": "string",
  "error": "string",
  "error_code": "string"
}

404 Not found

{
  "success": false,
  "message": "string",
  "error": "string",
  "error_code": "string"
}
POSTapi.reelspan.com/v1/queue/slot-fullTry it →

Request body

application/json

  • profile_usernamestringrequired
  • slot_datetimestringrequired

Responses

200 Updated

{}

400 Invalid input

{
  "success": false,
  "message": "string",
  "error": "string",
  "error_code": "string"
}

404 Not found

{
  "success": false,
  "message": "string",
  "error": "string",
  "error_code": "string"
}
DELETEapi.reelspan.com/v1/queue/slot-fullTry it →

Request body

application/json

  • profile_usernamestringrequired
  • slot_datetimestringrequired

Responses

200 Updated

{}

400 Invalid input

{
  "success": false,
  "message": "string",
  "error": "string",
  "error_code": "string"
}

404 Not found

{
  "success": false,
  "message": "string",
  "error": "string",
  "error_code": "string"
}

Something unclear or missing? Write to [email protected] and we’ll fix the page.