Skip to content

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).

Tool

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).

When to use

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.

Example

Ask your agent something like this:

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).

The agent will invoke content_publications_publish with these arguments:

{
  "postId": "<postId>",
  "channelId": "<channelId>"
}

Esc

Start typing to search the docs.

↑↓navigate↵select