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

# Get a page

> A Page's details, and its current HTML on request.

Read any live Page in the workspace, whichever bot owns it.

## Authorization

<ParamField header="Authorization" type="string" required>
  `Bearer mac_live_…`
</ParamField>

## Path parameters

<ParamField path="page_id" type="string" required>
  The Page's id.
</ParamField>

## Query parameters

<ParamField query="include" type="string">
  `content` to include the current version's HTML.
</ParamField>

## Response

<ResponseField name="ok" type="boolean">
  `true` on success.
</ResponseField>

<ResponseField name="page" type="object">
  The Page. This is the shape every Pages endpoint returns.

  <Expandable title="properties">
    <ResponseField name="id" type="string">
      The Page's id.
    </ResponseField>

    <ResponseField name="slug" type="string">
      The current URL name.
    </ResponseField>

    <ResponseField name="title" type="string">
      Up to 150 characters.
    </ResponseField>

    <ResponseField name="description" type="string | null">
      Up to 300 characters.
    </ResponseField>

    <ResponseField name="visibility" type="string">
      `private` or `public`.
    </ResponseField>

    <ResponseField name="chatbot_id" type="string | null">
      The bot that owns the Page. Only its keys can write to it.
    </ResponseField>

    <ResponseField name="conversation_id" type="string | null">
      The conversation the Page was created in or linked to, if any.
    </ResponseField>

    <ResponseField name="current_version" type="integer">
      The version the Page's main URL serves.
    </ResponseField>

    <ResponseField name="version_count" type="integer">
      Versions still kept, after pruning.
    </ResponseField>

    <ResponseField name="total_bytes" type="integer">
      Storage used by the kept versions.
    </ResponseField>

    <ResponseField name="disabled_reason" type="string | null">
      Set when an admin disabled the Page. It stops serving and rejects writes.
    </ResponseField>

    <ResponseField name="created_at" type="string">
      ISO 8601, UTC.
    </ResponseField>

    <ResponseField name="updated_at" type="string">
      Last version or metadata change.
    </ResponseField>

    <ResponseField name="url" type="string">
      The link to hand a human: the members-only door for `private`, the Page itself for `public`.
    </ResponseField>

    <ResponseField name="content" type="string">
      The current HTML. Only with `include=content`.
    </ResponseField>
  </Expandable>
</ResponseField>

<RequestExample>
  ```bash curl theme={null}
  curl "https://app.my-aichatbot.com/api/v1/pages/$PAGE_ID?include=content" \
    -H "Authorization: Bearer $MAC_KEY"
  ```

  ```javascript Node.js theme={null}
  const res = await fetch(
    `https://app.my-aichatbot.com/api/v1/pages/${pageId}?include=content`,
    { headers: { Authorization: `Bearer ${process.env.MAC_KEY}` } }
  )

  const { page } = await res.json()
  ```

  ```python Python theme={null}
  import os, requests

  res = requests.get(
      f"https://app.my-aichatbot.com/api/v1/pages/{page_id}",
      headers={"Authorization": f"Bearer {os.environ['MAC_KEY']}"},
      params={"include": "content"},
  )

  page = res.json()["page"]
  ```
</RequestExample>

<ResponseExample>
  ```json 200 OK theme={null}
  {
    "ok": true,
    "page": {
      "id": "9b3f11c2-…",
      "slug": "sales-report",
      "title": "Sales report",
      "description": null,
      "visibility": "private",
      "chatbot_id": "c1a2…",
      "conversation_id": null,
      "current_version": 4,
      "version_count": 4,
      "total_bytes": 8192,
      "disabled_reason": null,
      "created_at": "2026-09-21T03:00:00.000Z",
      "updated_at": "2026-09-21T07:00:00.000Z",
      "url": "https://app.my-aichatbot.com/pages/view/acme/sales-report",
      "content": "<!doctype html>…"
    }
  }
  ```
</ResponseExample>

## Errors

| Status | Code              | Meaning                                                                 |
| ------ | ----------------- | ----------------------------------------------------------------------- |
| `401`  | `INVALID_API_KEY` | Missing, broken, or revoked.                                            |
| `404`  | `NOT_FOUND`       | No live Page with that id in this workspace.                            |
| `429`  | `RATE_LIMITED`    | Over 300 reads per minute for this key. Wait for `retry_after_seconds`. |
