Rutba Social Relay

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

1

Connect the accounts

Authorise each platform once in the console. OAuth needs a browser; nothing else here does.

2

Mint an API key

One key for your systems. Scoped, revocable, and visible in the console alongside what it has published.

3

POST a post

Neutral content plus a list of destinations. The relay does the per-platform adaptation.

4

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.