Developers
A social media posting API with idempotency, webhooks and MCP
Everything the OmniPosts app does, your code can do over HTTP: send or schedule a post to every connected channel, read what happened on each one, and be told when something changes. The app uses this same API. It is included in every plan.
Your first post
Create a key in Settings → Agents & API, then send one request. A key can be limited to the scopes it needs, such as posts:write, and given an end date. See Authentication.
curl https://jamp.sh/v1/groups \
-H "Authorization: Bearer omniposts_..." \
-H "Idempotency-Key: 6f1c2a52-launch-post-1" \
-H "Content-Type: application/json" \
-d '{"body": "We shipped.", "targets": [{"channelId": "CHANNEL_ID"}]}'
The answer is 201 when every channel accepted the post, or 207 when some rejected it, with the reason for each. Add "queue": true to send it at your next free posting time, or scheduledFor for a time of your own. Retry with the same key and nothing new is created.
What you can rely on
-
Idempotency keys
Send the same request with the same Idempotency-Key and you get the first post back, marked as a replay. A timeout never turns into a second post.
-
A result per channel
One post to three channels has three results. A channel that rejects the post does not stop the others, and the answer says which one and why.
-
Signed webhooks
Get a call when a post is published or fails, or a channel needs reconnecting, signed with HMAC-SHA256 so you can prove it came from us.
-
An MCP server
Let an AI agent check, send and follow posts through the same operations, with the same answers and refusals as the API.
Agents: the MCP server and scoped keys
OmniPosts runs an MCP server at https://jamp.sh/mcp with the posting API as tools: list channels, check a post before sending it, send or queue it, and follow each channel's result. Claude Code, Cursor and other MCP clients connect with an API key in the Authorization header. See Connect an agent and MCP server.
- Give a key only what it needs. Scopes such as
posts:read,posts:writeandmedia:write, and an end date. A call outside its scopes gets403naming the missing scope. See Scopes. - A key belongs to one workspace. It sees that workspace's channels and posts, and nothing else. See Workspaces and members.
- Connecting stays with a person. An agent can start a channel connect and hand over a one-time link; a person signs in to the platform in their own browser. See Connect a channel.
- Agent sign-in with OAuth Coming soon
The contract
- /openapi.yaml is the OpenAPI 3.0 file for the whole API. It is written by hand and tested: every request our contract suite sends is checked against it. Import it into Insomnia or Postman.
- Interactive reference: every endpoint, field and status, with requests you can send from the page.
- Errors share one envelope,
{error: {code, message}}, and a429always says when to retry. See Errors and Rate limits. - Each platform's limits, media rules and settings are data:
GET /v1/providers. See Providers and Channels.