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, required
  • slug — 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 text
  • hero_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,
});

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

Next steps