# Content

Entries, types, releases, the delivery API, members and reader comments.

Scopes for this area: `content:read`, `content:write` and `content:admin`.

120 operations.

## tier

| Method | Route | What it does | Level | Command |
| --- | --- | --- | --- | --- |
| GET | `/members/tiers` | The membership tiers (free and paid) readers can hold. | read | `rivier content tier list` |
| POST | `/members/tiers` | Add a tier: a name, free or paid, a price and a period (month, year or once). | admin | `rivier content tier create` |

## member

| Method | Route | What it does | Level | Command |
| --- | --- | --- | --- | --- |
| GET | `/members` | Members and the tiers each holds now. | read | `rivier content member list` |
| POST | `/members/grants` | Give someone a tier (a gift, a comp, an import, or a payment recorded by hand). | admin | `rivier content member grant` |
| POST | `/members/grants/{id}/end` | End a grant now. | admin | `rivier content member end grant` |
| POST | `/members/session` | Tokens for a member whom the site has signed in: one for the server-side check and, where the edge key is set up, one the edge verifies with the public key. | admin | `rivier content member session` |
| POST | `/public/members/verify` | Check the code a member was mailed and get their tokens. Every failure looks the same; five wrong tries end the code. | read | `rivier content member verify` |
| POST | `/public/members/sign-in` | Ask for a sign-in code by email. The answer is the same whether or not the address is a member. | read | `rivier content member sign in` |

## access

| Method | Route | What it does | Level | Command |
| --- | --- | --- | --- | --- |
| GET | `/content-access/{entryId}` | Who may read a page and how much of it everyone sees. | read | `rivier content access get` |
| PUT | `/content-access/{entryId}` | Set who may read a page: free, members, paid (named tiers), metered (free reads per month) or preview (the first blocks). | admin | `rivier content access set` |

## plan

| Method | Route | What it does | Level | Command |
| --- | --- | --- | --- | --- |
| GET | `/public/subscriptions/plans` | The tiers a visitor can choose from, with where to pay. | read | `rivier content plan list` |
| POST | `/public/subscriptions/{tierId}/checkout` | Start buying a paid tier: a pending membership and a hosted checkout address. The membership starts when the payment succeeds. | read | `rivier content plan checkout` |
| POST | `/workspace/content/plans` | Plan recurring content. | write | `rivier content plan create` |
| PATCH | `/workspace/content/plans/{id}` | Change a content plan. | write | `rivier content plan update` |
| DELETE | `/workspace/content/plans/{id}` | Delete a content plan. | write | `rivier content plan delete` |

## entitlement

| Method | Route | What it does | Level | Command |
| --- | --- | --- | --- | --- |
| GET | `/public/entitlements/entry/{entryId}` | For a site build: whether a page is free, metered or paid, which fields everyone may read, which rich-text fields are behind the wall and how many blocks of them are shown, and which tiers open it. | read | `rivier content entitlement entry` |
| POST | `/public/entitlements/reveal` | For a reader the check lets in: the gated rich-text fields of the page in full, and nothing for anyone else. A metered read is counted once, as in check. | read | `rivier content entitlement reveal` |
| POST | `/public/entitlements/check` | At request time: may this reader see the body now. Counts a metered read once per page per month. | read | `rivier content entitlement check` |

## reader comment

| Method | Route | What it does | Level | Command |
| --- | --- | --- | --- | --- |
| GET | `/public/comments/{entryId}` | The comments readers may see under a page, and the guard's token for the form. | read | `rivier content reader comment public` |
| POST | `/public/comments/{entryId}` | A reader writes a comment. The form guard judges it: abuse is refused, anything unsure is held for a person. | read | `rivier content reader comment submit` |
| GET | `/cms/reader-comments` | Reader comments of a page or of the whole project, by state (held, published, refused). | read | `rivier content reader comment list` |
| POST | `/cms/reader-comments/{id}/decide` | Let a held comment through or refuse it. A person with the approver role does this; nothing is deleted. | write | `rivier content reader comment decide` |

## proof

| Method | Route | What it does | Level | Command |
| --- | --- | --- | --- | --- |
| GET | `/portfolio/proofs` | The private links made for a page, with how many pictures were approved, rejected or commented on. | read | `rivier content proof list` |
| POST | `/portfolio/proofs` | Make a private link for a client to look at a set of pictures, comment on them and approve them. The token is shown once. | write | `rivier content proof create` |
| GET | `/portfolio/proofs/{id}/marks` | What the client approved, rejected or said, picture by picture. | read | `rivier content proof marks` |
| DELETE | `/portfolio/proofs/{id}` | Switch a client link off. | write | `rivier content proof revoke` |

## offer

| Method | Route | What it does | Level | Command |
| --- | --- | --- | --- | --- |
| GET | `/portfolio/offers` | Licence offers and where each stands (offered, accepted, declined, paid, withdrawn, expired). | read | `rivier content offer list` |
| POST | `/portfolio/offers` | Offer a licence: what it allows, where, for how long, whether exclusive, and the price. The buyer answers at a private link; no money moves here. | admin | `rivier content offer create` |
| POST | `/portfolio/offers/{id}/settle` | Mark an accepted offer paid when the money arrived, or take an offer back. | admin | `rivier content offer settle` |

## certificate

| Method | Route | What it does | Level | Command |
| --- | --- | --- | --- | --- |
| GET | `/portfolio/certificates` | Certificates of authenticity that were issued. | read | `rivier content certificate list` |
| POST | `/portfolio/certificates` | Issue a certificate of authenticity for a work or one numbered edition, with a serial number anyone can check. | admin | `rivier content certificate issue` |
| POST | `/portfolio/certificates/{id}/void` | Void a certificate, with the reason. It stays on record and shows as void. | admin | `rivier content certificate void` |
| GET | `/public/certificates/{serial}` | Check a certificate by serial number: what it certifies, the edition, the date and whether it was voided. | read | `rivier content certificate verify` |

## cms

| Method | Route | What it does | Level | Command |
| --- | --- | --- | --- | --- |
| GET | `/cms/summary` | Counts and health of the brand's content. | read | `rivier content cms summary` |

## settings

| Method | Route | What it does | Level | Command |
| --- | --- | --- | --- | --- |
| GET | `/cms/settings` | Locales, rules, cache time and limits. | read | `rivier content settings get` |
| PUT | `/cms/settings` | Change the CMS settings. | admin | `rivier content settings update` |

## type

| Method | Route | What it does | Level | Command |
| --- | --- | --- | --- | --- |
| GET | `/cms/types` | The content types, with fields and rules. | read | `rivier content type list` |
| GET | `/cms/types.d.ts` | The types as TypeScript declarations. | read | `rivier content type typescript` |
| GET | `/cms/types/{key}` | One content type. | read | `rivier content type get` |
| PUT | `/cms/types/{key}` | Create or change a content type. | admin | `rivier content type save` |
| DELETE | `/cms/types/{key}` | Delete a content type with no entries. | admin | `rivier content type delete` |
| GET | `/cms/types/{key}/pack` | The writing pack for a type: schema, rules, voice and grounding. | read | `rivier content type pack` |

## comment

| Method | Route | What it does | Level | Command |
| --- | --- | --- | --- | --- |
| GET | `/cms/entries/{id}/comments` | The comments on a page. | read | `rivier content comment list` |
| POST | `/cms/entries/{id}/comments` | Leave a note on a page or on one of its fields, naming people if needed. | write | `rivier content comment add` |
| POST | `/cms/comments/{id}/resolve` | Settle a comment, or open it again. | write | `rivier content comment resolve` |

## redirect

| Method | Route | What it does | Level | Command |
| --- | --- | --- | --- | --- |
| GET | `/cms/redirects` | Old addresses and where they lead (301, 302, 307, 308 or 410 for gone). | read | `rivier content redirect list` |
| POST | `/cms/redirects` | Send an old address to a new one so links and search standing carry over. A redirect never points at another one; chains are followed on write. | write | `rivier content redirect set` |
| DELETE | `/cms/redirects/{id}` | Remove a redirect. | write | `rivier content redirect remove` |

## delivery

| Method | Route | What it does | Level | Command |
| --- | --- | --- | --- | --- |
| GET | `/cms/delivery/v1/redirects` | Every redirect of a site for the build and the edge, or where one address leads (?path=). | read | `rivier content delivery redirects` |
| GET | `/cms/delivery/v1/id/{id}/markdown` | A published page as markdown with a small header (title, address, dates, AI use, reviewer, retraction), its corrections and the AI line. | read | `rivier content delivery markdown` |
| GET | `/cms/delivery/v1/id/{id}/jsonld` | Structured data (schema.org Article) for a published page: dates, authors with their ORCID iD, the DOI, and a retraction. | read | `rivier content delivery jsonld` |
| GET | `/cms/delivery/v1/news-sitemap.xml` | A Google News sitemap of what was published in the last two days; retracted pages are left out. | read | `rivier content delivery news sitemap` |
| GET | `/cms/delivery/v1/podcast.rss` | A podcast feed (RSS with iTunes tags): each published episode with its audio file attached. | read | `rivier content delivery podcast` |
| GET | `/cms/delivery/v1/feed.json` | A JSON Feed 1.1 of the published entries (by type, language, site). The site serves it at its own address. | read | `rivier content delivery feed json` |
| GET | `/cms/delivery/v1/feed.rss` | An RSS 2.0 feed of the published entries. | read | `rivier content delivery feed rss` |
| GET | `/cms/delivery/v1/feed.atom` | An Atom 1.0 feed of the published entries. | read | `rivier content delivery feed atom` |
| GET | `/cms/delivery/v1/entries` | Published entries for a site, cached. | read | `rivier content delivery list` |
| GET | `/cms/delivery/v1/entries/{type}/{slug}` | One published entry by address. | read | `rivier content delivery get` |
| GET | `/cms/delivery/v1/id/{id}` | One published entry by id. | read | `rivier content delivery by id` |
| GET | `/cms/delivery/v1/llms.txt` | An llms.txt for the published content. | read | `rivier content delivery llms` |

## entry

| Method | Route | What it does | Level | Command |
| --- | --- | --- | --- | --- |
| POST | `/cms/entries/{id}/embargo` | Hold an approved page until a time and get a link the press can read it with until then. | write | `rivier content entry embargo` |
| GET | `/cms/entries/{id}/email` | A published page as an email ready for the contact store to send: subject, preheader, safe HTML with corrections and the AI line, a plain-text part and the address of the page. The unsubscribe footer is the sender's. | read | `rivier content entry email` |
| GET | `/cms/entries` | List entries with filters. | read | `rivier content entry list` |
| POST | `/cms/query` | Query entries with a typed filter. | read | `rivier content entry query` |
| POST | `/cms/entries` | Create an entry as a draft. | write | `rivier content entry create` |
| GET | `/cms/entries/{id}` | One entry with its translations. | read | `rivier content entry get` |
| GET | `/cms/by-slug/{type}/{slug}` | One entry by its address. | read | `rivier content entry by slug` |
| PATCH | `/cms/entries/{id}` | Change an entry with field-level operations. | write | `rivier content entry patch` |
| DELETE | `/cms/entries/{id}` | Delete an entry. | write | `rivier content entry delete` |
| GET | `/cms/entries/{id}/history` | The versions of an entry. | read | `rivier content entry history` |
| GET | `/cms/entries/{id}/diff` | What changed between two versions. | read | `rivier content entry diff` |
| GET | `/cms/entries/{id}/check` | Whether an entry passes its rules and can be published. | read | `rivier content entry check` |
| POST | `/cms/entries/{id}/rollback` | Return an entry to an earlier version as a new version. | write | `rivier content entry rollback` |
| POST | `/cms/entries/{id}/submit` | Send an entry for review. | write | `rivier content entry submit` |
| POST | `/cms/entries/{id}/review` | Approve an entry or send it back. | write | `rivier content entry review` |
| POST | `/cms/entries/{id}/schedule` | Schedule publication. | write | `rivier content entry schedule` |
| POST | `/cms/entries/{id}/publish` | Publish an approved entry. | write | `rivier content entry publish` |
| POST | `/cms/entries/{id}/unpublish` | Withdraw a published entry. | write | `rivier content entry unpublish` |
| POST | `/cms/entries/{id}/archive` | Archive an entry. | write | `rivier content entry archive` |
| POST | `/cms/entries/{id}/restore` | Restore an archived entry. | write | `rivier content entry restore` |
| GET | `/cms/entries/{id}/translation-pack` | Everything a translator needs for one locale. | read | `rivier content entry translation pack` |
| POST | `/cms/assist` | A proposal from the project's writing model for a passage: a draft, a rewrite, a shorter or longer version, a tone, a summary, a search description, alt text or a translation. Nothing is saved; the result is marked as machine-written. | write | `rivier content entry assist` |
| POST | `/cms/entries/{id}/translate` | Add or update a translation. | write | `rivier content entry translate` |
| POST | `/cms/entries/{id}/preview-link` | A signed, expiring link that shows the working copy. | write | `rivier content entry preview link` |
| POST | `/cms/bulk` | Create or update many entries by source reference. | write | `rivier content entry bulk` |
| POST | `/cms/import` | Import markdown, a Ghost export, WordPress posts, a Medium export (html files) or a Substack export (posts.csv and html files). Returns what was made, what was skipped and why, and a redirect from each old address to the new page. | write | `rivier content entry import` |

## correction

| Method | Route | What it does | Level | Command |
| --- | --- | --- | --- | --- |
| GET | `/cms/entries/{id}/corrections` | The corrections log of a page: every correction, update or clarification made after publishing. | read | `rivier content correction list` |
| POST | `/cms/entries/{id}/corrections` | Record a correction, an update or a clarification on a published page. A person with the approver role does this; it is shown with the page and never removed. | write | `rivier content correction add` |

## preset

| Method | Route | What it does | Level | Command |
| --- | --- | --- | --- | --- |
| GET | `/cms/presets` | Ready-made groups of content types: blog, magazine, and portfolios for photographers, artists, musicians, designers, writers, performers and consultants. | read | `rivier content preset list` |
| POST | `/cms/presets/{key}/apply` | Set the project up with a preset's content types. A type the project already has is left alone. | admin | `rivier content preset apply` |

## release

| Method | Route | What it does | Level | Command |
| --- | --- | --- | --- | --- |
| GET | `/cms/releases` | List releases. | read | `rivier content release list` |
| POST | `/cms/releases` | Create a release. | write | `rivier content release create` |
| GET | `/cms/releases/{id}/diff` | What a release would change. | read | `rivier content release diff` |
| POST | `/cms/releases/{id}/items` | Add an entry to a release. | write | `rivier content release add item` |
| DELETE | `/cms/releases/{id}/items/{entryId}` | Take an entry out of a release. | write | `rivier content release remove item` |
| POST | `/cms/releases/{id}/rebase` | Bring a release up to date with changed entries. | write | `rivier content release rebase` |
| POST | `/cms/releases/{id}/submit` | Send a release for review. | write | `rivier content release submit` |
| POST | `/cms/releases/{id}/review` | Approve a release or send it back. | write | `rivier content release review` |
| POST | `/cms/releases/{id}/schedule` | Schedule a release. | write | `rivier content release schedule` |
| POST | `/cms/releases/{id}/publish` | Publish a release. | write | `rivier content release publish` |
| POST | `/cms/releases/{id}/cancel` | Cancel a release. | write | `rivier content release cancel` |

## event

| Method | Route | What it does | Level | Command |
| --- | --- | --- | --- | --- |
| GET | `/cms/events` | The CMS change feed. | read | `rivier content event list` |

## knowledge

| Method | Route | What it does | Level | Command |
| --- | --- | --- | --- | --- |
| GET | `/cms/knowledge` | Published passages for customer service and memory. | read | `rivier content knowledge list` |

## webhook

| Method | Route | What it does | Level | Command |
| --- | --- | --- | --- | --- |
| GET | `/cms/webhooks` | The CMS's webhook endpoints. | read | `rivier content webhook list` |
| POST | `/cms/webhooks` | Add a webhook endpoint; the signing secret is returned once. | admin | `rivier content webhook create` |
| DELETE | `/cms/webhooks/{id}` | Remove a webhook endpoint. | admin | `rivier content webhook delete` |

## site

| Method | Route | What it does | Level | Command |
| --- | --- | --- | --- | --- |
| GET | `/cms/export` | A static export of the published content. | read | `rivier content site export` |

## item

| Method | Route | What it does | Level | Command |
| --- | --- | --- | --- | --- |
| GET | `/workspace/content` | Drafts and posts, by state. | read | `rivier content item list` |
| POST | `/workspace/content` | Write a draft for a channel. | write | `rivier content item draft` |
| PATCH | `/workspace/content/{id}` | Edit a draft. | write | `rivier content item edit` |
| POST | `/workspace/content/{id}/decide` | Approve or discard a draft. | write | `rivier content item decide` |

## run

| Method | Route | What it does | Level | Command |
| --- | --- | --- | --- | --- |
| POST | `/content/run-plans` | Run due content plans now. | write | `rivier content run plans` |
| POST | `/content/publish-due` | Publish approved items that are due. | write | `rivier content run publish due` |

## library

| Method | Route | What it does | Level | Command |
| --- | --- | --- | --- | --- |
| GET | `/workspace/library` | The reference documents the business keeps. | read | `rivier content library list` |
| POST | `/workspace/library` | Add a document. | write | `rivier content library upload` |
| PATCH | `/workspace/library/{id}` | Rename or tag a document. | write | `rivier content library update` |
| DELETE | `/workspace/library/{id}` | Delete a document. | write | `rivier content library delete` |
| GET | `/workspace/library/{id}/download` | Download a document. | read | `rivier content library download` |
| GET | `/workspace/library/drive/picker` | Files in the connected Drive. | read | `rivier content library drive picker` |
| POST | `/workspace/library/drive/pull` | Copy a Drive file into the library. | write | `rivier content library drive pull` |
