Getting Started
From zero to content served over the API, step by step.
1. Create your account
Sign up at your workspace's signup page (locally: http://localhost:3000/signup)
with a company name and work email, then confirm the verification email. You can
also use Continue with Google / GitHub — a personal workspace is created
automatically on first sign-in.
2. Create a space
A space holds one project's content: its content model, entries, media,
locales, and API keys. The onboarding wizard creates your first space; more can
be added from the space switcher. Every space starts with a master
environment.
3. Model your first content type
Go to Content model → Add content type and define fields:
title— Text, localized, requiredslug— Slug. Leave "Entries of this type have their own page" checked and this is added for you; it is what gives each entry a URL. Reusable blocks (a hero, a card) skip it.body— Rich texthero_image— Media
Mark a field as the display field so entries have readable titles. Add
reference / reference_many fields to compose assemblies (e.g. a
landing_page that references hero and card blocks).
4. Create and publish an entry
Under Content → Add entry, pick your content type and write. The right-hand
panel shows the live preview; switch locale tabs to translate, or use
AI translate to prefill. Connect your site's GitHub repository under
Code Sync and that preview becomes your own deployed page,
editable in place. When ready, move the entry through the workflow:
draft → in review → published.
5. Create an API key
Under Settings → API keys, create a Delivery key. Copy the one-time
token — it looks like cms_del_… and is only shown once. Delivery keys see
published content; Preview keys (cms_pre_…) also see drafts.
6. Fetch it
With curl:
curl "http://localhost:8000/spaces/<spaceId>/environments/master/delivery/entries?content_type=article" \
-H "Authorization: Bearer cms_del_..."
Or with the SDK:
import { createClient } from '@ondros/sdk';
const client = createClient({
host: 'http://localhost:8000',
spaceId: '<spaceId>',
environment: 'master',
accessToken: process.env.CMS_DELIVERY_TOKEN!,
});
const { entry } = await client.getEntryBySlug({
contentType: 'article',
slug: 'hello-world',
include: 2,
});
includeresolves linked entries/assets up to 3 levels deep, so assembly pages arrive with their nested blocks in one request.
Next steps
- Understand the data model in Core Concepts
- Explore the full SDK Reference
- Keep your builds in sync with Webhooks