Cavuno · Schema
PatchSettingsBody
Job Board SoftwareArtificial IntelligenceCommunity PlatformsMonetization
Properties
| Name | Type | Description |
|---|---|---|
| name | string | Display name of the board. |
| slug | string | URL slug of the board. Lowercase alphanumeric and hyphens; reserved values (e.g. `admin`, `api`) are rejected. |
| primaryDomainId | string | Identifier of the custom domain to use as the primary public URL. |
| logoMediaId | string | Cavuno media ID returned by `POST /v1/media/upload` with `purpose=board_logo`. |
| heroMediaId | string | Cavuno media ID returned by `POST /v1/media/upload` with `purpose=board_hero`. |
| passwordProtectionEnabled | boolean | Whether the board sits behind a password gate. Use `POST /v1/settings/password-protection` to set the actual password before enabling. |
| jobAlertsEnabled | boolean | Whether candidates can subscribe to email alerts for new jobs. |
| jobRecommendationsEnabled | boolean | Whether signed-in candidates can see personalized job recommendations. Absent board config defaults to `true`. |
| recommendedTalentEnabled | boolean | Whether employers can see recommended talent matches for their jobs. Absent board config defaults to `false`. |
| candidatesEnabled | boolean | Whether candidate profiles are enabled on the board. |
| employersEnabled | boolean | Whether employer self-serve flows are enabled. |
| blogEnabled | boolean | Whether the public blog is exposed. |
| impressumEnabled | boolean | 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 reporte |
| requireApprovalFreeJobs | boolean | Whether jobs posted by employers from the free tier require admin approval before they appear on the public board. |
| postingRequiresMembership | boolean | When true, only companies with an active plan assignment can post jobs. Absent means anyone can post. |
| requireApprovalAggregatedJobs | boolean | Whether aggregated jobs (e.g. those sourced or imported from upstream sources) require admin approval before they appear on the public board. |
| registrationWallEnabled | boolean | Whether visitors must sign in to view jobs. |
| nativeApplicationsEnabled | boolean | 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/:jobSl |
| countryGatingMode | string | Apply country gate mode. The default is sponsored_only; all_jobs also gates ordinary external and native starter applies. |
| applicantMessagingEnabled | boolean | 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 | object | |
| talentDirectoryEnabled | boolean | 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 `se |
| talentDirectoryVisibility | string | Talent directory access mode: `off` (hidden), `public` (anyone), or `employers_only` (approved employers). Canonical field; supersedes `talentDirectoryEnabled`. |
| defaultCandidateProfileVisibility | string | 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 mea |
| experienceVerificationEnabled | boolean | 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/ca |
| educationVerificationEnabled | boolean | 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/candi |
| requireCookieConsent | boolean | Whether the public board shows a cookie consent banner before non-essential tracking runs. |
| cookieBannerTitle | string | Title shown on the cookie consent banner. 1–200 characters. |
| cookieBannerDescription | string | Body copy shown on the cookie consent banner. 1–500 characters. |
| cookieBannerRejectLabel | string | Reject-button label on the cookie consent banner. 1–80 characters. |
| cookieBannerAcceptLabel | string | Accept-button label on the cookie consent banner. 1–80 characters. |
| cookieBannerManageLabel | string | Preferences/manage-button label on the cookie consent banner. 1–80 characters. |
| showCavunoBranding | boolean | Whether the Cavuno-branded footer is displayed on the public board. Plan-gated; lower-tier plans cannot disable this. |
| defaultJobDurationDays | integer | Default expiry, in days, applied to newly published jobs when no `expiresAt` is supplied. |
| contactEmail | object | Public contact email shown on the board. Pass `null` to clear. |
| companyLegalName | object | Legal name of the entity operating the board. Pass `null` to clear. |
| companyAddress | object | Postal address of the entity operating the board. Pass `null` to clear. |
| companyWebsiteUrl | object | Public company website URL. Pass `null` to clear. |
| companyXHandle | object | Company X (Twitter) handle or profile URL. Pass `null` to clear. |
| companyFacebookUrl | object | Company Facebook page URL. Pass `null` to clear. |
| companyLinkedinUrl | object | Company LinkedIn page URL. Pass `null` to clear. |
| companyInstagramUrl | object | Company Instagram handle or profile URL. Pass `null` to clear. |
| companyTiktokUrl | object | Company TikTok handle or profile URL, stored as `https://www.tiktok.com/@handle`. Pass `null` to clear. |
| companyYoutubeUrl | object | 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 | stringnull | 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 | stringnull | 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 | stringnull | Meta Pixel ID loaded on the public board. Letters, digits, `-` and `_`, up to 120 characters. Pass `null` or an empty string to clear. |
| linkedinPartnerId | stringnull | 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 | stringnull | 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 | stringnull | 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 | stringnull | 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 | stringnull | 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 | stringnull | 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 | string | Label shown for the talent directory in the public navigation. 1–50 characters. |
| passwordProtectionMessage | object | 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 hoste |
| signInMethods | object | |
| employerCompanyDeletionEnabled | boolean | Whether employers can delete their company from the board. Absent board config defaults to `true`. |
| talentAccessModel | string | `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 m |
| language | string | 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 |
| interfaceLocales | array | 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 transla |
| salaryCurrency | string | 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 | object | |
| emailPoweredByText | string | “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 | string | Label of the manage-preferences link in marketing email footers, up to 60 characters. An empty string resets it to `Manage preferences`. |
| emailUnsubscribeLabel | string | Label of the unsubscribe link in marketing email footers, up to 60 characters. An empty string resets it to `Unsubscribe`. |
| customLinks | array | 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 whi |
JSON Schema
{
"$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 t
# --- truncated at 32 KB (34 KB total) ---
# Full source: https://artifacts.apis.io/cavuno-com/json-schema/cavuno-com-patch-settings-body-schema.json
Work with this as data
Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for schemas
4 MCP tools reach this
find_json_schemasBrowse and filter every JSON Schema in the catalog.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/cavuno-com-patch-settings-body"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.