> ## Documentation Index
> Fetch the complete documentation index at: https://docs.frontic.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Contentful

<div style={{ display: "flex", gap: "1.75rem", alignItems: "flex-start", marginTop: "0.5rem", marginBottom: "1.75rem" }}>
  <img src="https://mintcdn.com/frontic/zwqcoY8MRIYLLSYv/images/connectors/contentful.svg?fit=max&auto=format&n=zwqcoY8MRIYLLSYv&q=85&s=acfd149900bd815dbfa6b6d29ef29f41" alt="Contentful" style={{ height: "56px", width: "auto", flexShrink: 0, marginTop: "0.25rem" }} width="24" height="24" data-path="images/connectors/contentful.svg" />

  <div>
    The Contentful connector syncs entries from a Contentful space — and a specific environment — into Frontic. Each entry becomes a record on a Content feed; the connector preserves Contentful's `sys.id` as the Source ID so updates land deterministically.
  </div>
</div>

<div style={{ display: "grid", gridTemplateColumns: "repeat(3, 1fr)", gap: "0.75rem", marginBottom: "2rem" }}>
  <div style={{ padding: "0.75rem 1rem", border: "1px solid var(--card-border, rgba(0,0,0,0.08))", borderRadius: "0.625rem" }}>
    <div style={{ display: "flex", alignItems: "center", gap: "0.5rem", fontSize: "0.75rem", textTransform: "uppercase", letterSpacing: "0.04em", opacity: 0.6, marginBottom: "0.25rem" }}>
      <Icon icon="key" iconType="solid" /> Auth
    </div>

    <div style={{ fontSize: "0.875rem", fontWeight: 500 }}>Access token</div>
  </div>

  <div style={{ padding: "0.75rem 1rem", border: "1px solid var(--card-border, rgba(0,0,0,0.08))", borderRadius: "0.625rem" }}>
    <div style={{ display: "flex", alignItems: "center", gap: "0.5rem", fontSize: "0.75rem", textTransform: "uppercase", letterSpacing: "0.04em", opacity: 0.6, marginBottom: "0.25rem" }}>
      <Icon icon="arrows-rotate" iconType="solid" /> Update methods
    </div>

    <div style={{ fontSize: "0.875rem", fontWeight: 500 }}>Trigger · Polling</div>
  </div>

  <div style={{ padding: "0.75rem 1rem", border: "1px solid var(--card-border, rgba(0,0,0,0.08))", borderRadius: "0.625rem" }}>
    <div style={{ display: "flex", alignItems: "center", gap: "0.5rem", fontSize: "0.75rem", textTransform: "uppercase", letterSpacing: "0.04em", opacity: 0.6, marginBottom: "0.25rem" }}>
      <Icon icon="boxes-stacked" iconType="solid" /> Resources
    </div>

    <div style={{ fontSize: "0.875rem", fontWeight: 500 }}>Content entries</div>
  </div>
</div>

The Contentful connector follows the standard integration model — see [how integrations work](/connectors/overview) for Connection, Channels, and Data Feeds. This page covers the Contentful-specific configuration.

## Connection settings

<ParamField path="Space ID" type="string" required>
  Your Contentful space ID — find it in Contentful under **Settings → General settings**.
</ParamField>

<ParamField path="Access Token" type="string" required>
  A Content Delivery API token (read-only) for your space, with access to the environments you'll connect.
</ParamField>

## Channels

A Contentful channel carries which translations the connector pulls per entry.

<ParamField path="Channel Name" type="string" required>
  A label for the channel in Frontic.
</ParamField>

<ParamField path="Available Translations" type="multiselect" required>
  Contentful locale codes the connector pulls per entry.
</ParamField>

<ParamField path="Fallback Translation" type="select" required>
  The translation used when an entry field is missing in another locale.
</ParamField>

## Data Feeds

The Contentful connector exposes one feed type:

| Feed        | What it pulls                                                                                   |
| ----------- | ----------------------------------------------------------------------------------------------- |
| **Content** | Every entry in the configured space and environment, with the Source ID resolved from `sys.id`. |

The standard **Settings → Updates → Schema** setup wizard applies — see [Data Feeds in the overview](/connectors/overview#data-feeds). For Contentful specifically:

### Per-feed config

<ParamField path="Environment" type="string" default="master">
  Which Contentful environment this feed reads from. Defaults to `master`. Use this to point a feed at a sandbox/preview environment without changing the connection itself.
</ParamField>

### Update methods

* **Trigger** — wire a Contentful webhook (Settings → Webhooks) to the feed's inbound webhook URL to push changes in near-real-time.
* **Polling** — scheduled refresh.

The connector does not expose a manual feed Refresh — use Polling or trigger a webhook from Contentful to backfill.

## What the data looks like

### Source ID

Each record's Source ID is taken from Contentful's `sys.id`. References between entries (`sys.type === "Link"`) come through on the raw payload — resolve them in your Data Sync if you want denormalized fields.

### Assets

Contentful asset entries come through alongside content entries. If you want them on a dedicated storage, configure a separate feed and filter by content type at the Data Sync layer.

## Good to know

* **Read-only via the connector.** Edits happen in Contentful. The Ingest API path is for systems that supplement Contentful with extra records, not for editing entries.
* **Reference resolution lives in the Data Sync.** The connector emits entries with `Link` references intact; resolution into denormalized fields is your Value Composer's job.

## Related

<CardGroup cols={2}>
  <Card title="Storyblok" icon="cube" href="/connectors/storyblok">
    Storyblok's connector — draft mode and folder filters.
  </Card>

  <Card title="Custom Integration" icon="paintbrush-fine" href="/connectors/custom">
    For pushing supplemental records via the Ingest API.
  </Card>
</CardGroup>
