{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/cavuno-com/json-schema/cavuno-com-patch-settings-body-schema.json",
  "title": "PatchSettingsBody",
  "x-generated": "2026-11-04",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/cavuno-com-openapi.json#/components/schemas/PatchSettingsBody",
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200,
      "description": "Display name of the board."
    },
    "slug": {
      "type": "string",
      "minLength": 1,
      "maxLength": 120,
      "description": "URL slug of the board. Lowercase alphanumeric and hyphens; reserved values (e.g. `admin`, `api`) are rejected."
    },
    "primaryDomainId": {
      "type": "string",
      "description": "Identifier of the custom domain to use as the primary public URL."
    },
    "logoMediaId": {
      "type": "string",
      "description": "Cavuno media ID returned by `POST /v1/media/upload` with `purpose=board_logo`."
    },
    "heroMediaId": {
      "type": "string",
      "description": "Cavuno media ID returned by `POST /v1/media/upload` with `purpose=board_hero`."
    },
    "passwordProtectionEnabled": {
      "type": "boolean",
      "description": "Whether the board sits behind a password gate. Use `POST /v1/settings/password-protection` to set the actual password before enabling."
    },
    "jobAlertsEnabled": {
      "type": "boolean",
      "description": "Whether candidates can subscribe to email alerts for new jobs."
    },
    "jobRecommendationsEnabled": {
      "type": "boolean",
      "description": "Whether signed-in candidates can see personalized job recommendations. Absent board config defaults to `true`."
    },
    "recommendedTalentEnabled": {
      "type": "boolean",
      "description": "Whether employers can see recommended talent matches for their jobs. Absent board config defaults to `false`."
    },
    "candidatesEnabled": {
      "type": "boolean",
      "description": "Whether candidate profiles are enabled on the board."
    },
    "employersEnabled": {
      "type": "boolean",
      "description": "Whether employer self-serve flows are enabled."
    },
    "blogEnabled": {
      "type": "boolean",
      "description": "Whether the public blog is exposed."
    },
    "impressumEnabled": {
      "type": "boolean",
      "deprecated": true,
      "description": "Deprecated: current headless sites publish the Impressum page when they have Impressum content of their own and ignore this setting. Still accepted and returned, honoured by hosted boards, and reported as `features.impressum` on the board context for older sites."
    },
    "requireApprovalFreeJobs": {
      "type": "boolean",
      "description": "Whether jobs posted by employers from the free tier require admin approval before they appear on the public board."
    },
    "postingRequiresMembership": {
      "type": "boolean",
      "description": "When true, only companies with an active plan assignment can post jobs. Absent means anyone can post."
    },
    "requireApprovalAggregatedJobs": {
      "type": "boolean",
      "description": "Whether aggregated jobs (e.g. those sourced or imported from upstream sources) require admin approval before they appear on the public board."
    },
    "registrationWallEnabled": {
      "type": "boolean",
      "description": "Whether visitors must sign in to view jobs."
    },
    "nativeApplicationsEnabled": {
      "type": "boolean",
      "description": "Whether the board's built-in ATS receives applications. When `false` (external-applications-only board), posting surfaces require an external `applicationUrl` and `POST /boards/:identifier/jobs/:jobSlug/apply` rejects with `applications_native_disabled`. Turning this off UNPUBLISHES every published native-apply job (those with no external `applicationUrl`) back to draft via an asynchronous batched drain. Expect published job counts to shrink over the following seconds. Nothing is deleted, and re-enabling does NOT republish the drafted jobs. Absent means `true`."
    },
    "countryGatingMode": {
      "type": "string",
      "enum": [
        "sponsored_only",
        "all_jobs"
      ],
      "description": "Apply country gate mode. The default is sponsored_only; all_jobs also gates ordinary external and native starter applies."
    },
    "applicantMessagingEnabled": {
      "type": "boolean",
      "description": "Whether applicant↔employer messaging is enabled. When `false`, the `me/conversations` route family rejects with `messaging_disabled` and new-message emails are suppressed. Absent means `true`."
    },
    "applyUrlAttribution": {
      "allOf": [
        {
          "$ref": "#/$defs/ApplyUrlAttribution"
        },
        {
          "description": "Query parameters appended to outbound apply URLs. `{ \"mode\": \"off\" }` appends nothing — use it for boards whose upstream application host rejects unexpected query parameters. `{ \"mode\": \"append\", \"params\": [...] }` sets the parameters explicitly; each `valueTemplate` may contain the `{{boardHost}}`, `{{boardSlug}}` and `{{boardName}}` tokens. An `append` policy with an empty `params` array is stored as `off`. Absent board config means the default `ref={{boardHost}}`. Individual import feeds can override this per feed."
        }
      ]
    },
    "talentDirectoryEnabled": {
      "type": "boolean",
      "description": "Legacy shorthand for the talent directory. `true` maps to `talentDirectoryVisibility: \"public\"`; `false` maps to `\"off\"`. Prefer the tri-state field. Providing both with conflicting values returns `settings_conflicting_fields`."
    },
    "talentDirectoryVisibility": {
      "type": "string",
      "enum": [
        "off",
        "public",
        "employers_only"
      ],
      "description": "Talent directory access mode: `off` (hidden), `public` (anyone), or `employers_only` (approved employers). Canonical field; supersedes `talentDirectoryEnabled`."
    },
    "defaultCandidateProfileVisibility": {
      "type": "string",
      "enum": [
        "hidden",
        "logged_in_only",
        "public"
      ],
      "description": "Visibility a candidate profile is created with at signup: `hidden` (not listed), `logged_in_only` (signed-in visitors), or `public`. Defaults to `hidden`, which matches what an unset value already means — the talent directory lists only `public` and `logged_in_only` profiles. Applies at signup ONLY: it never rewrites an existing profile, and a candidate can change their own afterwards. Composes with `talentDirectoryVisibility`, which controls who may browse the directory at all."
    },
    "experienceVerificationEnabled": {
      "type": "boolean",
      "description": "Whether the board team verifies candidate experience. Each experience entry gets a verification status covering its company name and website; changing either removes it. Decide items with `POST /v1/candidates/{id}/verifications/{itemKey}/decisions`."
    },
    "educationVerificationEnabled": {
      "type": "boolean",
      "description": "Whether the board team verifies candidate education. Each education entry gets a verification status covering its school name and website; changing either removes it. Decide items with `POST /v1/candidates/{id}/verifications/{itemKey}/decisions`."
    },
    "requireCookieConsent": {
      "type": "boolean",
      "description": "Whether the public board shows a cookie consent banner before non-essential tracking runs."
    },
    "cookieBannerTitle": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200,
      "description": "Title shown on the cookie consent banner. 1–200 characters."
    },
    "cookieBannerDescription": {
      "type": "string",
      "minLength": 1,
      "maxLength": 500,
      "description": "Body copy shown on the cookie consent banner. 1–500 characters."
    },
    "cookieBannerRejectLabel": {
      "type": "string",
      "minLength": 1,
      "maxLength": 80,
      "description": "Reject-button label on the cookie consent banner. 1–80 characters."
    },
    "cookieBannerAcceptLabel": {
      "type": "string",
      "minLength": 1,
      "maxLength": 80,
      "description": "Accept-button label on the cookie consent banner. 1–80 characters."
    },
    "cookieBannerManageLabel": {
      "type": "string",
      "minLength": 1,
      "maxLength": 80,
      "description": "Preferences/manage-button label on the cookie consent banner. 1–80 characters."
    },
    "showCavunoBranding": {
      "type": "boolean",
      "description": "Whether the Cavuno-branded footer is displayed on the public board. Plan-gated; lower-tier plans cannot disable this."
    },
    "defaultJobDurationDays": {
      "type": "integer",
      "minimum": 0,
      "exclusiveMinimum": true,
      "description": "Default expiry, in days, applied to newly published jobs when no `expiresAt` is supplied."
    },
    "contactEmail": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 320,
          "format": "email"
        },
        {
          "type": "string",
          "enum": [
            ""
          ]
        },
        {
          "nullable": true
        }
      ],
      "description": "Public contact email shown on the board. Pass `null` to clear."
    },
    "companyLegalName": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 200
        },
        {
          "type": "string",
          "enum": [
            ""
          ]
        },
        {
          "nullable": true
        }
      ],
      "description": "Legal name of the entity operating the board. Pass `null` to clear."
    },
    "companyAddress": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 500
        },
        {
          "type": "string",
          "enum": [
            ""
          ]
        },
        {
          "nullable": true
        }
      ],
      "description": "Postal address of the entity operating the board. Pass `null` to clear."
    },
    "companyWebsiteUrl": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 500
        },
        {
          "type": "string",
          "enum": [
            ""
          ]
        },
        {
          "nullable": true
        }
      ],
      "description": "Public company website URL. Pass `null` to clear."
    },
    "companyXHandle": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 500
        },
        {
          "type": "string",
          "enum": [
            ""
          ]
        },
        {
          "nullable": true
        }
      ],
      "description": "Company X (Twitter) handle or profile URL. Pass `null` to clear."
    },
    "companyFacebookUrl": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 500
        },
        {
          "type": "string",
          "enum": [
            ""
          ]
        },
        {
          "nullable": true
        }
      ],
      "description": "Company Facebook page URL. Pass `null` to clear."
    },
    "companyLinkedinUrl": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 500
        },
        {
          "type": "string",
          "enum": [
            ""
          ]
        },
        {
          "nullable": true
        }
      ],
      "description": "Company LinkedIn page URL. Pass `null` to clear."
    },
    "companyInstagramUrl": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 500
        },
        {
          "type": "string",
          "enum": [
            ""
          ]
        },
        {
          "nullable": true
        }
      ],
      "description": "Company Instagram handle or profile URL. Pass `null` to clear."
    },
    "companyTiktokUrl": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 500
        },
        {
          "type": "string",
          "enum": [
            ""
          ]
        },
        {
          "nullable": true
        }
      ],
      "description": "Company TikTok handle or profile URL, stored as `https://www.tiktok.com/@handle`. Pass `null` to clear."
    },
    "companyYoutubeUrl": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 500
        },
        {
          "type": "string",
          "enum": [
            ""
          ]
        },
        {
          "nullable": true
        }
      ],
      "description": "Company YouTube channel: an `@handle` or a channel URL (`/@handle`, `/channel/UC…`, `/c/name`, `/user/name`); video links are refused. Pass `null` to clear."
    },
    "ga4MeasurementId": {
      "type": [
        "string",
        "null"
      ],
      "maxLength": 120,
      "pattern": "^[A-Za-z0-9_-]*$",
      "description": "Google Analytics 4 measurement ID (for example `G-XXXXXXXXXX`) loaded on the public board. Letters, digits, `-` and `_`, up to 120 characters. Pass `null` or an empty string to clear."
    },
    "gtmContainerId": {
      "type": [
        "string",
        "null"
      ],
      "maxLength": 120,
      "pattern": "^[A-Za-z0-9_-]*$",
      "description": "Google Tag Manager container ID (for example `GTM-XXXXXXX`) loaded on the public board. Letters, digits, `-` and `_`, up to 120 characters. Pass `null` or an empty string to clear."
    },
    "metaPixelId": {
      "type": [
        "string",
        "null"
      ],
      "maxLength": 120,
      "pattern": "^[A-Za-z0-9_-]*$",
      "description": "Meta Pixel ID loaded on the public board. Letters, digits, `-` and `_`, up to 120 characters. Pass `null` or an empty string to clear."
    },
    "linkedinPartnerId": {
      "type": [
        "string",
        "null"
      ],
      "maxLength": 120,
      "pattern": "^[A-Za-z0-9_-]*$",
      "description": "LinkedIn Insight Tag partner ID loaded on the public board. Letters, digits, `-` and `_`, up to 120 characters. Pass `null` or an empty string to clear."
    },
    "linkedinConversionSignUpId": {
      "type": [
        "string",
        "null"
      ],
      "maxLength": 120,
      "pattern": "^[A-Za-z0-9_-]*$",
      "description": "LinkedIn conversion ID fired when a visitor signs up. Letters, digits, `-` and `_`, up to 120 characters. Pass `null` or an empty string to clear."
    },
    "linkedinConversionLoginId": {
      "type": [
        "string",
        "null"
      ],
      "maxLength": 120,
      "pattern": "^[A-Za-z0-9_-]*$",
      "description": "LinkedIn conversion ID fired when a visitor signs in. Letters, digits, `-` and `_`, up to 120 characters. Pass `null` or an empty string to clear."
    },
    "linkedinConversionApplyClickId": {
      "type": [
        "string",
        "null"
      ],
      "maxLength": 120,
      "pattern": "^[A-Za-z0-9_-]*$",
      "description": "LinkedIn conversion ID fired when a visitor clicks Apply. Letters, digits, `-` and `_`, up to 120 characters. Pass `null` or an empty string to clear."
    },
    "linkedinConversionApplySubmitId": {
      "type": [
        "string",
        "null"
      ],
      "maxLength": 120,
      "pattern": "^[A-Za-z0-9_-]*$",
      "description": "LinkedIn conversion ID fired when a visitor submits an application. Letters, digits, `-` and `_`, up to 120 characters. Pass `null` or an empty string to clear."
    },
    "linkedinConversionJobAlertSubscribeId": {
      "type": [
        "string",
        "null"
      ],
      "maxLength": 120,
      "pattern": "^[A-Za-z0-9_-]*$",
      "description": "LinkedIn conversion ID fired when a visitor subscribes to job alerts. Letters, digits, `-` and `_`, up to 120 characters. Pass `null` or an empty string to clear."
    },
    "talentNavLabel": {
      "type": "string",
      "minLength": 1,
      "maxLength": 50,
      "description": "Label shown for the talent directory in the public navigation. 1–50 characters."
    },
    "passwordProtectionMessage": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 500
        },
        {
          "type": "string",
          "enum": [
            ""
          ]
        },
        {
          "nullable": true
        }
      ],
      "deprecated": true,
      "description": "Deprecated: no longer shown on the password gate. Gate copy now lives on the board's builder-designed coming-soon page. Still accepted and returned for compatibility; it will be removed with the hosted board. Up to 500 characters. Pass `null` to clear."
    },
    "signInMethods": {
      "$ref": "#/$defs/SignInMethodsPatch"
    },
    "employerCompanyDeletionEnabled": {
      "type": "boolean",
      "description": "Whether employers can delete their company from the board. Absent board config defaults to `true`."
    },
    "talentAccessModel": {
      "type": "string",
      "enum": [
        "paid_messaging",
        "paid_unlocks_and_messaging"
      ],
      "description": "`paid_messaging`: employers browse full candidate profiles and spend credits only to message. `paid_unlocks_and_messaging`: employers spend credits to unlock a profile before messaging. Changing the model, or first setting `paid_messaging`, is refused with 409 `settings_talent_access_model_locked` while an active plan includes candidate database credits; archive those plans first."
    },
    "language": {
      "type": "string",
      "enum": [
        "en",
        "de",
        "fr",
        "es",
        "pt",
        "nl",
        "it",
        "sv",
        "da",
        "nb",
        "fi",
        "pl",
        "cs",
        "ja",
        "ko",
        "zh",
        "hi",
        "tr",
        "ru"
      ],
      "description": "Board language. On a hosted board the new language applies immediately. On a site built with the AI website builder the language lives in the site code: a change starts a translation of your site that is published when it is ready (usually a few minutes), so `config.language` keeps the current value and the response carries the pending `languageChange`. Sending the current language changes nothing."
    },
    "interfaceLocales": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "en",
          "de",
          "fr",
          "es",
          "pt",
          "nl",
          "it",
          "sv",
          "da",
          "nb",
          "fi",
          "pl",
          "cs",
          "ja",
          "ko",
          "zh",
          "hi",
          "tr",
          "ru"
        ]
      },
      "maxItems": 19,
      "description": "Sites built with the AI website builder only: the whole set of secondary languages the site serves besides `language`, up to 3 (a set already larger may shrink but not grow). A change starts a translation that is published when it is ready, reported in `languageChange`; `config.interfaceLocales` updates once it is live. Sending the current set changes nothing. Refused with 409 `settings_language_change_refused` on a hosted board, before the site's first publish, or while another language change is in progress — including a language change in the same request."
    },
    "salaryCurrency": {
      "type": "string",
      "pattern": "^[A-Z]{3}$",
      "description": "ISO 4217 code the board’s salary pages and salary amounts are shown in. A currency without a current exchange rate is refused with 400."
    },
    "themeConfig": {
      "$ref": "#/$defs/BoardThemeConfig"
    },
    "emailPoweredByText": {
      "type": "string",
      "maxLength": 80,
      "description": "“Powered by” text in the footer of the board’s emails, up to 80 characters. Must contain the word `Cavuno` (linked to cavuno.com) while `showCavunoBranding` is on."
    },
    "emailManagePreferencesLabel": {
      "type": "string",
      "maxLength": 60,
      "description": "Label of the manage-preferences link in marketing email footers, up to 60 characters. An empty string resets it to `Manage preferences`."
    },
    "emailUnsubscribeLabel": {
      "type": "string",
      "maxLength": 60,
      "description": "Label of the unsubscribe link in marketing email footers, up to 60 characters. An empty string resets it to `Unsubscribe`."
    },
    "customLinks": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/SettingsCustomLink"
      },
      "maxItems": 50,
      "description": "Custom links shown in email footers, in order (up to 50). Replaces the whole list. Rows with neither a label nor a URL are dropped; a row needs both, and an unsafe URL is refused. Refused with 409 while the site is moving to the AI website builder; sending the current list changes nothing."
    }
  },
  "additionalProperties": false,
  "$defs": {
    "ApplyUrlAttribution": {
      "oneOf": [
        {
          "type": "object",
          "properties": {
            "mode": {
              "type": "string",
              "enum": [
                "off"
              ]
            }
          },
          "required": [
            "mode"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "mode": {
              "type": "string",
              "enum": [
                "append"
              ]
            },
            "params": {
              "type": "array",
              "items": {
                "$ref": "#/$defs/ApplyUrlParamTemplate"
              },
              "maxItems": 8
            }
          },
          "required": [
            "mode",
            "params"
          ],
          "additionalProperties": false
        }
      ],
      "description": "Query parameters appended to outbound apply URLs. Absent means the default `ref={{boardHost}}`."
    },
    "ApplyUrlParamTemplate": {
      "type": "object",
      "properties": {
        "key": {
          "type": "string",
          "minLength": 1,
          "maxLength": 64,
          "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]*$"
        },
        "valueTemplate": {
          "type": "string",
          "maxLength": 200
        }
      },
      "required": [
        "key",
        "valueTemplate"
      ],
      "additionalProperties": false
    },
    "BoardThemeConfig": {
      "type": "object",
      "properties": {
        "mode": {
          "type": "string",
          "enum": [
            "light",
            "dark",
            "system"
          ]
        },
        "designSystem": {
          "type": "object",
          "properties": {
            "schemeId": {
              "type": "string",
              "enum": [
                "obsidian",
                "slate",
                "sand",
                "coral",
                "indigo",
                "emerald",
                "charcoal",
                "custom"
              ]
            },
            "colors": {
              "type": "object",
              "properties": {
                "light": {
                  "type": "object",
                  "properties": {
                    "brandColor": {
                      "type": "string",
                      "pattern": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"
                    },
                    "buttonPrimary": {
                      "type": "string",
                      "pattern": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"
                    },
                    "buttonPrimaryText": {
                      "type": "string",
                      "pattern": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"
                    },
                    "buttonDanger": {
                      "type": "string",
                      "pattern": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"
                    },
                    "background": {
                      "type": "string",
                      "pattern": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"
                    },
                    "surfaceBackground": {
                      "type": "string",
                      "pattern": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"
                    },
                    "mutedBackground": {
                      "type": "string",
                      "pattern": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"
                    },
                    "highlightBackground": {
                      "type": "string",
                      "pattern": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"
                    },
                    "text": {
                      "type": "string",
                      "pattern": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"
                    },
                    "textSubtle": {
                      "type": "string",
                      "pattern": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"
                    },
                    "textMuted": {
                      "type": "string",
                      "pattern": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"
                    },
                    "textDisabled": {
                      "type": "string",
                      "pattern": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"
                    },
                    "textError": {
                      "type": "string",
                      "pattern": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"
                    },
                    "border": {
                      "type": "string",
                      "pattern": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"
                    },
                    "contrastBackground": {
                      "type": "string",
                      "pattern": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"
                    },
                    "contrastText": {
                      "type": "string",
                      "pattern": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"
                    }
                  },
                  "required": [
                    "brandColor",
                    "buttonPrimary",
                    "buttonPrimaryText",
                    "buttonDanger",
                    "background",
                    "surfaceBackground",
                    "mutedBackground",
                    "highlightBackground",
                    "text",
                    "textMuted",
                    "textError",
                    "border",
                    "contrastBackground",
                    "contrastText"
                  ]
                },
                "dark": {
                  "type": "object",
                  "properties": {
                    "brandColor": {
                      "type": "string",
                      "pattern": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"
                    },
                    "buttonPrimary": {
                      "type": "string",
                      "pattern": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"
                    },
                    "buttonPrimaryText": {
                      "type": "string",
                      "pattern": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"
                    },
                    "buttonDanger": {
                      "type": "string",
                      "pattern": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"
                    },
                    "background": {
                      "type": "string",
                      "pattern": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"
                    },
                    "surfaceBackground": {
                      "type": "string",
                      "pattern": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"
                    },
                    "mutedBackground": {
                      "type": "string",
                      "pattern": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"
                    },
                    "highlightBackground": {
                      "type": "string",
                      "pattern": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"
                    },
                    "text": {
                      "type": "string",
                      "pattern": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"
                    },
                    "textSubtle": {
                      "type": "string",
                      "pattern": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"
                    },
                    "textMuted": {
                      "type": "string",
                      "pattern": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"
                    },
                    "textDisabled": {
                      "type": "string",
                      "pattern": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"
                    },
                    "textError": {
                      "type": "string",
                      "pattern": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"
                    },
                    "border": {
                      "type": "string",
                      "pattern": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"
                    },
                    "contrastBackground": {
                      "type": "string",
                      "pattern": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"
                    },
                    "contrastText": {
                      "type": "string",
                      "pattern": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}|[A-Fa-f0-9]{8})$"
                    }
                  },
                  "required": [
                    "brandColor",
                    "buttonPrimary",
                    "buttonPrimaryText",
                    "buttonDanger",
                    "background",
                    "surfaceBackground",
                    "mutedBackground",
                    "highlightBackground",
                    "text",
                    "textMuted",
                    "textError",
                    "border",
                    "contrastBackground",
                    "contrastText"
                  ]
                }
              },
              "required": [
                "light",
                "dark"
              ]
            },
            "typography": {
              "type": "object",
              "properties": {
                "fontSans": {
                  "type": "string",
                  "enum": [
                    "be-vietnam-pro",
                    "inter",
                    "plus-jakarta-sans",
                    "dm-sans",
                    "public-sans",
                    "figtree",
                    "work-sans",
                    "open-sans",
                    "poppins",
                    "hind",
                    "lexend",
                    "fira-sans",
                    "manrope",
                    "source-sans-pro",
                    "outfit",
                    "space-grotesk",
                    "geist",
                    "source-serif-4",
                    "lora",
                    "crimson-pro"
                  ]
                },
                "fontHeading": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "enum": [
                    "be-vietnam-pro",
                    "inter",
                    "plus-jakarta-sans",
                    "dm-sans",
                    "public-sans",
                    "figtree",
                    "work-sans",
                    "open-sans",
                    "poppins",
                    "hind",
                    "lexend",
                    "fira-sans",
                    "manrope",
                    "source-sans-pro",
                    "outfit",
                    "space-grotesk",
                    "geist",
                    "source-serif-4",
                    "lora",
                    "crimson-pro"
                  ]
                }
              },
              "required": [
                "fontSans",
                "fontHeading"
              ]
            }
          },
          "required": [
            "schemeId",
            "colors",
            "typography"
          ]
        }
      },
      "required": [
        "mode",
        "designSystem"
      ],
      "description": "Board theme: color mode, light and dark color tokens (hex), and fonts. Replaces the whole theme. Refused with 409 on a site built with the AI website builder, where the theme is edited in the builder; sending the current theme changes nothing."
    },
    "SettingsCustomLink": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "minLength": 1,
          "maxLength": 100,
          "description": "Your stable identifier for the link."
        },
        "label": {
          "type": "string",
          "maxLength": 60
        },
        "url": {
          "type": "string",
          "maxLength": 2048,
          "description": "An `http(s)`, `mailto:` or `tel:` URL, `#`, a bare host (stored as `https://…`), or a path on the board such as `/employers` (emails link it on the board's address)."
        },
        "iconName": {
          "type": "string",
          "maxLength": 64,
          "description": "Optional icon shown beside the link in email footers."
        }
      },
      "required": [
        "id",
        "label",
        "url"
      ],
      "additionalProperties": false
    },
    "SignInMethodsPatch": {
      "type": "object",
      "properties": {
        "candidate": {
          "type": "object",
          "properties": {
            "password": {
              "type": "boolean"
            },
            "magicLink": {
              "type": "boolean"
            },
            "google": {
              "type": "boolean"
            },
            "linkedin": {
              "type": "boolean"
            }
          },
          "additionalProperties": false
        },
        "employer": {
          "type": "object",
          "properties": {
            "password": {
              "type": "boolean"
            },
            "magicLink": {
              "type": "boolean"
            },
            "google": {
              "type": "boolean"
            },
            "linkedin": {
              "type": "boolean"
            }
          },
          "additionalProperties": false
        }
      },
      "additionalProperties": false,
      "description": "Switch built-in sign-in methods on or off per role; omitted methods stay as they are. Switching off a role’s last way to sign in (no other built-in method on, and no tested SSO connection switched on for that role) is refused with 409 `sign_in_method_last`. People already signed in stay signed in."
    }
  }
}