Publish or schedule a piece
Post an X post, X article, or LinkedIn post now, or schedule an X or LinkedIn post for later. It publishes on the account chosen for the piece, or the publication's connected account.
This counts the same as approving in the app, with the same checks. A scheduled piece shows up on the Calendar, and its words are locked until it goes out or is unscheduled.
apiKeyAuthorizationBearer <token>API key for authenticating protected endpoints. Pass as Bearer token in Authorization header.
contentId*stringUnique identifier of the content
Body
application/json- body
publishAt?stringWhen to publish, ISO 8601, within the next 30 days. Omit to publish now
date-timeupdatedAt?stringThe piece's updatedAt from when you reviewed it, to refuse the publish if it changed since
Published or scheduled
application/json- response
id*stringUnique identifier for this piece of content
kind*stringWhat this piece is: tweet, linkedin, newsletter, or x_article
title*stringWhat this piece is called in your library
excerpt*stringFirst readable line of the body, for listing views
status*stringWhether this piece has been delivered, is still a draft, or was archived
"draft""published""archived"scheduled*booleanWhether a scheduled send is queued against this piece
lockedReason*|Why this piece can't be edited right now, or null when it can. A queued or in-flight send locks the words, because they go out exactly as written.
publishedAt*|ISO 8601 timestamp of the first delivery, or null
url*|Where this piece went live, from the same delivery publishedAt came from. Null when it hasn't been delivered, and null by design for a channel that publishes no page: a custom email renders into the message itself, so there is no address to link to. Never guessed — a delivery whose id isn't shaped like its channel reports null rather than a link that would 404.
archivedAt*|ISO 8601 timestamp of when this piece was archived, or null
bucketId*|The bucket grouping this piece with the post it was made from, or null when it stands alone. Read it back with GET /v1/buckets/{bucketId}.
createdAt*stringISO 8601 timestamp of creation
updatedAt*stringISO 8601 timestamp of the last change
body*The artifact itself, in the shape its kind uses
curl -X POST "https://example.com/v1/content/string/publish" \ -H "Content-Type: application/json" \ -d '{}'{ "id": "string", "kind": "string", "title": "string", "excerpt": "string", "status": "draft", "scheduled": true, "lockedReason": "string", "publishedAt": "string", "url": "string", "archivedAt": "string", "bucketId": "string", "createdAt": "string", "updatedAt": "string", "body": { "property1": null, "property2": null }}Restore an archived piece POST
Bring an archived piece back into your library. Suggestions dismissed when it was archived stay dismissed — you get the draft back, not the to-do items telling you to ship it.
List the schedule GET
Everything on the Calendar from 30 days ago to 30 days ahead: what your agents made and proposed times for, what's scheduled, what went out, and what failed. Filter with `status`.