How to Model Content and Fetch It With the Contentful API

October 22, 2026

Contentful splits into a web app where you define content types and a Delivery API that serves published entries as JSON. The workflow is: create a content type with fields, add entries, publish, then fetch with a space ID and access token. Setup to first successful curl is under half an hour.

What takes longer is content modeling, and mistakes there are expensive because changing a content type after 5,000 entries exist means a migration script.

What Is Contentful?

Contentful is an API-first CMS: a hosted database of structured content with a read API, a preview API for drafts, and a management API for schema changes. There is no built-in front end. You get JSON and build the site yourself.

Its audience is teams with several surfaces — web, app, and a partner feed — pulling from the same content model. A single-channel blog gets little benefit and a lot of setup cost.

How Do I Create a Content Type?

In the web app, go Content model → Add content type, name it blogPost, and set the API identifier (lowercase, camelCase). Then add fields.

Fields worth getting right on the first pass:

  • Title — Short text, required.
  • Slug — Short text with a unique validation, because duplicate slugs break routing.
  • Body — Rich text, not Long text. Rich text renders to structured JSON you can map to your components.
  • Author — Reference field pointing to an author type. Setting the reference cardinality to many versus one now saves a migration later.
  • Publish date — Date and time.

Adding a validation rule at field level — say, maximum 160 characters on a summary — prevents a class of front-end layout bugs that no amount of CSS survives.

How Do I Fetch Entries From the Delivery API?

Two credentials: the space ID and a Delivery API access token (read-only, safe for a client bundle in principle, but keep it server-side anyway if you can).

GET https://cdn.contentful.com/spaces/SPACE_ID/environments/master/entries?content_type=blogPost&limit=10

Responses include items and includes. Linked entries arrive in includes.Entry, not nested inside each item — that catches everyone once. You resolve references yourself or use the SDK, which does it for you.

How Do Drafts and Locales Work?

Drafts only appear via the Preview API at preview.contentful.com, which needs a separate Preview token. The Delivery API always returns the last published version, so an editor’s unpublished changes are invisible in production by design.

Locales are set at the space level. Every field then has per-locale values. Query with &locale=de-DE and Contentful falls back to the space default for missing translations; use &locale=* to get every locale in one response when you need to compare them.

What Does Contentful Cost in 2026?

The free Community tier includes 5 users, 25,000 entries, 48 content types, and 1 million API calls per month. That is a real ceiling: 25,000 entries sounds huge until you have a product catalog.

The next tier is roughly $300 per month billed annually, which is a steep jump from zero. Compare that with a self-hosted option before assuming it is worth it — Contentful’s price reflects the management UI and enterprise compliance, not raw hosting.

Where Contentful Gets Awkward

Publishing is per-entry, so a change to an author name does not propagate to posts automatically; those still show the old name until republished. Bulk publishing exists but is a management API script, not a UI button.

The rich text model is verbose JSON. Rendering it requires a per-node-type mapper, and every new embedded content type needs a new case in that mapper.

Who Should Use Contentful

Use it when you have multiple channels, several editors, and a team that can afford the tier jump. Skip it for a single blog or a marketing site with under 500 entries — the free tier’s good, but the migration cost at scale is real and the paid tier is priced for companies.

Quick Summary

  • Contentful is an API-first CMS with a Delivery API for published entries and a Preview API for drafts.
  • Linked entries appear in includes, not nested in items.
  • Free tier: 5 users, 25,000 entries, 1M API calls per month.
  • Locales are space-wide; every field has per-locale values with fallback.
  • Rich text is JSON that needs a node mapper in your front end.