Social publishing API
One API. Every platform answers separately.
Send a neutral post and a list of destinations. The relay adapts it to each platform's rules — truncation, media limits, required fields — publishes asynchronously, and reports every delivery on its own. A post is never one outcome, and this API never pretends it is.
No card to start. The console, API keys and delivery history are on every tier, free included.
Publishing, in one request
curl -X POST https://api.relay.rutba.io/v1/posts \
-H "Authorization: Bearer $RUTBA_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "content-type: application/json" \
-d '{
"content": { "text": "We shipped it." },
"platforms": ["bluesky", "mastodon", "telegram"]
}'202 with a post id and one delivery per destination. Full reference
What it actually does
The hard parts of publishing, handled once.
Every one of these is a thing you would otherwise write, per platform, and then maintain as each platform changes its mind.
You see what each platform gets
Preview runs the same projection the publisher runs, against your real connections. If the preview says Bluesky truncates at 300, that is because Bluesky will.
A retry cannot double-post
Send an idempotency key and a repeat returns the original response. Deliveries are per destination, so retrying Reddit does not repost to the eight platforms that already took it.
Failures say which kind they are
A refused post and a failed one are different states with different answers. One is worth retrying; the other needs the content changed, and the API says which.
Scheduling that survives a restart
Queue a post days or months ahead. The schedule lives in the relay, not in a cron job on a machine you have to keep alive.
Connections you do not have to rebuild
Each platform is authorised once in the console, in a browser, because that is the only way OAuth works. After that your systems only ever talk to one API.
Deliveries you can watch
Webhooks per delivery, or read them back on demand. The history is per destination and it keeps, so "did it go out?" has an answer months later.
How it works
Four steps, and only the last two ever repeat
Connect the accounts
Authorise each platform once in the console. OAuth needs a browser; nothing else here does.
Mint an API key
One key for your systems. Scoped, revocable, and visible in the console alongside what it has published.
POST a post
Neutral content plus a list of destinations. The relay does the per-platform adaptation.
Read the deliveries
One result per destination, by webhook or on demand. Retry the ones that failed, individually.
Questions
Frequently asked
Do I need the dashboard, or can I use only the API?
Only the API, for publishing. You do need the console once per platform to authorise the connection, because a social account cannot be authorised without a browser — that is the platform’s rule, not ours. After that your systems talk to the API and nothing else.
What happens when a platform rejects a post?
That delivery fails and the others do not. You get a result per destination saying whether it was refused (the content breaks a rule, so retrying changes nothing) or failed (something transient, so retrying is worth it). Retries are per destination, so nothing that already published publishes twice.
Why are some platforms listed as unavailable?
Because they are. Several platforms require their own review of any app that posts on a user’s behalf, and some have no public write API at all. The catalogue lists every one with its real status rather than showing a wall of logos and letting you find out later.
Is scheduling included, or an upsell?
Included, on every tier. So are API keys, connection management and delivery history. The plans differ on volume — deliveries a month, connections, requests a minute — not on whether the product works.
Can I bring my own platform app credentials?
On the higher tiers, yes. It matters if you are publishing at volume under your own brand, or if a platform has approved your app rather than ours. The pricing page lists which tiers include it, read live from the API that enforces it.
Publish to everything from one request.
Start on the free tier, connect an account, and post to it in about ten minutes.