Content
Package content is marketing content from draft to published, on every channel.
Package content is marketing content from draft to published, on every channel.
| Base URL | https://api.hanzo.ai |
| Operations | 6 |
| Auth | Authorization: Bearer $HANZO_API_KEY |
content
PostTransition moves one content item to a new lifecycle state and, on the move to published, fans it out to the item's channels.
POST /v1/content/{doctype}/{name}/transition
PostTransition moves one content item to a new lifecycle state and, on the move to published, fans it out to the item's channels. The edge must be legal for the item's current state — an illegal move is refused with 409 — and the status write re-validates it at the storage boundary. Distribution is best effort: its honest state is reported on the result and a distribution failure never rolls the status change back.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
doctype | path | string | yes | DocType is the content type to act on, from the path. |
name | path | string | yes | Name is the document to act on, from the path. |
Request body — application/json (required)
| Field | Type | Required | Description |
|---|---|---|---|
doctype | string | — | DocType is the content type to act on, from the path. |
name | string | — | Name is the document to act on, from the path. |
scheduleAt | string | — | ScheduleAt is an ISO-8601 go-live time handed to the channel's own scheduler; "" distributes now. |
to | string | — | To is the lifecycle state to move to. |
GetBoard aggregates the caller org's marketing content across every publishable content type into ONE queue board — the cross-type read the framework's per-DocType list cannot give.
GET /v1/content/board
GetBoard aggregates the caller org's marketing content across every publishable content type into ONE queue board — the cross-type read the framework's per-DocType list cannot give. It never fails on a partial outage: a content type the org has not installed, or one whose search errors, is skipped and logged rather than failing the whole board.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
status | query | string | — | Status keeps only items in one lifecycle state (draft, in_review, approved, queued, published, archived). |
project | query | string | — | Project keeps only items in one brand/site sub-scope. |
doctype | query | string | — | DocType keeps only one content type; omitted, the board spans every publishable type. |
limit | query | integer | — | Limit caps the rows returned, clamped to 1000. |
GetChannels lists the distribution channels the caller's org has connected — the social integrations a publish can target.
GET /v1/content/channels
GetChannels lists the distribution channels the caller's org has connected — the social integrations a publish can target. A deployment with no distribution edge wired answers 503 rather than an empty list that would read as "no channels".
post_v1_content_generate
POST /v1/content/generate
GetLifecycle returns the ONE marketing-content state machine: the ordered lifecycle states, which state a fresh document starts in, which one is publicly live, and the legal successors of every state.
GET /v1/content/lifecycle
GetLifecycle returns the ONE marketing-content state machine: the ordered lifecycle states, which state a fresh document starts in, which one is publicly live, and the legal successors of every state. The console builds its board columns and its per-item action buttons from this single answer, so the UI and the write-time enforcement hook can never disagree about what is legal.
Publish distributes one CMS content item to the channels recorded on it and returns the honest per-channel outcome.
POST /v1/content/publish
Publish distributes one CMS content item to the channels recorded on it and returns the honest per-channel outcome. The item names itself — its caption, media and channel list are read from the stored document, not from this request. It is idempotent per channel (a channel already posted for this item is skipped), and a publish that loses the per-item lease to a live publisher answers status "in_progress" having posted nothing.
Request body — application/json (required)
| Field | Type | Required | Description |
|---|---|---|---|
doctype | string | — | |
name | string | — | |
scheduleAt | string | — | "" = now |
How is this guide?