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

# Replace a global document

> Replaces the whole document: every field left out is reset to its default. PATCH changes only the fields sent. Completely replace a specific global document document by ID using PUT semantics

**Access:** an API key with `global:write` (or a master above it: `global:all`, `admin:all`). In published mode (the default) it goes live too, so the key also needs `global:publish` (or a master above it); send `aposMode=draft` (or a draft `_id` and no `aposMode`) to change only the draft. Custom CSS fields also need `global:css`. A signed-in person may call it as far as their own permissions allow; anyone else gets 403.

**Rate limit:** the key’s own writes-per-minute limit, set when the key is created (default 120); over it, 429 with `Retry-After`.



## OpenAPI

````yaml /api-reference/openapi.yaml put /@apostrophecms/global/{_id}
openapi: 3.1.0
info:
  title: Fetchski Attract CMS API
  description: >-
    Auto-generated OpenAPI spec for this Fetchski site instance. Authenticate
    machine-to-machine requests with an API key by sending the header
    `Authorization: ApiKey <token>`. Keys are issued in the CMS (API Keys) and
    carry scopes that limit them to specific actions. Each key also has its own
    security policy, chosen when it is created: a signing mode (token only,
    signed writes, or every request signed with the key’s signing secret via
    `X-Fetchski-Timestamp` + `X-Fetchski-Signature`), an optional network
    allowlist, and reads/writes-per-minute limits (429 with `Retry-After` over
    them). Some routes require a signature from every key — see each route.
  version: 1.0.0
servers:
  - url: https://{host}/api/v1
    description: 'Your site: set `host` to its host name.'
    variables:
      host:
        default: acme.example
security: []
tags:
  - name: Authentication
    description: >-
      Sign in as a person to get a bearer token or a session cookie.
      Integrations use an API key instead: send `Authorization: ApiKey <token>`.
  - name: SDK Packages
    description: >-
      The site’s own npm registry and Composer repository for the Attract SDKs,
      so an app installs them with one of the site’s API keys. Point npm, pnpm,
      Bun or Composer at them; the SDKs never call them.
  - name: Pages
    description: 'The page tree: each page’s content, place and URL.'
  - name: Global Content
    description: Site-wide content and settings every page shares.
  - name: Redirects
    description: Old URLs and where they now send visitors.
  - name: Internationalization
    description: The site’s locales.
  - name: Languages
    description: >-
      The site’s languages: the main language’s name and every further
      language’s name, code and Public switch. A save applies at once: a new
      language gets its home page and its own addresses (/fr/…), and its pages
      are then translated with each type’s localize routes.
  - name: Page Templates
    description: >-
      The site’s whole-page starting arrangements. They are not pages of the
      site (the Pages list leaves them out for API keys): read one, then make a
      page from it with Pages → create and `_copyingId` (`copyingId` in the
      SDKs).
  - name: Blog Posts
    description: The blog’s posts, and importing them from Markdown or MDX.
  - name: Blog Categories
    description: The categories posts are filed under.
  - name: Authors
    description: The people posts are credited to.
  - name: Team Members
    description: The people the Team section shows.
  - name: Testimonials
    description: Quotes from customers.
  - name: FAQ Items
    description: Questions and their answers.
  - name: FAQ Categories
    description: The groups questions are sorted into.
  - name: Google Reviews
    description: Reviews from the business’s Google profile, synced on a schedule.
  - name: Instagram Posts
    description: Posts from the connected Instagram account, synced on a schedule.
  - name: Service Areas
    description: The places the business serves, for the service map.
  - name: Cookies
    description: The cookies the consent banner declares.
  - name: Media
    description: The Images and Files libraries, and their tags.
  - name: Videos
    description: The Videos library.
  - name: Image Folders
    description: The folders that organize the Images library.
  - name: File Folders
    description: The folders that organize the Files library.
  - name: Video Folders
    description: The folders that organize the Videos library.
  - name: Photo Albums
    description: Hand-picked, ordered sets of photos for galleries.
  - name: Photo Feeds
    description: >-
      Feeds that collect photos from a connected photo source into the Images
      library on a schedule.
  - name: Attachments
    description: Uploading files and cropping images.
  - name: Fetchski Media
    description: >-
      Read-only discovery over the Images and Videos libraries: find what to
      reference in an MDX blog import, or which file to use, with its URLs.
  - name: Forms
    description: The site’s forms and their fields.
  - name: Form Submissions
    description: >-
      What visitors sent through the site’s forms. Submissions hold personal
      details: give a key `forms:read` only where it is needed.
  - name: Conversion Events
    description: >-
      The conversion event log — one record per conversion, with its attribution
      and consent snapshot and its delivery to each ad platform. Read it
      incrementally, post facts from other systems (a reservation purchase, a
      lead outcome), and adjust them (refunds, cancellations). One event ID
      travels everywhere as the platforms’ de-duplication key.
  - name: Visitor Attribution
    description: >-
      Per-visitor attribution on this site: first touch, last ad or campaign
      touch, and the ad platforms’ browser IDs. The join other systems use to
      attach a purchase to the marketing-site journey that led to it.
  - name: Ads Metrics
    description: >-
      Aggregates for dashboards: ad-click landings and conversions, by day,
      platform, campaign and more.
  - name: Conversions
    description: >-
      Conversion definitions — the visitor actions (a lead, a call click, a
      booking, a purchase) this site reports to the ad platforms, each with a
      row per platform. Managed by administrators in the CMS.
  - name: Webhooks
    description: >-
      Push notifications of form submissions and conversion-event changes to the
      site’s Webhook Destinations — signed with each destination’s own secret,
      retried for a day, at-least-once. Set destinations up in the CMS (Webhook
      Destinations, for people granted “Manage webhook destinations”): URL,
      events, optional filters and custom headers, and the signing secret shown
      once.
  - name: Request Log
    description: >-
      The page views the site captured (Connections → Tracking → Request log),
      and the query parameters on them: campaign tags and ad click IDs.
paths:
  /@apostrophecms/global/{_id}:
    put:
      tags:
        - Global Content
      summary: Replace a global document
      description: >-
        Replaces the whole document: every field left out is reset to its
        default. PATCH changes only the fields sent. Completely replace a
        specific global document document by ID using PUT semantics


        **Access:** an API key with `global:write` (or a master above it:
        `global:all`, `admin:all`). In published mode (the default) it goes live
        too, so the key also needs `global:publish` (or a master above it); send
        `aposMode=draft` (or a draft `_id` and no `aposMode`) to change only the
        draft. Custom CSS fields also need `global:css`. A signed-in person may
        call it as far as their own permissions allow; anyone else gets 403.


        **Rate limit:** the key’s own writes-per-minute limit, set when the key
        is created (default 120); over it, 429 with `Retry-After`.
      operationId: replaceGlobal
      parameters:
        - $ref: '#/components/parameters/DocumentId'
        - $ref: '#/components/parameters/AposMode'
        - $ref: '#/components/parameters/AposLocale'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Global'
      responses:
        '200':
          description: Global replaced successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Global'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalServerError'
      security:
        - ApiKeyAuth:
            - global:write
        - BearerAuth: []
      x-codeSamples:
        - lang: typescript
          label: TypeScript
          source: >-
            import { createSiteClient } from '@fetchski/attract-cms-sdk';


            const site = createSiteClient();

            const globalContent = await site.globalContent().replaceGlobal({ id:
            'ckitdo5oq004pu69kr6oxo6fr:en:published', cookiePolicyVersion: '1',
            cookieMessage: 'This website uses cookies to supplement a balanced
            diet and provide a much deserved reward to the senses after
            consuming bland but nutritious meals. Accepting our cookies is
            optional but recommended, as they are delicious.',
            cookieAcceptLabel: 'Accept all', cookieRejectLabel: 'Reject all',
            cookiePrefsTitle: 'Cookie preferences' });
        - lang: php
          label: Laravel
          source: >-
            use Fetchski\AttractCmsLaravel\Facades\Attract;


            $globalContent = Attract::globalContent()->replaceGlobal(id:
            'ckitdo5oq004pu69kr6oxo6fr:en:published', cookiePolicyVersion: '1',
            cookieMessage: 'This website uses cookies to supplement a balanced
            diet and provide a much deserved reward to the senses after
            consuming bland but nutritious meals. Accepting our cookies is
            optional but recommended, as they are delicious.',
            cookieAcceptLabel: 'Accept all', cookieRejectLabel: 'Reject all',
            cookiePrefsTitle: 'Cookie preferences');
components:
  parameters:
    DocumentId:
      name: _id
      in: path
      required: true
      description: >-
        Computed document ID (can optionally include mode and locale, e.g.,
        id:en:published)
      schema:
        type: string
        pattern: ^\S+$
        example: ckitdo5oq004pu69kr6oxo6fr:en:published
    AposMode:
      name: aposMode
      in: query
      description: >-
        `published` (the default) or `draft`. Drafts need a credential that may
        see them: an API key with the type’s write scope
        (`content:<type>:write`), or a signed-in editor. The public and a key
        with only the read scope get 403.
      required: false
      schema:
        type: string
        enum:
          - draft
          - published
        default: published
      example: published
    AposLocale:
      name: aposLocale
      in: query
      description: >-
        The locale to read or write, e.g. `en` (default: the site’s default
        locale).
      required: false
      schema:
        type: string
        example: fr
  schemas:
    Global:
      type: object
      description: >-
        The site-wide settings document (one per site and locale), with the
        fields this site adds.
      properties:
        _id:
          type: string
          description: Unique identifier
          example: global
          readOnly: true
        title:
          type:
            - string
            - 'null'
          description: Default title field
          readOnly: true
          example: global
        slug:
          type: string
          description: Default slug field
          readOnly: true
          example: global
        type:
          type: string
          example: '@apostrophecms/global'
          readOnly: true
        copyOfId:
          type:
            - string
            - 'null'
          description: >-
            The `_id` of the piece/page that was copied to create this document
            (only present if created via `_copyingId`)
          example: ckhdscx5900054z9k88uqs16w:en:published
        businessName:
          type:
            - string
            - 'null'
          title: Business name
          default: Fetchski Attract
          description: Business name.
        tagline:
          type:
            - string
            - 'null'
          title: Tagline
          default: The website platform for modern businesses
          description: Tagline.
        _logo:
          type:
            - array
            - 'null'
          items:
            type: object
            additionalProperties: true
          title: Logo — white version
          description: >-
            Shown in the site header on the dark theme (and over the hero).
            Upload to the Images library first. The related
            `@apostrophecms/image` documents, in order (empty when none). To set
            it, send a list of `{ "_id": "…" }`, one per document (one at most);
            a document the site can’t find is left out.
          maxItems: 1
        _logoLight:
          type:
            - array
            - 'null'
          items:
            type: object
            additionalProperties: true
          title: Logo — dark version (light theme)
          description: >-
            Optional darker logo for the light theme. If empty, the white logo
            is auto-inverted. The related `@apostrophecms/image` documents, in
            order (empty when none). To set it, send a list of `{ "_id": "…" }`,
            one per document (one at most); a document the site can’t find is
            left out.
          maxItems: 1
        _favicon:
          type:
            - array
            - 'null'
          items:
            type: object
            additionalProperties: true
          title: Favicon
          description: >-
            Browser tab icon — the default, also used when the browser is in
            dark mode. Upload a square PNG or SVG (at least 64×64) to the Images
            library. If empty, the bundled default icon is used. The related
            `@apostrophecms/image` documents, in order (empty when none). To set
            it, send a list of `{ "_id": "…" }`, one per document (one at most);
            a document the site can’t find is left out.
          maxItems: 1
        _faviconLight:
          type:
            - array
            - 'null'
          items:
            type: object
            additionalProperties: true
          title: Favicon — light-scheme version
          description: >-
            Optional. Used when the visitor’s BROWSER or device is in light mode
            — this follows the browser’s color scheme, not the site’s own theme
            toggle. If empty, the main favicon is used everywhere. The related
            `@apostrophecms/image` documents, in order (empty when none). To set
            it, send a list of `{ "_id": "…" }`, one per document (one at most);
            a document the site can’t find is left out.
          maxItems: 1
        addressLine1:
          type:
            - string
            - 'null'
          title: Address line 1
          description: >-
            Shown in the footer. Use up to three lines for a full street
            address, or just one for a town/region.
          default: Your City, ST
        addressLine2:
          type:
            - string
            - 'null'
          title: Address line 2
          default: ''
          description: Address line 2.
        addressLine3:
          type:
            - string
            - 'null'
          title: Address line 3
          default: ''
          description: Address line 3.
        phone:
          type:
            - string
            - 'null'
          title: Phone
          default: (555) 000-0000
          description: Phone.
        email:
          type:
            - string
            - 'null'
          title: Email
          default: hello@example.com
          description: Email.
        legalName:
          type:
            - string
            - 'null'
          title: Legal business name
          description: >-
            The registered name of the company, e.g. “Example Holdings LLC”.
            Fills [Business legal name].
          default: ''
        tradeNames:
          type:
            - string
            - 'null'
          title: Trade names
          description: >-
            Any other names the business operates under, e.g. “Example Studio
            and Example Supply”. Fills [Trade names].
          default: ''
        legalRegion:
          type:
            - string
            - 'null'
          title: State or region
          description: >-
            Where the business is based, for governing law. Fills [State or
            region].
          default: ''
        legalCountry:
          type:
            - string
            - 'null'
          title: Country
          description: Fills [Country].
          default: ''
        legalVenue:
          type:
            - string
            - 'null'
          title: County or court venue
          description: Where legal disputes are heard. Fills [County or venue].
          default: ''
        minimumAge:
          type:
            - string
            - 'null'
          title: Minimum age of users
          description: >-
            The youngest age your website is intended for, e.g. “13”. Fills
            [Minimum age].
          default: ''
        paletteAccent:
          type:
            - string
            - 'null'
          description: >-
            Your main brand color — buttons, links, accents. Hover + soft tints
            are derived automatically. Leave empty for the built-in design
            color.
          title: Primary / brand (dark theme)
        paletteAccentLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Primary / brand (light theme)
        paletteOnAccent:
          type:
            - string
            - 'null'
          description: >-
            Text/icon color shown ON primary-colored buttons. Defaults to white
            — set a dark color if your primary is pale.
          title: Text on primary (dark theme)
        paletteOnAccentLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Text on primary (light theme)
        paletteSecondary:
          type:
            - string
            - 'null'
          description: Supporting color — eyebrows, offset shadows, secondary accents.
          title: Secondary (dark theme)
        paletteSecondaryLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Secondary (light theme)
        paletteTertiary:
          type:
            - string
            - 'null'
          description: Warm accent, used sparingly.
          title: Tertiary (dark theme)
        paletteTertiaryLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Tertiary (light theme)
        paletteLink:
          type:
            - string
            - 'null'
          description: >-
            Body-text link color (rich-text content). Leave empty to track the
            primary color.
          title: Link (dark theme)
        paletteLinkLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Link (light theme)
        paletteSurface:
          type:
            - string
            - 'null'
          description: The base page background.
          title: Page background (dark theme)
        paletteSurfaceLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Page background (light theme)
        paletteRaised:
          type:
            - string
            - 'null'
          description: Cards and raised panels that sit above the page background.
          title: Cards (dark theme)
        paletteRaisedLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Cards (light theme)
        paletteSunken:
          type:
            - string
            - 'null'
          description: Recessed / inset bands.
          title: Bands between sections (dark theme)
        paletteSunkenLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Bands between sections (light theme)
        paletteInk:
          type:
            - string
            - 'null'
          description: Primary text color. Mind contrast against the page background.
          title: Text (dark theme)
        paletteInkLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Text (light theme)
        paletteInkMuted:
          type:
            - string
            - 'null'
          description: Secondary / muted text color.
          title: Muted text (dark theme)
        paletteInkMutedLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Muted text (light theme)
        paletteLine:
          type:
            - string
            - 'null'
          description: Borders and dividers.
          title: Lines and borders (dark theme)
        paletteLineLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Lines and borders (light theme)
        paletteSuccess:
          type:
            - string
            - 'null'
          description: Positive / confirmation state (forms, alerts).
          title: Success (dark theme)
        paletteSuccessLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Success (light theme)
        paletteWarning:
          type:
            - string
            - 'null'
          description: Caution state.
          title: Warning (dark theme)
        paletteWarningLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Warning (light theme)
        paletteDanger:
          type:
            - string
            - 'null'
          description: Error / destructive state.
          title: Error (dark theme)
        paletteDangerLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Error (light theme)
        paletteInfo:
          type:
            - string
            - 'null'
          description: Informational state.
          title: Information (dark theme)
        paletteInfoLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Information (light theme)
        fontDisplaySource:
          type:
            - string
            - 'null'
          title: Display font
          description: >-
            Typeface used for headings and display type. Default is the built-in
            design font; the other sources replace it site-wide.
          default: default
          enum:
            - default
            - curated
            - cdn
            - upload
            - null
        fontDisplayCurated:
          type:
            - string
            - 'null'
          title: Display font — curated pick
          default: clash-display
          enum:
            - clash-display
            - satoshi
            - general-sans
            - space-grotesk
            - bricolage-grotesque
            - archivo
            - sora
            - syne
            - outfit
            - unbounded
            - fraunces
            - playfair-display
            - zodiak
            - sentient
            - null
          description: Display font — curated pick.
        fontDisplayCdnProvider:
          type:
            - string
            - 'null'
          title: Display font — provider
          description: >-
            Where to browse for the family. Pick one, then follow the link below
            to find the exact name.
          default: bunny
          enum:
            - bunny
            - fontshare
            - null
        fontDisplayCdnFamily:
          type:
            - string
            - 'null'
          title: Display font — family name
          description: >-
            Exactly as the provider’s catalog spells it, e.g. "Space Grotesk" or
            "Clash Display".
          default: ''
        fontDisplayCdnWeights:
          type:
            - string
            - 'null'
          title: Display font — weights
          description: >-
            Comma-separated weights to load, e.g. 400, 700. Empty loads 500,
            700, 800. Weights the family doesn’t ship are skipped by the CDN and
            synthesized by the browser (faux bold).
          default: ''
        fontDisplayUploads:
          type:
            - array
            - 'null'
          items:
            $ref: '#/components/schemas/GlobalFontDisplayUploadsItem'
          title: Display font — font files
          description: >-
            One file per weight/style of the SAME typeface. woff2 strongly
            recommended (smallest, universally supported); woff/ttf/otf also
            accepted.
          default: []
          maxItems: 8
        fontDisplayFallback:
          type:
            - string
            - 'null'
          title: Display font — fallback style
          description: >-
            Generic system fonts shown while the font loads (and if it fails).
            Curated picks set this automatically.
          default: sans
          enum:
            - sans
            - serif
            - mono
            - null
        fontBodySource:
          type:
            - string
            - 'null'
          title: Body font
          description: >-
            Typeface used for body text and UI. Default is the built-in design
            font; the other sources replace it site-wide.
          default: default
          enum:
            - default
            - curated
            - cdn
            - upload
            - null
        fontBodyCurated:
          type:
            - string
            - 'null'
          title: Body font — curated pick
          default: inter
          enum:
            - inter
            - manrope
            - public-sans
            - work-sans
            - nunito-sans
            - ibm-plex-sans
            - source-sans-3
            - dm-sans
            - karla
            - switzer
            - supreme
            - satoshi
            - general-sans
            - lora
            - source-serif-4
            - null
          description: Body font — curated pick.
        fontBodyCdnProvider:
          type:
            - string
            - 'null'
          title: Body font — provider
          description: >-
            Where to browse for the family. Pick one, then follow the link below
            to find the exact name.
          default: bunny
          enum:
            - bunny
            - fontshare
            - null
        fontBodyCdnFamily:
          type:
            - string
            - 'null'
          title: Body font — family name
          description: >-
            Exactly as the provider’s catalog spells it, e.g. "Space Grotesk" or
            "Clash Display".
          default: ''
        fontBodyCdnWeights:
          type:
            - string
            - 'null'
          title: Body font — weights
          description: >-
            Comma-separated weights to load, e.g. 400, 700. Empty loads 400,
            500, 600, 700. Weights the family doesn’t ship are skipped by the
            CDN and synthesized by the browser (faux bold).
          default: ''
        fontBodyUploads:
          type:
            - array
            - 'null'
          items:
            $ref: '#/components/schemas/GlobalFontBodyUploadsItem'
          title: Body font — font files
          description: >-
            One file per weight/style of the SAME typeface. woff2 strongly
            recommended (smallest, universally supported); woff/ttf/otf also
            accepted.
          default: []
          maxItems: 8
        fontBodyFallback:
          type:
            - string
            - 'null'
          title: Body font — fallback style
          description: >-
            Generic system fonts shown while the font loads (and if it fails).
            Curated picks set this automatically.
          default: sans
          enum:
            - sans
            - serif
            - mono
            - null
        fontAccentSource:
          type:
            - string
            - 'null'
          title: Accent / mono font
          description: >-
            Typeface used for code blocks and monospace accents. Default is the
            built-in design font; the other sources replace it site-wide.
          default: default
          enum:
            - default
            - curated
            - cdn
            - upload
            - null
        fontAccentCurated:
          type:
            - string
            - 'null'
          title: Accent / mono font — curated pick
          default: jetbrains-mono
          enum:
            - jetbrains-mono
            - ibm-plex-mono
            - fira-code
            - space-mono
            - source-code-pro
            - dm-mono
            - inconsolata
            - ubuntu-mono
            - courier-prime
            - red-hat-mono
            - spline-sans-mono
            - victor-mono
            - null
          description: Accent / mono font — curated pick.
        fontAccentCdnProvider:
          type:
            - string
            - 'null'
          title: Accent / mono font — provider
          description: >-
            Where to browse for the family. Pick one, then follow the link below
            to find the exact name.
          default: bunny
          enum:
            - bunny
            - fontshare
            - null
        fontAccentCdnFamily:
          type:
            - string
            - 'null'
          title: Accent / mono font — family name
          description: >-
            Exactly as the provider’s catalog spells it, e.g. "Space Grotesk" or
            "Clash Display".
          default: ''
        fontAccentCdnWeights:
          type:
            - string
            - 'null'
          title: Accent / mono font — weights
          description: >-
            Comma-separated weights to load, e.g. 400, 700. Empty loads 400,
            700. Weights the family doesn’t ship are skipped by the CDN and
            synthesized by the browser (faux bold).
          default: ''
        fontAccentUploads:
          type:
            - array
            - 'null'
          items:
            $ref: '#/components/schemas/GlobalFontAccentUploadsItem'
          title: Accent / mono font — font files
          description: >-
            One file per weight/style of the SAME typeface. woff2 strongly
            recommended (smallest, universally supported); woff/ttf/otf also
            accepted.
          default: []
          maxItems: 8
        fontAccentFallback:
          type:
            - string
            - 'null'
          title: Accent / mono font — fallback style
          description: >-
            Generic system fonts shown while the font loads (and if it fails).
            Curated picks set this automatically.
          default: mono
          enum:
            - sans
            - serif
            - mono
            - null
        contentWidth:
          type:
            - string
            - 'null'
          title: Content width
          description: >-
            The widest the page content gets: sections, layouts, the header and
            the footer all line up to it. Smaller screens always use their full
            width, minus the side margins.
          default: wide
          enum:
            - standard
            - wide
            - xwide
            - null
        socialLinks:
          type:
            - array
            - 'null'
          items:
            $ref: '#/components/schemas/GlobalSocialLinksItem'
          title: Social links
          description: >-
            Each profile is optional — add only the networks you use. A link
            only appears once it has a URL. Pick a platform for its brand icon,
            or “Other / custom” to choose any icon.
          default: []
        seoImage:
          title: Default social share image
          description: >-
            Site-wide fallback for link previews (Open Graph): used on any page
            that has neither its own Social share image nor a featured image.
            Recommended 1200×630. Widgets, top to bottom: send `{ "items": [ … ]
            }`, one object per widget with its `type`. Writing it replaces the
            whole area.
          allOf:
            - $ref: '#/components/schemas/ImageArea'
        seoStructuredData:
          type:
            - boolean
            - 'null'
          title: Publish structured data (JSON-LD)
          description: >-
            Adds schema.org structured data about the business to every page,
            built from the Brand tab’s business name, address, phone and email
            plus the Social Links list. Helps search engines show rich results.
            Nothing is published until this is on and a business name is set.
          default: false
        seoStructuredDataType:
          type:
            - string
            - 'null'
          title: Schema.org type
          description: >-
            The schema.org type that best describes the business. “Local
            business” fits most sites with a physical location or service area.
          default: LocalBusiness
          enum:
            - LocalBusiness
            - Organization
            - ProfessionalService
            - Store
            - null
        seoServiceAreas:
          type:
            - boolean
            - 'null'
          title: Include service areas (areaServed)
          description: >-
            Adds the Service Area Map’s coverage (place names, service radius)
            to the business structured data on every page, and the full
            zip-code/boundary detail on pages with a Service Area Map section.
            Helps search engines and AI answers understand where the business
            serves — there is no visual search result for this, and it never
            affects map-pack ranking. Keep it consistent with the areas on the
            business’s Google Business Profile. Demo map data is never
            published.
          default: true
        seoServiceType:
          type:
            - string
            - 'null'
          title: Service type (for structured data)
          description: >-
            Optional, plain words — e.g. “House cleaning” or “Airport
            transfers”. When set, the structured data pairs it with the service
            areas as a schema.org Service; when empty the areas attach directly
            to the business.
          default: ''
        analyticsProvider:
          type:
            - string
            - 'null'
          title: Analytics provider
          description: >-
            Plausible is a privacy-friendly, cookieless analytics service.
            Visitor page views are counted anonymously; logged-in editors are
            never tracked.
          default: none
          enum:
            - none
            - plausible
            - null
        plausibleScriptUrl:
          type:
            - string
            - 'null'
          title: Plausible snippet script URL
          description: >-
            Paste the script address from your site's snippet in Plausible →
            Site Settings → Site Installation (it looks like
            https://plausible.io/js/pa-XXXXXXXX.js and is unique per site).
            Analytics stay off until this is set. Optional measurements
            (outbound links, file downloads, form submissions) are toggled in
            the Plausible dashboard — no change needed here. When set, a URL;
            empty or null when not.
        cookieBannerEnabled:
          type:
            - boolean
            - 'null'
          title: Show the cookie banner
          description: >-
            Off hides the banner AND stops every non-essential cookie and
            third-party embed — declining is the only safe reading of "never
            asked". Turn it off only on a site that sets nothing beyond the
            strictly necessary.
          default: true
        cookieEnforcement:
          type:
            - string
            - 'null'
          title: Who has to opt in
          description: >-
            Where opt-in applies, nothing non-essential runs until the visitor
            agrees. Everyone else sees the same banner as a notice: analytics
            and embedded content work immediately, and declining switches them
            off. The first option follows the law that is strictest about being
            asked first, without putting a wall in front of visitors whose law
            does not require one.
          default: eu
          enum:
            - eu
            - all
            - notice
            - null
        cookieUnknownRegion:
          type:
            - string
            - 'null'
          title: When the visitor’s country is unknown
          description: >-
            Country comes from your CDN or proxy (Cloudflare’s header, or one
            you configure). Without it the site falls back to this, plus a
            browser time-zone check that quietly upgrades an apparently European
            visitor to opt-in. Put Cloudflare or a GeoIP header in front of the
            site and this setting stops mattering.
          default: lenient
          enum:
            - lenient
            - strict
            - null
        cookieLayout:
          type:
            - string
            - 'null'
          title: Banner position
          default: left
          enum:
            - left
            - right
            - center
            - full
            - null
          description: Banner position.
        cookieShowCustomize:
          type:
            - boolean
            - 'null'
          title: Offer a “Customize” button
          description: >-
            Opens the per-category preferences panel. Leaving it on is the safer
            choice: accept-or-reject with no middle option is what regulators
            have been fining sites over.
          default: true
        cookieShowLauncher:
          type:
            - boolean
            - 'null'
          title: Show a floating “Cookie preferences” button
          description: >-
            A small button pinned to the bottom corner, over the page. Off by
            default because the footer link below already offers this — turn it
            on if you want the control visible without scrolling.
          default: false
        cookieShowFooterLink:
          type:
            - boolean
            - 'null'
          title: Show a “Cookie preferences” link in the footer
          description: >-
            Puts the reopen control at the bottom of every page, under the
            “Powered by” line — where visitors look for it. Uses the reopen
            label from the Cookie banner wording tab. Leave this on unless the
            floating button above is on instead: consent must stay as easy to
            withdraw as it was to give.
          default: true
        cookieRespectGpc:
          type:
            - boolean
            - 'null'
          title: Honor Global Privacy Control
          description: >-
            GPC is a browser-level "do not sell or share my data" signal,
            legally binding in several US states. When on, a visitor sending it
            starts with everything non-essential switched off — they can still
            turn categories on by hand.
          default: true
        cookieReloadOnWithdraw:
          type:
            - boolean
            - 'null'
          title: Reload the page when a visitor withdraws consent
          description: >-
            A third-party script that has already run cannot be switched off in
            place: it keeps running until the next full page load (each vendor
            is still told about the withdrawal straight away). On, the page
            reloads as soon as a visitor switches a category OFF, so nothing
            they declined keeps running. Off by default: the reload interrupts
            whatever the visitor was doing, and most visitors are not in a
            region that requires it.
          default: false
        cookieLifetimeDays:
          type:
            - integer
            - 'null'
          title: Ask again after (days)
          description: >-
            How long a visitor’s answer stands before the banner returns. Six
            months is the common practice and twelve is the usual ceiling.
          default: 180
          minimum: 1
          maximum: 365
          x-fetchski-clamped: true
        cookiePolicyVersion:
          type: string
          title: Policy version
          description: >-
            Change this — to “2”, a date, anything — and every visitor is asked
            again. Do that whenever what you do with the data materially
            changes; consent given under the old terms does not carry over.
          default: '1'
        cookieConsentLogRecords:
          type:
            - boolean
            - 'null'
          title: Keep consent records
          description: >-
            Stores a receipt for each decision (which categories, when, under
            which policy version) so you can show consent was given. Kept for
            two years, then deleted automatically.
          default: true
        cookieTitle:
          type:
            - string
            - 'null'
          title: Banner heading
          description: >-
            Optional. Leave empty for the message alone, which is how most
            banners read best.
          default: ''
        cookieMessage:
          type: string
          title: Banner message
          default: >-
            This website uses cookies to supplement a balanced diet and provide
            a much deserved reward to the senses after consuming bland but
            nutritious meals. Accepting our cookies is optional but recommended,
            as they are delicious.
          description: Banner message.
        cookiePolicyLinkText:
          type:
            - string
            - 'null'
          title: Policy link text
          description: >-
            Rendered after the message as a link to the policy page. Leave empty
            to omit it.
          default: See our cookie policy.
        cookiePolicyUrl:
          type:
            - string
            - 'null'
          title: Policy link target
          description: >-
            A path on this site or a full URL. The default matches the parked
            Cookie Policy page.
          default: /cookie-policy
        cookieAcceptLabel:
          type: string
          title: Accept button
          default: Accept all
          description: Accept button.
        cookieRejectLabel:
          type: string
          title: Reject button
          description: >-
            Give this the same visual weight as Accept. A reject option that is
            harder to find than accept is the single most commonly penalized
            banner design.
          default: Reject all
        cookieCustomizeLabel:
          type:
            - string
            - 'null'
          title: Customize button
          default: Customize
          description: Customize button.
        cookieSaveLabel:
          type:
            - string
            - 'null'
          title: Save-choices button
          default: Save my choices
          description: Save-choices button.
        cookieLauncherLabel:
          type:
            - string
            - 'null'
          title: Reopen control label
          default: Cookie preferences
          description: Reopen control label.
        cookiePrefsTitle:
          type: string
          title: Preferences panel heading
          default: Cookie preferences
          description: Preferences panel heading.
        cookiePrefsIntro:
          type:
            - string
            - 'null'
          title: Preferences panel intro
          default: >-
            Choose which cookies we may use. You can change your mind at any
            time — nothing here is permanent.
          description: Preferences panel intro.
        cookieCatNecessaryLabel:
          type:
            - string
            - 'null'
          title: Strictly necessary — label
          default: Strictly necessary
          description: Strictly necessary — label.
        cookieCatNecessaryDescription:
          type:
            - string
            - 'null'
          title: Strictly necessary — description
          description: >-
            Shown beside this category’s switch in the preferences panel. Say
            what the visitor gains or loses, not which vendors are involved.
          default: >-
            Required for the site to work — security, load balancing,
            remembering your cookie choices. These are never used to track you
            and cannot be switched off.
        cookieCatFunctionalLabel:
          type:
            - string
            - 'null'
          title: Functional — label
          default: Functional
          description: Functional — label.
        cookieCatFunctionalDescription:
          type:
            - string
            - 'null'
          title: Functional — description
          description: >-
            Shown beside this category’s switch in the preferences panel. Say
            what the visitor gains or loses, not which vendors are involved.
          default: >-
            Remember your preferences and power embedded features such as maps,
            media and social content. Turning these off may leave parts of a
            page unavailable.
        cookieCatAnalyticsLabel:
          type:
            - string
            - 'null'
          title: Analytics — label
          default: Analytics
          description: Analytics — label.
        cookieCatAnalyticsDescription:
          type:
            - string
            - 'null'
          title: Analytics — description
          description: >-
            Shown beside this category’s switch in the preferences panel. Say
            what the visitor gains or loses, not which vendors are involved.
          default: >-
            Help us understand which pages are visited and how people move
            through the site, so we can improve it. Aggregate only — never used
            to identify you personally.
        cookieCatMarketingLabel:
          type:
            - string
            - 'null'
          title: Marketing — label
          default: Marketing
          description: Marketing — label.
        cookieCatMarketingDescription:
          type:
            - string
            - 'null'
          title: Marketing — description
          description: >-
            Shown beside this category’s switch in the preferences panel. Say
            what the visitor gains or loses, not which vendors are involved.
          default: >-
            Measure whether an advertisement or campaign brought you here, and
            let us tailor what we show you. These are the cookies most people
            mean by "tracking".
        cookieBlockedTitle:
          type:
            - string
            - 'null'
          title: Blocked-content heading
          description: >-
            Shown in place of an embed (a map, a social video) that is waiting
            on consent.
          default: Content not loaded
        cookieBlockedBody:
          type:
            - string
            - 'null'
          title: Blocked-content message
          default: >-
            This content is served by another company, which would receive your
            IP address and browser details. It loads once you accept functional
            cookies — or just for this one item, if you press the button.
          description: Blocked-content message.
        cookieBlockedButton:
          type:
            - string
            - 'null'
          title: Blocked-content button
          default: Load this content
          description: Blocked-content button.
        maintenanceMode:
          type:
            - boolean
            - 'null'
          title: Maintenance mode
          description: >-
            Takes the public site offline. Visitors and search engines see a “be
            right back” page (served with the correct temporary-outage signals,
            so search rankings are preserved); logged-in editors keep the full
            site and can continue editing. A new site starts with this on: turn
            it off when the site is ready to go live.
          default: true
        maintenanceRetryAfter:
          type:
            - string
            - 'null'
          title: Expected downtime
          description: >-
            How long search engines should wait before checking back (the
            Retry-After hint). A rough estimate is fine — it is a hint, not a
            promise, and nothing switches back automatically.
          default: '3600'
          enum:
            - '3600'
            - '14400'
            - '43200'
            - '86400'
            - '259200'
            - '604800'
            - null
        maintenanceMessage:
          type:
            - string
            - 'null'
          title: Visitor message
          description: >-
            Optional short message shown on the maintenance page (e.g. what is
            happening or when you expect to be back). Leave empty for a generic
            “we’ll be back soon” line.
          default: ''
        recaptchaSiteKey:
          type:
            - string
            - 'null'
          title: reCAPTCHA site key
          description: >-
            Public reCAPTCHA v3 site key. Managed automatically from Connections
            → Spam protection — edit it there, not here.
          default: ''
          readOnly: true
        requestLogEnabled:
          type:
            - boolean
            - 'null'
          title: Request log enabled
          description: >-
            Whether anonymous page views are being recorded. Managed
            automatically from Visitor data → Request log — edit it there, not
            here.
          default: false
          readOnly: true
        requestLogVisitorCookie:
          type:
            - boolean
            - 'null'
          title: Visitor-ID cookie enabled
          description: >-
            Whether anonymous visitors get the first-party visitor-ID cookie.
            Managed automatically from Visitor data → Request log — edit it
            there, not here.
          default: false
          readOnly: true
        conversionsEnabled:
          type:
            - boolean
            - 'null'
          title: Conversion tracking enabled
          description: >-
            Whether conversions and ad attribution are being recorded. Managed
            automatically from Visitor data → Conversions — edit it there, not
            here.
          default: false
          readOnly: true
        conversionLinkedDomains:
          type:
            - string
            - 'null'
          title: Conversion linked domains
          description: >-
            Sites visitors continue to (a booking site), for cross-domain ad
            attribution. Managed automatically from Visitor data → Conversions —
            edit it there, not here.
          default: ''
          readOnly: true
        googleMapsApiKey:
          type:
            - string
            - 'null'
          title: Google Maps API key
          description: >-
            Public (referrer-restricted) Maps JavaScript key — the Service Area
            Map loads Google Maps with it. Managed automatically from
            Connections → Google Maps — edit it there, not here.
          default: ''
          readOnly: true
        animationsEnabled:
          type:
            - boolean
            - 'null'
          title: Enable animations
          description: >-
            Master switch for the site’s scroll and entrance motion (section
            reveals, count-ups, marquees, the hero). When off, no animation code
            is loaded and every section appears in its final, static state.
            Visitors whose device requests reduced motion always get the static
            experience regardless of this setting.
          default: true
        designCss:
          type:
            - object
            - 'null'
          description: >-
            Site-wide CSS for every section of a type and for shared elements
            (buttons, the header, the footer…). Type into the slot of the part
            you want to style; a section’s own CSS tab wins over this.
          properties:
            slots:
              type: object
              additionalProperties:
                type: string
              description: The CSS typed into each part slot, by slot name.
            css:
              type: string
              description: 'The compiled CSS (read only: rebuilt from `slots`).'
            mark:
              type: string
              description: The site’s check mark for `css` (read only).
          title: Design layer
        headerStyle:
          type:
            - string
            - 'null'
          title: Bar style
          description: >-
            Floating rests transparent over the hero and morphs to glass on
            scroll; Glass is frosted from the top; Solid is an opaque bar (uses
            the bar background color).
          default: floating
          enum:
            - floating
            - glass
            - solid
            - null
        headerWidth:
          type:
            - string
            - 'null'
          title: Bar width
          description: >-
            Island floats as a contained pill; Full width spans edge-to-edge
            (squared corners, content still centered). Full width ignores the
            corner radius below.
          default: island
          enum:
            - island
            - full
            - null
        headerBarRadius:
          type:
            - string
            - 'null'
          title: Bar corner radius
          description: Applies to the Island bar (Full width is always squared).
          default: rounded
          enum:
            - pill
            - rounded
            - slight
            - square
            - null
        headerBackgroundColor:
          type:
            - string
            - 'null'
          description: >-
            The bar fill for Glass / Solid styles (and the glass tint when
            scrolled). Leave empty to use the raised surface color.
          title: Background (dark theme)
        headerBackgroundColorLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Background (light theme)
        headerBorder:
          type:
            - boolean
            - 'null'
          title: Show bar border
          description: >-
            A hairline outline around the bar (shown when glass / solid /
            scrolled).
          default: true
        headerShadow:
          type:
            - boolean
            - 'null'
          title: Show bar shadow
          description: A soft drop shadow under the bar (when glass / solid / scrolled).
          default: true
        headerHideOnScroll:
          type:
            - boolean
            - 'null'
          title: Hide on scroll down
          description: >-
            The bar slides away when scrolling down and returns when scrolling
            up.
          default: true
        headerGlassOnScroll:
          type:
            - boolean
            - 'null'
          title: Morph to glass on scroll
          description: >-
            The floating bar stays transparent at the top and becomes a glass
            pill once the page scrolls. Turn off to keep it transparent.
          default: true
        headerDarkBothThemes:
          type:
            - boolean
            - 'null'
          title: Use the dark-theme header in both themes
          description: >-
            Keeps the whole navbar (bar, logo, wordmark, links, dropdown, button
            and mobile menu) in its dark-theme look even when a visitor switches
            to the light theme, e.g. a header that always sits over a dark hero
            photo. While on, the light-theme header colors and the light-theme
            logo are not used. Off follows the site theme.
          default: false
        headerNavBreakpoint:
          type:
            - string
            - 'null'
          title: Collapse nav to menu at
          description: >-
            Below this width the links collapse into the mobile menu
            (hamburger). Raise it if you have many or long links.
          default: lg
          enum:
            - md
            - lg
            - xl
            - null
        headerLogoHeight:
          type:
            - string
            - 'null'
          title: Logo height
          default: medium
          enum:
            - small
            - medium
            - large
            - null
          description: Logo height.
        headerLogoHover:
          type:
            - boolean
            - 'null'
          title: Animate logo on hover
          description: A subtle tilt + scale when the cursor is over the logo lockup.
          default: true
        headerShowWordmark:
          type:
            - boolean
            - 'null'
          title: Show text wordmark
          description: >-
            The business name in type beside the logo. Turn off when the logo
            already includes the name.
          default: true
        headerWordmarkText:
          type:
            - string
            - 'null'
          title: Wordmark text
          description: >-
            Optional override of the text wordmark. Leave empty to use the
            business name.
          default: ''
        headerWordmarkSplit:
          type:
            - boolean
            - 'null'
          title: Split wordmark into name + caption
          description: >-
            Render the first word large and the rest as a small tracked-out
            caption beneath it. Off renders the whole wordmark on one line.
          default: true
        headerNameColor:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Name color (dark theme)
        headerNameColorLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Name color (light theme)
        headerNameWeight:
          type:
            - string
            - 'null'
          title: Weight
          default: extrabold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Weight.
        headerNameSize:
          type:
            - string
            - 'null'
          title: Size
          default: normal
          enum:
            - small
            - normal
            - large
            - null
          description: Size.
        headerSublineColor:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Caption color (dark theme)
        headerSublineColorLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Caption color (light theme)
        headerSublineWeight:
          type:
            - string
            - 'null'
          title: Weight
          default: bold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Weight.
        headerNav:
          type:
            - array
            - 'null'
          items:
            $ref: '#/components/schemas/GlobalHeaderNavItem'
          title: Header navigation
          default:
            - label: About
              url: /about-us
              placement: visible
            - label: Services
              url: /services
              placement: visible
            - label: Pricing
              url: /pricing
              placement: visible
            - label: Gallery
              url: /gallery
              placement: visible
            - label: Blog
              url: /blog
              placement: more
            - label: Contact
              url: /contact-us
              placement: more
          description: Header navigation.
        headerMoreLabel:
          type:
            - string
            - 'null'
          title: “More” dropdown label
          description: Label for the overflow dropdown that holds links placed in “More”.
          default: More
        headerNavLinkColor:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Link color (dark theme)
        headerNavLinkColorLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Link color (light theme)
        headerNavLinkWeight:
          type:
            - string
            - 'null'
          title: Weight
          default: extrabold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Weight.
        headerNavLinkSize:
          type:
            - string
            - 'null'
          title: Size
          default: normal
          enum:
            - small
            - normal
            - large
            - null
          description: Size.
        headerNavIndicator:
          type:
            - string
            - 'null'
          title: Marker
          description: How the hovered / active link is marked.
          default: sweep
          enum:
            - sweep
            - grow
            - pill
            - none
            - null
        headerNavHoverColor:
          type:
            - string
            - 'null'
          description: Optional. Leave empty to use the site accent color.
          title: Hover color (dark theme)
        headerNavHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Hover color (light theme)
        headerNavActiveColor:
          type:
            - string
            - 'null'
          description: >-
            Color + indicator for the current page’s link. Leave empty to use
            the secondary (mint) color.
          title: Current page color (dark theme)
        headerNavActiveColorLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Current page color (light theme)
        headerCtaLabel:
          type:
            - string
            - 'null'
          title: Button label
          description: The visible button text. Leave empty to hide the button.
          default: Member Portal
        headerCtaUrl:
          type:
            - string
            - 'null'
          title: Button link
          description: Where the button goes — a path (/blog) or full URL.
          default: https://fetchski.com
        headerCtaNewTab:
          type:
            - boolean
            - 'null'
          title: Open in new tab
          description: >-
            Opens the link in a new browser tab (adds rel="noopener
            noreferrer").
          default: false
        headerCtaVariant:
          type:
            - string
            - 'null'
          title: Button style
          description: >-
            Solid fills with the color; Outline / Soft / Text link use it for
            the border + text.
          default: solid
          enum:
            - solid
            - outline
            - soft
            - link
            - null
        headerCtaSize:
          type:
            - string
            - 'null'
          title: Button size
          default: normal
          enum:
            - small
            - normal
            - large
            - null
          description: Button size.
        headerCtaRadius:
          type:
            - string
            - 'null'
          title: Corner radius
          default: slight
          enum:
            - pill
            - rounded
            - slight
            - square
            - null
          description: Corner radius.
        headerCtaColor:
          type:
            - string
            - 'null'
          description: >-
            Solid fill, or the border + text for the other styles. Defaults to
            the brand accent; CLEAR it for a transparent, outline-only button.
          title: Button color (dark theme)
          default: '--fetchski-accent'
        headerCtaColorLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Button color (light theme)
        headerCtaTextColor:
          type:
            - string
            - 'null'
          description: >-
            The text/icon color. Clear it to derive from the button color
            (readable on solid fills).
          title: Label color (dark theme)
          default: '--fetchski-ink'
        headerCtaTextColorLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Label color (light theme)
        headerCtaHoverColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Drives the hover treatment. Leave empty to derive it from
            the button color.
          title: Hover color (dark theme)
        headerCtaHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Hover color (light theme)
        headerCtaStyle:
          type:
            - string
            - 'null'
          title: Hover surface
          description: >-
            The hover treatment: a soft shadow, a colored offset shadow, a glow,
            a fill sweep, or a thicker border.
          default: sweep
          enum:
            - none
            - single
            - dual
            - glow
            - sweep
            - thicken
            - null
        headerCtaShadowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. The offset-shadow or glow color on hover. Leave empty to
            use the site secondary color.
          title: Offset / glow color (dark theme)
        headerCtaShadowColorLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Offset / glow color (light theme)
        headerCtaAnimation:
          type:
            - string
            - 'null'
          title: Hover motion
          default: lift-scale
          enum:
            - lift
            - scale
            - lift-scale
            - none
            - null
          description: Hover motion.
        headerCtaIcon:
          type:
            - string
            - 'null'
          title: Icon name
          description: >-
            Any Font Awesome icon name, e.g. star, bolt, arrow-left-to-bracket
            (no “fa-” prefix). Browse at fontawesome.com/icons.
          default: ''
        headerCtaIconFamily:
          type:
            - string
            - 'null'
          title: Icon family
          default: classic-regular
          enum:
            - classic-regular
            - duotone-regular
            - brands
            - jelly
            - jelly-duo
            - whiteboard
            - null
          description: Icon family.
        headerCtaIconPosition:
          type:
            - string
            - 'null'
          title: Icon position
          description: Which side of the label the icon sits on (when an icon name is set).
          default: before
          enum:
            - before
            - after
            - null
        headerCtaIconNudge:
          type:
            - boolean
            - 'null'
          title: Nudge icon on hover
          description: >-
            The icon slides toward its side on hover (e.g. an arrow edges
            outward).
          default: false
        headerMobileSide:
          type:
            - string
            - 'null'
          title: Drawer side
          default: right
          enum:
            - right
            - left
            - null
          description: Drawer side.
        headerMobileWidth:
          type:
            - string
            - 'null'
          title: Drawer width
          default: normal
          enum:
            - narrow
            - normal
            - wide
            - null
          description: Drawer width.
        headerMobileBackgroundColor:
          type:
            - string
            - 'null'
          description: Optional. Leave empty to use the site surface color.
          title: Background (dark theme)
        headerMobileBackgroundColorLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Background (light theme)
        headerMobileShowLogo:
          type:
            - boolean
            - 'null'
          title: Show logo in drawer
          default: true
          description: Show logo in drawer.
        headerMobileShowCta:
          type:
            - boolean
            - 'null'
          title: Show CTA button in drawer
          description: Repeat the header button at the bottom of the mobile drawer.
          default: true
        headerMobileShowScrollCue:
          type:
            - boolean
            - 'null'
          title: Show scroll cue
          description: A small animated hint shown when the menu links overflow.
          default: true
        headerMobileLinkColor:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Link color (dark theme)
        headerMobileLinkColorLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Link color (light theme)
        headerMobileLinkWeight:
          type:
            - string
            - 'null'
          title: Weight
          default: bold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Weight.
        headerMobileLinkSize:
          type:
            - string
            - 'null'
          title: Size
          default: normal
          enum:
            - small
            - normal
            - large
            - null
          description: Size.
        headerMobileLinkHoverColor:
          type:
            - string
            - 'null'
          description: Optional. Leave empty to use the site accent color.
          title: Hover and current page color (dark theme)
        headerMobileLinkHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Hover and current page color (light theme)
        footerBackgroundType:
          type:
            - string
            - 'null'
          title: Background
          description: >-
            Site default keeps the footer’s sunken surface; Solid color and
            Image override it. The site surface color is the fallback when a
            color is left empty.
          default: default
          enum:
            - default
            - solid
            - image
            - null
        footerBackgroundColor:
          type:
            - string
            - 'null'
          description: >-
            Used for a Solid background (and as the fallback behind an Image).
            Leave empty to use the site surface color.
          title: Background color (dark theme)
        footerBackgroundColorLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Background color (light theme)
        footerImage:
          title: Background image
          description: >-
            Widgets, top to bottom: send `{ "items": [ … ] }`, one object per
            widget with its `type`. Writing it replaces the whole area.
          allOf:
            - $ref: '#/components/schemas/ImageArea'
        footerOverlayColor:
          type:
            - string
            - 'null'
          description: >-
            Scrim over the image to keep the footer legible. Leave empty to use
            the surface color.
          title: Overlay color (dark theme)
        footerOverlayColorLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Overlay color (light theme)
        footerOverlayOpacity:
          type:
            - number
            - 'null'
          title: Overlay opacity (%)
          default: 85
          minimum: 0
          maximum: 100
          x-fetchski-clamped: true
          description: Overlay opacity (%).
        footerPadding:
          type:
            - string
            - 'null'
          title: Vertical padding
          default: normal
          enum:
            - tight
            - normal
            - roomy
            - null
          description: Vertical padding.
        footerTopBorder:
          type:
            - boolean
            - 'null'
          title: Show top border
          description: A hairline rule along the top edge of the footer.
          default: true
        footerBackToTop:
          type:
            - boolean
            - 'null'
          title: Show “Back to top” button
          default: true
          description: Show “Back to top” button.
        _footerLogo:
          type:
            - array
            - 'null'
          items:
            type: object
            additionalProperties: true
          title: Footer logo — white version
          description: >-
            Optional logo shown at the top of the company column, used on the
            dark theme. Leave both footer logos empty to use the site logo (Site
            settings → Brand); with no logo at all the business name leads.
            Upload to the Images library first. The related
            `@apostrophecms/image` documents, in order (empty when none). To set
            it, send a list of `{ "_id": "…" }`, one per document (one at most);
            a document the site can’t find is left out.
          maxItems: 1
        _footerLogoLight:
          type:
            - array
            - 'null'
          items:
            type: object
            additionalProperties: true
          title: Footer logo — dark version (light theme)
          description: >-
            Optional darker logo for the light theme. If empty, the white logo
            is auto-inverted. The related `@apostrophecms/image` documents, in
            order (empty when none). To set it, send a list of `{ "_id": "…" }`,
            one per document (one at most); a document the site can’t find is
            left out.
          maxItems: 1
        footerLogoHeight:
          type:
            - string
            - 'null'
          title: Logo height
          default: medium
          enum:
            - small
            - medium
            - large
            - null
          description: Logo height.
        footerLogoAlign:
          type:
            - string
            - 'null'
          title: Logo alignment
          description: >-
            Aligns the logo within the company column (e.g. centered above the
            business name).
          default: left
          enum:
            - left
            - center
            - right
            - null
        footerShowName:
          type:
            - boolean
            - 'null'
          title: Show business name
          description: >-
            The business name as a heading at the top of the column. Turn off
            when the logo already carries the name.
          default: true
        footerShowTagline:
          type:
            - boolean
            - 'null'
          title: Show tagline
          default: true
          description: Show tagline.
        footerShowContact:
          type:
            - boolean
            - 'null'
          title: Show address, phone & email
          default: true
          description: Show address, phone & email.
        footerNameColor:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Name color (dark theme)
        footerNameColorLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Name color (light theme)
        footerNameWeight:
          type:
            - string
            - 'null'
          title: Weight
          default: bold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Weight.
        footerNameSize:
          type:
            - string
            - 'null'
          title: Size
          default: normal
          enum:
            - small
            - normal
            - large
            - null
          description: Size.
        footerBrandColor:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Text color (dark theme)
        footerBrandColorLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Text color (light theme)
        footerBrandWeight:
          type:
            - string
            - 'null'
          title: Weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Weight.
        footerBrandSize:
          type:
            - string
            - 'null'
          title: Size
          default: normal
          enum:
            - small
            - normal
            - large
            - null
          description: Size.
        footerLinkGroups:
          type:
            - array
            - 'null'
          items:
            $ref: '#/components/schemas/GlobalFooterLinkGroupsItem'
          title: Link groups
          description: >-
            Each group becomes a column in the footer. Add a Legal group for
            Terms & Privacy, etc.
          default:
            - heading: Explore
              links:
                - label: About Us
                  url: /about-us
                  external: false
                - label: Services
                  url: /services
                  external: false
                - label: Pricing
                  url: /pricing
                  external: false
                - label: Service Area Map
                  url: /service-area-map
                  external: false
                - label: Gallery
                  url: /gallery
                  external: false
                - label: Blog
                  url: /blog
                  external: false
                - label: Contact Us
                  url: /contact-us
                  external: false
            - heading: Elsewhere
              links:
                - label: Fetchski
                  url: https://fetchski.com
                  external: true
                - label: Member Portal
                  url: https://fetchski.com
                  external: true
            - heading: Legal
              links:
                - label: Privacy Policy
                  url: /privacy-policy
                  external: false
                - label: Terms & Conditions
                  url: /terms-and-conditions
                  external: false
                - label: Cookie Policy
                  url: /cookie-policy
                  external: false
        footerLinkColumns:
          type:
            - string
            - 'null'
          title: Link columns
          description: >-
            How many columns the link groups flow into. Auto fits to the
            available width; a fixed count packs shorter groups together (e.g.
            Legal stacked under Elsewhere). Groups are never split across
            columns.
          default: '2'
          enum:
            - auto
            - '2'
            - '3'
            - '4'
            - null
        footerHeadingColor:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Heading color (dark theme)
        footerHeadingColorLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Heading color (light theme)
        footerHeadingWeight:
          type:
            - string
            - 'null'
          title: Weight
          default: bold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Weight.
        footerHeadingSize:
          type:
            - string
            - 'null'
          title: Size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Size.
        footerLinkColor:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Link color (dark theme)
        footerLinkColorLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Link color (light theme)
        footerLinkWeight:
          type:
            - string
            - 'null'
          title: Weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Weight.
        footerLinkSize:
          type:
            - string
            - 'null'
          title: Size
          default: normal
          enum:
            - small
            - normal
            - large
            - null
          description: Size.
        footerLinkHoverColor:
          type:
            - string
            - 'null'
          description: Optional. Leave empty to use the site accent color.
          title: Hover color (dark theme)
        footerLinkHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Hover color (light theme)
        footerLinkHoverEffect:
          type:
            - string
            - 'null'
          title: Hover effect
          default: slide
          enum:
            - none
            - slide
            - underline
            - null
          description: Hover effect.
        footerMarqueeEnabled:
          type:
            - boolean
            - 'null'
          title: Show marquee by default
          description: >-
            A slow ribbon of phrases scrolling across the top of the footer. Any
            page can override this for itself in Page Settings → Footer.
          default: true
        footerMarquee:
          type:
            - array
            - 'null'
          items:
            $ref: '#/components/schemas/GlobalFooterMarqueeItem'
          title: Marquee phrases
          description: >-
            Each phrase can carry its own icon; without one, a dot separates it
            from the next phrase.
          default:
            - phrase: Fast by default
              icon: bolt
              iconFamily: jelly
            - phrase: Edit in context
              icon: pen
              iconFamily: jelly
            - phrase: Stays on-brand
              icon: palette
              iconFamily: jelly
            - phrase: Built accessible
              icon: star
              iconFamily: jelly
            - phrase: Fully responsive
              icon: mobile
              iconFamily: jelly
        footerMarqueeSpeed:
          type:
            - string
            - 'null'
          title: Marquee speed
          default: normal
          enum:
            - slow
            - normal
            - fast
            - null
          description: Marquee speed.
        footerMarqueeMotionPause:
          type:
            - boolean
            - 'null'
          title: Show pause button on background motion
          description: >-
            Adds a small, unobtrusive pause/play control so visitors can stop
            the auto-playing background motion (WCAG 2.2.2). Only appears when a
            moving background is set.
          default: false
        footerMarqueeColor:
          type:
            - string
            - 'null'
          description: Optional. Leave empty for the muted default.
          title: Phrase color (dark theme)
        footerMarqueeColorLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Phrase color (light theme)
        footerMarqueeWeight:
          type:
            - string
            - 'null'
          title: Weight
          default: bold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Weight.
        footerWordmarkEnabled:
          type:
            - boolean
            - 'null'
          title: Show watermark wordmark
          description: >-
            A giant outlined word along the bottom of the footer. Reveals/fills
            on hover.
          default: true
        footerWordmark:
          type:
            - string
            - 'null'
          title: Watermark text
          description: >-
            Keep it to one short word — it renders at display size. Leave empty
            to use the business name.
          default: ''
        footerWordmarkSize:
          type:
            - string
            - 'null'
          title: Watermark size
          default: display
          enum:
            - display
            - large
            - medium
            - null
          description: Watermark size.
        footerWordmarkAlign:
          type:
            - string
            - 'null'
          title: Watermark alignment
          default: left
          enum:
            - left
            - center
            - right
            - null
          description: Watermark alignment.
        footerWordmarkFill:
          type:
            - string
            - 'null'
          title: Watermark fill
          description: >-
            Outlined letters that fill on hover one at a time, all at once, or
            always-solid (no ghost effect).
          default: letter
          enum:
            - letter
            - word
            - solid
            - null
        footerWordmarkColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Overrides the wordmark fill + outline tint. Leave empty to
            track the theme’s text color.
          title: Color (dark theme)
        footerWordmarkColorLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Color (light theme)
        footerCopyrightText:
          type:
            - string
            - 'null'
          title: Copyright text
          description: >-
            Type \{year\} where this year goes (it updates itself every January)
            and \{business\} for the business name. Left empty, the site shows
            “© \{year\} \{business\}. All rights reserved.”
          default: © {year} {business}. All rights reserved.
        footerNote:
          type:
            - string
            - 'null'
          title: Tagline / note
          description: >-
            Optional short line shown beside the copyright (e.g. a slogan or
            license number).
          default: ''
        footerCopyrightColor:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Text color (dark theme)
        footerCopyrightColorLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Text color (light theme)
        footerCopyrightWeight:
          type:
            - string
            - 'null'
          title: Weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Weight.
        footerCopyrightSize:
          type:
            - string
            - 'null'
          title: Size
          default: small
          enum:
            - small
            - normal
            - large
            - null
          description: Size.
        footerShowSocial:
          type:
            - boolean
            - 'null'
          title: Show social links
          description: >-
            Render the site’s social profiles (configured in the “Social Links”
            tab) in the footer.
          default: true
        footerSocialHeading:
          type:
            - string
            - 'null'
          title: Heading
          description: >-
            Optional small heading above the icons (e.g. “Follow us”). Leave
            empty for none.
          default: ''
        footerSocialPlacement:
          type:
            - string
            - 'null'
          title: Placement
          description: >-
            In the company column (under the contact details) or as its own
            centered row above the copyright bar.
          default: brand
          enum:
            - brand
            - bar
            - null
        footerSocialBarBorder:
          type:
            - boolean
            - 'null'
          title: Border above the social row
          description: >-
            A hairline rule above the dedicated social row, for a touch of
            separation from the watermark.
          default: false
        footerSocialVariant:
          type:
            - string
            - 'null'
          title: Icon style
          default: outline
          enum:
            - bare
            - outline
            - solid
            - null
          description: Icon style.
        footerSocialSize:
          type:
            - string
            - 'null'
          title: Icon size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Icon size.
        footerSocialSpacing:
          type:
            - string
            - 'null'
          title: Icon spacing
          description: Gap between the icons.
          default: normal
          enum:
            - tight
            - normal
            - loose
            - null
        footerSocialHeadingColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Leave empty to match the footer’s other group headings
            (Footer: Links tab).
          title: Heading color (dark theme)
        footerSocialHeadingColorLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Heading color (light theme)
        footerSocialColor:
          type:
            - string
            - 'null'
          description: Resting icon color. Leave empty for the muted default.
          title: Icon color (dark theme)
        footerSocialColorLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Icon color (light theme)
        footerSocialHover:
          type:
            - string
            - 'null'
          title: Hover color
          description: >-
            Hover to each platform’s own brand color, or to the site accent (or
            a chosen hover color).
          default: brand
          enum:
            - brand
            - accent
            - null
        footerSocialHoverColor:
          type:
            - string
            - 'null'
          description: >-
            Used when “Hover color” is Accent / custom. Leave empty for the site
            accent.
          title: Custom hover color (dark theme)
        footerSocialHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color
            name) or a palette token’s name (`--fetchski-accent`).
          title: Custom hover color (light theme)
        formUploadsEnabled:
          type:
            - boolean
            - 'null'
          title: Accept file uploads on public forms
          description: >-
            OFF by default. While off, the server rejects every file submitted
            through a public form, regardless of the form’s fields. Turn on only
            after setting the limits below — anonymous file uploads are a
            deliberate, security-sensitive choice.
          default: false
        formUploadMaxFiles:
          type:
            - integer
            - 'null'
          title: Max files per submission
          description: How many files one submission may include (hard ceiling 8).
          default: 3
          minimum: 1
          maximum: 8
          x-fetchski-clamped: true
        formUploadMaxSizeMb:
          type:
            - integer
            - 'null'
          title: Max size per file (MB)
          description: Largest single file accepted, in megabytes (hard ceiling 10 MB).
          default: 5
          minimum: 1
          maximum: 10
          x-fetchski-clamped: true
        formUploadAllowedTypes:
          type:
            - array
            - 'null'
          items:
            type: string
            enum:
              - image
              - pdf
              - office
              - text
          title: Allowed file types
          description: >-
            Only these categories are accepted. Each file’s actual contents are
            verified by signature (magic bytes), not just its extension, so a
            renamed file is rejected. SVG and other script-capable formats can
            never be enabled here.
          default:
            - image
            - pdf
        createdAt:
          type: string
          format: date-time
          title: Created At
          readOnly: true
          description: Created At.
        updatedAt:
          type: string
          format: date-time
          title: Updated At
          readOnly: true
          description: Updated At.
        aposShareKey:
          type:
            - string
            - 'null'
          description: >-
            The draft’s preview share key, while its share link is on: the link
            is the draft’s `_url` with `aposShareKey` and `aposShareId` (the
            draft’s `_id`) in its query. Absent otherwise, and on published
            documents.
          example: k3v9x2m7q1z8w4p6
          readOnly: true
      additionalProperties: true
      title: Global
      required:
        - cookiePolicyVersion
        - cookieMessage
        - cookieAcceptLabel
        - cookieRejectLabel
        - cookiePrefsTitle
        - _id
        - type
        - slug
        - createdAt
        - updatedAt
    GlobalFontDisplayUploadsItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        file:
          type: object
          description: File attachment reference
          title: Font file
        weight:
          type:
            - string
            - 'null'
          title: Weight
          default: '400'
          enum:
            - '100'
            - '200'
            - '300'
            - '400'
            - '500'
            - '600'
            - '700'
            - '800'
            - '900'
            - null
          description: Weight.
        style:
          type:
            - string
            - 'null'
          title: Style
          default: normal
          enum:
            - normal
            - italic
            - null
          description: Style.
      required:
        - file
      additionalProperties: true
    GlobalFontBodyUploadsItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        file:
          type: object
          description: File attachment reference
          title: Font file
        weight:
          type:
            - string
            - 'null'
          title: Weight
          default: '400'
          enum:
            - '100'
            - '200'
            - '300'
            - '400'
            - '500'
            - '600'
            - '700'
            - '800'
            - '900'
            - null
          description: Weight.
        style:
          type:
            - string
            - 'null'
          title: Style
          default: normal
          enum:
            - normal
            - italic
            - null
          description: Style.
      required:
        - file
      additionalProperties: true
    GlobalFontAccentUploadsItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        file:
          type: object
          description: File attachment reference
          title: Font file
        weight:
          type:
            - string
            - 'null'
          title: Weight
          default: '400'
          enum:
            - '100'
            - '200'
            - '300'
            - '400'
            - '500'
            - '600'
            - '700'
            - '800'
            - '900'
            - null
          description: Weight.
        style:
          type:
            - string
            - 'null'
          title: Style
          default: normal
          enum:
            - normal
            - italic
            - null
          description: Style.
      required:
        - file
      additionalProperties: true
    GlobalSocialLinksItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        platform:
          type: string
          title: Platform
          default: instagram
          enum:
            - instagram
            - facebook
            - x-twitter
            - youtube
            - tiktok
            - linkedin
            - github
            - pinterest
            - whatsapp
            - snapchat
            - threads
            - bluesky
            - mastodon
            - yelp
            - google
            - spotify
            - vimeo
            - custom
          description: Platform.
        url:
          type: string
          format: uri
          title: Profile URL
          description: Full link to the profile, e.g. https://instagram.com/yourbusiness.
        label:
          type: string
          title: Accessible label (optional)
          description: >-
            Overrides the screen-reader / tooltip label. Recommended for a
            custom platform — defaults to the icon name (e.g. “discord” →
            “Discord”).
          default: ''
        icon:
          type: string
          title: Custom icon name
          description: >-
            Font Awesome icon name (no “fa-” prefix), e.g. discord. Browse
            fontawesome.com/icons.
          default: ''
        iconFamily:
          type:
            - string
            - 'null'
          title: Custom icon family
          default: brands
          enum:
            - classic-regular
            - duotone-regular
            - brands
            - jelly
            - jelly-duo
            - whiteboard
            - null
          description: Custom icon family.
      required:
        - platform
        - url
      additionalProperties: true
    ImageArea:
      type: object
      description: >-
        Content made of widgets, as the site stores it: send `{ "items": [ … ]
        }`, one object per widget, top to bottom. It takes
        `@apostrophecms/image` widgets; an item of any other type is dropped. At
        most 1. Writing it replaces the whole area.
      properties:
        metaType:
          type: string
          enum:
            - area
          description: Always `area`.
        _id:
          type: string
          description: 'The area’s id, set by the site: leave it out when you write one.'
        items:
          type: array
          description: >-
            The widgets, top to bottom. Each is an object with its `type` and
            that widget’s own fields; `_id` and `metaType` may be left out (the
            site sets them).
          items:
            $ref: '#/components/schemas/ImageWidget'
          maxItems: 1
      additionalProperties: true
      example:
        items: []
    GlobalHeaderNavItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        label:
          type: string
          title: Label
          default: ''
          description: Label.
        url:
          type: string
          title: URL
          default: ''
          description: URL.
        placement:
          type:
            - string
            - 'null'
          title: Placement
          description: Desktop only — every link is listed in the mobile menu.
          default: visible
          enum:
            - visible
            - more
            - null
      required:
        - label
        - url
      additionalProperties: true
    GlobalFooterLinkGroupsItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        heading:
          type: string
          title: Group heading
          default: ''
          description: Group heading.
        links:
          type: array
          items:
            $ref: '#/components/schemas/GlobalFooterLinkGroupsItemLinksItem'
          title: Links
          default: []
          description: Links.
      required:
        - heading
      additionalProperties: true
    GlobalFooterMarqueeItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        phrase:
          type: string
          title: Phrase
          default: ''
          description: Phrase.
        icon:
          type: string
          title: Icon name
          description: >-
            Any Font Awesome icon name, e.g. star, bolt, arrow-left-to-bracket
            (no “fa-” prefix). Browse at fontawesome.com/icons.
          default: ''
        iconFamily:
          type:
            - string
            - 'null'
          title: Icon family
          default: classic-regular
          enum:
            - classic-regular
            - duotone-regular
            - brands
            - jelly
            - jelly-duo
            - whiteboard
            - null
          description: Icon family.
        iconColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the design’s own color rhythm.
          title: Icon color
        iconAnimation:
          type:
            - string
            - 'null'
          title: Icon animation
          default: none
          enum:
            - none
            - fa-beat
            - fa-bounce
            - fa-fade
            - fa-beat-fade
            - fa-flip
            - fa-shake
            - fa-spin
            - null
          description: Icon animation.
      required:
        - phrase
      additionalProperties: true
    ApiError:
      type: object
      description: >-
        An error answer: the error’s name, a message saying what is wrong, and
        details by error.
      required:
        - name
      properties:
        name:
          type: string
          description: >-
            The error’s name: `invalid`, `required`, `unauthorized`,
            `forbidden`, `notfound`, `conflict`, `locked`, `tooManyRequests`,
            `error` (a server failure)…
        message:
          type: string
          description: What is wrong, and how to fix it.
        data:
          type: object
          additionalProperties: true
          description: >-
            Details, by error: `errors` (one entry per field problem, each with
            its `path`), `retryAfter` (seconds, on 429), `permission`…
    ImageWidget:
      type: object
      properties:
        type:
          type: string
          enum:
            - '@apostrophecms/image'
          description: 'The widget’s type: always `@apostrophecms/image`.'
        _id:
          type: string
          description: >-
            The widget’s id, unique on the page. Leave it out for a new widget
            (the site sets one); keep it to change a widget that is there.
        metaType:
          type: string
          enum:
            - widget
          description: Always `widget`.
        _image:
          type: array
          items:
            type: object
            additionalProperties: true
          title: Image
          maxItems: 1
          description: >-
            The related `@apostrophecms/image` documents, in order (empty when
            none). To set it, send a list of `{ "_id": "…" }`, one per document
            (one at most); a document the site can’t find is left out.
        caption:
          type: string
          title: Caption
          default: ''
          description: Caption.
        linkTo:
          type:
            - string
            - 'null'
          title: Link To...
          default: none
          enum:
            - none
            - '@apostrophecms/any-page-type'
            - _url
            - null
          description: Link To...
        _apostrophecms-any-page-type:
          type: array
          items:
            type: object
            additionalProperties: true
          title: Page
          maxItems: 1
          description: >-
            The related `@apostrophecms/any-page-type` documents, in order
            (empty when none). To set it, send a list of `{ "_id": "…" }`, one
            per document (one at most); a document the site can’t find is left
            out.
        linkHref:
          type:
            - string
            - 'null'
          title: URL
          description: apostrophe:linkHrefHelp When set, a URL; empty or null when not.
        linkHrefTitle:
          type: string
          title: Link Title
          default: ''
          description: Link Title.
        linkTitle:
          type: string
          title: Link Title
          description: If empty, the title of the related document will be used.
          default: ''
        linkTarget:
          type:
            - array
            - 'null'
          items:
            type: string
            enum:
              - _blank
          title: Link Target
          description: Link Target.
        sectionCss:
          type:
            - object
            - 'null'
          description: >-
            CSS for this one section, typed into the slot of the part it styles.
            It wins over Site design → Custom CSS. Nested rules like &:hover,
            @media (width &gt;= 48rem) and [data-theme="light"] & work inside a
            slot.
          properties:
            slots:
              type: object
              additionalProperties:
                type: string
              description: The CSS typed into each part slot, by slot name.
            css:
              type: string
              description: 'The compiled CSS (read only: rebuilt from `slots`).'
            mark:
              type: string
              description: The site’s check mark for `css` (read only).
          title: Custom CSS
      required:
        - type
      description: >-
        A `@apostrophecms/image` widget: its `type` and its own fields. A field
        left out takes its default.
      additionalProperties: true
    GlobalFooterLinkGroupsItemLinksItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        label:
          type: string
          title: Label
          default: ''
          description: Label.
        url:
          type: string
          title: URL
          default: ''
          description: URL.
        external:
          type: boolean
          title: External link
          description: Opens in a new tab with an arrow indicator.
          default: false
      required:
        - label
        - url
      additionalProperties: true
  responses:
    BadRequest:
      description: 'The request is not valid: `message` says what to change.'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ApiError'
    Unauthorized:
      description: The credential is missing or not accepted.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ApiError'
    Forbidden:
      description: The caller may not do this.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ApiError'
    NotFound:
      description: Nothing matches, or the caller may not see it.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ApiError'
    InternalServerError:
      description: 'The site failed: `message` is the generic “An error occurred.”'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ApiError'
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: Authorization
      description: >-
        Paste your API key as the CMS showed it: `fsk_<site>_<key id>_<secret>`
        (issued under API Keys). `ApiKey ` in front of it works too. Leave it
        empty to read as the public.
    BearerAuth:
      type: http
      scheme: bearer
      description: >-
        A person’s bearer token, from **Signing in (people)** → `POST
        /@apostrophecms/login/login`. Apps use an API key instead.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.