Schedule a post with one field
Send the same body you would publish now, add a scheduleAt timestamp, and FoPost holds it in the queue until then. Everything stays editable until the moment it goes out, and delivery is reported per account.
curl -X POST https://api.fopost.com/v1/posts \
-H "X-API-Key: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"workspaceId": "9b2f6c1e-...",
"status": "scheduled",
"scheduleAt": "2026-09-01T09:00:00Z",
"content": [{ "text": "Webhook retries are live. Read the changelog.", "position": 0 }],
"accounts": [{ "id": "4a71d80b-..." }, { "id": "c30e9f12-..." }]
}'One timestamp
Any ISO 8601 time in the future. The queue picks it up and publishes on schedule.
Editable until sent
PATCH the text, media, accounts, or time on anything still in the queue.
Delivery per account
Once it goes out, each account reports its own status and permalink.
Plan a week of posts in one script
Loop over your content, pick a time for each item, and create the posts. The queue runs in FoPost, so your own process can exit as soon as the request returns. List scheduled posts any time to see what is coming up.
Read the posts referencecurl "https://api.fopost.com/v1/posts?workspaceId=9b2f6c1e-...&status=scheduled" \
-H "X-API-Key: $API_KEY"
{
"data": [
{ "id": "post_01j8...", "status": "scheduled", "scheduleAt": "2026-09-01T09:00:00Z", "accounts": 2 },
{ "id": "post_01j9...", "status": "scheduled", "scheduleAt": "2026-09-02T09:00:00Z", "accounts": 3 }
]
}Filter by status
List drafts, scheduled, published, or failed posts with one query parameter.
Labels
Tag each post by campaign and filter the queue by label.
Per workspace
A key sees one workspace, so one client’s queue never mixes with another.
Move, rewrite, or cancel before it goes out
Plans change. PATCH a scheduled post to change its time, text, media, or target accounts. Cancel it and it is marked cancelled and never delivered, or delete it outright. Nothing is locked until the queue picks it up.
See the PATCH endpointcurl -X PATCH https://api.fopost.com/v1/posts/post_01j8... \
-H "X-API-Key: $API_KEY" \
-H "Content-Type: application/json" \
-d '{ "scheduleAt": "2026-09-01T14:00:00Z" }'Reschedule
Change scheduleAt and the queue moves the post to the new time.
Swap content
Replace the content array or the media ids on a post in the queue.
Cancel or delete
Pull a post from the queue without touching anything else in it.
Know when it landed, without polling
When the scheduled time arrives, the post fans out into one delivery per account. Register a webhook and post.published or post.failed fires for each one, or poll the deliveries endpoint if you prefer a pull model.
Start building
Webhook on settle
post.published and post.failed carry the post id, account, and permalink.
Retries
Transient network errors retry with backoff before a failure is reported.
Analytics after
Once live, the same post id reads back impressions and engagement from the Analytics API.
Scheduling API questions, answered
How far ahead can I schedule?
What timezone does scheduleAt use?
Can I edit a post after scheduling it?
What happens if my server is down at publish time?
Can I schedule to a subset of accounts?
Is there a rate limit?
Build on the Scheduling API today
Starting is free and the full API is included. Create a key and make your first call in minutes.
Get your API key