content_publications_publish
Publish NOW: the same queue, scheduled for this instant, publishing one output of the post's approved version to the channel (there is no `text` parameter: per-output text lives in `targets[].text`, set with content_posts_update).
Publish NOW: the same queue, scheduled for this instant, publishing one output of the post's approved version to the channel (there is no `text` parameter: per-output text lives in `targets[].text`, set with content_posts_update). variantId picks the output; it is inferred when the channel's network has exactly one, and refused with 409 variant_required (listing the outputs) when it has several and none is named. There is no separate synchronous path — a fast path would differ exactly where it matters, on failure. The same one-publication-per-output-per-channel rule as content_publications_schedule: if that output already has a pending, publishing or published publication on the channel, this is refused with 409 already_scheduled naming it. An idempotencyKey already spent on a cancelled or failed publication is refused with 409 idempotency_key_spent.
Behavior
- HTTP
POST /content/publications/publish
Arguments
Name | Type | Required | Description |
|---|---|---|---|
postId | string | • | The post to publish. It must already be approved and have an output for the channel's network. |
channelId | string | • | The channel to publish to. What goes out is the chosen output of the post's approved version. |
variantId | string | — | Which OUTPUT of the post to publish: a targets[].id from content_posts_get. Omit when the channel's network has exactly one output — it is inferred. When the network has several (a YouTube video and two Shorts), omitting it is refused with 409 variant_required listing them; pick one and call again. An id of another network's output is refused with 409 network_not_targeted; an id the post does not have with 409 variant_not_found. |
idempotencyKey | string | — | Your own key for this publishing intent, unique within the product. Resending the same key returns the SAME publication instead of creating a second one — a duplicate in a client feed is the worst defect this product can ship. Omit it and one is derived from post, channel and time. |
Response
Field | Type | Always | Description |
|---|---|---|---|
id | string | • | Publication id. |
text | string | • | The exact text that will be published to this channel — markdown already flattened to plain network text at schedule time. Not the markdown source; that stays on the post. |
media | array | • | The media asset ids this publication sends — the output's own list, or the post's when the output inherits — copied when it was scheduled. What the adapter uploads, character for character. |
state | string | • | pending (queued) -> publishing (the reminder was sent; a person is publishing by hand) -> published (confirmed) | failed | cancelled. |
fields | object | • | The network variant fields it goes out with — a YouTube title, a Reddit subreddit — copied from the post's approved output when it was scheduled. |
postId | string | • | The post being published. |
costUsd | number | • | What publishing this costs in USD, computed when it was scheduled. On X a post carrying a link costs 13x a plain one. Null means the cost is not known — an auto channel refuses to dispatch it. |
warning | string | • | Set on a published publication when something did not go as asked but the post is out — e.g. YouTube refused the cover as the thumbnail (an unverified channel, a file too large). The post is NOT retried; fix it on the network by hand. Null otherwise. |
attempts | integer | • | How many dispatch attempts have been made. |
postType | string | • | The post type this publication goes out as (video, short, reel, post, ...), copied from the post's approved variant when it was scheduled. Null on a publication scheduled before post targets existed. |
channelId | string | • | The channel it is published to. |
costBasis | string | • | Which rate produced costUsd: `plain` the flat per-post rate, `link` the higher rate a post carrying a link is charged, `free` a channel whose rates are both zero. Null when the cost is not known. |
createdAt | string | • | ISO-8601 creation time. |
lastError | string | • | The most recent failure, if any. |
updatedAt | string | • | ISO-8601 time of the last change. |
variantId | string | • | The post output this publication is bound to (targets[].id). One live publication per post × channel × output. A publication scheduled before outputs existed carries the channel's network name. |
externalId | string | • | The network's id for the published post, once known. |
externalUrl | string | • | URL of the published post, once known. |
publishedAt | string | • | ISO-8601 time it was confirmed published. |
scheduledAt | string | • | ISO-8601 time the publication is due. |
coverMediaId | string | • | The output's cover image asset id, copied when it was scheduled, or null for none. YouTube sets it as the video's thumbnail after the upload; a reminder links it for the person publishing by hand. |
publicationId | string | • | The publication id again, under the name the content/publication.settled event uses to report this publication finishing. Always identical to id. |
reminderCount | integer | • | How many reminders have been sent for this publication. |
idempotencyKey | string | • | The key that makes a retry the same publication. |
reminderSentAt | string | • | ISO-8601 time the most recent reminder went out, or null if none has. |
Try it
Publish NOW: the same queue, scheduled for this instant, publishing one output of the post's approved version to the channel (there is no `text` parameter: per-output text lives in `targets[].text`, set with content_posts_update).