Your posts,from your own code.
One key. Every network you connect.
Schedule, publish and follow posts from your shop, your app or the tools you already run. Plain HTTP and JSON, on the same rules and limits as everything else in Spica Post.



Three requests to a scheduled post.
Connect your accounts once on your account page. After that, your code does the rest: write the post, check it, pick the time.
Make a key
On your account page, under API keys. It is shown once; keep it as you would a password.
Authorization: Bearer sp_live_…Write the post
One version per account, each with its own words and pictures. Nothing goes out yet.
POST /v1/drafts { "title": "Fresh bread", "variants": [{ "accountId": "…", "text": "Fresh bread from 7am.", "mediaIds": ["…"] }] }Pick the time
Send it now, at a time, or into your next free slot. Repeating a request never posts twice. Or write and send in one go with POST /v1/posts.
POST /v1/drafts/{id}/schedule { "version": 1, "idempotencyKey": "b1f0…", "scheduledAt": "2026-11-06T14:00:00Z" }
Hear it the moment it happens.
Add an address of yours and Spica Post tells it at once, so your shop, your sheet or your team chat knows without asking.
post.published- A post went out, with its link.
post.failed- It did not, and why, in plain words.
post.needs_check- The network gave no clear answer yet.
post.cancelled- Someone took it off the schedule.
account.needs_reconnect- An account must be connected again.
Your server is down? Each event is tried again by itself, 8 times over a day, and your account page shows what reached you.
POST https://yourshop.com/hooks/spica
Spica-Event: post.published
Spica-Signature: t=1792641600,v1=5f2c…
{
"type": "post.published",
"data": { "delivery": {
"network": "instagram",
"state": "published",
"url": "https://www.instagram.com/p/…"
} }
}Check it came from us
hmac_sha256(secret, t + "." + body) == v1Every request is signed with a secret only you and Spica Post hold.
Everything your assistant can do, your code can too.
34 routes. Each one does exactly what the matching assistant tool does, so a post made either way follows the same rules. Every field is in the reference. Read the reference
Accounts
GET /v1/accountsGET /v1/accounts/connect-linksGET /v1/accounts/{accountId}/recent-postsDELETE /v1/accounts/{id}GET /v1/capabilities
Media
GET /v1/mediaPOST /v1/mediaPOST /v1/media/from-urlDELETE /v1/media/{id}
Drafts
GET /v1/draftsPOST /v1/draftsGET /v1/drafts/{id}PATCH /v1/drafts/{id}DELETE /v1/drafts/{id}POST /v1/drafts/{id}/validatePOST /v1/check
Publishing
POST /v1/postsPOST /v1/drafts/{id}/publishPOST /v1/drafts/{id}/schedulePOST /v1/drafts/{id}/queueGET /v1/queuePUT /v1/queueGET /v1/jobsGET /v1/jobs/{id}POST /v1/jobs/{id}/cancelPOST /v1/jobs/{id}/reschedule
Results
GET /v1/results
Plan
GET /v1/usage
Webhooks
GET /v1/webhooksPOST /v1/webhooksPATCH /v1/webhooks/{id}DELETE /v1/webhooks/{id}POST /v1/webhooks/{id}/testGET /v1/webhooks/{id}/events
The limits, plainly
- Every paid planThe API comes with Starter, Studio and Pro.
- 120 a minuteRequests each key may make.
- 5 keysOne for each app; revoke any of them at once.
- 5 webhooksAddresses that hear about your posts.
Answers
Is this the same as connecting my assistant?
No. Your assistant connects with one link and a sign-in, and needs no key. A key is for software you or your developer write.
Do I need my own developer accounts with the networks?
No. You connect your accounts on your account page, the same as always. Your key only reaches your own Spica Post account.
What happens if a post fails?
The answer says why in a sentence, and a webhook tells your address at once. Repeating a request with the same idempotency key never posts twice.
Where is the full list of fields?
In the API reference, a standard OpenAPI document that tools like Postman and most code generators read as it is.
Your first post, from your own code, today.
Prefer to ask? Your assistant can do all of this with one link and no key.


