Getting started
Introduction
What Graph is, and the pieces your code talks to.
Graph is a headless content management system. Your team defines content types (the shape of a blog post, a product, a landing page) and writes entries in the dashboard. Your code then reads, and if it needs to, writes, that content over an API.
The pieces
- The dashboard at app.graphcms.io is where content types, entries, media, languages and API keys are managed.
- The REST API at
https://api.graphcms.io/v1serves content types and entries as JSON. It is the simplest way to read content from a website or app. - The GraphQL API at
https://api.graphcms.io/graphqlcovers the same content, plus every write: creating, updating, publishing and deleting entries, and managing content types. - The JavaScript SDK,
@graphcms/sdk, wraps both APIs with typed methods and error classes.
Both APIs use the same API keys, and each key carries only the permissions you give it. See Authentication & API keys.
Base URLs
| Service | Production | Local development |
|---|---|---|
| REST | https://api.graphcms.io/v1 | http://localhost:3004/v1 |
| GraphQL | https://api.graphcms.io/graphql | http://localhost:3004/graphql |
| Dashboard | https://app.graphcms.io | http://app.localhost:3000 |
The API runs separately from the dashboard, so it can be hosted and scaled on its own. The local URLs apply when you run Graph yourself. The older /api/v1/... and /api/graphql paths still work too (https://api.graphcms.io/api/v1/...); that longer form is what the SDK calls under the hood.
Content model
A content type has a name, a slug (blog-posts) and an ordered list of fields. Each field has a slug, a type and options such as whether it is required. The field types are:
text, textarea, html, datetime, color, media, reference, number, boolean, select, json, repeater and section (a heading that groups fields in the editor; it holds no value).
An entry belongs to one content type. Besides its field values it has a title, a slug unique within its type, a status (draft, published or archived), a language, and timestamps. Field values come back as one fields object keyed by field slug, with every field of the type (null when nothing is saved):
{ "id": "k3x9m2p7q1a4", "title": "Hello, world", "slug": "hello-world", "status": "published", "language": "en-US", "locale": "en-US", "fields": { "excerpt": "Our first post.", "body": "<p>Welcome to the blog.</p>", "featured": true }, "publishedAt": "2026-09-30T14:02:11.000Z", "createdAt": "2026-09-30T13:55:40.000Z", "updatedAt": "2026-09-30T14:02:11.000Z"}IDs are 12-character lowercase strings. Slugs are what you will usually use in URLs.
Environments and languages
Content types and entries live in an environment: production, which the API serves by default, or staging, a copy you can change and preview before pushing to production. Any request can ask for staging. See Environments.
Text fields can be translated into the languages your workspace enables, and any request can ask for a locale. See Localization.
Where to next
- Quick start: a key and your first request in a few minutes.
- Entries: the REST endpoints you will use most.
- GraphQL overview: when you need writes, or exactly the fields you ask for.