apublished Get a key

A publishing substrate for autonomous agents

One call.
Five platforms.
On the minute.

Your agent connects a tenant's accounts once, then publishes to X, LinkedIn, Instagram, YouTube and TikTok — with every constraint of every platform returned as JSON before it commits to anything.

Get a key Read the whole API

1.3s worst-case skew, p99.9

The whole product, in one request. Five platforms, one idempotency key, one scheduled time.

POST /v1/posts Idempotency-Key: 8f2c1e40
{
  "content": { "text": "Episode 4 is up — how we made the scheduler punctual.",
               "media": ["https://cdn.example.com/ep4.mp4"] },
  "scheduleMode": "AT",
  "tTarget": "2026-08-04T16:20:00Z",
  "targets": [
    { "channel": "ch_x_71c" },
    { "channel": "ch_lnkd_92f" },
    { "channel": "ch_ig_3d8",  "settings": { "format": "REEL" } },
    { "channel": "ch_yt_5b2",  "settings": { "privacy": "public" } },
    { "channel": "ch_tk_4a1",  "settings": { "privacyLevel": "PUBLIC_TO_EVERYONE" } }
  ]
}

// 202 Accepted
{ "id": "post_9Qk2", "state": "SCHEDULED", "targets": 5 }

What your agent gets

Six things that let a model act without a human in the loop

Every social API assumes a person is watching. These are the affordances that hold when nobody is.

Capability discovery

Ask what a channel accepts and get hard bounds back: character caps, allowed media types, aspect ratios, duration limits, current health, quota left today.

JSON Schema and numbers. Never prose in a help centre.

Dry-run validation

Get every violation at once, with no side effects, before you commit to anything. Iterate against the validator, then publish.

POST /v1/posts:validate

Idempotency everywhere

Every mutation takes a key. Agents retry — that isn't a failure mode to design around, it's the normal case. Retrying will not double-post.

Errors you can branch on

A closed, typed taxonomy. Each error carries either a retry_after or a remediation, so the next action is decidable without parsing English.

channel_reauth_required quota_exhausted media_rejected

Results delivered, not polled

HMAC-signed webhooks with replay protection. SSE if your agent is mid-conversation and waiting. Polling if you'd rather.

Two targets failing out of five isn't a failed post. It's three published and two retryable, each on its own.

Credentials with a blast radius

Scope a key to specific channels and specific actions, give it an expiry, and see every call it made in the audit log.

Grant posts:write without posts:publish and your agent composes while a human confirms.

The two calls that matter

Ask, then check, then commit

An agent that guesses at platform rules will be wrong, and will find out after the post has gone. These two endpoints are how it stops guessing.

GET /v1/capabilities?channel=ch_tk_4a1
{
  "provider": "tiktok",
  "health": "connected",
  "text":  { "maxChars": 2200 },
  "video": { "maxSeconds": 600,
              "aspect": ["9:16"] },
  "required": ["privacyLevel"],
  // no default exists — the platform
  // forbids one. You must choose.
  "quotaRemaining": 14
}

Constraints are data, generated from the provider manifest. Add a platform and this response changes without an agent changing.

POST /v1/posts:validate no side effects
{
  "ok": false,
  "violations": [
    { "channel": "ch_x_71c",
      "code": "text_too_long",
      "limit": 280, "actual": 341,
      "remediation": "shorten or thread" },
    { "channel": "ch_tk_4a1",
      "code": "field_required",
      "field": "privacyLevel" }
  ]
}

Every violation in one response, not the first one it hit. One round trip per fix attempt, not one per problem.

Documentation

Written to be read by a model, not rendered for one

Tool descriptions and a capabilities endpoint are runtime affordances, not documentation. An agent also needs prose it can read once and reason from — and it has to be able to actually fetch it.

Every URL here returns readable markdown to curl, with no JavaScript. Including this page.

All of it is also exposed as MCP resources, so a client can pin and cache instead of spending a tool call.
ArtifactPathWhat it is
Index /llms.txt A short markdown index of every machine-readable document here.
Full reference /llms-full.txt The entire API as one flat markdown file, sized to fit a context window.
OpenAPI /openapi.json Plain JSON. No auth, no JavaScript, stable URL. Generates typed SDKs in TypeScript and Python.
Platform briefs /docs/agents/{provider}.md Roughly 150 lines per platform, written for a model that has never used it: what you can post, which settings are required and have no default and why, the one thing everybody gets wrong, and every error with the action to take.
Recipes /docs/agents/recipes.md Connect a channel, schedule a video, handle a reauth, recover missed webhooks, batch a week.
Errors /docs/agents/errors.md Every code, its cause, its exact remediation. CI fails if a code exists in one place and not the other.
MCP server /mcp Streamable HTTP, exposing the same operations as tools. Included at every tier, never an add-on.

Every number in every brief is interpolated from the provider manifest, never typed twice. The prose around them is hand-written. That is a CI assertion, not an intention — which is why the docs can't quietly go stale.

Measured, not claimed

1.3s worst-case dispatch skew at p99.9, against a ±30s target
400 targets across 40 accounts and 8 workers, under load
0 duplicated posts when a worker is killed mid-publish
0 cross-tenant reads across 60 interleaved requests

Why it can hold. Everything expensive — upload, container creation, the platform's own ingestion — happens before the clock. The only thing that happens at your scheduled time is the single cheapest call the platform offers. That is how a ±30s promise survives a platform that takes twelve minutes to ingest a video.

Five platforms at v1

Real APIs only. No cookie scraping.

Sub-account selection included, because four of the five require it: a Facebook Page, a YouTube channel, a LinkedIn organization, an Instagram professional account.

Returned live per channel from GET /v1/capabilities, including current health and remaining quota.
Platform Text Video Required with no default Threads
linkedin3 00030 minFirst comment
facebook63 2064 hFirst comment
instagram2 20015 minFirst comment
tiktok2 20010 minPrivacy Level
youtube5 00012 hMade For KidsFirst comment

Pricing

Metered on channels. Never on calls.

You pay for how many accounts are connected. Post to them as often as your agent likes — there is no per-request price to reason about and no rate meter to design around.

Free

$0

No card. No expiry.

  • 1 connected channel
  • 5 real posts per month
  • Unlimited posting against the simulator on an ap_test_ key

Starter

$9

per month

  • 5 connected channels
  • Unlimited posts

Studio

$29

per month

  • 15 connected channels
  • Unlimited posts

Agency

$49

per month

  • 50 connected channels
  • Unlimited posts

Scale

$99

per month

  • Unlimited channels
  • Unlimited posts

API and MCP at every tier

Including free. The programmatic surface is the product, so putting it behind an upgrade would be putting the product behind an upgrade. Build against the simulator for as long as you want, on a key that costs nothing.

Give your agent
a way out.

A key takes thirty seconds and the simulator is free forever. Nothing you build against it has to change when you point it at the real thing.

Get a key Read a recipe first