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.
A publishing substrate for autonomous agents
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.
1.3s worst-case skew, p99.9
The whole product, in one request. Five platforms, one idempotency key, one scheduled time.
{
"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
Every social API assumes a person is watching. These are the affordances that hold when nobody is.
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.
Get every violation at once, with no side effects, before you commit to anything. Iterate against the validator, then publish.
POST /v1/posts:validate
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.
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
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.
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
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.
{
"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.
{
"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
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.
| Artifact | Path | What 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
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
Sub-account selection included, because four of the five require it: a Facebook Page, a YouTube channel, a LinkedIn organization, an Instagram professional account.
| Platform | Text | Video | Required with no default | Threads |
|---|---|---|---|---|
| 3 000 | 30 min | — | First comment | |
| 63 206 | 4 h | — | First comment | |
| 2 200 | 15 min | — | First comment | |
| tiktok | 2 200 | 10 min | Privacy Level | — |
| youtube | 5 000 | 12 h | Made For Kids | First comment |
Pricing
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.
ap_test_ keyStarter
$9
per month
Studio
$29
per month
Agency
$49
per month
Scale
$99
per month
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.
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.