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

# Fetch a page by id or slug



## OpenAPI

````yaml /openapi.yaml get /pages/{id_or_slug}
openapi: 3.1.0
info:
  title: Neural Draft Project API
  version: 1.0.1
  summary: The AI-native backend platform for Lovable / Claude / v0 / Bolt-built sites.
  description: |
    The **Neural Draft Project API** is the single REST contract every AI-built
    site, MCP server tool call, and SDK in our ecosystem speaks against. One
    project key (`ndsk_live_...`) gets you CMS, blog, social, booking and
    commerce primitives behind a stable v1 surface.

    ## Quick start

    ```bash
    curl https://api.neuraldraft.io/v1/projects/me \
      -H "Authorization: Bearer ndsk_live_yourkey"
    ```

    ## Authentication

    Every endpoint except `GET /health` requires a project API key passed as
    `Authorization: Bearer ndsk_live_...`. Keys are scoped to a single project
    (formerly "tenant"). Resolve the project context by calling
    `GET /projects/me`.

    Keys carry one or more **scopes** (e.g. `content:write`, `commerce:admin`).
    A `403 Forbidden` is returned if the key lacks the scope required by the
    endpoint.

    ## Credits

    Most operations cost credits. Costs are documented per endpoint in this
    spec and on the [pricing page](https://neuraldraft.io/pricing). When a
    project has no credits left, every credit-consuming operation returns
    `402 Payment Required` with `code: insufficient_credits`. The response
    includes `cost` (credits the operation needed) and `balance` (credits the
    project had on hand) so clients can render an exact top-up prompt.

    Read-only endpoints (`GET`) do not consume credits. Mutating writes —
    upserting a content key, creating or updating a page, registering an
    image (URL swap or multipart upload) — cost **1 credit** each on top of
    the AI-generation costs documented per endpoint.

    ## Rate limits

    Default project budget is **60 requests per minute**, burst **120**. Every
    response includes:

    | Header | Meaning |
    |---|---|
    | `X-RateLimit-Limit` | Window ceiling |
    | `X-RateLimit-Remaining` | Requests left in window |
    | `X-RateLimit-Reset` | Unix seconds when bucket refills |
    | `Retry-After` | Seconds to wait, only on `429` |

    Enterprise plans get higher budgets — contact sales.

    ## Async work

    Long-running operations (blog generation, image generation, batch
    translation, content plans, full website generation) return a
    [`Job`](#tag/Jobs) resource immediately with `202 Accepted` and
    `status: pending`. Two ways to track progress:

    1. **Poll** `GET /jobs/{id}` until `status` is one of `completed`,
       `failed` or `cancelled`.
    2. **Stream** `GET /jobs/{id}/stream` for a Server-Sent Events feed of
       `progress`, `step`, `done`, `error` events.

    ## Webhooks

    Outgoing webhooks let your project URL receive events (e.g.
    `order.paid`, `blog_post.published`). Manage delivery URLs at
    [`/webhook-endpoints`](#tag/Webhooks). Every delivery is signed with
    HMAC-SHA256:

    ```
    X-Neural-Draft-Signature: t=1745000000,v1=<hex_hmac_sha256(body, secret)>
    X-Neural-Draft-Event: order.paid
    X-Neural-Draft-Delivery: <uuid>
    ```

    Verify the timestamp is within 5 minutes and the HMAC matches before
    trusting the payload.

    ## Idempotency

    Mutating endpoints accept an `Idempotency-Key` header (any unique string
    up to 255 chars). Retries with the same key within 24 hours return the
    original response without re-executing the side effect.

    ## Errors

    All errors follow [RFC 7807](https://datatracker.ietf.org/doc/html/rfc7807)
    `application/problem+json` shape. The `code` field is a stable machine
    identifier; the `detail` is a human-readable explanation.
  termsOfService: https://neuraldraft.io/legal/terms
  contact:
    name: Neural Draft Support
    email: info@neuraldraft.io
    url: https://neuraldraft.io/support
  license:
    name: Proprietary
    url: https://neuraldraft.io/legal/api-license
  x-logo:
    url: https://neuraldraft.io/assets/logo-dark.svg
    altText: Neural Draft
servers:
  - url: https://api.neuraldraft.io/v1
    description: Production
  - url: https://api.staging.neuraldraft.io/v1
    description: Staging
security:
  - apiKeyAuth: []
tags:
  - name: Health
    description: Liveness, version, and the runtime OpenAPI document.
  - name: Projects
    description: >
      Project (formerly "tenant") metadata, API key management, and credit
      usage.

      Every API key resolves to exactly one project.
  - name: Brand
    description: |
      Canonical brand context — voice, colors, fonts, audience, content tone.
      This is the single source of truth that the MCP server's `brand://current`
      resource exposes to AI codegen tools.
  - name: Content
    description: |
      The CMS pillar. Translation keys map `dot.notation` keys to per-language
      values. Use `bulk` for build-time fetches of many keys at once.
  - name: Components
    description: >
      Editable HTML chunks registered by AI codegen tools during a build
      session.

      A registered component becomes editable in the project's admin UI.
  - name: Pages
    description: |
      Multi-page authoring with per-page SEO meta (meta_title, meta_description,
      og_*, canonical_url). Pages live alongside the components that render
      them.
  - name: Galleries
    description: |
      Named, ordered image collections. One `slug` per gallery, an `items`
      array of `{url, alt}` (max 200). Updates are full-replace — fetch,
      mutate, send the complete new list back. Use for carousels, lookbooks,
      product galleries, and any other variable-length image set.
  - name: Images
    description: Brand-consistent image generation, replacement, and resolution by key.
  - name: Blog
    description: |
      Full blog engine — posts, categories, tags, scheduling, multi-language
      translation, AI authoring pipeline.
  - name: Social
    description: |
      Social pillar — multi-platform post generation, scheduling, publishing,
      OAuth account connections.
  - name: Booking
    description: |
      Booking pillar — bookable services, weekly availability, slot lookup,
      bookings (admin + public), embeddable widget.
  - name: Commerce
    description: |
      Commerce pillar — products, variants, categories, orders, Stripe
      Checkout, Stripe Connect onboarding, embeddable widgets.
  - name: Jobs
    description: |
      Async work tracking. Every long-running AI op (blog gen, image gen,
      translation, content plan, website gen) returns a Job. Poll or stream.
  - name: Webhooks
    description: |
      Outgoing webhooks. Subscribe a URL to events your project cares about.
      All deliveries signed with HMAC-SHA256.
  - name: Forms
    description: |
      Lead-capture surfaces — newsletter subscribe and contact-form submit.
      Public submit endpoints (no auth, project resolved via
      `X-NeuralDraft-Project-Key` or `?project_id=`); admin list/delete
      endpoints require an API key with `forms:read` / `forms:write` scope.
      No credits charged — this is storage + delivery, not AI.
paths:
  /pages/{id_or_slug}:
    get:
      tags:
        - Pages
      summary: Fetch a page by id or slug
      operationId: getPage
      parameters:
        - in: path
          name: id_or_slug
          required: true
          schema:
            type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/Page'
        '404':
          description: Not found.
      security:
        - apiKeyAuth: []
components:
  schemas:
    Page:
      type: object
      required:
        - id
        - slug
        - title
        - type
        - is_homepage
        - is_active
      properties:
        id:
          type: integer
          example: 42
        slug:
          type: string
          example: about
        title:
          type: string
          example: About us
        type:
          type: string
          enum:
            - landing
            - blog_list
            - blog_post
            - legal
          default: landing
        is_homepage:
          type: boolean
          example: false
        is_active:
          type: boolean
          example: true
        exclude_from_search:
          type: boolean
          example: false
        meta_title:
          type:
            - string
            - 'null'
          example: About — Acme
        meta_description:
          type:
            - string
            - 'null'
        og_title:
          type:
            - string
            - 'null'
        og_description:
          type:
            - string
            - 'null'
        og_image:
          type:
            - string
            - 'null'
          format: uri
        canonical_url:
          type:
            - string
            - 'null'
          format: uri
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
  securitySchemes:
    apiKeyAuth:
      type: http
      scheme: bearer
      bearerFormat: API Key
      description: |
        Project API key. Pass as `Authorization: Bearer ndsk_live_...`. Manage
        keys via [`/projects/me/api-keys`](#tag/Projects). Test-mode keys use
        the `ndsk_test_` prefix.

````