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

# Content

## Worked content samples

The endpoint list below documents every operation's parameters; this
overlay walks a CMS content page the way a lobby page or static-publisher
integration actually uses it: **list the published pages → fetch one
page → handle a delete when a landing campaign ends**. Success envelopes
are `{ data, meta }`, error envelopes `{ error, meta }` — see [How to
read a worked sample](/guides/using-orbit-samples). Content endpoints are
org-admin scoped; the read paths accept any tenant-scoped API key, the
write paths require owner or admin.

Every response carries `meta.request_id`. Quote the request id when you
report a deleted page still cached in the tenant's CDN, or a fetch that
404s on an id the dashboard still lists.

### 1. List content pages

`GET /api/v1/content/pages` returns the pages your tenant has published —
landing pages, help decoys, email-copy blocks — with cursor pagination.
Use this to manage the content block id you hand to a personalization
slot or a flow.

<CodeGroup>
  ```bash cURL theme={null}
  curl -X GET "https://api.orbit.devotel.io/api/v1/content/pages" \
    -H "X-API-Key: dv_test_sk_YOUR_KEY"
  ```

  ```typescript Node.js theme={null}
  const res = await fetch(
    "https://api.orbit.devotel.io/api/v1/content/pages",
    {
      headers: { "X-API-Key": process.env.ORBIT_API_KEY! },
    },
  );
  console.log(await res.json());
  ```
</CodeGroup>

```json 200 theme={null}
{
  "data": {
    "pages": [
      {
        "id": "pg_8fb2d1b7c00c4ec9",
        "slug": "welcome-flow",
        "title": "Welcome flow",
        "status": "published",
        "updated_at": "2026-08-01T12:00:00.000Z"
      }
    ],
    "pagination": { "cursor": null, "has_more": false }
  },
  "meta": {
    "request_id": "req_ctn_list",
    "timestamp": "2026-08-26T12:00:00.000Z"
  }
}
```

### 2. Fetch one page

`GET /api/v1/content/pages/{id}` returns a single page entity — body,
metadata, and the raw content blob the builder captured — for a
downstream renderer or editor. A deleted page returns 404.

<CodeGroup>
  ```bash cURL theme={null}
  curl -X GET \
    "https://api.orbit.devotel.io/api/v1/content/pages/pg_8fb2d1b7c00c4ec9" \
    -H "X-API-Key: dv_test_sk_YOUR_KEY"
  ```

  ```typescript Node.js theme={null}
  const res = await fetch(
    "https://api.orbit.devotel.io/api/v1/content/pages/pg_8fb2d1b7c00c4ec9",
    {
      headers: { "X-API-Key": process.env.ORBIT_API_KEY! },
    },
  );
  console.log(await res.json());
  ```
</CodeGroup>

### 3. Create a page

`POST /api/v1/content/pages` stores a new page centrally so a flow, a
widget, or the dashboard can resolve it by id. The create endpoint is
idempotent via the `Idempotency-Key` header — the same key replays the
original response for 24h on success.

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST "https://api.orbit.devotel.io/api/v1/content/pages" \
    -H "X-API-Key: dv_test_sk_YOUR_KEY" \
    -H "Content-Type: application/json" \
    -H "Idempotency-Key: ctn-create-2026-08-26-0001" \
    -d '{
    "slug": "checkout-thanks",
    "title": "Checkout thanks",
    "body": "<p>Thanks for your order.</p>"
  }'
  ```

  ```typescript Node.js theme={null}
  const res = await fetch(
    "https://api.orbit.devotel.io/api/v1/content/pages",
    {
      method: "POST",
      headers: {
        "X-API-Key": process.env.ORBIT_API_KEY!,
        "Content-Type": "application/json",
        "Idempotency-Key": "ctn-create-2026-08-26-0001",
      },
      body: JSON.stringify({
        slug: "checkout-thanks",
        title: "Checkout thanks",
        body: "<p>Thanks for your order.</p>",
      }),
    },
  );
  console.log(await res.json());
  ```
</CodeGroup>

```json 200 theme={null}
{
  "data": {
    "id": "pg_8fb2d1b7c00c4eca",
    "slug": "checkout-thanks",
    "status": "published"
  },
  "meta": {
    "request_id": "req_ctn_create",
    "timestamp": "2026-08-26T12:01:00.000Z"
  }
}
```

### 4. Errors

Errors follow the `{ error, meta }` envelope. The failure every content
editor hits:

**422 — bot-protection or body validation.** An unsigned ingestion, a
Turnstile gate blocking a public form submission, or a slug collision:

```json 422 theme={null}
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "slug must be unique across published pages.",
    "status": 422
  },
  "meta": {
    "request_id": "req_ctn_err",
    "timestamp": "2026-08-26T12:02:00.000Z"
  }
}
```
