ReelspanDocsRate limits

Rate limits

Limits are per workspace, the same for every key in it. Every response tells you where you stand, so a client never has to guess.
4 sections

01

Limits by plan

Requests are counted in two windows, a minute and ten minutes; the tighter one applies. Uploads count one per platform: one video to three platforms is three uploads.

Free
60 requests a minute, 300 per 10 minutes · 15 uploads a month · files up to 0.5 GB · 5,000 scheduled posts waiting
Starter
60 requests a minute, 300 per 10 minutes · unlimited uploads · files up to 1 GB · 20,000 scheduled posts waiting
Pro
100 requests a minute, 500 per 10 minutes · unlimited uploads · files up to 2 GB · 30,000 scheduled posts waiting
Agency
200 requests a minute, 1000 per 10 minutes · unlimited uploads · files up to 4 GB · 40,000 scheduled posts waiting
Scale
500 requests a minute, 2500 per 10 minutes · unlimited uploads · files up to 8 GB · 50,000 scheduled posts waiting

Monthly upload limits reset on the 1st (UTC). An upload over the limit answers 429 with your usage; upgrading applies the new limits at once.

02

Headers

Every call made with an API key carries:

X-RateLimit-Limit
Requests allowed in the tightest window.
X-RateLimit-Remaining
How many are left in it.
X-RateLimit-Reset
Unix seconds when it resets.
Retry-After
On a 429: seconds to wait before trying again.
429
HTTP/1.1 429 Too Many Requests
Retry-After: 23

{ "success": false, "message": "Rate limit exceeded", "error_code": "RATE_LIMITED" }

03

Retrying safely

A network error can hide whether a post went out. Send an Idempotency-Key header (any unique string up to 200 characters) on uploads, and retry with the same key: Reelspan never posts twice.

Same key within 24 hours
The first response comes back again, with the header Idempotent-Replayed: true and idempotent_replay: true in the body.
First request still running
409 IDEMPOTENCY_KEY_IN_USE; wait and retry.
Different post kind
Keys are separate for video, photo and text posts.
Retry with backoff
for attempt in 1 2 3 4 5; do
  status=$(curl -s -o out.json -w "%{http_code}" -X POST "$API/upload" \
    -H "Authorization: Apikey $REELSPAN_KEY" \
    -H "Idempotency-Key: launch-video-2026-11-07" \
    -F "user=my-brand" -F "platform[]=tiktok" -F "title=Launch" -F "[email protected]")
  [ "$status" != "429" ] && [ "$status" -lt 500 ] && break
  sleep $((2 ** attempt))
done

You can also send your own request_id (8–100 letters, digits, - or _) and poll it later even if the response never arrived.

04

Next steps

Questions?Talk to a person.Contact us