<!-- Generated from the canonical OpenPost public page. Do not edit this build artifact. -->

Title: Publications and Renditions
Description: Create drafts, customize destinations, and run the Publication lifecycle over HTTP.
Canonical: https://docs.openpo.st/automate/api/publications
Source: [https://docs.openpo.st/automate/api/publications](https://docs.openpo.st/automate/api/publications)

# Publications and Renditions

A Publication owns the source idea, schedule, and lifecycle. A Rendition is the destination-specific version for one connected account.

## Create a draft

```sh
curl https://app.openpo.st/api/v1/publications \
  -X POST \
  -H "Authorization: Bearer $OPENPOST_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: release-2026-09-19-draft" \
  --data '{
    "workspace_id": "ws_...",
    "title": "Launch day",
    "content_profile": "short_text",
    "source_text": "The new import flow is live.",
    "social_account_ids": ["acc_linkedin", "acc_x"]
  }'
```

Creating a Publication does not publish it. Omit `social_account_ids` for a draft without destinations. Pass `social_set_id` to initialize the destination snapshot from a Social Set.

The server records raw HTTP creation as `creation_source: "api"`. The TypeScript SDK sends its own client identity and records `creation_source: "sdk"` instead.

## Validate and publish

Validate the saved Publication before scheduling or publishing:

```sh
curl https://app.openpo.st/api/v1/publications/pub_.../validate \
  -X POST \
  -H "Authorization: Bearer $OPENPOST_TOKEN" \
  -H "Content-Type: application/json" \
  --data '{}'
```

Send the revision from the latest Publication response when you schedule, publish, cancel, update, or replace Renditions. This example publishes immediately, so its job can be polled to completion:

```sh
curl https://app.openpo.st/api/v1/publications/pub_.../publish-now \
  -X POST \
  -H "Authorization: Bearer $OPENPOST_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: release-2026-09-19-publish" \
  --data '{"expected_revision": 3}'
```

A `409` conflict means the Publication changed after revision 3. Read it again and reconcile the newer state before another write.

To publish later, set `scheduled_at` to a future RFC 3339 time when you create or update the Publication, then call `/schedule` with the latest revision. Do not wait synchronously for that job: it stays pending until the scheduled time.

## Inspect each destination

Read `GET /publications/{id}` after the job finishes. Check each Rendition's status, provider URL, and error fields. Use `GET /publications/{id}/events` when you need the ordered lifecycle history.

Start with the [create Publication reference](https://docs.openpo.st/api-reference/publications/create-publication), then use the operation list to find update bodies, Rendition fields, filters, cancellation, deletion, and failed-destination retries.
