> ## Documentation Index
> Fetch the complete documentation index at: https://www.openpmm.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Posts and publishing

> Learn how an OpenPMM Post moves from draft to scheduled or published state.

A **Post** contains content for one channel. It also contains the publishing state.

| State or action              | Result                                             | Can contact a provider? |
| ---------------------------- | -------------------------------------------------- | ----------------------- |
| Create with `when: "draft"`  | An editable Post                                   | No                      |
| Publish with `when: "now"`   | The same Post starts publishing                    | Yes                     |
| Publish with `when: "queue"` | The same Post uses the next Destination queue slot | At the selected time    |
| Publish with a timestamp     | The same Post becomes scheduled                    | At the scheduled time   |

The Post keeps the same `id` when you publish it.
Use the ETag to prevent changes to an old Post revision.
Publish every draft Post in a group together. This keeps the group consistent.

A queued Post has the `scheduled` state and the `queue` schedule mode.
OpenPMM selects an exact time when the Post enters the queue.
You can move a queued Post to another local date without selecting an exact time.
You can change the copy and Destination publishing options on a scheduled Post.
The Post keeps its schedule after these changes.
Cancel the schedule before you change assets or thread structure.

## Post details

`GET /workspaces/{workspace_id}/posts/{post}` returns the complete Post status.
The response includes lifecycle metadata, the latest error, and publication receipts.
Use `include=attempts` to include sanitized publishing attempts.

## Groups

`group` is an optional label that you assign to related Posts.
It is not a separate resource and has no publishing state.
Use `GET /workspaces/{workspace_id}/posts?group={group}` to retrieve the Posts.

## Confirmation

Requests that can publish must contain `confirmed: true`.
OpenPMM validates the Post before it changes the state.

<Warning>
  A timeout does not prove that publishing failed. Retry with the same idempotency key.
</Warning>
