Understand the pieces
A content type is a structure: its fields define what an editor can enter. The display name is for people; the API identifier (such as content_item) is the stable name your app queries.
An entry is one record of that type. A workspace contains your types, entries, media and delivery keys. The API calls its workspace identifier projectId or project_id; these refer to the same UUID.
Saving creates a draft. Publishing creates a snapshot for delivery. Editing a published entry leaves its public snapshot unchanged until you publish again.
Set up your first content
1. Open the studio and choose a workspace. Owners and Developers define content types; Editors manage entries and media.
2. Create the sample type below, or use one of your own. Change every content_item and field identifier in the examples to match your actual schema.
3. Add an entry, save it, and publish it. For a first test, fill title and position. Leave related and image empty, or publish those dependencies first.
4. Open API Access as the Owner. Generate keys if needed and copy the public value with its copy control and store the one-time secret securely when generated. Prefer individually scoped application tokens for each consuming app. Developers and Editors should request the appropriate key from their Owner.
5. Copy your workspace UUID and CMS base URL. The URL must be reachable from the device/server running your app; localhost always means that device itself.
The sample schema
This is an illustrative schema, not content already installed in your workspace. Guides never create types or entries automatically. Use the field keys exactly as shown when following these examples.
Create Content items with API identifier content_item. Title: text, required; position: number; publication_date: date; summary: text with translation enabled; related: single reference to content_item; image: image. Enable English and Spanish in Workspace settings to follow locale examples. All other fields are optional.
Dates are ISO strings (2026-10-15), UTC date/time values use an offset such as Z, colors are hex strings, choices use stable string values, and Markdown is source text. Text, long text, Markdown and rich text can be localized.
{
"fields": [
{
"key": "title",
"label": "Title",
"required": true,
"type": "text"
},
{
"key": "position",
"label": "Position",
"required": false,
"type": "number"
},
{
"key": "publication_date",
"label": "Publication date",
"required": false,
"type": "date"
},
{
"key": "summary",
"label": "Summary",
"localized": true,
"required": false,
"type": "text"
},
{
"key": "related",
"label": "Related item",
"required": false,
"target": "content_item",
"type": "reference"
},
{
"key": "image",
"label": "Image",
"required": false,
"type": "image"
}
],
"key": "content_item",
"name": "Content items"
}
Use the right key
A public pk_ key reads published content from a browser or server. Anyone who has it can read that workspace’s published content. Frontend environment variables are public configuration.
A secret sk_ key can read previews. Keep it in server-owned code and private runtime configuration. Your own application must authorize users before serving draft content.
Studio login cookies do not authorize delivery APIs. Every external request needs an Authorization: Bearer header. Key rotation invalidates the previous pair; update all consuming apps after rotating.
Replace YOUR_CMS_HOST, YOUR_WORKSPACE_UUID, YOUR_PUBLIC_KEY and ENTRY_UUID before running examples. Find an entry ID in a collection response. Example values and responses are synthetic, never pulled from a signed-in workspace.
Choose how to connect
JavaScript SDK — recommended for JavaScript/TypeScript apps. It wraps REST, checks options, converts top-level response metadata to camelCase, and supports generated types. It works across frameworks.
REST — straightforward HTTP GET requests and JSON. Use from any language.
GraphQL — request precise fields and traverse references using a schema generated from your content types. The studio Explorer helps build queries.
JSON-RPC — POST named content.list and content.get operations with request IDs. Uses the same publication and workspace rules.
Make a first request
Publish a sample entry, replace the placeholders, and run this in a terminal. An empty data array is a successful request with no matching published entries. Continue with your chosen guide for response details, item reads and pagination.
curl --get 'https://YOUR_CMS_HOST/api/v1/projects/YOUR_WORKSPACE_UUID/content/content_item' \
-H 'Authorization: Bearer YOUR_PUBLIC_KEY' \
--data-urlencode 'limit=5' \
--data-urlencode 'locale=en'