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.
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.
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))
doneYou can also send your own request_id (8–100 letters, digits, - or _) and poll it later even if the response never arrived.
04