History has one row per network post: a video sent to three networks is three rows. Use it to build a "recent posts" view, to find failures, or to look up a post by your own id.
List recent posts
curl "https://api.reelspan.com/v1/posts?profile_username=my-brand&limit=20" \
-H "Authorization: Bearer $REELSPAN_API_KEY"import { Reelspan } from 'reelspan';
const reelspan = new Reelspan();
const page = await reelspan.posts.history({ profile_username: 'my-brand', limit: 20 });from reelspan import Reelspan
reelspan = Reelspan()
page = reelspan.posts.history(profile_username="my-brand", limit=20){
"history": [
{
"profile_username": "my-brand",
"platform": "youtube",
"media_type": "video",
"upload_timestamp": "2026-12-01T09:01:12.000Z",
"success": true,
"status": "completed",
"platform_post_id": "aB3…",
"post_url": "https://youtube.com/shorts/aB3…",
"error_message": null,
"post_title": "Launch day",
"post_caption": "Launch day, in 60 seconds",
"is_async": false,
"request_id": "9b1f6c2e8a3d4f50b7e1c9a2d6f3e8b1",
"job_id": null,
"external_id": "campaign-42",
"request_total_platforms": 3,
"post_id_resolved_late": false,
"video_was_transcoded": false
}
],
"in_progress": [],
"total": 57,
"page": 1,
"limit": 20
}What a row holds
statusiscompleted,failedorskipped;successistrueonly forcompleted.media_typeisvideo,photo,textordocument.upload_timestampis when that network finished.post_titleis the post'stitle;post_captionis the text this network got (its{network}_title, elsetitle).is_asyncistruefor posts that were scheduled, queued or sent withasync_upload.request_id,job_idandexternal_idtie the row to the post. Passrequest_idto Post status or Retry.post_id_resolved_lateandvideo_was_transcodedare kept for Upload-Post compatibility and arefalse.
history holds finished network posts only. Networks still working are listed separately under in_progress, with the same fields: up to 100 of them, from posts made in the last 24 hours. The filters below don't apply to in_progress. Scheduled posts that haven't run yet are in Scheduled posts instead.
Filters
| Parameter | What it does |
|---|---|
platform |
One network, like tiktok. |
status |
success for live posts; failed for failed and skipped ones (cancelled scheduled posts show here as skipped). |
profile_username |
One profile. profile works too. |
request_id, job_id, external_id |
Exact match: every network of that post. |
start, end |
A time range on when each network post last changed (normally when it finished). Send both, as dates (2026-12-01) or date-times with an offset (2026-12-01T00:00:00Z). end is not included, and the range can be at most 2 months. |
Find every network of one post sent with your own id:
curl "https://api.reelspan.com/v1/posts?external_id=campaign-42" \
-H "Authorization: Bearer $REELSPAN_API_KEY"Wrong filters get 400: an unknown status, a limit other than the allowed values, only one of start and end, or a range that is backwards or longer than 2 months.
Pages
Rows come newest first, by when each network post last changed. page starts at 1 and limit is 10 (the default), 20, 50 or 100. There are more pages while page × limit is less than total.
The SDKs walk every page for you:
for await (const row of reelspan.posts.all({ platform: 'tiktok', status: 'failed' })) {
console.log(row.request_id, row.error_message);
}for row in reelspan.posts.all(platform="tiktok", status="failed"):
print(row["request_id"], row["error_message"])A key limited to some profiles only sees their posts.