Publish content
Prepare text and media, fan out to explicit account targets, and preserve independent destination outcomes through retries and reconciliation.
A publication request records application intent. It has shared content, explicit account targets, optional target overrides, and an idempotency key. Each target receives an independent delivery outcome.
Prepare locally
Preparation validates known content combinations, references, target ownership, capability declarations, and media inputs without uploading or publishing. It should report missing fields and warnings before a network call. Preparation never crops, truncates, rewrites, changes visibility, or adds a destination to make a request pass.
Interpret results
published requires a destination-specific native post reference. accepted and processing remain pending. A failed target can coexist with a published target. An uncertain write must be reconciled before a retry that could create public content twice.
The per-target lifecycle diagram shows why a single aggregate status cannot stand in for destination results. Media uploads, video processing, scheduling, cancellation, and removal each have additional backend and platform constraints; consult the adapter capability manifest before enabling them.
Continue with the platform support matrix and capability declarations before selecting destinations.
Reply and retry scope
Set replyTo on a target when destinations reply to different native posts or comments. A request-level replyTo applies to all its targets. Every reply reference must use the selected target’s account, backend, and platform; mismatches fail preparation before dispatch.
Idempotency fingerprints include target content, options, reply references, and schedules. Changing any of these under a previously claimed logical key produces an idempotency conflict. Provider request keys also include the tenant scope, so shared accounts do not collapse two tenants’ independent publication intentions into one provider request.
The client’s concurrency limit applies to each backend across overlapping reads and writes on that client. A queued cancellation does not dispatch a write. Native adapter access bypasses client coordination and must be managed explicitly by the application.
Native scheduling on direct adapters
A direct adapter accepts schedule only when the platform stores the post and publishes it at the requested time. The SDK does not delay a request itself. Only the YouTube adapter supports this today; see schedule a video. The other direct adapters reject schedule during preparation, before any network call, and declare posts.schedule in their capability manifests with the reason.
| Platform | Declaration | Reason |
|---|---|---|
| X | not-implemented-by-adapter |
POST /2/tweets has no publish-time field. X schedules Tweets only through the Ads API scheduled_tweets endpoint, which needs Ads API approval, an ads account and OAuth 1.0a-signed requests. Those Tweets are promoted-only by default. See X. |
| Threads | unsupported-by-platform |
The publishing reference has no publish-time parameter, and threads_publish publishes immediately. |
| Bluesky | unsupported-by-platform |
A record is visible once written. The app.bsky.feed.post createdAt field is a client-declared timestamp and does not delay publication. |
unsupported-by-platform |
Content publishing has no publish-time parameter. media_publish publishes immediately, and unpublished containers expire after 24 hours. |
|
| TikTok | unsupported-by-platform |
Direct Post post_info has no publish-time field. |
unsupported-by-platform |
The Posts API accepts only lifecycleState: "PUBLISHED" on creation and has no publish-time field. |
These sources were checked on 2026-09-24. Because these adapters never create a scheduled post, they do not implement posts.cancelScheduled. To publish later on these platforms, run the publish from your own durable job runner, or use a hosted backend that schedules on your behalf.
Cancel a schedule or remove content
Use the operation that matches the resource you intend to change. These methods authorize the reference’s account before network access and check backend ownership before writing.
| Method | Reference | Implemented behavior |
|---|---|---|
posts.cancelScheduled(job) |
Account-scoped ScheduledJobRef from a scheduled outcome |
Zernio deletes the future scheduled record. Post for Me retains the record as a draft, preserving its timestamp and content. Direct YouTube clears publishAt and keeps the video private. |
posts.deleteBackendRecord(record) |
BackendPostRef with recordId |
Deletes a draft provider record on Zernio or Post for Me. Scheduled and dispatched records are rejected. |
posts.removeFromPlatform(post) |
PlatformPostRef from publication |
Zernio unpublishes a native post while retaining the backend record, on X, Threads, Bluesky, YouTube, LinkedIn, and Facebook. |
Direct adapters also implement posts.removeFromPlatform for X, Threads, Bluesky, LinkedIn, YouTube, and Instagram with Facebook Login. They delete the native post with the connected account credentials. The direct TikTok adapter does not implement it.
The direct YouTube adapter implements posts.cancelScheduled for videos uploaded with schedule. It clears the scheduled publish time and leaves the video uploaded and private; it never deletes the video. See YouTube for the quota cost and scope.
On Zernio, native removal needs the backend record ID preserved in post.native.backendRecordId. A native post ID alone cannot identify that provider record. Post for Me does not advertise native removal because its record deletion endpoint does not establish that it removes live platform content.
A record shared by multiple destinations is rejected by these mutations. The client will not change another account’s schedule or post as a side effect. Schedule cancellation requires a future schedule; once submission is due or underway, reconcile its delivery. The provider controls races between cancellation and dispatch. Cancellation never proves that an already dispatched native post was removed.
Mutations are sent once. A lost response raises ambiguous_outcome with reconcile-first; inspect the backend before repeating the operation.
Edit a published post
Editing is a native operation because each platform changes a different part of a post. The direct adapters declare posts.update as follows:
| Platform | Availability | Behavior |
|---|---|---|
| X | available | updatePost edits text on a recent post and returns the new version’s ID. |
| available | updatePost applies a partial update to the post. |
|
| YouTube | available | updateVideo replaces video metadata. |
| Threads | unsupported-by-platform | The Threads API has no edit endpoint. |
| Bluesky | unsupported-by-platform | The Bluesky AppView ignores post record updates. |
| unsupported-by-platform | Only comment_enabled can be updated on published media. |
|
| TikTok | unsupported-by-platform | The Content Posting API has no edit endpoint. |
Edits are sent once, like the other mutations. See each platform page for eligibility rules and sources.