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:

  • titleText, localized, required
  • slugSlug (auto-generates from the display field)
  • bodyRich text
  • hero_imageMedia

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. 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,
});

include resolves linked entries/assets up to 3 levels deep, so assembly pages arrive with their nested blocks in one request.

Next steps