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

# Add a page

> Creates a page on the draft. `slug` becomes its URL path segment and must be unique on the site; it is lowercased and stripped of surrounding slashes.
Adding a page does not link to it - update the header's `navItems` and the footer's links afterwards, or visitors will never find it.




## OpenAPI

````yaml /openapi-platform.json post /v1/platform/website/pages
openapi: 3.0.0
info:
  title: 1club Platform API
  version: 1.0.0
  description: >-
    The 1club Platform API lets you programmatically access and manage your
    organization's data.


    ## Official API Contract


    This documentation is the official source of truth for the 1club Platform
    API.

    If an integration relies on undocumented endpoints, fields, response shapes,
    or internal behavior outside this spec, we can't guarantee backward
    compatibility.

    Build against what's documented here to stay stable as the platform evolves.


    ## Authentication


    All requests require a customer API key passed as a Bearer token:


    ```

    Authorization: Bearer 1club_sk_live_...

    ```


    Generate API keys from the admin portal under **Settings > API Tokens**.

    The key is tied to your organization - all responses are scoped to your
    org's data.


    ## Rate Limiting


    - **100 requests per minute** per API key

    - When exceeded, the API returns `429 Too Many Requests` with a
    `Retry-After` header

    - Rate limit headers are included in every response:
      - `X-RateLimit-Limit` - max requests per window
      - `X-RateLimit-Remaining` - requests remaining
      - `X-RateLimit-Reset` - seconds until the window resets

    ## Errors


    | Status | Meaning |

    |--------|---------|

    | `400` | Invalid request parameters |

    | `401` | Missing or invalid API key |

    | `404` | Resource not found (or doesn't belong to your organization) |

    | `429` | Rate limit exceeded |

    | `500` | Internal server error |
  contact:
    name: 1club API Support
    email: support@1club.ai
servers:
  - url: https://api.1club.ai
    description: Production API
security:
  - customerApiAuth: []
tags: []
paths:
  /v1/platform/website/pages:
    post:
      tags:
        - Website
      summary: Add a page
      description: >
        Creates a page on the draft. `slug` becomes its URL path segment and
        must be unique on the site; it is lowercased and stripped of surrounding
        slashes.

        Adding a page does not link to it - update the header's `navItems` and
        the footer's links afterwards, or visitors will never find it.
      parameters:
        - in: query
          name: siteId
          schema:
            type: integer
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - slug
                - title
              properties:
                slug:
                  type: string
                  description: >-
                    Lowercase letters, numbers and hyphens, e.g.
                    "personal-training"
                title:
                  type: string
                isHomepage:
                  type: boolean
                  description: >-
                    Makes this the homepage, clearing the flag on whichever page
                    held it
                sections:
                  type: array
                  description: >-
                    Initial sections. See GET /section-types for the types and
                    their config.
                  items:
                    type: object
                    required:
                      - type
                    properties:
                      type:
                        type: string
                      config:
                        type: object
                      translations:
                        type: object
                metaTitle:
                  type: string
                  nullable: true
                  description: SEO title. Falls back to the page title.
                metaDescription:
                  type: string
                  nullable: true
                  description: Falls back to `seoSettings.siteDescription`.
                ogImage:
                  type: string
                  nullable: true
                  description: >-
                    Absolute URL. Get one from GET /media rather than composing
                    it.
                noindex:
                  type: boolean
                  nullable: true
                  description: >
                    Ask search engines not to index this page, and leave it out
                    of `sitemap.xml`. For thank-you pages and campaign landing
                    variants. The page stays publicly reachable - this is not a
                    privacy control.
                translations:
                  type: object
                  nullable: true
                  description: >
                    Per-locale `metaTitle`/`metaDescription`, keyed by locale:
                    `{ "bg": { "metaTitle": "…" } }`. Replaces the whole map.
                    `ogImage` is not localizable - one social card serves every
                    locale.

                    An override only reaches a visitor for a locale the
                    organization actually serves: check `supportedLocales` on
                    `GET /website` and add the locale there first, or the
                    translation has no URL to be served at.
                  additionalProperties:
                    type: object
                    additionalProperties: false
                    properties:
                      metaTitle:
                        type: string
                      metaDescription:
                        type: string
      responses:
        '201':
          description: The created page
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PlatformWebsitePage'
        '400':
          description: Invalid slug, invalid section type, or the page limit is reached
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PlatformError'
        '401':
          $ref: '#/components/responses/PlatformUnauthorized'
        '403':
          description: API key is missing the required `website:write` scope
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PlatformError'
        '409':
          description: A page with that slug already exists
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PlatformError'
        '429':
          $ref: '#/components/responses/PlatformRateLimited'
      security:
        - customerApiAuth: []
components:
  schemas:
    PlatformWebsitePage:
      type: object
      description: A page on the website draft.
      properties:
        slug:
          type: string
          description: >-
            URL path segment. The homepage is served at "/" regardless of its
            slug.
        title:
          type: string
        isHomepage:
          type: boolean
        sectionCount:
          type: integer
        sectionTypes:
          type: array
          items:
            type: string
        sections:
          type: array
          description: Present when fetching a single page; omitted from list responses.
          items:
            $ref: '#/components/schemas/PlatformWebsiteSection'
        metaTitle:
          type: string
          nullable: true
        metaDescription:
          type: string
          nullable: true
        ogImage:
          type: string
          nullable: true
        noindex:
          type: boolean
          description: >-
            True when the page asks search engines not to index it and is left
            out of `sitemap.xml`.
        translations:
          type: object
          nullable: true
          description: >-
            Per-locale `metaTitle`/`metaDescription` overrides, keyed by locale:
            { "bg": { "metaTitle": "…" } }. Present when fetching a single page.
          additionalProperties:
            type: object
            properties:
              metaTitle:
                type: string
              metaDescription:
                type: string
        seo:
          $ref: '#/components/schemas/PlatformWebsitePageSeo'
        url:
          type: string
          description: The page's public URL once published.
    PlatformError:
      type: object
      properties:
        error:
          type: string
    PlatformWebsiteSection:
      type: object
      description: >-
        One section of a page or of the site layout. `config` fields depend on
        `type` - see GET /v1/platform/website/section-types for the definitions.
      properties:
        type:
          type: string
          description: Section type, e.g. "hero", "plans", "faq", "header".
        config:
          type: object
          additionalProperties: true
        translations:
          type: object
          additionalProperties: true
          description: >-
            Per-locale overrides for the section's translatable string fields,
            keyed by locale then field: { "bg": { "headline": "…" } }. Config
            values themselves stay in the default language.
    PlatformWebsitePageSeo:
      type: object
      description: >-
        What the published page will actually put in its `<head>`, after every
        fallback has been applied - the authored fields alone do not answer "is
        my SEO right?". Present when fetching a single page. Read-only.
      properties:
        metaTitle:
          type: string
          description: The `<title>`, after falling back to the page title.
        metaDescription:
          type: string
          nullable: true
          description: After falling back to `seoSettings.siteDescription`.
        ogImage:
          type: string
          nullable: true
          description: After falling back to `seoSettings.defaultOgImage`.
        canonicalUrl:
          type: string
          description: >-
            The `rel=canonical` the default-locale render emits, locale prefix
            included.
        indexable:
          type: boolean
          description: Whether search engines are asked to index this page.
        notIndexableReason:
          type: string
          nullable: true
          enum:
            - page_noindex
            - site_unpublished
            - site_inactive
          description: >-
            Why `indexable` is false. An unpublished or switched-off site is not
            indexable however the page is configured.
        localizedLocales:
          type: array
          items:
            type: string
          description: Locales carrying their own metaTitle/metaDescription overrides.
  responses:
    PlatformUnauthorized:
      description: Invalid or missing API key
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/PlatformError'
    PlatformRateLimited:
      description: Rate limit exceeded
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/PlatformError'
  securitySchemes:
    customerApiAuth:
      type: http
      scheme: bearer
      description: >-
        Organization-scoped bearer credential: a customer API key
        (1club_sk_live_...) or an MCP OAuth access token.

````