Skip to main content
Understanding how content moves through different states is key to building reliable integrations with Publive.

State Diagram

                    ┌──────────────────┐
                    │                  │
                    ▼                  │
┌───────┐    ┌──────────────┐    ┌───────────┐
│ Draft │───▶│   Approval   │───▶│ Published │
│       │    │   Pending    │    │           │
└───┬───┘    └──────┬───────┘    └─────┬─────┘
    │               │                  │
    │               │ (reject)         │ (unpublish)
    │               └──────────────────┘

    │         ┌───────────┐
    └────────▶│ Scheduled │──────▶ Published (at scheduled_at)
              └───────────┘

Valid State Transitions

FromToNotes
DraftApproval PendingSubmit for review
DraftPublishedDirect publish (if permissions allow)
DraftScheduledRequires scheduled_at datetime
Approval PendingPublishedApproved by checker
Approval PendingDraftRejected by checker
PublishedDraftUnpublish content
ScheduledDraftCancel scheduled publish
ScheduledPublishedAuto-triggered at scheduled_at time

Checking Post Status

Use the CMS API to check current status:
curl -X GET \
  'https://cms.thepublive.com/publisher/123/post/{id}/' \
  -H 'username: YOUR_API_KEY' \
  -H 'password: YOUR_API_SECRET'
The response includes:
{
  "id": 50123,
  "title": "My Article",
  "status": "Published",
  "published_at": "2026-02-01T09:00:00Z",
  "created_at": "2026-01-28T14:00:00Z",
  "updated_at": "2026-02-01T09:00:00Z",
  "approver": {"id": 5, "name": "Editor"},
  "source": "HeadlessCMS"
}

Access Control

The access_type field in meta_data controls content visibility:
ValueDescription
FreePublicly accessible to all readers
PaidBehind paywall, requires subscription
# Set content as paid/premium
curl -X PATCH \
  'https://cms.thepublive.com/publisher/123/post/{id}/' \
  -H 'Content-Type: application/json' \
  -d '{"meta_data": {"access_type": "Paid"}}'