Read one post
Returns one of the caller's posts. A post that belongs to another user answers the same 404 as one that does not exist.
Returns one of the caller's posts. A post that belongs to another user answers the same 404 as one that does not exist.
Authorization
bearerAuth A bearer token. The Account routes accept a Privy access token; the MCP transport accepts an sk- API key issued by POST /account/api-keys.
In: header
Path Parameters
The publish request id.
Response Body
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/social/posts/string"{ "id": "string", "projectId": "string", "platforms": [ { "accountId": "string", "platform": "string", "text": "string" } ], "assetIds": [ "string" ], "scheduledFor": "string", "status": "draft", "zernioPostId": "string", "lastError": "string", "approveUrl": "string", "createdAt": "string", "updatedAt": "string"}Create a post draft POST
Creates a `PublishRequest` in the `draft` state. **This route never calls Zernio.** The dashboard renders a preview per platform from `platforms` and shows the `approveUrl`; only a click on that link — `POST /social/posts/{id}/approve` — reaches Zernio's create-post. Pass `scheduledFor` to schedule, or omit it to publish as soon as the user approves. Media go to Zernio as short-lived signed Garage URLs minted at approval time, so the asset ids here are putty-internal and never leave putty as a path.
Approve a draft and publish it POST
**The only route that calls Zernio's create-post.** A user clicking Approve in the dashboard lands here; a model or an external MCP caller never does, which is why the tool hands back an `approveUrl` instead. Sends `scheduledFor` when the draft has one and `publishNow` when it does not, and moves the row out of `draft` before the call so a crash mid-publish cannot leave something a retry would post twice. Requires the caller's own Privy session: an `sk-` key cannot publish on a user's behalf, exactly as it cannot sign a transaction.