{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://docs.buildbase.app/schemas/blueprint.v1.json",
  "title": "BuildBase blueprint",
  "description": "One file that sets up a whole BuildBase app: settings, sign-in, email, billing, roles, webhooks, workflows and the data model. Apply it from the console (Get started, then Set up from one file), with `npx buildbase blueprint apply`, or through the API. Fields you leave out are left as they are. Secrets are always written as \"${env:NAME}\" and supplied when you apply.",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "version"
  ],
  "properties": {
    "$schema": {
      "type": "string",
      "description": "Editor hint: the URL of this schema."
    },
    "version": {
      "const": 1,
      "description": "Blueprint format version. Always 1."
    },
    "policy": {
      "type": "object",
      "description": "How apply treats things the file does not cover.",
      "additionalProperties": false,
      "properties": {
        "prune": {
          "type": "array",
          "description": "Kinds (e.g. \"webhooks\", \"auth.clients\") whose resources this blueprint created or adopted may be DELETED when removed from the file. Empty by default: removing an entry never deletes anything unless its kind is listed here AND apply is run with prune switched on.",
          "items": {
            "type": "string",
            "maxLength": 100
          },
          "maxItems": 100
        },
        "publish": {
          "type": "string",
          "enum": [
            "always",
            "never"
          ],
          "description": "Versioned resources (plans, pricing groups, add-ons, held credit packages, collections): \"always\" (default) publishes the new version so the change is live; \"never\" leaves it as a draft to publish in the console. Existing subscribers keep the version they bought either way, and a publish with versionMoves on never moves them by itself: the move waits for confirmation in the console."
        }
      }
    },
    "app": {
      "type": "object",
      "description": "App settings.",
      "additionalProperties": false,
      "properties": {
        "name": {
          "type": "string",
          "maxLength": 120,
          "description": "The app name. The console, the default email sender name and the hosted sign-in page title use it.",
          "minLength": 2
        },
        "domain": {
          "type": "string",
          "maxLength": 253,
          "description": "The app's main website domain, e.g. app.example.com. Informational: sign-in uses auth.domains and each auth client's redirect URLs.",
          "format": "hostname"
        },
        "currencies": {
          "type": "array",
          "items": {
            "enum": [
              "usd",
              "eur",
              "gbp",
              "cad",
              "aud",
              "jpy",
              "inr",
              "chf",
              "sek",
              "nok",
              "dkk",
              "sgd",
              "hkd",
              "nzd",
              "mxn",
              "brl",
              "pln",
              "czk",
              "thb",
              "try",
              "zar"
            ],
            "description": "A lowercase ISO 4217 currency code."
          },
          "maxItems": 21,
          "description": "Currencies plans are sold in. Every published paid plan must have a price in each one. Currencies can be added but never removed: a currency listed live and missing here stays, and the plan says so.",
          "minItems": 1,
          "uniqueItems": true
        },
        "workflowLimits": {
          "type": "object",
          "description": "Frequency caps for messages sent by workflows. Workflows > Frequency cap in the console.",
          "additionalProperties": false,
          "properties": {
            "maxEmailsPerDay": {
              "type": "integer",
              "description": "Most workflow emails one contact may receive per day, across all workflows. 0 means no cap.",
              "minimum": 0,
              "maximum": 1000
            },
            "maxPushPerDay": {
              "type": "integer",
              "description": "Most workflow push messages one contact may receive per day. 0 means no cap.",
              "minimum": 0,
              "maximum": 1000
            }
          }
        },
        "notifications": {
          "type": "object",
          "description": "Organization-wide kill switches for the notification events in email.notificationEvents.",
          "additionalProperties": false,
          "properties": {
            "email": {
              "type": "boolean",
              "description": "Send notification emails at all. Off stops every notification event email."
            },
            "push": {
              "type": "boolean",
              "description": "Send push notifications at all. Off stops every notification event push."
            }
          }
        }
      }
    },
    "workspaces": {
      "type": "object",
      "description": "Workspace settings.",
      "additionalProperties": false,
      "properties": {
        "mode": {
          "enum": [
            "personal",
            "platform"
          ],
          "description": "\"personal\": every user gets exactly one workspace of their own, no invites, no roles. \"platform\": shared team workspaces with invites, roles and a switcher (a paid BuildBase plan feature). Switching mode resets the behaviour flags below to that mode's defaults unless you set them too."
        },
        "canCreateWorkspace": {
          "type": "boolean",
          "description": "Users may create workspaces themselves. Must be false in personal mode."
        },
        "canInviteMembers": {
          "description": "Who may invite people into a workspace: true (any member with the invite permission), \"admin-only\" (workspace admins), or false (nobody). Must be false in personal mode.",
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "enum": [
                "admin-only"
              ]
            }
          ]
        },
        "showSwitcher": {
          "type": "boolean",
          "description": "Show the workspace switcher in the app. Must be false in personal mode."
        },
        "maxWorkspacesPerUser": {
          "type": "integer",
          "description": "Most workspaces one person may own (create). 0 means no cap. At most 1 in personal mode.",
          "minimum": 0,
          "maximum": 100000
        },
        "autoCreateFirst": {
          "type": "boolean",
          "description": "Create a first workspace for every new user at sign-up. Must be true in personal mode."
        },
        "maxWorkspaces": {
          "type": "integer",
          "description": "Most workspaces one person may belong to, owned or joined. 1 in personal mode.",
          "minimum": 1,
          "maximum": 1000
        },
        "maxWorkspaceUsers": {
          "type": "integer",
          "description": "Most members in one workspace. 1 in personal mode.",
          "minimum": 1,
          "maximum": 10000
        },
        "roles": {
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 50,
            "description": "A workspace role name.",
            "pattern": "^[a-z0-9][a-z0-9_-]{0,49}$"
          },
          "maxItems": 50,
          "description": "Workspace roles, in display order. Must include the built-in roles admin, editor and viewer. Platform mode only.",
          "uniqueItems": true
        },
        "defaultRole": {
          "type": "string",
          "maxLength": 50,
          "description": "Role new members get. Any role except admin. Platform mode only."
        },
        "permissions": {
          "type": "object",
          "description": "What each workspace role may do: role name to permission keys. Roles left out keep their current permissions; the built-in defaults apply until you set a role.",
          "propertyNames": {
            "maxLength": 200
          },
          "additionalProperties": {
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 100,
              "description": "A permission key: a built-in one (workspace:members:invite, ...) or one from customPermissions."
            },
            "maxItems": 200,
            "description": "Permission keys this role holds.",
            "uniqueItems": true
          }
        },
        "customPermissions": {
          "type": "object",
          "description": "Permissions your own app checks (with the SDK), keyed by permission key, e.g. \"reports:export\". Removing one also removes it from every role.",
          "propertyNames": {
            "maxLength": 200,
            "pattern": "^[a-z0-9][a-z0-9:._-]{1,99}$"
          },
          "additionalProperties": {
            "type": "object",
            "description": "A custom permission.",
            "additionalProperties": false,
            "properties": {
              "label": {
                "type": "string",
                "maxLength": 100,
                "description": "Name shown in the permission matrix.",
                "minLength": 1
              },
              "group": {
                "type": "string",
                "maxLength": 100,
                "description": "Group heading in the permission matrix."
              }
            },
            "required": [
              "label"
            ]
          }
        },
        "features": {
          "type": "object",
          "description": "Feature flags your app checks per workspace with the SDK. Flags that a plan grants are declared as billing items of type \"feature\" instead.",
          "propertyNames": {
            "description": "Each key is the feature slug your app checks with the SDK (cannot change after creation).",
            "pattern": "^[a-z0-9][a-z0-9_-]{1,99}$",
            "maxLength": 200
          },
          "additionalProperties": {
            "type": "object",
            "description": "A workspace feature flag.",
            "additionalProperties": false,
            "properties": {
              "name": {
                "type": "string",
                "maxLength": 100,
                "description": "Name shown in the console and to workspace admins.",
                "minLength": 2
              },
              "description": {
                "type": "string",
                "maxLength": 500,
                "description": "What the flag turns on.",
                "minLength": 2
              },
              "enabled": {
                "type": "boolean",
                "description": "The flag is live. Off, it reads as off everywhere whatever its value. Default false."
              },
              "defaultValue": {
                "type": "boolean",
                "description": "Value a workspace gets until someone changes it. Default false."
              },
              "userManaged": {
                "type": "boolean",
                "description": "Workspace admins may switch it themselves in the app; otherwise only the console can. Default false."
              },
              "allowAll": {
                "type": "boolean",
                "description": "Available to every workspace rather than only ones you select. Default false."
              },
              "category": {
                "type": "string",
                "maxLength": 50,
                "description": "Grouping label in the console. Default \"general\"."
              },
              "archived": {
                "type": "boolean",
                "description": "Archived flags are hidden and read as off. Removing a flag from the file never archives it."
              }
            },
            "required": [
              "name",
              "description"
            ]
          },
          "examples": [
            {
              "beta-reports": {
                "name": "Beta reports",
                "description": "The new reports page",
                "enabled": true,
                "userManaged": true
              }
            }
          ]
        }
      }
    },
    "auth": {
      "type": "object",
      "description": "How end users sign in to the app: login methods, auth clients (one per front end), the hosted sign-in page, session and MFA policy, sign-up rules, custom auth domains, bot protection, SMS and agent access.",
      "additionalProperties": false,
      "properties": {
        "methods": {
          "type": "object",
          "description": "Sign-in methods (User management > Authentication > Methods): email and password, magic link or email code, passkeys, phone codes, guests, wallets, the social providers and one custom OIDC provider. A method does nothing until an auth client lists it in its methods. Social secrets are write-only: give them as \"${env:NAME}\".",
          "propertyNames": {
            "description": "Each key is a name you choose for the method (it only lives in this file); auth.clients name methods by it.",
            "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,99}$",
            "maxLength": 200
          },
          "additionalProperties": {
            "type": "object",
            "description": "A sign-in method.",
            "additionalProperties": false,
            "properties": {
              "type": {
                "enum": [
                  "password",
                  "magic-link",
                  "passkey",
                  "phone",
                  "guest",
                  "wallet",
                  "google",
                  "linkedin",
                  "github",
                  "microsoft",
                  "apple",
                  "custom-oidc"
                ],
                "description": "Which sign-in method this is. password: email and password. magic-link: a link or 6-digit code by email. passkey: device passkeys (WebAuthn). phone: a code by text message, WhatsApp or voice call through the app's own SMS provider (auth.sms). guest: \"Continue as guest\", an account-less session that upgrades in place. wallet: an Ethereum or Solana wallet signature. google, linkedin, github, microsoft, apple: those providers' OAuth sign-in (Google, LinkedIn, GitHub, Microsoft, Apple, Custom OIDC provider). custom-oidc: one button for any other OpenID Connect or OAuth 2.0 provider (one per app). The type of an existing method cannot change."
              },
              "title": {
                "type": "string",
                "maxLength": 120,
                "description": "The method's name in the console and, for most types, on the hosted sign-in page's button.",
                "minLength": 2
              },
              "delivery": {
                "enum": [
                  "link",
                  "code",
                  "both"
                ],
                "description": "Only for magic-link: what the email sends. link (default): a sign-in link. code: a 6-digit code typed on the page. both: either."
              },
              "ethereumChainIds": {
                "type": "array",
                "items": {
                  "type": "integer",
                  "description": "An EIP-155 chain ID: 1 is Ethereum mainnet, 137 Polygon, 8453 Base.",
                  "minimum": 1,
                  "maximum": 2147483648
                },
                "maxItems": 20,
                "description": "Only for wallet: the Ethereum networks a wallet may sign in from. Default [1] (mainnet). Empty allows no Ethereum wallet, which needs solana: true.",
                "uniqueItems": true
              },
              "solana": {
                "type": "boolean",
                "description": "Only for wallet: allow Solana wallets too. Default false."
              },
              "clientId": {
                "type": "string",
                "maxLength": 512,
                "description": "Social providers only: the OAuth client ID registered with the provider (for apple, the Services ID, e.g. com.example.signin).",
                "minLength": 1
              },
              "clientSecret": {
                "type": "string",
                "maxLength": 10000,
                "description": "Social providers except apple: the OAuth client secret registered with the provider. Write-only: put \"${env:NAME}\" here and supply the value when you apply. It is never shown again."
              },
              "privateKey": {
                "type": "string",
                "maxLength": 10000,
                "description": "Only for apple: the contents of the .p8 Sign in with Apple key (an EC P-256 private key), from -----BEGIN PRIVATE KEY----- to the end. Write-only: put \"${env:NAME}\" here and supply the value when you apply. It is never shown again."
              },
              "scopes": {
                "type": "array",
                "items": {
                  "type": "string",
                  "maxLength": 256,
                  "description": "One OAuth scope.",
                  "minLength": 1
                },
                "maxItems": 50,
                "description": "Social providers only: the scopes to ask for. Empty (the default) asks for the provider's standard sign-in scopes (email and profile).",
                "uniqueItems": true
              },
              "oneTap": {
                "type": "boolean",
                "description": "Only for google: offer Google One Tap on the sign-in page. Default false. Register the sign-in page's origin as an authorized JavaScript origin on the Google client."
              },
              "tenant": {
                "type": "string",
                "maxLength": 200,
                "description": "Only for microsoft: the directory tenant. \"common\" (the default) accepts work, school and personal accounts; a directory ID or domain accepts that directory only.",
                "minLength": 1
              },
              "teamId": {
                "type": "string",
                "maxLength": 64,
                "description": "Only for apple: the Apple Developer team ID (Membership details), e.g. ABCDE12345.",
                "minLength": 1
              },
              "keyId": {
                "type": "string",
                "maxLength": 64,
                "description": "Only for apple: the ID of the Sign in with Apple key, e.g. XYZ987WVU6.",
                "minLength": 1
              },
              "label": {
                "type": "string",
                "maxLength": 120,
                "description": "Only for custom-oidc: the name on its sign-in button, e.g. \"Acme ID\".",
                "minLength": 1
              },
              "issuer": {
                "description": "The OIDC issuer URL; BuildBase reads the endpoints from its /.well-known/openid-configuration when saving (it must answer). Give this, or all three of authorizeUrl, tokenUrl and userInfoUrl. Only for custom-oidc. Use null to clear it.",
                "anyOf": [
                  {
                    "type": "string",
                    "format": "uri",
                    "maxLength": 2000,
                    "pattern": "^https?://"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "authorizeUrl": {
                "description": "For a provider without discovery: its authorization endpoint. Only for custom-oidc. Use null to clear it.",
                "anyOf": [
                  {
                    "type": "string",
                    "format": "uri",
                    "maxLength": 2000,
                    "pattern": "^https?://"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "tokenUrl": {
                "description": "For a provider without discovery: its token endpoint. Only for custom-oidc. Use null to clear it.",
                "anyOf": [
                  {
                    "type": "string",
                    "format": "uri",
                    "maxLength": 2000,
                    "pattern": "^https?://"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "userInfoUrl": {
                "description": "For a provider without discovery: its user info endpoint. Only for custom-oidc. Use null to clear it.",
                "anyOf": [
                  {
                    "type": "string",
                    "format": "uri",
                    "maxLength": 2000,
                    "pattern": "^https?://"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "iconUrl": {
                "description": "Only for custom-oidc: a square image for its button, over HTTPS. Without one the button shows a generic key. Use null to clear it.",
                "anyOf": [
                  {
                    "type": "string",
                    "format": "uri",
                    "maxLength": 2000,
                    "pattern": "^https://"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "emailTrust": {
                "enum": [
                  "verified-claim",
                  "always-verified",
                  "never"
                ],
                "description": "Only for custom-oidc: when an email address from it may sign into an existing account with the same email. never (default): it cannot. verified-claim: when it sends email_verified: true. always-verified: always. Trust only a provider that verifies addresses itself."
              }
            },
            "required": [
              "type",
              "title"
            ],
            "allOf": [
              {
                "if": {
                  "properties": {
                    "type": {
                      "const": "google"
                    }
                  },
                  "required": [
                    "type"
                  ]
                },
                "then": {
                  "required": [
                    "clientId",
                    "clientSecret"
                  ]
                }
              },
              {
                "if": {
                  "properties": {
                    "type": {
                      "const": "linkedin"
                    }
                  },
                  "required": [
                    "type"
                  ]
                },
                "then": {
                  "required": [
                    "clientId",
                    "clientSecret"
                  ]
                }
              },
              {
                "if": {
                  "properties": {
                    "type": {
                      "const": "github"
                    }
                  },
                  "required": [
                    "type"
                  ]
                },
                "then": {
                  "required": [
                    "clientId",
                    "clientSecret"
                  ]
                }
              },
              {
                "if": {
                  "properties": {
                    "type": {
                      "const": "microsoft"
                    }
                  },
                  "required": [
                    "type"
                  ]
                },
                "then": {
                  "required": [
                    "clientId",
                    "clientSecret"
                  ]
                }
              },
              {
                "if": {
                  "properties": {
                    "type": {
                      "const": "apple"
                    }
                  },
                  "required": [
                    "type"
                  ]
                },
                "then": {
                  "required": [
                    "clientId",
                    "teamId",
                    "keyId",
                    "privateKey"
                  ]
                }
              },
              {
                "if": {
                  "properties": {
                    "type": {
                      "const": "custom-oidc"
                    }
                  },
                  "required": [
                    "type"
                  ]
                },
                "then": {
                  "required": [
                    "label",
                    "clientId",
                    "clientSecret"
                  ]
                }
              }
            ]
          },
          "examples": [
            {
              "google": {
                "type": "google",
                "title": "Google",
                "clientId": "1234-abc.apps.googleusercontent.com",
                "clientSecret": "${env:GOOGLE_CLIENT_SECRET}",
                "oneTap": true
              }
            }
          ]
        },
        "clients": {
          "type": "object",
          "description": "Auth clients (User management > Authentication > Settings), one per app or front end that signs people in. A normal client is your own app using the hosted sign-in page; an oauth2 client makes this organization the OAuth 2.0 provider another application signs in with. The client ID and secret are generated by BuildBase and returned once, in the apply result of the run that creates the client.",
          "propertyNames": {
            "description": "Each key is a name you choose for the client (it only lives in this file).",
            "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,99}$",
            "maxLength": 200
          },
          "additionalProperties": {
            "type": "object",
            "description": "An auth client.",
            "additionalProperties": false,
            "properties": {
              "title": {
                "type": "string",
                "maxLength": 120,
                "description": "The client's name in the console, on the consent screen and in emails.",
                "minLength": 2
              },
              "type": {
                "enum": [
                  "normal",
                  "oauth2"
                ],
                "description": "normal: your own app signs people in through the hosted page (SDK or redirect). oauth2: a standard OAuth 2.0 / OIDC client, for an application that uses this organization as its identity provider. Cannot change once created."
              },
              "applicationTokenUrl": {
                "type": "string",
                "format": "uri",
                "maxLength": 2000,
                "description": "Your app's endpoint the hosted page posts the signed-in session to (normal clients), e.g. https://app.example.com/api/auth/token.",
                "pattern": "^https?://"
              },
              "applicationProfileUrl": {
                "type": "string",
                "format": "uri",
                "maxLength": 2000,
                "description": "Your app's endpoint for the signed-in person's profile, e.g. https://app.example.com/api/auth/profile.",
                "pattern": "^https?://"
              },
              "applicationRevokeUrl": {
                "type": "string",
                "maxLength": 2000,
                "description": "Optional: an http(s) URL BuildBase POSTs to when a session is revoked, so the app can drop its own token. Empty clears it.",
                "pattern": "^(https?://.*)?$"
              },
              "requirePkce": {
                "type": "boolean",
                "description": "Require PKCE on the authorization code flow. Defaults to true for a new oauth2 client and false for a normal one."
              },
              "clientKind": {
                "enum": [
                  "app",
                  "agent"
                ],
                "description": "app (default): a first-party app; tokens are issued straight after sign-in. agent: a third-party client such as an AI agent; the person approves access on a consent screen first."
              },
              "deviceGrant": {
                "type": "boolean",
                "description": "Allow the OAuth device code grant (RFC 8628), for CLIs and TVs. Default false."
              },
              "redirectUrls": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uri",
                  "maxLength": 2000,
                  "description": "A URL, or a pattern with one * in a subdomain label (https://*.example.com/callback).",
                  "pattern": "^[a-zA-Z][a-zA-Z0-9+.-]*:"
                },
                "maxItems": 500,
                "description": "Where the hosted page may send people back to after sign-in. A redirect to anything else is refused. Order does not matter.",
                "uniqueItems": true
              },
              "methods": {
                "type": "array",
                "items": {
                  "type": "string",
                  "maxLength": 200,
                  "description": "A key of auth.methods."
                },
                "maxItems": 50,
                "description": "The sign-in methods this client's hosted page offers, by their auth.methods key. An empty list leaves the page with nothing to sign in with. Order does not matter.",
                "uniqueItems": true
              },
              "trackingScripts": {
                "type": "array",
                "items": {
                  "type": "string",
                  "maxLength": 200,
                  "description": "A key of integrations.tracking."
                },
                "maxItems": 50,
                "description": "The tracking scripts this client's pages load (once consent allows), by their integrations.tracking key. Default none.",
                "uniqueItems": true
              },
              "branding": {
                "type": "object",
                "description": "How this app appears on the hosted sign-in page; anything unset falls back to auth.hostedPage. Logos and the favicon are uploaded in the console (a blueprint carries no files).",
                "additionalProperties": false,
                "properties": {
                  "displayName": {
                    "description": "The app's name as its users know it, on the hosted page. Default: the organization's name. Use null to clear it.",
                    "anyOf": [
                      {
                        "type": "string",
                        "maxLength": 80,
                        "minLength": 2
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "primaryColor": {
                    "description": "#RRGGBB for buttons and links on this app's sign-in page, over the organization's colour. Use null to clear it.",
                    "anyOf": [
                      {
                        "type": "string",
                        "maxLength": 7,
                        "pattern": "^#[0-9A-Fa-f]{6}$"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                }
              },
              "trackingSettings": {
                "type": "object",
                "description": "Consent and conversion settings for the tracking scripts this client loads.",
                "additionalProperties": false,
                "properties": {
                  "consentDefaults": {
                    "description": "The consent a visitor starts with. Without a rule it is denied everywhere. Use null to clear it.",
                    "anyOf": [
                      {
                        "type": "object",
                        "additionalProperties": false,
                        "properties": {
                          "default": {
                            "enum": [
                              "granted",
                              "denied"
                            ],
                            "description": "Tracking consent before the visitor answers, everywhere not listed below."
                          },
                          "regions": {
                            "type": "object",
                            "description": "Exceptions by region.",
                            "additionalProperties": false,
                            "properties": {
                              "denied": {
                                "type": "array",
                                "items": {
                                  "type": "string",
                                  "maxLength": 10,
                                  "description": "\"EEA\", an ISO country code (GB) or a subdivision (US-CA).",
                                  "pattern": "^(EEA|[A-Z]{2}(-[A-Z0-9]{1,3})?)$"
                                },
                                "maxItems": 300,
                                "description": "Regions where tracking consent starts denied.",
                                "uniqueItems": true
                              },
                              "granted": {
                                "type": "array",
                                "items": {
                                  "type": "string",
                                  "maxLength": 10,
                                  "description": "\"EEA\", an ISO country code (GB) or a subdivision (US-CA).",
                                  "pattern": "^(EEA|[A-Z]{2}(-[A-Z0-9]{1,3})?)$"
                                },
                                "maxItems": 300,
                                "description": "Regions where tracking consent starts granted.",
                                "uniqueItems": true
                              }
                            }
                          }
                        },
                        "required": [
                          "default"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "enhancedConversions": {
                    "type": "boolean",
                    "description": "Send hashed email and phone with conversions (enhanced conversions). Default false."
                  },
                  "signInConsentPrompt": {
                    "type": "object",
                    "description": "A consent checkbox on the sign-up screen.",
                    "additionalProperties": false,
                    "properties": {
                      "enabled": {
                        "type": "boolean",
                        "description": "Show a consent checkbox on sign-up. Default false."
                      },
                      "label": {
                        "type": "string",
                        "maxLength": 500,
                        "description": "The checkbox's sentence. Empty uses ours (or auth.hostedPage.consentLabel)."
                      }
                    }
                  }
                }
              },
              "copy": {
                "type": "object",
                "description": "This app's own words on the hosted sign-in page and their translations.",
                "additionalProperties": false,
                "properties": {
                  "words": {
                    "type": "object",
                    "description": "This app's own words on the hosted page, over the organization's (auth.hostedPage.screens). Null removes one. BuildBase's default wording cannot be stored as the app's own: leave it out instead.",
                    "additionalProperties": false,
                    "properties": {
                      "login": {
                        "type": "object",
                        "description": "The sign-in screen.",
                        "additionalProperties": false,
                        "properties": {
                          "title": {
                            "description": "The headline. At most 120 characters; {app} is replaced with the app's name. Use null to clear it.",
                            "anyOf": [
                              {
                                "type": "string",
                                "maxLength": 120,
                                "minLength": 2
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "description": {
                            "description": "The line under the headline. At most 400 characters; {app} is replaced with the app's name. Use null to clear it.",
                            "anyOf": [
                              {
                                "type": "string",
                                "maxLength": 400,
                                "minLength": 2
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        }
                      },
                      "registration": {
                        "type": "object",
                        "description": "The sign-up screen.",
                        "additionalProperties": false,
                        "properties": {
                          "title": {
                            "description": "The headline. At most 120 characters; {app} is replaced with the app's name. Use null to clear it.",
                            "anyOf": [
                              {
                                "type": "string",
                                "maxLength": 120,
                                "minLength": 2
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "description": {
                            "description": "The line under the headline. At most 400 characters; {app} is replaced with the app's name. Use null to clear it.",
                            "anyOf": [
                              {
                                "type": "string",
                                "maxLength": 400,
                                "minLength": 2
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        }
                      },
                      "forgotPassword": {
                        "type": "object",
                        "description": "The screen that asks for an email to reset a password.",
                        "additionalProperties": false,
                        "properties": {
                          "title": {
                            "description": "The headline. At most 120 characters; {app} is replaced with the app's name. Use null to clear it.",
                            "anyOf": [
                              {
                                "type": "string",
                                "maxLength": 120,
                                "minLength": 2
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "description": {
                            "description": "The line under the headline. At most 400 characters; {app} is replaced with the app's name. Use null to clear it.",
                            "anyOf": [
                              {
                                "type": "string",
                                "maxLength": 400,
                                "minLength": 2
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        }
                      },
                      "resetPassword": {
                        "type": "object",
                        "description": "The screen where a new password is chosen.",
                        "additionalProperties": false,
                        "properties": {
                          "title": {
                            "description": "The headline. At most 120 characters; {app} is replaced with the app's name. Use null to clear it.",
                            "anyOf": [
                              {
                                "type": "string",
                                "maxLength": 120,
                                "minLength": 2
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "description": {
                            "description": "The line under the headline. At most 400 characters; {app} is replaced with the app's name. Use null to clear it.",
                            "anyOf": [
                              {
                                "type": "string",
                                "maxLength": 400,
                                "minLength": 2
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        }
                      },
                      "magicLink": {
                        "type": "object",
                        "description": "The screen shown after a sign-in link or code is emailed.",
                        "additionalProperties": false,
                        "properties": {
                          "title": {
                            "description": "The headline. At most 120 characters; {app} is replaced with the app's name. Use null to clear it.",
                            "anyOf": [
                              {
                                "type": "string",
                                "maxLength": 120,
                                "minLength": 2
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "description": {
                            "description": "The line under the headline. At most 400 characters; {app} is replaced with the app's name. Use null to clear it.",
                            "anyOf": [
                              {
                                "type": "string",
                                "maxLength": 400,
                                "minLength": 2
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        }
                      },
                      "verifyEmail": {
                        "type": "object",
                        "description": "The screen that asks a new account to verify its email.",
                        "additionalProperties": false,
                        "properties": {
                          "title": {
                            "description": "The headline. At most 120 characters; {app} is replaced with the app's name. Use null to clear it.",
                            "anyOf": [
                              {
                                "type": "string",
                                "maxLength": 120,
                                "minLength": 2
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "description": {
                            "description": "The line under the headline. At most 400 characters; {app} is replaced with the app's name. Use null to clear it.",
                            "anyOf": [
                              {
                                "type": "string",
                                "maxLength": 400,
                                "minLength": 2
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        }
                      },
                      "waitlistJoin": {
                        "type": "object",
                        "description": "The waitlist sign-up screen (sign-up access mode \"waitlist\").",
                        "additionalProperties": false,
                        "properties": {
                          "title": {
                            "description": "The headline. At most 120 characters; {app} is replaced with the app's name. Use null to clear it.",
                            "anyOf": [
                              {
                                "type": "string",
                                "maxLength": 120,
                                "minLength": 2
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "description": {
                            "description": "The line under the headline. At most 400 characters; {app} is replaced with the app's name. Use null to clear it.",
                            "anyOf": [
                              {
                                "type": "string",
                                "maxLength": 400,
                                "minLength": 2
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        }
                      },
                      "waitlistDone": {
                        "type": "object",
                        "description": "The screen shown after joining the waitlist.",
                        "additionalProperties": false,
                        "properties": {
                          "title": {
                            "description": "The headline. At most 120 characters; {app} is replaced with the app's name. Use null to clear it.",
                            "anyOf": [
                              {
                                "type": "string",
                                "maxLength": 120,
                                "minLength": 2
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "description": {
                            "description": "The line under the headline. At most 400 characters; {app} is replaced with the app's name. Use null to clear it.",
                            "anyOf": [
                              {
                                "type": "string",
                                "maxLength": 400,
                                "minLength": 2
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        }
                      },
                      "panel": {
                        "type": "object",
                        "description": "The split screen's image panel (auth.hostedPage.branding.layout.split).",
                        "additionalProperties": false,
                        "properties": {
                          "title": {
                            "description": "The headline. At most 80 characters; {app} is replaced with the app's name. Use null to clear it.",
                            "anyOf": [
                              {
                                "type": "string",
                                "maxLength": 80,
                                "minLength": 2
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "text": {
                            "description": "The line under the headline. At most 240 characters; {app} is replaced with the app's name. Use null to clear it.",
                            "anyOf": [
                              {
                                "type": "string",
                                "maxLength": 240,
                                "minLength": 2
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        }
                      }
                    }
                  },
                  "translations": {
                    "type": "object",
                    "description": "Translations of this app's words (or of ours), by locale, place and field. Null removes one.",
                    "additionalProperties": false,
                    "properties": {
                      "en": {
                        "type": "object",
                        "description": "Sentences in \"en\".",
                        "additionalProperties": false,
                        "properties": {
                          "login": {
                            "type": "object",
                            "description": "The sign-in screen.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "registration": {
                            "type": "object",
                            "description": "The sign-up screen.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "forgotPassword": {
                            "type": "object",
                            "description": "The screen that asks for an email to reset a password.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "resetPassword": {
                            "type": "object",
                            "description": "The screen where a new password is chosen.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "magicLink": {
                            "type": "object",
                            "description": "The screen shown after a sign-in link or code is emailed.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "verifyEmail": {
                            "type": "object",
                            "description": "The screen that asks a new account to verify its email.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "waitlistJoin": {
                            "type": "object",
                            "description": "The waitlist sign-up screen (sign-up access mode \"waitlist\").",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "waitlistDone": {
                            "type": "object",
                            "description": "The screen shown after joining the waitlist.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "panel": {
                            "type": "object",
                            "description": "The split screen's image panel (auth.hostedPage.branding.layout.split).",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 80 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 80,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "text": {
                                "description": "The line under the headline. In this language, at most 240 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 240,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "consent": {
                            "type": "object",
                            "description": "The consent checkbox on sign-up.",
                            "additionalProperties": false,
                            "properties": {
                              "label": {
                                "description": "The sentence beside the checkbox. In this language, at most 500 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 500,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          }
                        }
                      },
                      "es": {
                        "type": "object",
                        "description": "Sentences in \"es\".",
                        "additionalProperties": false,
                        "properties": {
                          "login": {
                            "type": "object",
                            "description": "The sign-in screen.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "registration": {
                            "type": "object",
                            "description": "The sign-up screen.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "forgotPassword": {
                            "type": "object",
                            "description": "The screen that asks for an email to reset a password.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "resetPassword": {
                            "type": "object",
                            "description": "The screen where a new password is chosen.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "magicLink": {
                            "type": "object",
                            "description": "The screen shown after a sign-in link or code is emailed.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "verifyEmail": {
                            "type": "object",
                            "description": "The screen that asks a new account to verify its email.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "waitlistJoin": {
                            "type": "object",
                            "description": "The waitlist sign-up screen (sign-up access mode \"waitlist\").",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "waitlistDone": {
                            "type": "object",
                            "description": "The screen shown after joining the waitlist.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "panel": {
                            "type": "object",
                            "description": "The split screen's image panel (auth.hostedPage.branding.layout.split).",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 80 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 80,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "text": {
                                "description": "The line under the headline. In this language, at most 240 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 240,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "consent": {
                            "type": "object",
                            "description": "The consent checkbox on sign-up.",
                            "additionalProperties": false,
                            "properties": {
                              "label": {
                                "description": "The sentence beside the checkbox. In this language, at most 500 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 500,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          }
                        }
                      },
                      "fr": {
                        "type": "object",
                        "description": "Sentences in \"fr\".",
                        "additionalProperties": false,
                        "properties": {
                          "login": {
                            "type": "object",
                            "description": "The sign-in screen.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "registration": {
                            "type": "object",
                            "description": "The sign-up screen.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "forgotPassword": {
                            "type": "object",
                            "description": "The screen that asks for an email to reset a password.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "resetPassword": {
                            "type": "object",
                            "description": "The screen where a new password is chosen.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "magicLink": {
                            "type": "object",
                            "description": "The screen shown after a sign-in link or code is emailed.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "verifyEmail": {
                            "type": "object",
                            "description": "The screen that asks a new account to verify its email.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "waitlistJoin": {
                            "type": "object",
                            "description": "The waitlist sign-up screen (sign-up access mode \"waitlist\").",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "waitlistDone": {
                            "type": "object",
                            "description": "The screen shown after joining the waitlist.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "panel": {
                            "type": "object",
                            "description": "The split screen's image panel (auth.hostedPage.branding.layout.split).",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 80 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 80,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "text": {
                                "description": "The line under the headline. In this language, at most 240 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 240,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "consent": {
                            "type": "object",
                            "description": "The consent checkbox on sign-up.",
                            "additionalProperties": false,
                            "properties": {
                              "label": {
                                "description": "The sentence beside the checkbox. In this language, at most 500 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 500,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          }
                        }
                      },
                      "de": {
                        "type": "object",
                        "description": "Sentences in \"de\".",
                        "additionalProperties": false,
                        "properties": {
                          "login": {
                            "type": "object",
                            "description": "The sign-in screen.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "registration": {
                            "type": "object",
                            "description": "The sign-up screen.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "forgotPassword": {
                            "type": "object",
                            "description": "The screen that asks for an email to reset a password.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "resetPassword": {
                            "type": "object",
                            "description": "The screen where a new password is chosen.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "magicLink": {
                            "type": "object",
                            "description": "The screen shown after a sign-in link or code is emailed.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "verifyEmail": {
                            "type": "object",
                            "description": "The screen that asks a new account to verify its email.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "waitlistJoin": {
                            "type": "object",
                            "description": "The waitlist sign-up screen (sign-up access mode \"waitlist\").",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "waitlistDone": {
                            "type": "object",
                            "description": "The screen shown after joining the waitlist.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "panel": {
                            "type": "object",
                            "description": "The split screen's image panel (auth.hostedPage.branding.layout.split).",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 80 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 80,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "text": {
                                "description": "The line under the headline. In this language, at most 240 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 240,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "consent": {
                            "type": "object",
                            "description": "The consent checkbox on sign-up.",
                            "additionalProperties": false,
                            "properties": {
                              "label": {
                                "description": "The sentence beside the checkbox. In this language, at most 500 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 500,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          }
                        }
                      },
                      "ja": {
                        "type": "object",
                        "description": "Sentences in \"ja\".",
                        "additionalProperties": false,
                        "properties": {
                          "login": {
                            "type": "object",
                            "description": "The sign-in screen.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "registration": {
                            "type": "object",
                            "description": "The sign-up screen.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "forgotPassword": {
                            "type": "object",
                            "description": "The screen that asks for an email to reset a password.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "resetPassword": {
                            "type": "object",
                            "description": "The screen where a new password is chosen.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "magicLink": {
                            "type": "object",
                            "description": "The screen shown after a sign-in link or code is emailed.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "verifyEmail": {
                            "type": "object",
                            "description": "The screen that asks a new account to verify its email.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "waitlistJoin": {
                            "type": "object",
                            "description": "The waitlist sign-up screen (sign-up access mode \"waitlist\").",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "waitlistDone": {
                            "type": "object",
                            "description": "The screen shown after joining the waitlist.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "panel": {
                            "type": "object",
                            "description": "The split screen's image panel (auth.hostedPage.branding.layout.split).",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 80 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 80,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "text": {
                                "description": "The line under the headline. In this language, at most 240 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 240,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "consent": {
                            "type": "object",
                            "description": "The consent checkbox on sign-up.",
                            "additionalProperties": false,
                            "properties": {
                              "label": {
                                "description": "The sentence beside the checkbox. In this language, at most 500 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 500,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          }
                        }
                      },
                      "zh": {
                        "type": "object",
                        "description": "Sentences in \"zh\".",
                        "additionalProperties": false,
                        "properties": {
                          "login": {
                            "type": "object",
                            "description": "The sign-in screen.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "registration": {
                            "type": "object",
                            "description": "The sign-up screen.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "forgotPassword": {
                            "type": "object",
                            "description": "The screen that asks for an email to reset a password.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "resetPassword": {
                            "type": "object",
                            "description": "The screen where a new password is chosen.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "magicLink": {
                            "type": "object",
                            "description": "The screen shown after a sign-in link or code is emailed.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "verifyEmail": {
                            "type": "object",
                            "description": "The screen that asks a new account to verify its email.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "waitlistJoin": {
                            "type": "object",
                            "description": "The waitlist sign-up screen (sign-up access mode \"waitlist\").",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "waitlistDone": {
                            "type": "object",
                            "description": "The screen shown after joining the waitlist.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "panel": {
                            "type": "object",
                            "description": "The split screen's image panel (auth.hostedPage.branding.layout.split).",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 80 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 80,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "text": {
                                "description": "The line under the headline. In this language, at most 240 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 240,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "consent": {
                            "type": "object",
                            "description": "The consent checkbox on sign-up.",
                            "additionalProperties": false,
                            "properties": {
                              "label": {
                                "description": "The sentence beside the checkbox. In this language, at most 500 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 500,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          }
                        }
                      },
                      "hi": {
                        "type": "object",
                        "description": "Sentences in \"hi\".",
                        "additionalProperties": false,
                        "properties": {
                          "login": {
                            "type": "object",
                            "description": "The sign-in screen.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "registration": {
                            "type": "object",
                            "description": "The sign-up screen.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "forgotPassword": {
                            "type": "object",
                            "description": "The screen that asks for an email to reset a password.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "resetPassword": {
                            "type": "object",
                            "description": "The screen where a new password is chosen.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "magicLink": {
                            "type": "object",
                            "description": "The screen shown after a sign-in link or code is emailed.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "verifyEmail": {
                            "type": "object",
                            "description": "The screen that asks a new account to verify its email.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "waitlistJoin": {
                            "type": "object",
                            "description": "The waitlist sign-up screen (sign-up access mode \"waitlist\").",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "waitlistDone": {
                            "type": "object",
                            "description": "The screen shown after joining the waitlist.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "panel": {
                            "type": "object",
                            "description": "The split screen's image panel (auth.hostedPage.branding.layout.split).",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 80 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 80,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "text": {
                                "description": "The line under the headline. In this language, at most 240 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 240,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "consent": {
                            "type": "object",
                            "description": "The consent checkbox on sign-up.",
                            "additionalProperties": false,
                            "properties": {
                              "label": {
                                "description": "The sentence beside the checkbox. In this language, at most 500 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 500,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          }
                        }
                      },
                      "ar": {
                        "type": "object",
                        "description": "Sentences in \"ar\".",
                        "additionalProperties": false,
                        "properties": {
                          "login": {
                            "type": "object",
                            "description": "The sign-in screen.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "registration": {
                            "type": "object",
                            "description": "The sign-up screen.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "forgotPassword": {
                            "type": "object",
                            "description": "The screen that asks for an email to reset a password.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "resetPassword": {
                            "type": "object",
                            "description": "The screen where a new password is chosen.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "magicLink": {
                            "type": "object",
                            "description": "The screen shown after a sign-in link or code is emailed.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "verifyEmail": {
                            "type": "object",
                            "description": "The screen that asks a new account to verify its email.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "waitlistJoin": {
                            "type": "object",
                            "description": "The waitlist sign-up screen (sign-up access mode \"waitlist\").",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "waitlistDone": {
                            "type": "object",
                            "description": "The screen shown after joining the waitlist.",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 120,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "description": {
                                "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 400,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "panel": {
                            "type": "object",
                            "description": "The split screen's image panel (auth.hostedPage.branding.layout.split).",
                            "additionalProperties": false,
                            "properties": {
                              "title": {
                                "description": "The headline. In this language, at most 80 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 80,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              },
                              "text": {
                                "description": "The line under the headline. In this language, at most 240 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 240,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          },
                          "consent": {
                            "type": "object",
                            "description": "The consent checkbox on sign-up.",
                            "additionalProperties": false,
                            "properties": {
                              "label": {
                                "description": "The sentence beside the checkbox. In this language, at most 500 characters. Use null to clear it.",
                                "anyOf": [
                                  {
                                    "type": "string",
                                    "maxLength": 500,
                                    "minLength": 2
                                  },
                                  {
                                    "type": "null"
                                  }
                                ]
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            },
            "required": [
              "title",
              "type",
              "applicationTokenUrl",
              "applicationProfileUrl"
            ]
          },
          "examples": [
            {
              "web": {
                "title": "Web app",
                "type": "normal",
                "applicationTokenUrl": "https://app.example.com/api/auth/token",
                "applicationProfileUrl": "https://app.example.com/api/auth/profile",
                "redirectUrls": [
                  "https://app.example.com/auth/callback"
                ],
                "methods": [
                  "password",
                  "google"
                ],
                "branding": {
                  "displayName": "Acme"
                }
              }
            }
          ]
        },
        "hostedPage": {
          "type": "object",
          "description": "The hosted sign-in page.",
          "additionalProperties": false,
          "properties": {
            "name": {
              "type": "string",
              "maxLength": 80,
              "description": "The app's name on the page and in the browser tab. The old default \"BuildBase Auth\" reads as unset, and the organization's name is shown.",
              "minLength": 2
            },
            "shortName": {
              "type": "string",
              "maxLength": 80,
              "description": "A short form of the name, where space is tight.",
              "minLength": 2
            },
            "description": {
              "type": "string",
              "maxLength": 400,
              "description": "A one-line description of the app, for the page metadata.",
              "minLength": 2
            },
            "logoUrl": {
              "type": "string",
              "format": "uri",
              "maxLength": 2000,
              "description": "An image URL shown as the logo when no logo is uploaded in the console.",
              "minLength": 2,
              "pattern": "^https?://"
            },
            "privacyPolicyUrl": {
              "description": "Your privacy policy, linked from the page. Null shows no link. An http(s) link. Use null to clear it.",
              "anyOf": [
                {
                  "type": "string",
                  "format": "uri",
                  "maxLength": 2000,
                  "pattern": "^https?://"
                },
                {
                  "type": "null"
                }
              ]
            },
            "termsOfServiceUrl": {
              "description": "Your terms of service, linked from the page. Null shows no link. An http(s) link. Use null to clear it.",
              "anyOf": [
                {
                  "type": "string",
                  "format": "uri",
                  "maxLength": 2000,
                  "pattern": "^https?://"
                },
                {
                  "type": "null"
                }
              ]
            },
            "supportUrl": {
              "description": "Where people get help, linked from the page. Null shows no link. An http(s) link. Use null to clear it.",
              "anyOf": [
                {
                  "type": "string",
                  "format": "uri",
                  "maxLength": 2000,
                  "pattern": "^https?://"
                },
                {
                  "type": "null"
                }
              ]
            },
            "websiteUrl": {
              "description": "Your app's website, linked from the page. Null shows no link. An http(s) link. Use null to clear it.",
              "anyOf": [
                {
                  "type": "string",
                  "format": "uri",
                  "maxLength": 2000,
                  "pattern": "^https?://"
                },
                {
                  "type": "null"
                }
              ]
            },
            "hideBranding": {
              "type": "boolean",
              "description": "Hide the \"Secured by BuildBase\" badge. Turning it on needs a plan with white-label. Default false."
            },
            "screens": {
              "type": "object",
              "description": "The title and line on each screen. A screen left out keeps what it says now; BuildBase's wording is the default.",
              "additionalProperties": false,
              "properties": {
                "login": {
                  "type": "object",
                  "description": "The sign-in screen.",
                  "additionalProperties": false,
                  "properties": {
                    "title": {
                      "type": "string",
                      "maxLength": 120,
                      "description": "The sign-in screen's title. {app} is replaced with the app's name.",
                      "minLength": 2
                    },
                    "description": {
                      "type": "string",
                      "maxLength": 400,
                      "description": "The line under the sign-in screen's title.",
                      "minLength": 2
                    }
                  }
                },
                "registration": {
                  "type": "object",
                  "description": "The sign-up screen.",
                  "additionalProperties": false,
                  "properties": {
                    "title": {
                      "type": "string",
                      "maxLength": 120,
                      "description": "The sign-up screen's title. {app} is replaced with the app's name.",
                      "minLength": 2
                    },
                    "description": {
                      "type": "string",
                      "maxLength": 400,
                      "description": "The line under the sign-up screen's title.",
                      "minLength": 2
                    }
                  }
                },
                "forgotPassword": {
                  "type": "object",
                  "description": "The forgot-password screen.",
                  "additionalProperties": false,
                  "properties": {
                    "title": {
                      "type": "string",
                      "maxLength": 120,
                      "description": "The forgot-password screen's title. {app} is replaced with the app's name.",
                      "minLength": 2
                    },
                    "description": {
                      "type": "string",
                      "maxLength": 400,
                      "description": "The line under the forgot-password screen's title.",
                      "minLength": 2
                    }
                  }
                },
                "resetPassword": {
                  "type": "object",
                  "description": "The reset-password screen.",
                  "additionalProperties": false,
                  "properties": {
                    "title": {
                      "type": "string",
                      "maxLength": 120,
                      "description": "The reset-password screen's title. {app} is replaced with the app's name.",
                      "minLength": 2
                    },
                    "description": {
                      "type": "string",
                      "maxLength": 400,
                      "description": "The line under the reset-password screen's title.",
                      "minLength": 2
                    }
                  }
                },
                "verifyEmail": {
                  "type": "object",
                  "description": "The verify-email screen.",
                  "additionalProperties": false,
                  "properties": {
                    "title": {
                      "type": "string",
                      "maxLength": 120,
                      "description": "The verify-email screen's title. {app} is replaced with the app's name.",
                      "minLength": 2
                    },
                    "description": {
                      "type": "string",
                      "maxLength": 400,
                      "description": "The line under the verify-email screen's title.",
                      "minLength": 2
                    }
                  }
                },
                "magicLink": {
                  "type": "object",
                  "description": "The check-your-email (after a sign-in link or code is sent) screen.",
                  "additionalProperties": false,
                  "properties": {
                    "title": {
                      "type": "string",
                      "maxLength": 120,
                      "description": "The check-your-email (after a sign-in link or code is sent) screen's title. {app} is replaced with the app's name.",
                      "minLength": 2
                    },
                    "description": {
                      "type": "string",
                      "maxLength": 400,
                      "description": "The line under the check-your-email (after a sign-in link or code is sent) screen's title.",
                      "minLength": 2
                    }
                  }
                }
              }
            },
            "branding": {
              "type": "object",
              "description": "Brand colours, font and layout of the hosted page. The logo, dark logo, favicon and background image are uploaded in the console (a blueprint carries no files).",
              "additionalProperties": false,
              "properties": {
                "primaryColor": {
                  "description": "#RRGGBB for buttons, links and focus rings. Use null to clear it.",
                  "anyOf": [
                    {
                      "type": "string",
                      "maxLength": 7,
                      "pattern": "^#[0-9A-Fa-f]{6}$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "backgroundColor": {
                  "description": "#RRGGBB for the page behind the card. Use null to clear it.",
                  "anyOf": [
                    {
                      "type": "string",
                      "maxLength": 7,
                      "pattern": "^#[0-9A-Fa-f]{6}$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "radius": {
                  "enum": [
                    "none",
                    "small",
                    "medium",
                    "large"
                  ],
                  "description": "Corner roundness of the card, buttons and inputs."
                },
                "font": {
                  "description": "The font on the page. Use null to clear it.",
                  "anyOf": [
                    {
                      "type": "object",
                      "additionalProperties": false,
                      "properties": {
                        "family": {
                          "enum": [
                            "inter",
                            "system",
                            "Roboto",
                            "Open Sans",
                            "Lato",
                            "Montserrat",
                            "Poppins",
                            "Nunito",
                            "Work Sans",
                            "DM Sans",
                            "IBM Plex Sans",
                            "Source Sans 3",
                            "Merriweather",
                            "Lora",
                            "custom"
                          ],
                          "description": "inter (bundled, the default look), system (the device font), a Google font by name, or custom (your own woff2 file: give name and url)."
                        },
                        "name": {
                          "type": "string",
                          "maxLength": 64,
                          "description": "For custom: the font family name to declare.",
                          "pattern": "^[A-Za-z0-9][A-Za-z0-9 ._-]{0,63}$"
                        },
                        "url": {
                          "type": "string",
                          "maxLength": 2000,
                          "description": "For custom: an https link to the woff2 file.",
                          "pattern": "^https://[^\\s]+\\.woff2(\\?[^\\s]*)?$"
                        }
                      },
                      "required": [
                        "family"
                      ]
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "colorScheme": {
                  "enum": [
                    "system",
                    "light",
                    "dark"
                  ],
                  "description": "Light, dark, or the visitor's system setting."
                },
                "layout": {
                  "type": "object",
                  "description": "Where things sit on the page. Anything unset keeps the default layout.",
                  "additionalProperties": false,
                  "properties": {
                    "frame": {
                      "enum": [
                        "card",
                        "frameless"
                      ],
                      "description": "A card around the form (default), or the form straight on the page."
                    },
                    "flow": {
                      "enum": [
                        "auto",
                        "all",
                        "email-first"
                      ],
                      "description": "auto (default) asks for the email first once the screen is crowded (SSO on, or more other ways than fit); all puts every way in on one screen; email-first always asks for the email, then the password, link or code."
                    },
                    "languagePicker": {
                      "enum": [
                        "show",
                        "hide"
                      ],
                      "description": "The language picker in the top bar: show (default) or hide. The page follows the visitor's browser either way."
                    },
                    "visibleMethods": {
                      "type": "array",
                      "items": {
                        "enum": [
                          "link",
                          "code",
                          "passkey",
                          "sso",
                          "phone",
                          "wallet"
                        ],
                        "description": "One other way in."
                      },
                      "maxItems": 2,
                      "description": "The other ways in shown under the main button when there are more than fit, in order, at most 2; the rest open from \"Other ways to sign in\". Default [\"passkey\", \"sso\"]; [] puts them all there.",
                      "uniqueItems": true
                    },
                    "cardPosition": {
                      "enum": [
                        "center",
                        "start",
                        "end"
                      ],
                      "description": "Where the card sits on a wide screen. Default center."
                    },
                    "cardStyle": {
                      "enum": [
                        "elevated",
                        "bordered",
                        "flat"
                      ],
                      "description": "The card's edge: a shadow (elevated, default), a border, or neither."
                    },
                    "logoPosition": {
                      "enum": [
                        "center",
                        "start",
                        "hidden",
                        "bar"
                      ],
                      "description": "Where the logo sits: above the title centred (default) or at the start, in the top bar beside the name, or hidden."
                    },
                    "logoSize": {
                      "enum": [
                        "small",
                        "medium",
                        "large"
                      ],
                      "description": "The logo's height: 32, 48 or 80 pixels above the title, 24, 32 or 40 in the top bar. Default medium."
                    },
                    "socialPlacement": {
                      "enum": [
                        "top",
                        "bottom"
                      ],
                      "description": "Social sign-in buttons above (default) or below the email form."
                    },
                    "socialStyle": {
                      "enum": [
                        "buttons",
                        "icons",
                        "auto"
                      ],
                      "description": "A button per provider with its name, a row of icons, or auto (default): names up to four providers, icons from five."
                    },
                    "headerAlign": {
                      "enum": [
                        "center",
                        "start"
                      ],
                      "description": "How the title and description line up. Default center."
                    },
                    "split": {
                      "enum": [
                        "none",
                        "start",
                        "end"
                      ],
                      "description": "Split screen: the background image fills a panel on this side from 1024px wide. Default none."
                    },
                    "splitOnPhone": {
                      "enum": [
                        "hidden",
                        "banner"
                      ],
                      "description": "On a narrow screen, hide the split panel (default) or show it as a banner."
                    }
                  }
                },
                "backgroundFit": {
                  "enum": [
                    "cover",
                    "pattern"
                  ],
                  "description": "cover (default) fills the page with the background image; pattern repeats it as a tile."
                },
                "panel": {
                  "type": "object",
                  "description": "Plain text over the split screen panel (shown only with layout.split).",
                  "additionalProperties": false,
                  "properties": {
                    "title": {
                      "description": "A headline over the split screen panel. Use null to clear it.",
                      "anyOf": [
                        {
                          "type": "string",
                          "maxLength": 80
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "text": {
                      "description": "A short line under it, such as a quote. Use null to clear it.",
                      "anyOf": [
                        {
                          "type": "string",
                          "maxLength": 240
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  }
                },
                "customCss": {
                  "description": "Your own stylesheet for the page, targeting the documented bb-* classes. It may load nothing (no url(), @import or @font-face). Needs a plan with white-label. Use null to clear it.",
                  "anyOf": [
                    {
                      "type": "string",
                      "maxLength": 20000
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              }
            },
            "defaultLocale": {
              "enum": [
                "en",
                "es",
                "fr",
                "de",
                "ja",
                "zh",
                "hi",
                "ar"
              ],
              "description": "The page's language when the visitor's browser asks for none it has. Default en."
            },
            "consentLabel": {
              "description": "The sign-up consent checkbox's sentence for every app (an auth client's own comes first). Null uses ours. Use null to clear it.",
              "anyOf": [
                {
                  "type": "string",
                  "maxLength": 500
                },
                {
                  "type": "null"
                }
              ]
            },
            "untranslatedCopy": {
              "enum": [
                "as-written",
                "default"
              ],
              "description": "Where a language has no translation of your words: as-written (default) shows your words as written; default shows ours in the visitor's language."
            },
            "translations": {
              "type": "object",
              "description": "Your words in other languages, by locale, place and field. Null removes one. The default language needs none.",
              "additionalProperties": false,
              "properties": {
                "en": {
                  "type": "object",
                  "description": "Sentences in \"en\".",
                  "additionalProperties": false,
                  "properties": {
                    "login": {
                      "type": "object",
                      "description": "The sign-in screen.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "registration": {
                      "type": "object",
                      "description": "The sign-up screen.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "forgotPassword": {
                      "type": "object",
                      "description": "The screen that asks for an email to reset a password.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "resetPassword": {
                      "type": "object",
                      "description": "The screen where a new password is chosen.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "magicLink": {
                      "type": "object",
                      "description": "The screen shown after a sign-in link or code is emailed.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "verifyEmail": {
                      "type": "object",
                      "description": "The screen that asks a new account to verify its email.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "waitlistJoin": {
                      "type": "object",
                      "description": "The waitlist sign-up screen (sign-up access mode \"waitlist\").",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "waitlistDone": {
                      "type": "object",
                      "description": "The screen shown after joining the waitlist.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "panel": {
                      "type": "object",
                      "description": "The split screen's image panel (auth.hostedPage.branding.layout.split).",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 80 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 80,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "text": {
                          "description": "The line under the headline. In this language, at most 240 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 240,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "consent": {
                      "type": "object",
                      "description": "The consent checkbox on sign-up.",
                      "additionalProperties": false,
                      "properties": {
                        "label": {
                          "description": "The sentence beside the checkbox. In this language, at most 500 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 500,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    }
                  }
                },
                "es": {
                  "type": "object",
                  "description": "Sentences in \"es\".",
                  "additionalProperties": false,
                  "properties": {
                    "login": {
                      "type": "object",
                      "description": "The sign-in screen.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "registration": {
                      "type": "object",
                      "description": "The sign-up screen.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "forgotPassword": {
                      "type": "object",
                      "description": "The screen that asks for an email to reset a password.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "resetPassword": {
                      "type": "object",
                      "description": "The screen where a new password is chosen.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "magicLink": {
                      "type": "object",
                      "description": "The screen shown after a sign-in link or code is emailed.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "verifyEmail": {
                      "type": "object",
                      "description": "The screen that asks a new account to verify its email.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "waitlistJoin": {
                      "type": "object",
                      "description": "The waitlist sign-up screen (sign-up access mode \"waitlist\").",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "waitlistDone": {
                      "type": "object",
                      "description": "The screen shown after joining the waitlist.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "panel": {
                      "type": "object",
                      "description": "The split screen's image panel (auth.hostedPage.branding.layout.split).",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 80 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 80,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "text": {
                          "description": "The line under the headline. In this language, at most 240 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 240,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "consent": {
                      "type": "object",
                      "description": "The consent checkbox on sign-up.",
                      "additionalProperties": false,
                      "properties": {
                        "label": {
                          "description": "The sentence beside the checkbox. In this language, at most 500 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 500,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    }
                  }
                },
                "fr": {
                  "type": "object",
                  "description": "Sentences in \"fr\".",
                  "additionalProperties": false,
                  "properties": {
                    "login": {
                      "type": "object",
                      "description": "The sign-in screen.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "registration": {
                      "type": "object",
                      "description": "The sign-up screen.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "forgotPassword": {
                      "type": "object",
                      "description": "The screen that asks for an email to reset a password.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "resetPassword": {
                      "type": "object",
                      "description": "The screen where a new password is chosen.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "magicLink": {
                      "type": "object",
                      "description": "The screen shown after a sign-in link or code is emailed.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "verifyEmail": {
                      "type": "object",
                      "description": "The screen that asks a new account to verify its email.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "waitlistJoin": {
                      "type": "object",
                      "description": "The waitlist sign-up screen (sign-up access mode \"waitlist\").",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "waitlistDone": {
                      "type": "object",
                      "description": "The screen shown after joining the waitlist.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "panel": {
                      "type": "object",
                      "description": "The split screen's image panel (auth.hostedPage.branding.layout.split).",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 80 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 80,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "text": {
                          "description": "The line under the headline. In this language, at most 240 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 240,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "consent": {
                      "type": "object",
                      "description": "The consent checkbox on sign-up.",
                      "additionalProperties": false,
                      "properties": {
                        "label": {
                          "description": "The sentence beside the checkbox. In this language, at most 500 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 500,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    }
                  }
                },
                "de": {
                  "type": "object",
                  "description": "Sentences in \"de\".",
                  "additionalProperties": false,
                  "properties": {
                    "login": {
                      "type": "object",
                      "description": "The sign-in screen.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "registration": {
                      "type": "object",
                      "description": "The sign-up screen.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "forgotPassword": {
                      "type": "object",
                      "description": "The screen that asks for an email to reset a password.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "resetPassword": {
                      "type": "object",
                      "description": "The screen where a new password is chosen.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "magicLink": {
                      "type": "object",
                      "description": "The screen shown after a sign-in link or code is emailed.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "verifyEmail": {
                      "type": "object",
                      "description": "The screen that asks a new account to verify its email.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "waitlistJoin": {
                      "type": "object",
                      "description": "The waitlist sign-up screen (sign-up access mode \"waitlist\").",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "waitlistDone": {
                      "type": "object",
                      "description": "The screen shown after joining the waitlist.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "panel": {
                      "type": "object",
                      "description": "The split screen's image panel (auth.hostedPage.branding.layout.split).",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 80 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 80,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "text": {
                          "description": "The line under the headline. In this language, at most 240 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 240,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "consent": {
                      "type": "object",
                      "description": "The consent checkbox on sign-up.",
                      "additionalProperties": false,
                      "properties": {
                        "label": {
                          "description": "The sentence beside the checkbox. In this language, at most 500 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 500,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    }
                  }
                },
                "ja": {
                  "type": "object",
                  "description": "Sentences in \"ja\".",
                  "additionalProperties": false,
                  "properties": {
                    "login": {
                      "type": "object",
                      "description": "The sign-in screen.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "registration": {
                      "type": "object",
                      "description": "The sign-up screen.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "forgotPassword": {
                      "type": "object",
                      "description": "The screen that asks for an email to reset a password.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "resetPassword": {
                      "type": "object",
                      "description": "The screen where a new password is chosen.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "magicLink": {
                      "type": "object",
                      "description": "The screen shown after a sign-in link or code is emailed.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "verifyEmail": {
                      "type": "object",
                      "description": "The screen that asks a new account to verify its email.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "waitlistJoin": {
                      "type": "object",
                      "description": "The waitlist sign-up screen (sign-up access mode \"waitlist\").",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "waitlistDone": {
                      "type": "object",
                      "description": "The screen shown after joining the waitlist.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "panel": {
                      "type": "object",
                      "description": "The split screen's image panel (auth.hostedPage.branding.layout.split).",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 80 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 80,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "text": {
                          "description": "The line under the headline. In this language, at most 240 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 240,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "consent": {
                      "type": "object",
                      "description": "The consent checkbox on sign-up.",
                      "additionalProperties": false,
                      "properties": {
                        "label": {
                          "description": "The sentence beside the checkbox. In this language, at most 500 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 500,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    }
                  }
                },
                "zh": {
                  "type": "object",
                  "description": "Sentences in \"zh\".",
                  "additionalProperties": false,
                  "properties": {
                    "login": {
                      "type": "object",
                      "description": "The sign-in screen.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "registration": {
                      "type": "object",
                      "description": "The sign-up screen.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "forgotPassword": {
                      "type": "object",
                      "description": "The screen that asks for an email to reset a password.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "resetPassword": {
                      "type": "object",
                      "description": "The screen where a new password is chosen.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "magicLink": {
                      "type": "object",
                      "description": "The screen shown after a sign-in link or code is emailed.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "verifyEmail": {
                      "type": "object",
                      "description": "The screen that asks a new account to verify its email.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "waitlistJoin": {
                      "type": "object",
                      "description": "The waitlist sign-up screen (sign-up access mode \"waitlist\").",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "waitlistDone": {
                      "type": "object",
                      "description": "The screen shown after joining the waitlist.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "panel": {
                      "type": "object",
                      "description": "The split screen's image panel (auth.hostedPage.branding.layout.split).",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 80 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 80,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "text": {
                          "description": "The line under the headline. In this language, at most 240 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 240,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "consent": {
                      "type": "object",
                      "description": "The consent checkbox on sign-up.",
                      "additionalProperties": false,
                      "properties": {
                        "label": {
                          "description": "The sentence beside the checkbox. In this language, at most 500 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 500,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    }
                  }
                },
                "hi": {
                  "type": "object",
                  "description": "Sentences in \"hi\".",
                  "additionalProperties": false,
                  "properties": {
                    "login": {
                      "type": "object",
                      "description": "The sign-in screen.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "registration": {
                      "type": "object",
                      "description": "The sign-up screen.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "forgotPassword": {
                      "type": "object",
                      "description": "The screen that asks for an email to reset a password.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "resetPassword": {
                      "type": "object",
                      "description": "The screen where a new password is chosen.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "magicLink": {
                      "type": "object",
                      "description": "The screen shown after a sign-in link or code is emailed.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "verifyEmail": {
                      "type": "object",
                      "description": "The screen that asks a new account to verify its email.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "waitlistJoin": {
                      "type": "object",
                      "description": "The waitlist sign-up screen (sign-up access mode \"waitlist\").",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "waitlistDone": {
                      "type": "object",
                      "description": "The screen shown after joining the waitlist.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "panel": {
                      "type": "object",
                      "description": "The split screen's image panel (auth.hostedPage.branding.layout.split).",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 80 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 80,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "text": {
                          "description": "The line under the headline. In this language, at most 240 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 240,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "consent": {
                      "type": "object",
                      "description": "The consent checkbox on sign-up.",
                      "additionalProperties": false,
                      "properties": {
                        "label": {
                          "description": "The sentence beside the checkbox. In this language, at most 500 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 500,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    }
                  }
                },
                "ar": {
                  "type": "object",
                  "description": "Sentences in \"ar\".",
                  "additionalProperties": false,
                  "properties": {
                    "login": {
                      "type": "object",
                      "description": "The sign-in screen.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "registration": {
                      "type": "object",
                      "description": "The sign-up screen.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "forgotPassword": {
                      "type": "object",
                      "description": "The screen that asks for an email to reset a password.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "resetPassword": {
                      "type": "object",
                      "description": "The screen where a new password is chosen.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "magicLink": {
                      "type": "object",
                      "description": "The screen shown after a sign-in link or code is emailed.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "verifyEmail": {
                      "type": "object",
                      "description": "The screen that asks a new account to verify its email.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "waitlistJoin": {
                      "type": "object",
                      "description": "The waitlist sign-up screen (sign-up access mode \"waitlist\").",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "waitlistDone": {
                      "type": "object",
                      "description": "The screen shown after joining the waitlist.",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 120 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 120,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "description": {
                          "description": "The line under the headline. In this language, at most 400 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 400,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "panel": {
                      "type": "object",
                      "description": "The split screen's image panel (auth.hostedPage.branding.layout.split).",
                      "additionalProperties": false,
                      "properties": {
                        "title": {
                          "description": "The headline. In this language, at most 80 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 80,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "text": {
                          "description": "The line under the headline. In this language, at most 240 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 240,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "consent": {
                      "type": "object",
                      "description": "The consent checkbox on sign-up.",
                      "additionalProperties": false,
                      "properties": {
                        "label": {
                          "description": "The sentence beside the checkbox. In this language, at most 500 characters. Use null to clear it.",
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 500,
                              "minLength": 2
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "security": {
          "type": "object",
          "description": "Sign-in security.",
          "additionalProperties": false,
          "properties": {
            "sessionTtlDays": {
              "type": "integer",
              "description": "How long a sign-in lasts without \"remember me\", in days. Default 30.",
              "minimum": 1,
              "maximum": 180
            },
            "allowRememberMe": {
              "type": "boolean",
              "description": "Offer \"remember me\" on the sign-in page. Default true."
            },
            "rememberMeDays": {
              "type": "integer",
              "description": "How long a sign-in with \"remember me\" lasts, in days. Default 90.",
              "minimum": 1,
              "maximum": 180
            },
            "blockDisposableEmail": {
              "type": "boolean",
              "description": "Refuse sign-up, and a change of email, to a throwaway inbox (mailinator and the like). Default false. auth.signup.blockDisposableSignups does the same: either switch on refuses."
            },
            "accountDeletionGraceDays": {
              "type": "integer",
              "description": "Days between someone asking to delete their account and the data being removed; they can cancel until then. 0 deletes at once. Default 7.",
              "minimum": 0,
              "maximum": 30
            }
          }
        },
        "mfa": {
          "type": "object",
          "description": "Two-step sign-in policy.",
          "additionalProperties": false,
          "properties": {
            "enforcement": {
              "enum": [
                "off",
                "optional",
                "required"
              ],
              "description": "off: nobody is prompted and nobody can enroll. optional (default): people may add a second step, and whoever has one is asked for it. required: everyone needs one, and sets it up at their next sign-in."
            },
            "allowedFactors": {
              "type": "array",
              "items": {
                "enum": [
                  "totp",
                  "sms"
                ],
                "description": "totp: an authenticator app. sms: a code to the verified phone (needs auth.sms)."
              },
              "maxItems": 2,
              "description": "Second steps people may use. Default [\"totp\"]. sms cannot be the only one.",
              "minItems": 1,
              "uniqueItems": true
            },
            "requireForSocial": {
              "type": "boolean",
              "description": "Ask for the second step after a social sign-in too. Default false (the provider ran its own checks)."
            }
          }
        },
        "phone": {
          "type": "object",
          "description": "Phone sign-in settings.",
          "additionalProperties": false,
          "properties": {
            "defaultCountry": {
              "type": "string",
              "maxLength": 2,
              "description": "The ISO 3166 alpha-2 country a number without a country code is read in, e.g. US. Default US.",
              "pattern": "^[A-Z]{2}$"
            },
            "channels": {
              "type": "array",
              "items": {
                "enum": [
                  "sms",
                  "whatsapp",
                  "voice"
                ],
                "description": "sms: a text message. whatsapp: a WhatsApp message. voice: a phone call that reads the code."
              },
              "maxItems": 3,
              "description": "How the page offers to send the code, narrowed to what the SMS provider can send (a webhook provider can send all three; Twilio without Verify sends sms only). Default [\"sms\"].",
              "minItems": 1,
              "uniqueItems": true
            }
          }
        },
        "username": {
          "type": "object",
          "description": "Username settings.",
          "additionalProperties": false,
          "properties": {
            "enabled": {
              "type": "boolean",
              "description": "Let people choose a username and sign in with it. Default false."
            },
            "required": {
              "type": "boolean",
              "description": "Ask every sign-up for a username. Needs enabled. Default false."
            }
          }
        },
        "guests": {
          "type": "object",
          "description": "Guest settings.",
          "additionalProperties": false,
          "properties": {
            "idleDays": {
              "type": "integer",
              "description": "Days a guest who has not upgraded to an account is kept after their last visit, then removed. Default 30.",
              "minimum": 1,
              "maximum": 365
            }
          }
        },
        "signup": {
          "type": "object",
          "description": "Sign-up rules.",
          "additionalProperties": false,
          "properties": {
            "allowPublicSignup": {
              "type": "boolean",
              "description": "Anyone may create an account: through the hosted register page, a social sign-in or an integration. Off makes sign-up invite-only (a workspace invitation still lets its recipient sign up). Default true."
            },
            "blockDisposableSignups": {
              "type": "boolean",
              "description": "Refuse sign-ups from throwaway inboxes (mailinator and the like). Default false. auth.security.blockDisposableEmail does the same: either switch on refuses."
            },
            "captcha": {
              "type": "boolean",
              "description": "Ask for a captcha on sign-up (the hosted register page and /api/v1/auth/register), using the organization's form captcha settings. Default false."
            },
            "access": {
              "type": "object",
              "description": "Sign-up access: the mode and its lists. The lists are private to the console.",
              "additionalProperties": false,
              "properties": {
                "mode": {
                  "enum": [
                    "open",
                    "allowlist",
                    "waitlist"
                  ],
                  "description": "open (default): anyone allowed above may sign up. allowlist: only the addresses and domains in allow. waitlist: people join the waitlist and sign up once approved (turns the waitlist on)."
                },
                "allow": {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "maxLength": 254,
                    "description": "A lowercase address (ada@example.com) or a domain written @example.com, which covers its subdomains too.",
                    "pattern": "^(@[a-z0-9-]+(\\.[a-z0-9-]+)*\\.[a-z]{2,}|[^\\sA-Z@]+@[a-z0-9.-]+\\.[a-z]{2,})$"
                  },
                  "maxItems": 1000,
                  "description": "Who may sign up in allowlist mode. Order does not matter. Replaced whole when stated.",
                  "uniqueItems": true
                },
                "block": {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "maxLength": 254,
                    "description": "A lowercase address (ada@example.com) or a domain written @example.com, which covers its subdomains too.",
                    "pattern": "^(@[a-z0-9-]+(\\.[a-z0-9-]+)*\\.[a-z]{2,}|[^\\sA-Z@]+@[a-z0-9.-]+\\.[a-z]{2,})$"
                  },
                  "maxItems": 1000,
                  "description": "Who may never sign up, in every mode, even with an invitation. Order does not matter. Replaced whole when stated.",
                  "uniqueItems": true
                }
              }
            }
          }
        },
        "botProtection": {
          "type": "object",
          "description": "Bot protection.",
          "additionalProperties": false,
          "properties": {
            "mode": {
              "enum": [
                "off",
                "always",
                "suspicious"
              ],
              "description": "off (default): no challenge. always: sign-up, magic link and email code sends and password sign-in each need a solved challenge. suspicious: the sends and sign-up always do; password sign-in only after the visitor's IP failed three sign-ins in 15 minutes."
            },
            "siteKey": {
              "description": "Your Turnstile site key, for a custom auth domain. Public by design. Null removes your key pair (site and secret). Use null to clear it.",
              "anyOf": [
                {
                  "type": "string",
                  "maxLength": 256,
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                {
                  "type": "null"
                }
              ]
            },
            "secretKey": {
              "type": "string",
              "maxLength": 10000,
              "description": "Your Turnstile secret key, which goes with siteKey. Checked with Cloudflare when saved, and refused if Cloudflare does not recognise it. Write-only: put \"${env:NAME}\" here and supply the value when you apply. It is never shown again."
            }
          }
        },
        "sms": {
          "type": "object",
          "description": "The SMS provider.",
          "additionalProperties": false,
          "properties": {
            "mode": {
              "enum": [
                "twilio",
                "webhook"
              ],
              "description": "twilio: codes go through your Twilio account. webhook: BuildBase POSTs each code to webhookUrl, signed, and your service sends it."
            },
            "accountSid": {
              "type": "string",
              "maxLength": 64,
              "description": "twilio: your Twilio account SID (AC...).",
              "pattern": "^[A-Za-z0-9]+$"
            },
            "twilioAuthToken": {
              "type": "string",
              "maxLength": 10000,
              "description": "twilio: your Twilio auth token. Checked with Twilio when saved. Write-only: put \"${env:NAME}\" here and supply the value when you apply. It is never shown again."
            },
            "verifyServiceSid": {
              "type": "string",
              "maxLength": 64,
              "description": "twilio: a Twilio Verify service SID (VA...). With one, codes can go by SMS, WhatsApp and voice.",
              "pattern": "^[A-Za-z0-9]+$"
            },
            "messagingServiceSid": {
              "type": "string",
              "maxLength": 64,
              "description": "twilio, without Verify: a Messaging service SID (MG...) to send SMS from.",
              "pattern": "^[A-Za-z0-9]+$"
            },
            "fromNumber": {
              "type": "string",
              "maxLength": 16,
              "description": "twilio, without Verify: the number to send SMS from, in E.164 form (+14155550123).",
              "pattern": "^\\+[1-9][0-9]{6,14}$"
            },
            "webhookUrl": {
              "type": "string",
              "format": "uri",
              "maxLength": 2048,
              "description": "webhook: where BuildBase POSTs each code. Must be reachable from BuildBase (a public https URL in production).",
              "pattern": "^https?://"
            },
            "dailyCap": {
              "type": "integer",
              "description": "Most codes sent in a day (UTC); sends stop beyond it, so a bot cannot run up your bill. Default 1000.",
              "minimum": 1,
              "maximum": 100000
            },
            "alertAt": {
              "type": "integer",
              "description": "Percent of the daily cap at which the organization is warned. Default 80.",
              "minimum": 1,
              "maximum": 100
            }
          },
          "required": [
            "mode"
          ]
        },
        "agentReadiness": {
          "type": "object",
          "description": "Agent readiness.",
          "additionalProperties": false,
          "properties": {
            "enabled": {
              "type": "boolean",
              "description": "Publish the agent discovery documents (the organization's OAuth metadata and agent instructions), so agents can find how to sign in. Default false."
            },
            "allowAgentSignup": {
              "type": "boolean",
              "description": "Let autonomous agents create accounts on the app themselves. Default false."
            },
            "dynamicClientRegistration": {
              "type": "object",
              "description": "Dynamic client registration.",
              "additionalProperties": false,
              "properties": {
                "enabled": {
                  "type": "boolean",
                  "description": "Let agents register their own OAuth clients (RFC 7591). Default false."
                },
                "baseClient": {
                  "type": "string",
                  "maxLength": 200,
                  "description": "The auth.clients key of the client every self-registered client is modelled on (usually an oauth2 client): they use its sign-in methods and endpoints, and are signed with its secret. It cannot be deleted while it is the base."
                },
                "maxClients": {
                  "type": "integer",
                  "description": "Most clients agents may register. Unset means no limit; once set it cannot be unset here.",
                  "minimum": 1
                }
              }
            }
          }
        },
        "domains": {
          "type": "object",
          "description": "Custom auth domains: the hosted sign-in page on a hostname of your own (login.example.com). Each entry is the hostname and nothing else ({}). Apply attaches it; the DNS records to add are listed as manual steps until it is verified in the console. A hostname another organization holds is refused. Needs a plan with custom auth domains.",
          "propertyNames": {
            "description": "Each key is the hostname, lowercase, e.g. login.example.com.",
            "pattern": "^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\\.)+[a-z]{2,}$",
            "maxLength": 200
          },
          "additionalProperties": {
            "type": "object",
            "description": "A custom auth domain. There is nothing to set: the key is the hostname.",
            "additionalProperties": false,
            "properties": {}
          },
          "examples": [
            {
              "login.example.com": {}
            }
          ]
        },
        "waitlist": {
          "type": "object",
          "description": "The waitlist page.",
          "additionalProperties": false,
          "properties": {
            "name": {
              "type": "string",
              "maxLength": 200,
              "description": "Name of the program, shown on the page.",
              "minLength": 2
            },
            "description": {
              "type": "string",
              "maxLength": 1000,
              "description": "What people are joining, shown on the page.",
              "minLength": 2
            },
            "logoUrl": {
              "type": "string",
              "format": "uri",
              "maxLength": 2000,
              "description": "An image URL shown as the logo when none is uploaded.",
              "minLength": 2,
              "pattern": "^https?://"
            },
            "privacyPolicyUrl": {
              "description": "Your privacy policy, linked from the page. Empty shows the hosted sign-in page's link, or none.",
              "anyOf": [
                {
                  "type": "string",
                  "maxLength": 0
                },
                {
                  "type": "string",
                  "format": "uri",
                  "pattern": "^https?://",
                  "maxLength": 2048
                }
              ]
            },
            "termsOfServiceUrl": {
              "description": "Your terms of service, linked from the page. Empty shows the hosted sign-in page's link, or none.",
              "anyOf": [
                {
                  "type": "string",
                  "maxLength": 0
                },
                {
                  "type": "string",
                  "format": "uri",
                  "pattern": "^https?://",
                  "maxLength": 2048
                }
              ]
            },
            "screens": {
              "type": "object",
              "description": "The words on the two waitlist screens.",
              "additionalProperties": false,
              "properties": {
                "register": {
                  "type": "object",
                  "description": "The join screen words. A field left out keeps its value.",
                  "additionalProperties": false,
                  "properties": {
                    "title": {
                      "type": "string",
                      "maxLength": 120,
                      "description": "The join screen headline.",
                      "minLength": 2
                    },
                    "description": {
                      "type": "string",
                      "maxLength": 400,
                      "description": "The join screen line under the headline.",
                      "minLength": 2
                    }
                  }
                },
                "thankYou": {
                  "type": "object",
                  "description": "The screen after joining words. A field left out keeps its value.",
                  "additionalProperties": false,
                  "properties": {
                    "title": {
                      "type": "string",
                      "maxLength": 120,
                      "description": "The screen after joining headline.",
                      "minLength": 2
                    },
                    "description": {
                      "type": "string",
                      "maxLength": 400,
                      "description": "The screen after joining line under the headline.",
                      "minLength": 2
                    }
                  }
                }
              }
            },
            "emails": {
              "type": "object",
              "description": "The waitlist emails: which template each sends, and whether it is sent.",
              "additionalProperties": false,
              "properties": {
                "registered": {
                  "type": "object",
                  "description": "Sent when someone joins the waitlist.",
                  "additionalProperties": false,
                  "properties": {
                    "template": {
                      "type": "string",
                      "maxLength": 100,
                      "description": "The email.templates key to send (or a seeded template id). Once set it can be changed, not cleared."
                    },
                    "send": {
                      "type": "boolean",
                      "description": "Sent when someone joins the waitlist. Default false."
                    }
                  }
                },
                "approved": {
                  "type": "object",
                  "description": "Sent when you approve someone (they may now sign up).",
                  "additionalProperties": false,
                  "properties": {
                    "template": {
                      "type": "string",
                      "maxLength": 100,
                      "description": "The email.templates key to send (or a seeded template id). Once set it can be changed, not cleared."
                    },
                    "send": {
                      "type": "boolean",
                      "description": "Sent when you approve someone (they may now sign up). Default false."
                    }
                  }
                },
                "rejected": {
                  "type": "object",
                  "description": "Sent when you turn someone down.",
                  "additionalProperties": false,
                  "properties": {
                    "template": {
                      "type": "string",
                      "maxLength": 100,
                      "description": "The email.templates key to send (or a seeded template id). Once set it can be changed, not cleared."
                    },
                    "send": {
                      "type": "boolean",
                      "description": "Sent when you turn someone down. Default false."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "email": {
      "type": "object",
      "description": "Transactional email: sending domains, senders, unsubscribe groups, templates, custom merge tags and the notification events that send them.",
      "additionalProperties": false,
      "properties": {
        "mailgun": {
          "type": "object",
          "description": "Mailgun credentials.",
          "additionalProperties": false,
          "properties": {
            "apiKey": {
              "type": "string",
              "maxLength": 10000,
              "description": "Mailgun private API key. Write-only: put \"${env:NAME}\" here and supply the value when you apply. It is never shown again."
            },
            "webhookSigningKey": {
              "type": "string",
              "maxLength": 10000,
              "description": "Mailgun HTTP webhook signing key, so bounce and complaint events are trusted. Write-only: put \"${env:NAME}\" here and supply the value when you apply. It is never shown again."
            }
          },
          "required": [
            "apiKey"
          ]
        },
        "domains": {
          "type": "object",
          "description": "Domains email is sent from through Mailgun. Needs email.mailgun. After apply, add the DNS records the result lists at your DNS provider, then verify the domain in the console (Messaging > Sender accounts > Domains).",
          "propertyNames": {
            "description": "Each key is the domain name, e.g. mail.example.com.",
            "pattern": "^(?=.{1,253}$)([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?\\.)+[a-z]{2,63}$",
            "maxLength": 200
          },
          "additionalProperties": {
            "type": "object",
            "description": "A sending domain. No settings: the key is the domain.",
            "additionalProperties": false,
            "properties": {}
          },
          "examples": [
            {
              "mail.example.com": {}
            }
          ]
        },
        "senders": {
          "type": "object",
          "description": "Who email is sent from. \"smtp\": your own SMTP server (checked with a live connection before it is saved). \"ses\": Amazon SES SMTP credentials. \"mailgun\": an address on one of your email.domains. \"managed\": BuildBase-managed sending, where the server offers it. \"google\": a Gmail account, which needs a browser sign-in in the console. Set \"default\": true on the one that sends system email.",
          "propertyNames": {
            "description": "Each key is a name you choose for the sender.",
            "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,99}$",
            "maxLength": 200
          },
          "additionalProperties": {
            "type": "object",
            "description": "An email sender.",
            "additionalProperties": false,
            "properties": {
              "type": {
                "enum": [
                  "smtp",
                  "ses",
                  "mailgun",
                  "managed",
                  "google"
                ],
                "description": "How mail leaves."
              },
              "title": {
                "type": "string",
                "maxLength": 200,
                "description": "Name shown in the console (smtp, ses).",
                "minLength": 2
              },
              "description": {
                "type": "string",
                "maxLength": 500,
                "description": "What the sender is for (smtp, ses).",
                "minLength": 2
              },
              "from": {
                "type": "string",
                "maxLength": 320,
                "description": "The From header, e.g. \"Acme <hello@example.com>\". The address must be one the server is allowed to send as.",
                "minLength": 3
              },
              "replyTo": {
                "type": "string",
                "maxLength": 320,
                "description": "Reply-To address for mail from this sender."
              },
              "default": {
                "type": "boolean",
                "description": "This sender sends system email (sign-in codes, invitations, notifications). One sender at a time."
              },
              "host": {
                "type": "string",
                "maxLength": 253,
                "description": "SMTP host (smtp).",
                "minLength": 1
              },
              "port": {
                "type": "integer",
                "description": "SMTP port (smtp), e.g. 587 or 465.",
                "minimum": 1,
                "maximum": 65535
              },
              "secure": {
                "type": "boolean",
                "description": "Connect with TLS from the start (port 465); false uses STARTTLS when offered (smtp)."
              },
              "username": {
                "type": "string",
                "maxLength": 320,
                "description": "SMTP or SES SMTP user name (smtp, ses).",
                "minLength": 1
              },
              "password": {
                "type": "string",
                "maxLength": 10000,
                "description": "SMTP or SES SMTP password (smtp, ses). Write-only: put \"${env:NAME}\" here and supply the value when you apply. It is never shown again."
              },
              "region": {
                "type": "string",
                "maxLength": 40,
                "description": "AWS region of the SES endpoint, e.g. us-east-1 (ses). Fixed once created.",
                "pattern": "^[a-z]{2}(-[a-z]+)+-\\d$"
              },
              "configurationSet": {
                "type": "string",
                "maxLength": 2000,
                "description": "SES configuration set to send with (ses).",
                "pattern": "^[A-Za-z0-9_-]{1,64}$"
              },
              "snsTopicArn": {
                "type": "string",
                "maxLength": 300,
                "description": "SNS topic ARN that receives SES bounce and complaint events (ses)."
              },
              "domain": {
                "type": "string",
                "maxLength": 253,
                "description": "The email.domains key the address belongs to (mailgun)."
              },
              "senderName": {
                "type": "string",
                "maxLength": 200,
                "description": "Display name (mailgun).",
                "minLength": 2
              },
              "senderEmail": {
                "type": "string",
                "maxLength": 320,
                "description": "Address on the domain, e.g. hello@mail.example.com (mailgun)."
              }
            },
            "required": [
              "type"
            ]
          },
          "examples": [
            {
              "transactional": {
                "type": "smtp",
                "title": "Transactional",
                "description": "Sign-in codes and receipts",
                "host": "smtp.example.com",
                "port": 587,
                "secure": false,
                "username": "apikey",
                "password": "${env:SMTP_PASSWORD}",
                "from": "Acme <hello@example.com>",
                "default": true
              }
            }
          ]
        },
        "unsubscribeGroups": {
          "type": "object",
          "description": "Groups a recipient can unsubscribe from one by one (newsletters, product updates...). The seeded groups \"system-workspace-notifications\" and \"system-billing-notifications\" exist in every organization, can be referenced by templates, and cannot be changed.",
          "propertyNames": {
            "description": "Each key is a name you choose for the group (templates refer to it by this key).",
            "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,99}$",
            "maxLength": 200
          },
          "additionalProperties": {
            "type": "object",
            "description": "An unsubscribe group.",
            "additionalProperties": false,
            "properties": {
              "title": {
                "type": "string",
                "maxLength": 120,
                "description": "Name recipients see on the preference page.",
                "minLength": 2
              },
              "description": {
                "type": "string",
                "maxLength": 500,
                "description": "What the group sends, shown on the preference page.",
                "minLength": 2
              },
              "isDefault": {
                "type": "boolean",
                "description": "New templates join this group unless they name another. Default false."
              },
              "isPublic": {
                "type": "boolean",
                "description": "Listed on the recipient preference page. Default false."
              }
            },
            "required": [
              "title"
            ]
          },
          "examples": [
            {
              "newsletter": {
                "title": "Newsletter",
                "description": "Monthly product news",
                "isPublic": true
              }
            }
          ]
        },
        "templates": {
          "type": "object",
          "description": "Email templates. Merge tags such as {{user.name}}, {{appName}} and your own email.mergeTags work in the subject and body. A seeded template keeps its type (markdown); a new template is markdown, html or text, and its type cannot change later.",
          "propertyNames": {
            "description": "Each key is a seeded template id (welcome, magic-link, sign-in-code, password-reset-code, email-verification-code, workspace-invite, subscription-created, payment-failed, ...) to customize it, or a name you choose for a new template.",
            "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,99}$",
            "maxLength": 200
          },
          "additionalProperties": {
            "type": "object",
            "description": "An email template.",
            "additionalProperties": false,
            "properties": {
              "title": {
                "type": "string",
                "maxLength": 200,
                "description": "Name shown in the console.",
                "minLength": 2
              },
              "description": {
                "type": "string",
                "maxLength": 500,
                "description": "What the template is for. Required for a new template.",
                "minLength": 2
              },
              "type": {
                "enum": [
                  "text",
                  "html",
                  "markdown"
                ],
                "description": "Body format of a new template: \"markdown\" (recommended), \"html\" or \"text\". Fixed once created."
              },
              "category": {
                "enum": [
                  "user",
                  "contact",
                  "audience",
                  "auth",
                  "default",
                  "beta-users",
                  "custom",
                  "notification"
                ],
                "description": "Which merge tags the editor offers: user, contact, audience, auth, notification, beta-users, custom or default. Default \"default\"."
              },
              "subject": {
                "type": "string",
                "maxLength": 500,
                "description": "Subject line. Merge tags allowed.",
                "minLength": 2
              },
              "unsubscribeGroup": {
                "type": "string",
                "maxLength": 100,
                "description": "The email.unsubscribeGroups key (or a system group) recipients can opt out of. New templates only; seeded templates keep theirs."
              },
              "markdown": {
                "type": "string",
                "maxLength": 200000,
                "description": "Body of a markdown template."
              },
              "html": {
                "type": "string",
                "maxLength": 500000,
                "description": "Body of an html template, as complete HTML. It opens in the code editor rather than the drag-and-drop designer."
              },
              "text": {
                "type": "string",
                "maxLength": 200000,
                "description": "Body of a plain text template."
              }
            }
          },
          "examples": [
            {
              "welcome": {
                "subject": "Welcome to {{appName}}, {{user.name}}",
                "markdown": "# Welcome\n\nThanks for joining {{appName}}."
              }
            }
          ]
        },
        "mergeTags": {
          "type": "object",
          "description": "Organization-wide merge tags. Every organization has appName, supportEmail, privacyPolicyUrl, termsUrl and companyAddress with empty values: set them here. Tags are archived, never deleted.",
          "propertyNames": {
            "description": "Each key is the tag name used in templates as {{key}}.",
            "pattern": "^[a-zA-Z][a-zA-Z0-9_-]{1,63}$",
            "maxLength": 200
          },
          "additionalProperties": {
            "type": "object",
            "description": "A merge tag.",
            "additionalProperties": false,
            "properties": {
              "title": {
                "type": "string",
                "maxLength": 128,
                "description": "Label in the template editor.",
                "minLength": 2
              },
              "value": {
                "type": "string",
                "maxLength": 2000,
                "description": "What {{key}} renders as."
              },
              "archived": {
                "type": "boolean",
                "description": "Hidden from the editor; templates that still use it render it empty."
              }
            },
            "required": [
              "title",
              "value"
            ]
          },
          "examples": [
            {
              "supportEmail": {
                "title": "Support Email",
                "value": "help@example.com"
              }
            }
          ]
        },
        "notificationEvents": {
          "type": "object",
          "description": "Notification events. A new event gets its own email template (\"custom-notification-<slug>\") unless you point \"template\" at one of yours. Platform events accept only \"channels\".",
          "propertyNames": {
            "description": "Each key is the event slug your app triggers (or a platform event slug, to switch its channels).",
            "pattern": "^[a-z0-9][a-z0-9._-]{1,99}$",
            "maxLength": 200
          },
          "additionalProperties": {
            "type": "object",
            "description": "A notification event.",
            "additionalProperties": false,
            "properties": {
              "name": {
                "type": "string",
                "maxLength": 120,
                "description": "Name in the console and in the user preference center.",
                "minLength": 2
              },
              "description": {
                "type": "string",
                "maxLength": 500,
                "description": "What the event tells the user."
              },
              "category": {
                "enum": [
                  "workspace",
                  "billing",
                  "trial",
                  "payment",
                  "account",
                  "general"
                ],
                "description": "Preference center grouping: workspace, billing, trial, payment, account or general. Default \"general\"."
              },
              "enabled": {
                "type": "boolean",
                "description": "Send at all. Default true."
              },
              "userManaged": {
                "type": "boolean",
                "description": "Users may switch it off in their notification preferences. Default false."
              },
              "channels": {
                "type": "object",
                "description": "Which channels carry this event.",
                "additionalProperties": false,
                "properties": {
                  "email": {
                    "type": "boolean",
                    "description": "Send the email. Default true."
                  },
                  "push": {
                    "type": "boolean",
                    "description": "Send a push notification. Default true."
                  }
                }
              },
              "template": {
                "type": "string",
                "maxLength": 100,
                "description": "The email.templates key used for the email."
              }
            }
          },
          "examples": [
            {
              "report-ready": {
                "name": "Report ready",
                "description": "Your weekly report is ready",
                "channels": {
                  "email": true,
                  "push": false
                }
              }
            }
          ]
        }
      }
    },
    "billing": {
      "type": "object",
      "description": "What the app sells: the Stripe connection, product categories, items (features, limits, quotas), credit packages, plans with versioned prices, pricing groups, the plan new workspaces start on, add-ons sold beside the plans, and coupons with their promotion codes.",
      "additionalProperties": false,
      "properties": {
        "stripe": {
          "type": "object",
          "description": "Stripe keys.",
          "additionalProperties": false,
          "properties": {
            "publishableKey": {
              "type": "string",
              "maxLength": 255,
              "description": "Stripe publishable key (pk_test_... or pk_live_...). Not a secret: the SDK sends it to browsers for checkout. \"${env:NAME}\" works too.",
              "pattern": "^pk_(test|live)_[0-9A-Za-z]+$"
            },
            "secretKey": {
              "type": "string",
              "maxLength": 10000,
              "description": "Stripe secret key (sk_test_..., sk_live_..., or a restricted rk_ key) of the same account and mode as the publishable key. Write-only: put \"${env:NAME}\" here and supply the value when you apply. It is never shown again."
            },
            "webhookSecret": {
              "type": "string",
              "maxLength": 10000,
              "description": "Signing secret (whsec_...) of the Stripe webhook endpoint that points at this organization. Without it Stripe events are refused, so subscriptions never update. In the console, Billing > Credentials > \"Check Stripe setup\", then \"Create the endpoint for me\", creates the endpoint and stores this for you instead. Write-only: put \"${env:NAME}\" here and supply the value when you apply. It is never shown again."
            }
          },
          "required": [
            "publishableKey",
            "secretKey"
          ]
        },
        "categories": {
          "type": "object",
          "description": "Groups that billing items are filed under. Pricing tables and plan comparisons show items section by section in category order. Every item belongs to exactly one category.",
          "propertyNames": {
            "description": "Each key is the category slug (cannot change after creation).",
            "pattern": "^[a-z0-9][a-z0-9_-]{1,99}$",
            "maxLength": 200
          },
          "additionalProperties": {
            "type": "object",
            "description": "An item category.",
            "additionalProperties": false,
            "properties": {
              "name": {
                "type": "string",
                "maxLength": 100,
                "description": "Section heading shown on pricing tables and in the console. No leading or trailing spaces.",
                "minLength": 2,
                "pattern": "^\\S(?:[\\s\\S]*\\S)?$"
              },
              "description": {
                "type": "string",
                "maxLength": 500,
                "description": "What the items in this category have in common. Shown in the console. Empty clears it.",
                "pattern": "^(?:|\\S(?:[\\s\\S]*\\S)?)$"
              },
              "sortOrder": {
                "type": "integer",
                "description": "Position of this section on pricing tables, ascending. Default 0; ties fall back to creation order.",
                "minimum": -100000,
                "maximum": 100000
              }
            },
            "required": [
              "name"
            ]
          },
          "examples": [
            {
              "core": {
                "name": "Core features",
                "sortOrder": 10
              }
            }
          ]
        },
        "items": {
          "type": "object",
          "description": "The catalog plans are built from. A \"feature\" item is a capability a plan switches on (BuildBase creates and owns its workspace feature flag, so do not declare it under workspaces.features). A \"limit\" is a count a plan caps, -1 meaning unlimited. A \"quota\" is a usage allowance per billing period, optionally billed as overage. Your app reads each one by its slug. An item is a workspace's unless its scope is \"user\": a person's, which is what an add-on a person buys (payerType \"user\") grants.",
          "propertyNames": {
            "description": "Each key is the item slug your app checks with the SDK (useEntitlement or useLimit from SDK 1.0.0; WhenWorkspaceFeatureEnabled and useQuotaUsageStatus on 0.0.90 and earlier) and plans list it under.",
            "pattern": "^[a-z0-9][a-z0-9_-]{1,99}$",
            "maxLength": 200
          },
          "additionalProperties": {
            "type": "object",
            "description": "A billing item.",
            "additionalProperties": false,
            "properties": {
              "type": {
                "enum": [
                  "feature",
                  "limit",
                  "quota"
                ],
                "description": "What kind of entitlement: \"feature\" (on or off), \"limit\" (a ceiling such as projects or seats) or \"quota\" (usage per billing period such as API calls). Cannot change after creation; use a new slug instead."
              },
              "scope": {
                "enum": [
                  "workspace",
                  "user"
                ],
                "description": "Who the item is declared for: \"workspace\" (the default) or \"user\", a person. An add-on a person buys (payerType \"user\") grants user-scope items only, and a workspace's add-on workspace-scope items only. A user-scope feature has no workspace feature flag: it is read for the person. Cannot change after creation; use a new slug instead. Counting a user-scope limit by claims (linkedTo, claimPolicy) is set in the console: the blueprint leaves it as it is."
              },
              "name": {
                "type": "string",
                "maxLength": 100,
                "description": "Name shown on pricing tables and in the console. No leading or trailing spaces.",
                "minLength": 2,
                "pattern": "^\\S(?:[\\s\\S]*\\S)?$"
              },
              "description": {
                "type": "string",
                "maxLength": 500,
                "description": "One line shown under the name on pricing tables. Empty clears it.",
                "pattern": "^(?:|\\S(?:[\\s\\S]*\\S)?)$"
              },
              "category": {
                "type": "string",
                "maxLength": 100,
                "description": "Key of the billing.categories entry this item is listed under."
              },
              "sortOrder": {
                "type": "integer",
                "description": "Position within its category on pricing tables, ascending. Default 0.",
                "minimum": -100000,
                "maximum": 100000
              },
              "highlight": {
                "type": "boolean",
                "description": "A selling point: pricing tables list highlighted items first on each plan card. Default false."
              },
              "badge": {
                "type": "string",
                "maxLength": 50,
                "description": "Short label shown next to the item on pricing tables, such as \"New\" or \"Beta\". Empty clears it.",
                "pattern": "^(?:|\\S(?:[\\s\\S]*\\S)?)$"
              },
              "internalOnly": {
                "type": "boolean",
                "description": "Gate a capability without ever showing it on a public pricing table. Default false."
              }
            },
            "required": [
              "type",
              "name",
              "category"
            ]
          },
          "examples": [
            {
              "api-calls": {
                "type": "quota",
                "name": "API calls",
                "category": "usage",
                "description": "Requests to the public API"
              }
            }
          ]
        },
        "creditPackages": {
          "type": "object",
          "description": "Bundles of credits sold as a one-time purchase, or granted by a plan (billing.plans.*.credits). Each price is a one-time charge in the currency's smallest unit. The organization's plan must include credits (402 otherwise). A package nothing holds is edited in place. Once something holds it (a published plan version grants it, an auto top-up buys it, or it was bought or granted), a change to its credits, its validity or the amount of a currency it is priced in is a new version of the package, published unless policy.publish is \"never\": what was bought keeps its terms. Its name, description, order, whether it is on sale and a currency it is not priced in yet are still edited in place.",
          "propertyNames": {
            "description": "Each key is the package slug the SDK buys it by (lowercase letters, digits and -; cannot change after creation).",
            "pattern": "^[a-z0-9][a-z0-9-]{1,99}$",
            "maxLength": 200
          },
          "additionalProperties": {
            "type": "object",
            "description": "A credit package.",
            "additionalProperties": false,
            "properties": {
              "name": {
                "type": "string",
                "maxLength": 100,
                "description": "Name shown at checkout and in the console. No leading or trailing spaces.",
                "minLength": 2,
                "pattern": "^\\S(?:[\\s\\S]*\\S)?$"
              },
              "description": {
                "type": "string",
                "maxLength": 500,
                "description": "What the buyer gets. Shown at checkout. Empty clears it.",
                "pattern": "^(?:|\\S(?:[\\s\\S]*\\S)?)$"
              },
              "credits": {
                "type": "integer",
                "description": "Credits added to the workspace balance per purchase or grant. At least 1. A sold term: once the package is held, a change is a new version.",
                "minimum": 1,
                "maximum": 1000000000
              },
              "prices": {
                "type": "object",
                "description": "Price per currency (lowercase ISO 4217 code). Exactly these currencies are offered: a currency left out is removed. At least one. Once the package is held, a new amount or a removed currency is a new version; a new currency is added in place.",
                "propertyNames": {
                  "enum": [
                    "usd",
                    "eur",
                    "gbp",
                    "cad",
                    "aud",
                    "jpy",
                    "inr",
                    "chf",
                    "sek",
                    "nok",
                    "dkk",
                    "sgd",
                    "hkd",
                    "nzd",
                    "mxn",
                    "brl",
                    "pln",
                    "czk",
                    "thb",
                    "try",
                    "zar"
                  ]
                },
                "additionalProperties": {
                  "type": "integer",
                  "description": "One-time price of the package. An integer in the currency's smallest unit (cents for USD and EUR, yen for JPY, which has none): 2900 is $29.00, 2900 in JPY is 2900 yen.",
                  "minimum": 0,
                  "maximum": 100000000000
                },
                "maxProperties": 21
              },
              "validityDays": {
                "description": "Days the credits stay usable after purchase or grant. Leave it out or use null for credits that never expire (refused when your BuildBase plan caps credit expiry). A sold term: once the package is held, a change is a new version. Use null to clear it.",
                "anyOf": [
                  {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 36500
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "active": {
                "type": "boolean",
                "description": "On sale. Inactive packages cannot be bought, but plans may still grant them. Default true."
              },
              "sortOrder": {
                "type": "integer",
                "description": "Position in package lists, ascending. Default 0.",
                "minimum": -100000,
                "maximum": 100000
              },
              "metadata": {
                "type": "object",
                "description": "Free-form string pairs stored with the package and returned by the API, for your own use. Keys left out keep their stored value.",
                "propertyNames": {
                  "maxLength": 200
                },
                "additionalProperties": {
                  "type": "string",
                  "maxLength": 500,
                  "description": "A metadata value."
                }
              },
              "versionMoves": {
                "type": "object",
                "description": "Version moves: what publishing a new version of the package does to the holders of the version it takes off sale. Credits already bought or granted never move: a move reaches the auto top-ups that buy the package. A publish made by apply never moves anyone by itself: the move waits as \"awaiting confirmation\" until an admin confirms its preview in the console, and the plan says how many holders it would reach.",
                "additionalProperties": false,
                "properties": {
                  "mode": {
                    "enum": [
                      "off",
                      "gains",
                      "all"
                    ],
                    "description": "\"off\" (the default) leaves holders on the version they have. \"gains\" moves them to the new version only where it takes nothing away from them. \"all\" moves gains at once and losses at each holder's renewal, after noticeDays of notice."
                  },
                  "noticeDays": {
                    "type": "integer",
                    "description": "Days of notice before a loss reaches a holder, 7 to 365, and never less than the time to their renewal. Default 30. Left out, the stored value stays.",
                    "minimum": 7,
                    "maximum": 365
                  }
                },
                "required": [
                  "mode"
                ]
              }
            },
            "required": [
              "name",
              "credits",
              "prices"
            ]
          },
          "examples": [
            {
              "starter-pack": {
                "name": "Starter pack",
                "credits": 1000,
                "prices": {
                  "usd": 900,
                  "eur": 800
                },
                "validityDays": 365
              }
            }
          ]
        },
        "plans": {
          "type": "object",
          "description": "Plans and their prices. A plan is versioned: what a subscriber bought never changes under them. Any change to features, limits, quotas, pricing, trial or credits creates a new version (filled from the current one plus this file) and publishes it unless policy.publish is \"never\"; existing subscribers stay on the version they have. The file is compared against the published version. Money is always an integer in the currency's smallest unit.",
          "propertyNames": {
            "description": "Each key is the plan slug (cannot change after creation).",
            "pattern": "^[a-z0-9][a-z0-9_-]{1,99}$",
            "maxLength": 200
          },
          "additionalProperties": {
            "type": "object",
            "description": "A plan.",
            "additionalProperties": false,
            "properties": {
              "name": {
                "type": "string",
                "maxLength": 100,
                "description": "Plan name shown on pricing tables, checkout and invoices. No leading or trailing spaces.",
                "minLength": 2,
                "pattern": "^\\S(?:[\\s\\S]*\\S)?$"
              },
              "description": {
                "type": "string",
                "maxLength": 500,
                "description": "One line under the plan name on pricing tables. Empty clears it.",
                "pattern": "^(?:|\\S(?:[\\s\\S]*\\S)?)$"
              },
              "freemium": {
                "type": "boolean",
                "description": "A free plan: prices may be 0, and the SDK assigns it without checkout. Cannot change once a version is published. Default false."
              },
              "versionMoves": {
                "type": "object",
                "description": "Version moves: what publishing a new version of the plan does to the holders of the version it takes off sale. A setting on the plan, not a term of a version: changing it makes no new version. A publish made by apply never moves anyone by itself: the move waits as \"awaiting confirmation\" until an admin confirms its preview in the console, and the plan says how many holders it would reach.",
                "additionalProperties": false,
                "properties": {
                  "mode": {
                    "enum": [
                      "off",
                      "gains",
                      "all"
                    ],
                    "description": "\"off\" (the default) leaves holders on the version they have. \"gains\" moves them to the new version only where it takes nothing away from them. \"all\" moves gains at once and losses at each holder's renewal, after noticeDays of notice."
                  },
                  "noticeDays": {
                    "type": "integer",
                    "description": "Days of notice before a loss reaches a holder, 7 to 365, and never less than the time to their renewal. Default 30. Left out, the stored value stays.",
                    "minimum": 7,
                    "maximum": 365
                  }
                },
                "required": [
                  "mode"
                ]
              },
              "features": {
                "type": "object",
                "description": "Feature items (billing.items of type \"feature\") on this plan, by slug. Exactly these: a feature left out is removed from the next version. Leave the whole field out to keep the features as they are.",
                "propertyNames": {
                  "maxLength": 200,
                  "pattern": "^[a-z0-9][a-z0-9_-]{1,99}$"
                },
                "additionalProperties": {
                  "type": "boolean",
                  "description": "true grants the feature on this plan; false lists it as not included."
                }
              },
              "limits": {
                "type": "object",
                "description": "Limit items (type \"limit\") on this plan, by slug. Exactly these: a limit left out is removed from the next version.",
                "propertyNames": {
                  "maxLength": 200,
                  "pattern": "^[a-z0-9][a-z0-9_-]{1,99}$"
                },
                "additionalProperties": {
                  "type": "integer",
                  "description": "The ceiling on this plan. -1 is unlimited, 0 is none.",
                  "minimum": -1,
                  "maximum": 1000000000000
                }
              },
              "quotas": {
                "type": "object",
                "description": "Quota items (type \"quota\") on this plan, by slug. Exactly these: a quota left out is removed from the next version.",
                "propertyNames": {
                  "maxLength": 200,
                  "pattern": "^[a-z0-9][a-z0-9_-]{1,99}$"
                },
                "additionalProperties": {
                  "type": "object",
                  "description": "One quota on this plan: the allowance per billing interval. Give one for every interval the plan is sold on.",
                  "additionalProperties": false,
                  "properties": {
                    "allowOverage": {
                      "type": "boolean",
                      "description": "Keep serving past the allowance and bill the extra at pricing.<currency>.overage. false makes the allowance a hard cap. Default false. Needs metered billing on your BuildBase plan."
                    },
                    "monthly": {
                      "type": "object",
                      "description": "Allowance for subscribers billed per month.",
                      "additionalProperties": false,
                      "properties": {
                        "included": {
                          "type": "integer",
                          "description": "Units included per month before overage. Quotas have no unlimited value: for no ceiling use a limit item, or a large allowance.",
                          "minimum": 0,
                          "maximum": 1000000000000
                        },
                        "unitSize": {
                          "type": "integer",
                          "description": "Units per billable overage unit: 1000 bills overage per 1,000 units. Default 1.",
                          "minimum": 1,
                          "maximum": 1000000000
                        }
                      }
                    },
                    "yearly": {
                      "type": "object",
                      "description": "Allowance for subscribers billed per year.",
                      "additionalProperties": false,
                      "properties": {
                        "included": {
                          "type": "integer",
                          "description": "Units included per year before overage. Quotas have no unlimited value: for no ceiling use a limit item, or a large allowance.",
                          "minimum": 0,
                          "maximum": 1000000000000
                        },
                        "unitSize": {
                          "type": "integer",
                          "description": "Units per billable overage unit: 1000 bills overage per 1,000 units. Default 1.",
                          "minimum": 1,
                          "maximum": 1000000000
                        }
                      }
                    },
                    "quarterly": {
                      "type": "object",
                      "description": "Allowance for subscribers billed per quarter.",
                      "additionalProperties": false,
                      "properties": {
                        "included": {
                          "type": "integer",
                          "description": "Units included per quarter before overage. Quotas have no unlimited value: for no ceiling use a limit item, or a large allowance.",
                          "minimum": 0,
                          "maximum": 1000000000000
                        },
                        "unitSize": {
                          "type": "integer",
                          "description": "Units per billable overage unit: 1000 bills overage per 1,000 units. Default 1.",
                          "minimum": 1,
                          "maximum": 1000000000
                        }
                      }
                    }
                  }
                }
              },
              "pricing": {
                "type": "object",
                "description": "Prices per currency (lowercase ISO 4217 code). Every currency the organization sells in (app.currencies) needs one. Fields left out keep their current value; null removes an interval or seat pricing.",
                "propertyNames": {
                  "enum": [
                    "usd",
                    "eur",
                    "gbp",
                    "cad",
                    "aud",
                    "jpy",
                    "inr",
                    "chf",
                    "sek",
                    "nok",
                    "dkk",
                    "sgd",
                    "hkd",
                    "nzd",
                    "mxn",
                    "brl",
                    "pln",
                    "czk",
                    "thb",
                    "try",
                    "zar"
                  ]
                },
                "additionalProperties": {
                  "type": "object",
                  "description": "Prices in one currency.",
                  "additionalProperties": false,
                  "properties": {
                    "monthly": {
                      "description": "Base price per month. Leave it out (or null) to not sell this interval. An integer in the currency's smallest unit (cents for USD and EUR, yen for JPY, which has none): 2900 is $29.00, 2900 in JPY is 2900 yen. Use null to clear it.",
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": 0,
                          "maximum": 100000000000
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "yearly": {
                      "description": "Base price per year. Leave it out (or null) to not sell this interval. An integer in the currency's smallest unit (cents for USD and EUR, yen for JPY, which has none): 2900 is $29.00, 2900 in JPY is 2900 yen. Use null to clear it.",
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": 0,
                          "maximum": 100000000000
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "quarterly": {
                      "description": "Base price per quarter (3 months). Leave it out (or null) to not sell this interval. An integer in the currency's smallest unit (cents for USD and EUR, yen for JPY, which has none): 2900 is $29.00, 2900 in JPY is 2900 yen. Use null to clear it.",
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": 0,
                          "maximum": 100000000000
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "seats": {
                      "description": "Bill per member. Needs seat pricing on your BuildBase plan, and a per-seat amount above 0 or tiers. Use null to clear it.",
                      "anyOf": [
                        {
                          "type": "object",
                          "additionalProperties": false,
                          "properties": {
                            "included": {
                              "type": "integer",
                              "description": "Members covered by the base price. Default 0.",
                              "minimum": 0,
                              "maximum": 1000000
                            },
                            "max": {
                              "type": "integer",
                              "description": "Most members a workspace on this plan may have. -1 (the default) for no cap.",
                              "minimum": -1,
                              "maximum": 1000000
                            },
                            "perSeat": {
                              "type": "object",
                              "description": "Per-seat price per interval.",
                              "additionalProperties": false,
                              "properties": {
                                "monthly": {
                                  "type": "integer",
                                  "description": "Price of each member beyond `included` per month. An integer in the currency's smallest unit (cents for USD and EUR, yen for JPY, which has none): 2900 is $29.00, 2900 in JPY is 2900 yen.",
                                  "minimum": 0,
                                  "maximum": 100000000000
                                },
                                "yearly": {
                                  "type": "integer",
                                  "description": "Price of each member beyond `included` per year. An integer in the currency's smallest unit (cents for USD and EUR, yen for JPY, which has none): 2900 is $29.00, 2900 in JPY is 2900 yen.",
                                  "minimum": 0,
                                  "maximum": 100000000000
                                },
                                "quarterly": {
                                  "type": "integer",
                                  "description": "Price of each member beyond `included` per quarter (3 months). An integer in the currency's smallest unit (cents for USD and EUR, yen for JPY, which has none): 2900 is $29.00, 2900 in JPY is 2900 yen.",
                                  "minimum": 0,
                                  "maximum": 100000000000
                                }
                              }
                            },
                            "tiers": {
                              "description": "Tiered per-seat price in place of perSeat, per interval. upTo counts billable seats: members beyond `included`. At least two tiers per interval, the last open-ended. An interval has a flat amount or tiers, not both: stating one here replaces the other for that interval. Use null to clear it.",
                              "anyOf": [
                                {
                                  "type": "object",
                                  "additionalProperties": false,
                                  "properties": {
                                    "mode": {
                                      "enum": [
                                        "graduated",
                                        "volume"
                                      ],
                                      "description": "\"graduated\" prices each tier's units at its own rate and sums them; \"volume\" prices every unit at the tier the whole quantity lands in."
                                    },
                                    "monthly": {
                                      "type": "array",
                                      "items": {
                                        "type": "object",
                                        "description": "One tier: a per-unit amount, a flat amount or both.",
                                        "additionalProperties": false,
                                        "properties": {
                                          "upTo": {
                                            "description": "The last unit this tier covers, inclusive. Leave it out (or null) on the last tier, which is open-ended, and only there. Use null to clear it.",
                                            "anyOf": [
                                              {
                                                "type": "integer",
                                                "minimum": 1
                                              },
                                              {
                                                "type": "null"
                                              }
                                            ]
                                          },
                                          "unitAmount": {
                                            "type": "integer",
                                            "description": "Price of each unit in this tier. An integer in the currency's smallest unit (cents for USD and EUR, yen for JPY, which has none): 2900 is $29.00, 2900 in JPY is 2900 yen.",
                                            "minimum": 0,
                                            "maximum": 100000000000
                                          },
                                          "flatAmount": {
                                            "type": "integer",
                                            "description": "A fixed amount charged once any unit reaches this tier. An integer in the currency's smallest unit (cents for USD and EUR, yen for JPY, which has none): 2900 is $29.00, 2900 in JPY is 2900 yen.",
                                            "minimum": 0,
                                            "maximum": 100000000000
                                          }
                                        }
                                      },
                                      "maxItems": 250,
                                      "description": "Tiers for the monthly price, in order."
                                    },
                                    "yearly": {
                                      "type": "array",
                                      "items": {
                                        "type": "object",
                                        "description": "One tier: a per-unit amount, a flat amount or both.",
                                        "additionalProperties": false,
                                        "properties": {
                                          "upTo": {
                                            "description": "The last unit this tier covers, inclusive. Leave it out (or null) on the last tier, which is open-ended, and only there. Use null to clear it.",
                                            "anyOf": [
                                              {
                                                "type": "integer",
                                                "minimum": 1
                                              },
                                              {
                                                "type": "null"
                                              }
                                            ]
                                          },
                                          "unitAmount": {
                                            "type": "integer",
                                            "description": "Price of each unit in this tier. An integer in the currency's smallest unit (cents for USD and EUR, yen for JPY, which has none): 2900 is $29.00, 2900 in JPY is 2900 yen.",
                                            "minimum": 0,
                                            "maximum": 100000000000
                                          },
                                          "flatAmount": {
                                            "type": "integer",
                                            "description": "A fixed amount charged once any unit reaches this tier. An integer in the currency's smallest unit (cents for USD and EUR, yen for JPY, which has none): 2900 is $29.00, 2900 in JPY is 2900 yen.",
                                            "minimum": 0,
                                            "maximum": 100000000000
                                          }
                                        }
                                      },
                                      "maxItems": 250,
                                      "description": "Tiers for the yearly price, in order."
                                    },
                                    "quarterly": {
                                      "type": "array",
                                      "items": {
                                        "type": "object",
                                        "description": "One tier: a per-unit amount, a flat amount or both.",
                                        "additionalProperties": false,
                                        "properties": {
                                          "upTo": {
                                            "description": "The last unit this tier covers, inclusive. Leave it out (or null) on the last tier, which is open-ended, and only there. Use null to clear it.",
                                            "anyOf": [
                                              {
                                                "type": "integer",
                                                "minimum": 1
                                              },
                                              {
                                                "type": "null"
                                              }
                                            ]
                                          },
                                          "unitAmount": {
                                            "type": "integer",
                                            "description": "Price of each unit in this tier. An integer in the currency's smallest unit (cents for USD and EUR, yen for JPY, which has none): 2900 is $29.00, 2900 in JPY is 2900 yen.",
                                            "minimum": 0,
                                            "maximum": 100000000000
                                          },
                                          "flatAmount": {
                                            "type": "integer",
                                            "description": "A fixed amount charged once any unit reaches this tier. An integer in the currency's smallest unit (cents for USD and EUR, yen for JPY, which has none): 2900 is $29.00, 2900 in JPY is 2900 yen.",
                                            "minimum": 0,
                                            "maximum": 100000000000
                                          }
                                        }
                                      },
                                      "maxItems": 250,
                                      "description": "Tiers for the quarterly price, in order."
                                    }
                                  },
                                  "required": [
                                    "mode"
                                  ]
                                },
                                {
                                  "type": "null"
                                }
                              ]
                            }
                          }
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "overage": {
                      "type": "object",
                      "description": "Overage price per quota slug (a key of quotas). Required for every quota with allowOverage, in every currency.",
                      "propertyNames": {
                        "maxLength": 200,
                        "pattern": "^[a-z0-9][a-z0-9_-]{1,99}$"
                      },
                      "additionalProperties": {
                        "type": "object",
                        "description": "Overage price of one quota per interval: a flat amount or tiers.",
                        "additionalProperties": false,
                        "properties": {
                          "monthly": {
                            "type": "integer",
                            "description": "Price of one billable overage unit per month. An integer in the currency's smallest unit (cents for USD and EUR, yen for JPY, which has none): 2900 is $29.00, 2900 in JPY is 2900 yen.",
                            "minimum": 0,
                            "maximum": 100000000000
                          },
                          "yearly": {
                            "type": "integer",
                            "description": "Price of one billable overage unit per year. An integer in the currency's smallest unit (cents for USD and EUR, yen for JPY, which has none): 2900 is $29.00, 2900 in JPY is 2900 yen.",
                            "minimum": 0,
                            "maximum": 100000000000
                          },
                          "quarterly": {
                            "type": "integer",
                            "description": "Price of one billable overage unit per quarter (3 months). An integer in the currency's smallest unit (cents for USD and EUR, yen for JPY, which has none): 2900 is $29.00, 2900 in JPY is 2900 yen.",
                            "minimum": 0,
                            "maximum": 100000000000
                          },
                          "tiers": {
                            "description": "Tiered overage price in place of the flat amount, per interval. upTo counts billable overage units (blocks of the quota's unitSize). At least two tiers per interval, the last open-ended. An interval has a flat amount or tiers, not both: stating one here replaces the other for that interval. Use null to clear it.",
                            "anyOf": [
                              {
                                "type": "object",
                                "additionalProperties": false,
                                "properties": {
                                  "mode": {
                                    "enum": [
                                      "graduated",
                                      "volume"
                                    ],
                                    "description": "\"graduated\" prices each tier's units at its own rate and sums them; \"volume\" prices every unit at the tier the whole quantity lands in."
                                  },
                                  "monthly": {
                                    "type": "array",
                                    "items": {
                                      "type": "object",
                                      "description": "One tier: a per-unit amount, a flat amount or both.",
                                      "additionalProperties": false,
                                      "properties": {
                                        "upTo": {
                                          "description": "The last unit this tier covers, inclusive. Leave it out (or null) on the last tier, which is open-ended, and only there. Use null to clear it.",
                                          "anyOf": [
                                            {
                                              "type": "integer",
                                              "minimum": 1
                                            },
                                            {
                                              "type": "null"
                                            }
                                          ]
                                        },
                                        "unitAmount": {
                                          "type": "integer",
                                          "description": "Price of each unit in this tier. An integer in the currency's smallest unit (cents for USD and EUR, yen for JPY, which has none): 2900 is $29.00, 2900 in JPY is 2900 yen.",
                                          "minimum": 0,
                                          "maximum": 100000000000
                                        },
                                        "flatAmount": {
                                          "type": "integer",
                                          "description": "A fixed amount charged once any unit reaches this tier. An integer in the currency's smallest unit (cents for USD and EUR, yen for JPY, which has none): 2900 is $29.00, 2900 in JPY is 2900 yen.",
                                          "minimum": 0,
                                          "maximum": 100000000000
                                        }
                                      }
                                    },
                                    "maxItems": 250,
                                    "description": "Tiers for the monthly price, in order."
                                  },
                                  "yearly": {
                                    "type": "array",
                                    "items": {
                                      "type": "object",
                                      "description": "One tier: a per-unit amount, a flat amount or both.",
                                      "additionalProperties": false,
                                      "properties": {
                                        "upTo": {
                                          "description": "The last unit this tier covers, inclusive. Leave it out (or null) on the last tier, which is open-ended, and only there. Use null to clear it.",
                                          "anyOf": [
                                            {
                                              "type": "integer",
                                              "minimum": 1
                                            },
                                            {
                                              "type": "null"
                                            }
                                          ]
                                        },
                                        "unitAmount": {
                                          "type": "integer",
                                          "description": "Price of each unit in this tier. An integer in the currency's smallest unit (cents for USD and EUR, yen for JPY, which has none): 2900 is $29.00, 2900 in JPY is 2900 yen.",
                                          "minimum": 0,
                                          "maximum": 100000000000
                                        },
                                        "flatAmount": {
                                          "type": "integer",
                                          "description": "A fixed amount charged once any unit reaches this tier. An integer in the currency's smallest unit (cents for USD and EUR, yen for JPY, which has none): 2900 is $29.00, 2900 in JPY is 2900 yen.",
                                          "minimum": 0,
                                          "maximum": 100000000000
                                        }
                                      }
                                    },
                                    "maxItems": 250,
                                    "description": "Tiers for the yearly price, in order."
                                  },
                                  "quarterly": {
                                    "type": "array",
                                    "items": {
                                      "type": "object",
                                      "description": "One tier: a per-unit amount, a flat amount or both.",
                                      "additionalProperties": false,
                                      "properties": {
                                        "upTo": {
                                          "description": "The last unit this tier covers, inclusive. Leave it out (or null) on the last tier, which is open-ended, and only there. Use null to clear it.",
                                          "anyOf": [
                                            {
                                              "type": "integer",
                                              "minimum": 1
                                            },
                                            {
                                              "type": "null"
                                            }
                                          ]
                                        },
                                        "unitAmount": {
                                          "type": "integer",
                                          "description": "Price of each unit in this tier. An integer in the currency's smallest unit (cents for USD and EUR, yen for JPY, which has none): 2900 is $29.00, 2900 in JPY is 2900 yen.",
                                          "minimum": 0,
                                          "maximum": 100000000000
                                        },
                                        "flatAmount": {
                                          "type": "integer",
                                          "description": "A fixed amount charged once any unit reaches this tier. An integer in the currency's smallest unit (cents for USD and EUR, yen for JPY, which has none): 2900 is $29.00, 2900 in JPY is 2900 yen.",
                                          "minimum": 0,
                                          "maximum": 100000000000
                                        }
                                      }
                                    },
                                    "maxItems": 250,
                                    "description": "Tiers for the quarterly price, in order."
                                  }
                                },
                                "required": [
                                  "mode"
                                ]
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        }
                      }
                    }
                  }
                },
                "maxProperties": 21
              },
              "trial": {
                "description": "Free trial before the first charge. Use null to clear it.",
                "anyOf": [
                  {
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                      "days": {
                        "type": "integer",
                        "description": "Length of the free trial in days. Default 14.",
                        "minimum": 1,
                        "maximum": 365
                      },
                      "requireCard": {
                        "type": "boolean",
                        "description": "Ask for a payment method to start the trial. Default true."
                      }
                    }
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "credits": {
                "description": "Credits the plan grants its subscribers. Use null to clear it.",
                "anyOf": [
                  {
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                      "package": {
                        "type": "string",
                        "maxLength": 100,
                        "description": "Key of the billing.creditPackages entry whose credit amount is granted."
                      },
                      "mode": {
                        "enum": [
                          "topup",
                          "reset"
                        ],
                        "description": "\"topup\" adds to the balance; \"reset\" expires the plan's earlier credits and grants afresh. Default \"topup\"."
                      },
                      "renewOnPeriod": {
                        "type": "boolean",
                        "description": "Grant again at every monthly usage reset. false (default) grants once, for the life of the subscription."
                      }
                    },
                    "required": [
                      "package"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "required": [
              "name"
            ]
          },
          "examples": [
            {
              "pro": {
                "name": "Pro",
                "features": {
                  "sso": true
                },
                "limits": {
                  "projects": 50,
                  "members": -1
                },
                "quotas": {
                  "api-calls": {
                    "allowOverage": true,
                    "monthly": {
                      "included": 100000,
                      "unitSize": 1000
                    }
                  }
                },
                "pricing": {
                  "usd": {
                    "monthly": 4900,
                    "yearly": 49000,
                    "overage": {
                      "api-calls": {
                        "monthly": 50
                      }
                    }
                  }
                },
                "trial": {
                  "days": 14,
                  "requireCard": false
                }
              }
            }
          ]
        },
        "groups": {
          "type": "object",
          "description": "Pricing pages. A group lists plans in display order, and each published group version pins the exact plan versions it sells. When a plan in a group publishes a new version, the group gets a new version pinning it, and subscribers on the old group version move with it where their plan is still listed. A group sells to workspaces or to people (payerType), and each payer type has one default group, served when a pricing page names none.",
          "propertyNames": {
            "description": "Each key is the group slug a pricing page asks for (not \"default\", which is reserved).",
            "pattern": "^[a-z0-9][a-z0-9_-]{1,99}$",
            "maxLength": 200
          },
          "additionalProperties": {
            "type": "object",
            "description": "A pricing group.",
            "additionalProperties": false,
            "properties": {
              "name": {
                "type": "string",
                "maxLength": 100,
                "description": "Group name, shown in the console and returned to pricing pages. No leading or trailing spaces.",
                "minLength": 2,
                "pattern": "^\\S(?:[\\s\\S]*\\S)?$"
              },
              "description": {
                "type": "string",
                "maxLength": 500,
                "description": "What this pricing page is for, such as \"Self-serve plans\". Empty clears it.",
                "pattern": "^(?:|\\S(?:[\\s\\S]*\\S)?)$"
              },
              "default": {
                "type": "boolean",
                "description": "The pricing page served when none is named (GET /api/subscriptions/public/groups/default). One group per payer type is the default; setting it here unsets it on the other groups of the same payerType."
              },
              "payerType": {
                "enum": [
                  "workspace",
                  "user"
                ],
                "description": "Who the plans in this group are for: \"workspace\" (a workspace pays, the default) or \"user\" (a person pays). Locked once a version of the group is published."
              },
              "plans": {
                "type": "array",
                "items": {
                  "type": "string",
                  "maxLength": 100,
                  "description": "Key of a billing.plans entry."
                },
                "maxItems": 50,
                "description": "Plans on this page, in display order. Each is pinned at its current published version.",
                "minItems": 1,
                "uniqueItems": true
              },
              "requiredItems": {
                "type": "array",
                "items": {
                  "type": "string",
                  "maxLength": 100,
                  "description": "Key of a billing.items entry."
                },
                "maxItems": 200,
                "description": "Items recorded on the group version as required (stored as requiredItems and returned with the group). No server rule acts on it today.",
                "uniqueItems": true
              },
              "versionDescription": {
                "type": "string",
                "maxLength": 500,
                "description": "Note stored on each new group version, such as what changed. Empty clears it.",
                "pattern": "^(?:|\\S(?:[\\s\\S]*\\S)?)$"
              }
            },
            "required": [
              "name",
              "plans"
            ]
          },
          "examples": [
            {
              "main": {
                "name": "Main pricing",
                "default": true,
                "plans": [
                  "free",
                  "pro",
                  "team"
                ]
              }
            }
          ]
        },
        "onboarding": {
          "type": "object",
          "description": "Workspace onboarding.",
          "additionalProperties": false,
          "properties": {
            "mode": {
              "enum": [
                "none",
                "trial",
                "freemium"
              ],
              "description": "\"none\": new workspaces start with no plan. \"trial\": they start a trial of `plan`. \"freemium\": they start on `plan`, which must be a freemium plan. Default \"none\"."
            },
            "plan": {
              "description": "Key of the billing.plans entry new workspaces start on. Use null to clear it.",
              "anyOf": [
                {
                  "type": "string",
                  "maxLength": 100
                },
                {
                  "type": "null"
                }
              ]
            }
          }
        },
        "customerBilling": {
          "type": "object",
          "description": "Customer billing.",
          "additionalProperties": false,
          "properties": {
            "cancel": {
              "enum": [
                "period_end",
                "immediately"
              ],
              "description": "\"period_end\": a customer's cancel runs to the end of the period paid for (the default). \"immediately\": customers may also end it now."
            },
            "refundOnCancelNow": {
              "enum": [
                "none",
                "prorated_credit",
                "prorated_refund"
              ],
              "description": "What ending a subscription now gives back for the unused time: \"none\" (the default), \"prorated_credit\" (a credit on the customer's next invoice) or \"prorated_refund\" (a refund to the card)."
            },
            "intervalSwitch": {
              "type": "boolean",
              "description": "Whether customers may move their plan to another billing interval themselves. Default true."
            },
            "afterFailedPayments": {
              "type": "object",
              "description": "What Stripe ending a subscription after its failed payments leads to.",
              "additionalProperties": false,
              "properties": {
                "then": {
                  "enum": [
                    "free",
                    "lapse_policy"
                  ],
                  "description": "\"free\": once the lapse grace is out the workspace lands on Free (the default). \"lapse_policy\": the lapse policy the subscription was sold with stays in force (read-only stays read-only, suspended stays suspended)."
                },
                "freeAfterDays": {
                  "description": "With \"lapse_policy\": days after the subscription ended when the workspace lands on Free all the same. Null: never. Use null to clear it.",
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 365
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              }
            }
          }
        },
        "offers": {
          "type": "object",
          "description": "Add-ons sold beside a plan, in every shape: \"recurring\" (a second item on the subscription, or a seat class), \"one_time\" (paid once, ends after validityDays), \"lifetime\" and \"consumable\" (a quota pack that counts down). An add-on is saved, then published (its Stripe prices minted) unless policy.publish is \"never\". Once published, a change to what a buyer holds (items, validity, limits on how many, trial rule, seat counting, whether a lifetime licence includes future versions) is a new version of the add-on, published per policy.publish, and the version it replaces stays with its buyers; a price change alone is a new price generation that new buyers pay. Its shape and payer type never change once published. Its name, description, badge, order, plans and visibility are edited in place. Money is always an integer in the currency's smallest unit. The organization's plan must include billing add-ons (402 otherwise), and publishing needs Stripe connected.",
          "propertyNames": {
            "description": "Each key is the add-on slug the SDK buys it by (lowercase letters, digits and -; cannot change after creation).",
            "pattern": "^[a-z0-9][a-z0-9-]{1,99}$",
            "maxLength": 200
          },
          "additionalProperties": {
            "type": "object",
            "description": "An add-on.",
            "additionalProperties": false,
            "properties": {
              "name": {
                "type": "string",
                "maxLength": 100,
                "description": "Name shown at checkout and on the pricing page. No leading or trailing spaces.",
                "minLength": 2,
                "pattern": "^\\S(?:[\\s\\S]*\\S)?$"
              },
              "description": {
                "type": "string",
                "maxLength": 500,
                "description": "What the buyer gets. Empty clears it.",
                "pattern": "^(?:|\\S(?:[\\s\\S]*\\S)?)$"
              },
              "shape": {
                "enum": [
                  "recurring",
                  "one_time",
                  "lifetime",
                  "consumable"
                ],
                "description": "\"recurring\" bills with the subscription on its interval; \"one_time\" is paid once and ends after validityDays; \"lifetime\" is paid once and kept; \"consumable\" is a pack of quota units that counts down. Fixed once published."
              },
              "payerType": {
                "enum": [
                  "workspace",
                  "user"
                ],
                "description": "Who buys it: \"workspace\" (the default) or \"user\" (a person). A person's add-on grants user-scope items (billing.items with \"scope\": \"user\"), and a workspace's add-on workspace-scope items. Fixed once published."
              },
              "items": {
                "type": "object",
                "description": "Items (keys of billing.items) one unit grants. Exactly these: an item left out is no longer granted by the next version. A consumable carries quota items only; a quota is granted by a recurring or consumable add-on only. At least one, except on a seat class.",
                "propertyNames": {
                  "maxLength": 200,
                  "pattern": "^[a-z0-9][a-z0-9_-]{1,99}$"
                },
                "additionalProperties": {
                  "type": "object",
                  "description": "What one unit of the add-on grants of this item.",
                  "additionalProperties": false,
                  "properties": {
                    "quantity": {
                      "type": "integer",
                      "description": "How much one unit grants: a count for a limit or a quota, 1 for a feature. -1 is unlimited.",
                      "minimum": -1,
                      "maximum": 1000000000000
                    },
                    "mode": {
                      "enum": [
                        "add",
                        "floor"
                      ],
                      "description": "\"add\" (the default) adds to what the plan gives; \"floor\" raises it to at least this. Not for quotas."
                    }
                  },
                  "required": [
                    "quantity"
                  ]
                }
              },
              "prices": {
                "type": "object",
                "description": "Price per currency (lowercase ISO 4217 code). Exactly these currencies: a currency left out is no longer sold. To publish, every currency in app.currencies needs one.",
                "propertyNames": {
                  "enum": [
                    "usd",
                    "eur",
                    "gbp",
                    "cad",
                    "aud",
                    "jpy",
                    "inr",
                    "chf",
                    "sek",
                    "nok",
                    "dkk",
                    "sgd",
                    "hkd",
                    "nzd",
                    "mxn",
                    "brl",
                    "pln",
                    "czk",
                    "thb",
                    "try",
                    "zar"
                  ]
                },
                "additionalProperties": {
                  "type": "object",
                  "description": "The price in one currency, per unit: a recurring add-on is priced per interval it is sold on (every interval a plan of its payer type is sold on, to publish); any other shape is priced once (oneTime). Stated whole: an interval left out is no longer sold.",
                  "additionalProperties": false,
                  "properties": {
                    "monthly": {
                      "type": "integer",
                      "description": "Price per month, for a recurring add-on. An integer in the currency's smallest unit (cents for USD and EUR, yen for JPY, which has none): 2900 is $29.00, 2900 in JPY is 2900 yen.",
                      "minimum": 0,
                      "maximum": 100000000000
                    },
                    "quarterly": {
                      "type": "integer",
                      "description": "Price per quarter (3 months), for a recurring add-on. An integer in the currency's smallest unit (cents for USD and EUR, yen for JPY, which has none): 2900 is $29.00, 2900 in JPY is 2900 yen.",
                      "minimum": 0,
                      "maximum": 100000000000
                    },
                    "yearly": {
                      "type": "integer",
                      "description": "Price per year, for a recurring add-on. An integer in the currency's smallest unit (cents for USD and EUR, yen for JPY, which has none): 2900 is $29.00, 2900 in JPY is 2900 yen.",
                      "minimum": 0,
                      "maximum": 100000000000
                    },
                    "oneTime": {
                      "type": "integer",
                      "description": "Price paid once, for a one_time, lifetime or consumable add-on. An integer in the currency's smallest unit (cents for USD and EUR, yen for JPY, which has none): 2900 is $29.00, 2900 in JPY is 2900 yen.",
                      "minimum": 0,
                      "maximum": 100000000000
                    }
                  }
                },
                "maxProperties": 21
              },
              "validityDays": {
                "description": "Days a one_time add-on lasts after purchase. Required on one_time, refused on the other shapes. Use null to clear it.",
                "anyOf": [
                  {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 36500
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "consumeOrder": {
                "description": "A consumable only: spend these units before the plan's allowance, or after it (the default). Use null to clear it.",
                "anyOf": [
                  {
                    "enum": [
                      "before_plan",
                      "after_plan"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "rolloverCapUnits": {
                "description": "A consumable only: at each usage reset, units above this many expire. Left out, nothing expires. Use null to clear it.",
                "anyOf": [
                  {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 1000000000000
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "maxPerSubject": {
                "description": "How many unexpired purchases one buyer may hold. A lifetime add-on defaults to 1. Use null to clear it.",
                "anyOf": [
                  {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 1000000
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "maxQuantity": {
                "description": "Most units one purchase may buy. Use null to clear it.",
                "anyOf": [
                  {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 1000000
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "duringTrial": {
                "description": "A recurring add-on only: what buying it during a trial does. \"join_trial\" adds it to the trial, \"refuse\" refuses, \"convert_first\" ends the trial first. Left out or null, the organization's add-on setting decides. Use null to clear it.",
                "anyOf": [
                  {
                    "enum": [
                      "join_trial",
                      "refuse",
                      "convert_first"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "seatClass": {
                "description": "A seat class: a recurring workspace add-on whose quantity follows the members this rule counts, as the plan's own seats do. It may grant no item. An add-on is a seat class or not for good once published. Use null to clear it.",
                "anyOf": [
                  {
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                      "includeRoles": {
                        "type": "array",
                        "items": {
                          "type": "string",
                          "maxLength": 100,
                          "description": "A workspace role name."
                        },
                        "maxItems": 50,
                        "description": "Count only members with one of these roles. Left out, every role counts.",
                        "uniqueItems": true
                      },
                      "excludeRoles": {
                        "type": "array",
                        "items": {
                          "type": "string",
                          "maxLength": 100,
                          "description": "A workspace role name."
                        },
                        "maxItems": 50,
                        "description": "Never count members with one of these roles.",
                        "uniqueItems": true
                      },
                      "excludeBlocked": {
                        "type": "boolean",
                        "description": "Leave blocked members out of the count."
                      },
                      "includePendingInvitations": {
                        "type": "boolean",
                        "description": "Count invitations not accepted yet. Default true."
                      }
                    }
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "includesFutureVersions": {
                "type": "boolean",
                "description": "A lifetime add-on only: each licence includes every later version of the add-on. Publishing a new version gives it to those licences through a move an admin confirms in the console, and apply reports that move. What a buyer holds: on a published add-on a change is a new version, and the licences already sold keep what they bought. Default false."
              },
              "appliesToPlans": {
                "type": "array",
                "items": {
                  "type": "string",
                  "maxLength": 100,
                  "description": "Key of a billing.plans entry of the same payer type."
                },
                "maxItems": 100,
                "description": "Plans a buyer must be on to buy it. Empty or left out: every plan of its payer type.",
                "uniqueItems": true
              },
              "sortOrder": {
                "type": "integer",
                "description": "Position in add-on lists, ascending.",
                "minimum": -100000,
                "maximum": 100000
              },
              "badge": {
                "type": "string",
                "maxLength": 40,
                "description": "A short label shown on the add-on, such as \"Popular\". Empty clears it.",
                "pattern": "^(?:|\\S(?:[\\s\\S]*\\S)?)$"
              },
              "internalOnly": {
                "type": "boolean",
                "description": "Hidden from the public add-on list: sold or granted by your own backend only."
              },
              "versionMoves": {
                "type": "object",
                "description": "Version moves: what publishing a new version of the add-on does to the holders of the version it takes off sale. Only a recurring add-on (and a seat class) has holders a move can reach: what was bought outright (one_time, lifetime, consumable) never moves. A publish made by apply never moves anyone by itself: the move waits as \"awaiting confirmation\" until an admin confirms its preview in the console, and the plan says how many holders it would reach.",
                "additionalProperties": false,
                "properties": {
                  "mode": {
                    "enum": [
                      "off",
                      "gains",
                      "all"
                    ],
                    "description": "\"off\" (the default) leaves holders on the version they have. \"gains\" moves them to the new version only where it takes nothing away from them. \"all\" moves gains at once and losses at each holder's renewal, after noticeDays of notice."
                  },
                  "noticeDays": {
                    "type": "integer",
                    "description": "Days of notice before a loss reaches a holder, 7 to 365, and never less than the time to their renewal. Default 30. Left out, the stored value stays.",
                    "minimum": 7,
                    "maximum": 365
                  }
                },
                "required": [
                  "mode"
                ]
              }
            },
            "required": [
              "name",
              "shape",
              "prices"
            ]
          },
          "examples": [
            {
              "extra-projects": {
                "name": "Extra projects",
                "shape": "recurring",
                "items": {
                  "projects": {
                    "quantity": 10
                  }
                },
                "prices": {
                  "usd": {
                    "monthly": 900,
                    "yearly": 9000
                  }
                },
                "versionMoves": {
                  "mode": "gains"
                }
              }
            }
          ]
        },
        "coupons": {
          "type": "object",
          "description": "Discounts in the organization's Stripe account, and the promotion codes buyers type to get them. Create-only: a coupon's terms (what it takes off, for how long, how often) never change once it exists. An entry is matched by its name: a coupon of the same name and terms is bound to it, not created again, and one of the same name with other terms is refused before anything is written. Promotion codes are created and switched on and off (active); a code's restrictions never change either. Codes the file leaves out are left as they are. Needs Stripe connected (billing.stripe).",
          "propertyNames": {
            "description": "Each key is a name for the entry in this file (letters, digits, - and _); the coupon itself is found by its name.",
            "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,99}$",
            "maxLength": 200
          },
          "additionalProperties": {
            "type": "object",
            "description": "A coupon.",
            "additionalProperties": false,
            "properties": {
              "name": {
                "type": "string",
                "maxLength": 40,
                "description": "The coupon name buyers see on checkout and invoices, and what this entry finds it by. Up to 40 characters.",
                "minLength": 1
              },
              "percentOff": {
                "type": "number",
                "description": "Percent taken off, above 0 and at most 100. Give this or amountOff.",
                "minimum": 0.01,
                "maximum": 100
              },
              "amountOff": {
                "type": "integer",
                "description": "Amount taken off. Give this or percentOff. An integer in the currency's smallest unit (cents for USD and EUR, yen for JPY, which has none): 2900 is $29.00, 2900 in JPY is 2900 yen.",
                "minimum": 0,
                "maximum": 100000000000
              },
              "currency": {
                "enum": [
                  "usd",
                  "eur",
                  "gbp",
                  "cad",
                  "aud",
                  "jpy",
                  "inr",
                  "chf",
                  "sek",
                  "nok",
                  "dkk",
                  "sgd",
                  "hkd",
                  "nzd",
                  "mxn",
                  "brl",
                  "pln",
                  "czk",
                  "thb",
                  "try",
                  "zar"
                ],
                "description": "The currency of amountOff (lowercase ISO 4217 code). Only with amountOff."
              },
              "duration": {
                "enum": [
                  "once",
                  "repeating",
                  "forever"
                ],
                "description": "\"once\" takes it off the first invoice; \"repeating\" for durationInMonths months; \"forever\" on every invoice."
              },
              "durationInMonths": {
                "type": "integer",
                "description": "Months a \"repeating\" coupon applies. Only with \"repeating\".",
                "minimum": 1,
                "maximum": 120
              },
              "appliesToProducts": {
                "type": "array",
                "items": {
                  "type": "string",
                  "maxLength": 255,
                  "description": "A Stripe product id (prod_...).",
                  "pattern": "^prod_[A-Za-z0-9]+$"
                },
                "maxItems": 50,
                "description": "Stripe products it is limited to. Left out, it applies to everything. Product ids belong to one Stripe account and mode: write \"${env:NAME}\" to vary them.",
                "uniqueItems": true
              },
              "maxRedemptions": {
                "type": "integer",
                "description": "How many times it may be redeemed in all.",
                "minimum": 1,
                "maximum": 1000000000
              },
              "redeemBy": {
                "type": "string",
                "maxLength": 40,
                "description": "The last moment it may be redeemed, as a date and time (2026-12-31T23:59:59Z). Must be in the future when the coupon is created.",
                "format": "date-time"
              },
              "promotionCodes": {
                "type": "object",
                "description": "Promotion codes on this coupon, by the code a buyer types (letters, digits, - and _, up to 64). Codes left out are left as they are.",
                "propertyNames": {
                  "maxLength": 200,
                  "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$"
                },
                "additionalProperties": {
                  "type": "object",
                  "description": "One promotion code. Its restrictions are set when it is created and never change; only active does.",
                  "additionalProperties": false,
                  "properties": {
                    "active": {
                      "type": "boolean",
                      "description": "Buyers can use it. false switches it off; true switches it back on. Default true."
                    },
                    "maxRedemptions": {
                      "type": "integer",
                      "description": "How many times this code may be used.",
                      "minimum": 1,
                      "maximum": 1000000000
                    },
                    "expiresAt": {
                      "type": "string",
                      "maxLength": 40,
                      "description": "When the code stops working, as a date and time. Must be in the future when the code is created.",
                      "format": "date-time"
                    },
                    "firstTimeTransaction": {
                      "type": "boolean",
                      "description": "Only for a buyer's first purchase."
                    },
                    "minimumAmount": {
                      "type": "integer",
                      "description": "The smallest order the code applies to, with minimumAmountCurrency. An integer in the currency's smallest unit (cents for USD and EUR, yen for JPY, which has none): 2900 is $29.00, 2900 in JPY is 2900 yen.",
                      "minimum": 0,
                      "maximum": 100000000000
                    },
                    "minimumAmountCurrency": {
                      "enum": [
                        "usd",
                        "eur",
                        "gbp",
                        "cad",
                        "aud",
                        "jpy",
                        "inr",
                        "chf",
                        "sek",
                        "nok",
                        "dkk",
                        "sgd",
                        "hkd",
                        "nzd",
                        "mxn",
                        "brl",
                        "pln",
                        "czk",
                        "thb",
                        "try",
                        "zar"
                      ],
                      "description": "The currency of minimumAmount."
                    }
                  }
                }
              }
            },
            "required": [
              "name",
              "duration"
            ]
          },
          "examples": [
            {
              "launch": {
                "name": "Launch 20%",
                "percentOff": 20,
                "duration": "repeating",
                "durationInMonths": 3,
                "promotionCodes": {
                  "LAUNCH20": {
                    "maxRedemptions": 500
                  }
                }
              }
            }
          ]
        }
      }
    },
    "rbac": {
      "type": "object",
      "description": "Console roles for team members and API keys.",
      "additionalProperties": false,
      "properties": {
        "roles": {
          "type": "object",
          "description": "Custom roles. \"user\" roles are given to team members in the console; \"api\" roles are given to API keys. The built-in owner, admin and user roles cannot be changed. A role can only grant what the key applying the blueprint itself holds.",
          "propertyNames": {
            "description": "Each key is the role name (lowercase).",
            "pattern": "^[a-z][a-z0-9_-]{1,49}$",
            "maxLength": 200
          },
          "additionalProperties": {
            "type": "object",
            "description": "A role.",
            "additionalProperties": false,
            "properties": {
              "kind": {
                "enum": [
                  "user",
                  "api"
                ],
                "description": "Who the role is for: team members (\"user\", the default) or API keys (\"api\"). Fixed once created."
              },
              "permissions": {
                "type": "object",
                "description": "Console resource to allowed actions, e.g. { \"subscription_plans\": [\"read\", \"update\"] }. Resources left out are not granted.",
                "propertyNames": {
                  "enum": [
                    "access_controls",
                    "assets",
                    "audience",
                    "audience_activities",
                    "audience_attributes",
                    "audience_lists",
                    "audience_lists_history",
                    "audience_tags",
                    "auths_audit_log",
                    "auths_config",
                    "auths_domains",
                    "auths_enterprise_config",
                    "auths_enterprises",
                    "auths_methods",
                    "auths_settings",
                    "auths_sms_providers",
                    "blogs",
                    "blogs_authors",
                    "blogs_folders",
                    "blogs_tags",
                    "collections",
                    "collections_records",
                    "collections_versions",
                    "credit_balances",
                    "credit_buckets",
                    "credit_packages",
                    "credit_transactions",
                    "deployment_history",
                    "deployment_hooks",
                    "docs",
                    "docs_authors",
                    "docs_folders",
                    "docs_tags",
                    "emails_api_sends",
                    "emails_campaigns",
                    "emails_domains",
                    "emails_domains_credentials",
                    "emails_drafts",
                    "emails_history",
                    "emails_senders",
                    "emails_senders_accounts",
                    "emails_templates",
                    "emails_tracking",
                    "emails_unsubscribe_groups",
                    "entitlement_claims",
                    "entitlement_grants",
                    "faqs",
                    "faqs_collections",
                    "forms",
                    "grant_offers",
                    "links",
                    "links_analytics",
                    "monday_actions_logs",
                    "monday_credentials",
                    "monday_events",
                    "notification_events",
                    "org_settings",
                    "organizations_stripe_credentials",
                    "organizations_tokens",
                    "push_campaigns",
                    "push_credentials",
                    "rich_contents",
                    "stripe_coupons",
                    "stripe_subscription_actions",
                    "stripe_subscription_logs",
                    "stripe_subscriptions",
                    "stripe_webhooks",
                    "subscription_item_categories",
                    "subscription_items",
                    "subscription_plan_group_versions",
                    "subscription_plan_groups",
                    "subscription_plan_versions",
                    "subscription_plans",
                    "testimonials",
                    "tracking_scripts",
                    "user_preferences",
                    "users",
                    "users_attributes",
                    "users_beta",
                    "users_beta_config",
                    "users_features",
                    "users_lists",
                    "users_lists_history",
                    "users_tags",
                    "web_domains",
                    "web_sessions",
                    "webhook_endpoints",
                    "workflows",
                    "workflows_actions",
                    "workflows_instances",
                    "workflows_logs",
                    "workflows_metrics",
                    "workflows_templates",
                    "workflows_trigger_events",
                    "workflows_versions",
                    "workspaces",
                    "workspaces_features",
                    "workspaces_settings"
                  ]
                },
                "additionalProperties": {
                  "type": "array",
                  "items": {
                    "enum": [
                      "create",
                      "read",
                      "update",
                      "delete"
                    ],
                    "description": "An action."
                  },
                  "maxItems": 4,
                  "description": "Actions allowed on this resource.",
                  "uniqueItems": true
                }
              }
            },
            "required": [
              "permissions"
            ]
          },
          "examples": [
            {
              "support": {
                "kind": "user",
                "permissions": {
                  "users": [
                    "read",
                    "update"
                  ],
                  "emails_templates": [
                    "read"
                  ]
                }
              }
            }
          ]
        },
        "apiKeys": {
          "type": "object",
          "description": "Org API keys (orgId:secret) for your servers, CI and agents. The secret appears once, in the result of the apply that creates the key. A key's role is fixed at creation: to change it, add a new key and deactivate the old one.",
          "propertyNames": {
            "description": "Each key is a name you choose for the key.",
            "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,99}$",
            "maxLength": 200
          },
          "additionalProperties": {
            "type": "object",
            "description": "An API key.",
            "additionalProperties": false,
            "properties": {
              "name": {
                "type": "string",
                "maxLength": 100,
                "description": "Name shown in the console.",
                "minLength": 2
              },
              "description": {
                "type": "string",
                "maxLength": 500,
                "description": "What the key is for.",
                "minLength": 2
              },
              "role": {
                "type": "string",
                "maxLength": 50,
                "description": "An \"api\" role from rbac.roles, or a built-in role (admin, content-reader). Default: the role of whoever applies."
              },
              "expiresAt": {
                "type": "string",
                "maxLength": 40,
                "description": "Expiry as an ISO date-time. Fixed at creation.",
                "format": "date-time"
              },
              "active": {
                "type": "boolean",
                "description": "Accepted by the API. false switches the key off without deleting it."
              }
            },
            "required": [
              "name"
            ]
          },
          "examples": [
            {
              "backend": {
                "name": "Backend server",
                "role": "admin"
              }
            }
          ]
        }
      }
    },
    "webhooks": {
      "type": "object",
      "description": "Outbound webhook endpoints. Each receives a signed HTTPS POST for every event it subscribes to. The signing secret is generated by BuildBase and returned once, in the apply result of the run that creates the endpoint.",
      "propertyNames": {
        "description": "Each key is a name you choose for the endpoint (it only lives in this file).",
        "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,99}$",
        "maxLength": 200
      },
      "additionalProperties": {
        "type": "object",
        "description": "A webhook endpoint.",
        "additionalProperties": false,
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 100,
            "description": "Name shown in the console.",
            "minLength": 2
          },
          "description": {
            "type": "string",
            "maxLength": 500,
            "description": "What the endpoint is for."
          },
          "url": {
            "type": "string",
            "format": "uri",
            "maxLength": 2000,
            "description": "HTTPS URL that receives the events. Private and internal addresses are refused.",
            "pattern": "^https://"
          },
          "events": {
            "type": "array",
            "items": {
              "enum": [
                "user.registered",
                "user.logged_in",
                "user.new_device_login",
                "user.email_verified",
                "user.password_changed",
                "user.password_reset_requested",
                "user.profile_updated",
                "user.tag_added",
                "user.tag_removed",
                "user.blocked",
                "user.unblocked",
                "user.mfa_enrolled",
                "user.mfa_disabled",
                "user.mfa_reset_by_admin",
                "user.email_changed",
                "user.imported",
                "user.account_linked",
                "user.account_unlinked",
                "user.phone_added",
                "user.phone_verified",
                "user.phone_removed",
                "user.deletion_scheduled",
                "user.deletion_cancelled",
                "user.deleted",
                "auth.login_failed",
                "auth.signup_challenged",
                "auth.sms_budget_exceeded",
                "organization.member_invited",
                "organization.member_accepted",
                "organization.member_role_changed",
                "organization.member_removed",
                "organization.public_write_limit_reached",
                "organization.end_user_ceiling_reached",
                "entitlement.ceiling_reached",
                "workspace.created",
                "workspace.updated",
                "workspace.deleted",
                "workspace.settings_updated",
                "workspace.features_updated",
                "workspace.member_added",
                "workspace.member_removed",
                "workspace.member_role_changed",
                "workspace.member_invited",
                "workspace.invitation_accepted",
                "workspace.invitation_declined",
                "workspace.invitation_revoked",
                "workspace.invitation_expired",
                "subscription.created",
                "subscription.updated",
                "subscription.upgraded",
                "subscription.canceled",
                "subscription.cancel_scheduled",
                "subscription.resumed",
                "subscription.suspended",
                "subscription.trial_started",
                "subscription.trial_will_end",
                "subscription.trial_extended",
                "subscription.trial_expired",
                "subscription.paused",
                "subscription.unpaused",
                "subscription.retention_accepted",
                "subscription.stripe_out_of_sync",
                "payment.succeeded",
                "payment.failed",
                "payment.action_required",
                "payment.refunded",
                "payment.card_expiring",
                "payment.stripe_events_failed",
                "quota.limit_exceeded",
                "quota.threshold_reached",
                "credit.purchased",
                "credit.consumed",
                "credit.expired",
                "credit.granted",
                "credit.revoked",
                "credit.low_balance",
                "credit.reserved",
                "credit.settled",
                "credit.released",
                "credit.threshold_crossed",
                "credit.top_up_failed",
                "credit.plan_grant_failed",
                "addon.purchased",
                "addon.expired",
                "addon.revoked",
                "addon.changed",
                "payer.subject_added",
                "payer.subject_removed",
                "workflow.created",
                "workflow.deleted",
                "workflow.published",
                "workflow.paused",
                "workflow.resumed",
                "workflow.instance_completed",
                "workflow.instance_failed",
                "audience.member_created",
                "audience.member_updated",
                "audience.added_to_list",
                "audience.removed_from_list",
                "audience.attribute_changed",
                "audience.tag_added",
                "audience.tag_removed",
                "audience.unsubscribed",
                "audience.resubscribed",
                "audience.email_invalidated",
                "audience.blocked",
                "audience.unblocked",
                "audience.import_completed",
                "audience.list_created",
                "audience.list_updated",
                "audience.list_deleted",
                "email.domain_added",
                "email.domain_verified",
                "email.sent",
                "email.opened",
                "email.clicked",
                "email.bounced",
                "email.complained",
                "email.unsubscribed",
                "email.campaign_sent",
                "push.campaign_sent",
                "auth.method_deleted",
                "auth.domain_added",
                "auth.domain_verified",
                "auth.domain_deleted",
                "auth.client_self_registered",
                "enterprise.created",
                "enterprise.deleted",
                "enterprise.domain_verified",
                "enterprise.user_provisioned",
                "enterprise.user_deprovisioned",
                "enterprise.directory_synced",
                "enterprise.certificate_expiring",
                "enterprise.certificate_renewed",
                "enterprise.policy_updated",
                "enterprise.break_glass_used",
                "enterprise.sessions_revoked",
                "enterprise.connection_activated",
                "enterprise.connection_deactivated",
                "enterprise.connection_deleted",
                "enterprise.log_stream_failing",
                "enterprise.log_stream_recovered",
                "enterprise.admin_added",
                "enterprise.admin_removed",
                "enterprise.key_created",
                "enterprise.key_revoked",
                "enterprise.group_created",
                "enterprise.group_updated",
                "enterprise.group_deleted",
                "enterprise.group_members_changed",
                "enterprise.role_created",
                "enterprise.role_updated",
                "enterprise.role_deleted",
                "enterprise.person_joined",
                "enterprise.join_requested",
                "enterprise.join_request_declined",
                "enterprise.domain_removed",
                "enterprise.app_team_session",
                "enterprise.workos_roles_attention",
                "enterprise.workos_roles_recovered",
                "enterprise.agent_issuer_updated",
                "enterprise.agent_access",
                "enterprise.sso_routing_updated",
                "enterprise.workload_credential_updated",
                "enterprise.workload_access",
                "enterprise.workspace_policy_updated",
                "oauth.consent_granted",
                "oauth.consent_revoked",
                "subscription.downgraded",
                "subscription.discount_applied",
                "subscription.discount_removed",
                "subscription.version_move_scheduled",
                "subscription.version_moved",
                "subscription.version_move_withdrawn",
                "token.created",
                "token.updated",
                "token.revoked",
                "group_version.published",
                "version_move.completed",
                "version_move.cancelled",
                "form.submitted",
                "blog.published",
                "blog.updated",
                "blog.unpublished",
                "blog.deleted",
                "doc.published",
                "doc.updated",
                "doc.unpublished",
                "doc.deleted",
                "faq.updated",
                "faq_collection.updated",
                "testimonial.updated",
                "testimonial.deleted",
                "rich_content.updated",
                "rich_content.deleted",
                "collection.version_published",
                "collection.record_created",
                "collection.record_updated",
                "collection.record_deleted",
                "*"
              ],
              "description": "An event name, or \"*\" for every event."
            },
            "maxItems": 500,
            "description": "Events to send. The webhook event catalog lists them (user.registered, subscription.created, ...).",
            "minItems": 1,
            "uniqueItems": true
          },
          "enabled": {
            "type": "boolean",
            "description": "Deliver events to this endpoint. Default true."
          }
        },
        "required": [
          "name",
          "url",
          "events"
        ]
      },
      "examples": [
        {
          "crm": {
            "name": "CRM sync",
            "url": "https://hooks.example.com/buildbase",
            "events": [
              "user.registered",
              "subscription.created"
            ]
          }
        }
      ]
    },
    "integrations": {
      "type": "object",
      "description": "Outside services the console connects to: Slack admin alerts, tracking scripts, web push keys, deploy hooks and the monday.com app.",
      "additionalProperties": false,
      "properties": {
        "slack": {
          "type": "object",
          "description": "Slack alerts.",
          "additionalProperties": false,
          "properties": {
            "webhookUrl": {
              "type": "string",
              "maxLength": 10000,
              "description": "Slack incoming-webhook URL (https://hooks.slack.com/services/...). Write-only: put \"${env:NAME}\" here and supply the value when you apply. It is never shown again."
            },
            "events": {
              "type": "array",
              "items": {
                "enum": [
                  "user.registered",
                  "user.blocked",
                  "user.unblocked",
                  "workspace.created",
                  "workspace.deleted",
                  "subscription.created",
                  "subscription.upgraded",
                  "subscription.canceled",
                  "subscription.cancel_scheduled",
                  "subscription.resumed",
                  "subscription.suspended",
                  "subscription.trial_started",
                  "subscription.trial_will_end",
                  "subscription.trial_extended",
                  "subscription.trial_expired",
                  "subscription.stripe_out_of_sync",
                  "payment.succeeded",
                  "payment.failed",
                  "payment.action_required",
                  "payment.refunded",
                  "payment.card_expiring",
                  "payment.stripe_events_failed",
                  "credit.purchased",
                  "credit.expired",
                  "credit.granted",
                  "credit.revoked",
                  "credit.low_balance",
                  "credit.top_up_failed",
                  "credit.plan_grant_failed",
                  "quota.limit_exceeded",
                  "addon.purchased",
                  "addon.expired",
                  "addon.revoked",
                  "addon.changed",
                  "payer.subject_added",
                  "payer.subject_removed",
                  "organization.member_invited",
                  "organization.member_accepted",
                  "organization.member_role_changed",
                  "organization.member_removed",
                  "workflow.created",
                  "workflow.deleted",
                  "workflow.published",
                  "workflow.paused",
                  "workflow.resumed",
                  "workflow.instance_completed",
                  "workflow.instance_failed",
                  "email.campaign_sent",
                  "push.campaign_sent",
                  "audience.blocked",
                  "audience.unblocked",
                  "audience.import_completed",
                  "audience.list_created",
                  "audience.list_updated",
                  "audience.list_deleted",
                  "email.domain_added",
                  "email.domain_verified",
                  "auth.method_deleted",
                  "auth.domain_added",
                  "auth.domain_verified",
                  "auth.domain_deleted",
                  "auth.client_self_registered",
                  "subscription.downgraded",
                  "token.created",
                  "token.updated",
                  "token.revoked",
                  "group_version.published",
                  "version_move.completed",
                  "version_move.cancelled"
                ],
                "description": "An event."
              },
              "maxItems": 500,
              "description": "Events to post. An empty list posts nothing.",
              "uniqueItems": true
            }
          }
        },
        "tracking": {
          "type": "object",
          "description": "Analytics and ad tags for the hosted sign-in page, gated on visitor consent. Known providers: gtm, ga4, google_ads, meta_pixel, x_pixel, linkedin, tiktok, reddit, bing_uet, clarity, hotjar, posthog, plausible, ahrefs; anything else is \"external\" with its script URL.",
          "propertyNames": {
            "description": "Each key is a name you choose for the script (auth clients refer to it by this key).",
            "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,99}$",
            "maxLength": 200
          },
          "additionalProperties": {
            "type": "object",
            "description": "A tracking script.",
            "additionalProperties": false,
            "properties": {
              "name": {
                "type": "string",
                "maxLength": 120,
                "description": "Name shown in the console.",
                "minLength": 1
              },
              "provider": {
                "enum": [
                  "gtm",
                  "ga4",
                  "google_ads",
                  "meta_pixel",
                  "x_pixel",
                  "linkedin",
                  "tiktok",
                  "reddit",
                  "bing_uet",
                  "clarity",
                  "hotjar",
                  "posthog",
                  "plausible",
                  "ahrefs",
                  "external"
                ],
                "description": "Which tag this is. \"external\" loads any https script by URL."
              },
              "providerId": {
                "type": "string",
                "maxLength": 200,
                "description": "The provider's id for your property, e.g. GTM-ABC1234 (gtm), G-ABCD123456 (ga4), AW-123456789 (google_ads). Not used by \"external\"."
              },
              "host": {
                "type": "string",
                "maxLength": 200,
                "description": "Self-hosted analytics host, for providers that allow one (posthog, plausible)."
              },
              "src": {
                "type": "string",
                "maxLength": 300,
                "description": "Script URL of an \"external\" script: https, no query string."
              },
              "dataAttributes": {
                "type": "object",
                "description": "data-* attributes on an \"external\" script tag.",
                "propertyNames": {
                  "maxLength": 200
                },
                "additionalProperties": {
                  "type": "string",
                  "maxLength": 200,
                  "description": "Attribute value."
                }
              },
              "consentCategory": {
                "enum": [
                  "analytics",
                  "marketing"
                ],
                "description": "Which consent the visitor must give before it loads. Defaults to the provider's usual category."
              },
              "conversionIds": {
                "type": "object",
                "description": "Event name to the provider conversion id, for ad providers that need one per event.",
                "propertyNames": {
                  "maxLength": 200
                },
                "additionalProperties": {
                  "type": "string",
                  "maxLength": 200,
                  "description": "Provider conversion id or label."
                }
              },
              "vendorName": {
                "type": "string",
                "maxLength": 120,
                "description": "Vendor named in the consent banner (\"external\")."
              },
              "privacyUrl": {
                "type": "string",
                "maxLength": 300,
                "description": "Vendor privacy policy linked from the consent banner (\"external\")."
              },
              "enabled": {
                "type": "boolean",
                "description": "Load it. Default true."
              },
              "serverSide": {
                "type": "object",
                "description": "Server-side conversions (meta and ga4 only).",
                "additionalProperties": false,
                "properties": {
                  "enabled": {
                    "type": "boolean",
                    "description": "Also send conversions from the server (Meta Conversions API, GA4 Measurement Protocol)."
                  },
                  "secret": {
                    "type": "string",
                    "maxLength": 10000,
                    "description": "Meta Conversions API access token or GA4 Measurement Protocol API secret. Write-only: put \"${env:NAME}\" here and supply the value when you apply. It is never shown again."
                  },
                  "testEventCode": {
                    "type": "string",
                    "maxLength": 64,
                    "description": "Meta test event code, while you check events arrive."
                  },
                  "sendRenewals": {
                    "type": "boolean",
                    "description": "Send subscription renewals as conversions too."
                  },
                  "whenConsentUnknown": {
                    "enum": [
                      "skip",
                      "send"
                    ],
                    "description": "What to do when the visitor never answered the consent banner."
                  }
                }
              }
            },
            "required": [
              "name",
              "provider"
            ]
          },
          "examples": [
            {
              "analytics": {
                "name": "Google Analytics",
                "provider": "ga4",
                "providerId": "G-ABCD123456"
              }
            }
          ]
        },
        "push": {
          "type": "object",
          "description": "Web push.",
          "additionalProperties": false,
          "properties": {
            "enabled": {
              "const": true,
              "description": "Generate the VAPID keys if the organization has none. Always true: keys, once made, stay."
            },
            "subject": {
              "type": "string",
              "maxLength": 512,
              "description": "Contact push services may use about your sends: mailto:you@example.com or an https URL. Fixed when the keys are made. Default: the platform contact.",
              "pattern": "^(mailto:[^\\s@]+@[^\\s@]+|https://\\S+)$"
            }
          },
          "required": [
            "enabled"
          ]
        },
        "deployHooks": {
          "type": "object",
          "description": "Build hooks of your hosting provider (Vercel, Netlify, Render, Cloudflare Pages) that BuildBase calls when content is published, so your site rebuilds. A hook URL lets anyone who holds it start a build: write it as \"${env:NAME}\" to keep it out of the file. Only the secret can be edited in place; a changed title, description or URL replaces the hook.",
          "propertyNames": {
            "description": "Each key is a name you choose for the hook (it only lives in this file).",
            "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,99}$",
            "maxLength": 200
          },
          "additionalProperties": {
            "type": "object",
            "description": "A deploy hook.",
            "additionalProperties": false,
            "properties": {
              "title": {
                "type": "string",
                "maxLength": 200,
                "description": "Name shown in the console.",
                "minLength": 3
              },
              "description": {
                "description": "What the hook rebuilds. Empty, or at least 2 characters.",
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 0
                  },
                  {
                    "type": "string",
                    "minLength": 2,
                    "maxLength": 1000
                  }
                ]
              },
              "url": {
                "type": "string",
                "format": "uri",
                "maxLength": 2000,
                "description": "The provider's deploy hook URL (Vercel: https://api.vercel.com/v1/integrations/deploy/..., Netlify: https://api.netlify.com/build_hooks/...). Private and internal addresses are refused.",
                "pattern": "^https?://"
              },
              "webhookSecret": {
                "type": "string",
                "maxLength": 10000,
                "description": "Vercel only: the secret Vercel shows when you add its deployment webhook, so BuildBase can trust the build status events it sends. Write-only: put \"${env:NAME}\" here and supply the value when you apply. It is never shown again."
              }
            },
            "required": [
              "title",
              "url"
            ]
          },
          "examples": [
            {
              "site": {
                "title": "Marketing site",
                "url": "https://api.vercel.com/v1/integrations/deploy/prj_abc123/hook456"
              }
            }
          ]
        },
        "monday": {
          "type": "object",
          "description": "The monday.com app.",
          "additionalProperties": false,
          "properties": {
            "clientId": {
              "type": "string",
              "maxLength": 200,
              "description": "The app's Client ID.",
              "minLength": 1
            },
            "clientSecret": {
              "type": "string",
              "maxLength": 10000,
              "description": "The app's Client Secret. Write-only: put \"${env:NAME}\" here and supply the value when you apply. It is never shown again."
            },
            "signingSecret": {
              "type": "string",
              "maxLength": 10000,
              "description": "The app's Signing Secret, which signs the events monday sends. Write-only: put \"${env:NAME}\" here and supply the value when you apply. It is never shown again."
            },
            "appId": {
              "type": "integer",
              "description": "The app's numeric App ID.",
              "minimum": 1
            },
            "appVersionId": {
              "description": "An App version ID, only for letting collaborators authorize a draft version. Use null to clear it.",
              "anyOf": [
                {
                  "type": "integer",
                  "minimum": 1
                },
                {
                  "type": "null"
                }
              ]
            },
            "applicationEventWebhook": {
              "description": "Your own URL that BuildBase forwards install and uninstall events to. Empty means not set.",
              "anyOf": [
                {
                  "type": "string",
                  "maxLength": 0
                },
                {
                  "type": "string",
                  "format": "uri",
                  "pattern": "^https?://",
                  "maxLength": 2048
                }
              ]
            },
            "applicationAuthenticationUrl": {
              "description": "Your own URL installers are sent to after authorizing. Empty means not set.",
              "anyOf": [
                {
                  "type": "string",
                  "maxLength": 0
                },
                {
                  "type": "string",
                  "format": "uri",
                  "pattern": "^https?://",
                  "maxLength": 2048
                }
              ]
            },
            "requiredScopes": {
              "type": "array",
              "items": {
                "type": "string",
                "maxLength": 100,
                "description": "A monday.com scope, e.g. boards:read.",
                "pattern": "^[a-z_]+:[a-z_]+$"
              },
              "maxItems": 100,
              "description": "Scopes the app needs; an installer whose token lacks one goes through consent again. Order does not matter.",
              "uniqueItems": true
            }
          },
          "required": [
            "clientId",
            "clientSecret",
            "signingSecret",
            "appId"
          ]
        }
      }
    },
    "data": {
      "type": "object",
      "description": "The app data model: user and audience attributes and tags, collections, forms and their captcha, end-user feature flags and storage settings.",
      "additionalProperties": false,
      "properties": {
        "userAttributes": {
          "type": "object",
          "description": "Custom fields on every end user (Users > Attributes): plan tier, company size, a birthday. Your app reads and writes them with the SDK; workflows and segments use them. Deleting one (prune) deletes its values too.",
          "propertyNames": {
            "description": "Each key is the attribute key values are stored under (lowercase letters and digits joined by single hyphens, at least 2 characters). Fixed once created: a new key is a new attribute.",
            "pattern": "^(?=.{2,100}$)[a-z0-9]+(?:-[a-z0-9]+)*$",
            "maxLength": 200
          },
          "additionalProperties": {
            "type": "object",
            "description": "User attribute.",
            "additionalProperties": false,
            "properties": {
              "name": {
                "type": "string",
                "maxLength": 255,
                "description": "Label shown in the console and the SDK profile forms.",
                "minLength": 2
              },
              "type": {
                "enum": [
                  "string",
                  "boolean",
                  "number",
                  "dropdown",
                  "date"
                ],
                "description": "Value type: string, number, boolean, date (YYYY-MM-DD or a full ISO date-time in UTC) or dropdown (one of options)."
              },
              "description": {
                "description": "Help text for the attribute. Empty, or at least 2 characters. Default empty.",
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 0
                  },
                  {
                    "type": "string",
                    "minLength": 2,
                    "maxLength": 1000
                  }
                ]
              },
              "options": {
                "type": "array",
                "items": {
                  "type": "object",
                  "description": "A dropdown choice.",
                  "additionalProperties": false,
                  "properties": {
                    "label": {
                      "type": "string",
                      "maxLength": 200,
                      "description": "Text shown for the choice.",
                      "minLength": 2
                    },
                    "value": {
                      "type": "string",
                      "maxLength": 200,
                      "description": "Value stored when it is chosen. Always text: the route stores every option value as a string.",
                      "minLength": 1
                    }
                  },
                  "required": [
                    "label",
                    "value"
                  ]
                },
                "maxItems": 200,
                "description": "The choices of a dropdown attribute, in display order. Required (at least one) for type dropdown, not allowed for other types. Replaced whole when stated."
              },
              "defaultValue": {
                "description": "Value a record gets until one is set. Must match the type: a number for number, true or false for boolean, a date string for date, one of the option values for dropdown, text for string. Leaving it out keeps what is set; it cannot be cleared through the API.",
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 2000
                  },
                  {
                    "type": "number"
                  },
                  {
                    "type": "boolean"
                  }
                ]
              },
              "allowPublicEdit": {
                "type": "boolean",
                "description": "Users may change the value themselves through the SDK. Default false."
              },
              "allowPublicView": {
                "type": "boolean",
                "description": "Users may read the value through the SDK. Default false."
              }
            },
            "required": [
              "name",
              "type"
            ]
          },
          "examples": [
            {
              "company-size": {
                "name": "Company size",
                "type": "dropdown",
                "options": [
                  {
                    "label": "1-10",
                    "value": "small"
                  },
                  {
                    "label": "11-200",
                    "value": "medium"
                  }
                ],
                "defaultValue": "small",
                "allowPublicEdit": true,
                "allowPublicView": true
              }
            }
          ]
        },
        "audienceAttributes": {
          "type": "object",
          "description": "Custom fields on every audience contact (Audience > Attributes), for email campaigns, forms and workflows. Deleting one (prune) deletes its values too.",
          "propertyNames": {
            "description": "Each key is the attribute key values are stored under (lowercase letters and digits joined by single hyphens, at least 2 characters). Fixed once created: a new key is a new attribute.",
            "pattern": "^(?=.{2,100}$)[a-z0-9]+(?:-[a-z0-9]+)*$",
            "maxLength": 200
          },
          "additionalProperties": {
            "type": "object",
            "description": "Audience attribute.",
            "additionalProperties": false,
            "properties": {
              "name": {
                "type": "string",
                "maxLength": 255,
                "description": "Label shown in the console and the SDK profile forms.",
                "minLength": 2
              },
              "type": {
                "enum": [
                  "string",
                  "boolean",
                  "number",
                  "dropdown",
                  "date"
                ],
                "description": "Value type: string, number, boolean, date (YYYY-MM-DD or a full ISO date-time in UTC) or dropdown (one of options)."
              },
              "description": {
                "description": "Help text for the attribute. Empty, or at least 2 characters. Default empty.",
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 0
                  },
                  {
                    "type": "string",
                    "minLength": 2,
                    "maxLength": 1000
                  }
                ]
              },
              "options": {
                "type": "array",
                "items": {
                  "type": "object",
                  "description": "A dropdown choice.",
                  "additionalProperties": false,
                  "properties": {
                    "label": {
                      "type": "string",
                      "maxLength": 200,
                      "description": "Text shown for the choice.",
                      "minLength": 2
                    },
                    "value": {
                      "type": "string",
                      "maxLength": 200,
                      "description": "Value stored when it is chosen. Always text: the route stores every option value as a string.",
                      "minLength": 1
                    }
                  },
                  "required": [
                    "label",
                    "value"
                  ]
                },
                "maxItems": 200,
                "description": "The choices of a dropdown attribute, in display order. Required (at least one) for type dropdown, not allowed for other types. Replaced whole when stated."
              },
              "defaultValue": {
                "description": "Value a record gets until one is set. Must match the type: a number for number, true or false for boolean, a date string for date, one of the option values for dropdown, text for string. Leaving it out keeps what is set; it cannot be cleared through the API.",
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 2000
                  },
                  {
                    "type": "number"
                  },
                  {
                    "type": "boolean"
                  }
                ]
              },
              "allowPublicEdit": {
                "type": "boolean",
                "description": "Contacts may change the value themselves through the SDK. Default false."
              },
              "allowPublicView": {
                "type": "boolean",
                "description": "Contacts may read the value through the SDK. Default false."
              }
            },
            "required": [
              "name",
              "type"
            ]
          },
          "examples": [
            {
              "lead-score": {
                "name": "Lead score",
                "type": "number",
                "defaultValue": 0
              }
            }
          ]
        },
        "userTags": {
          "type": "object",
          "description": "Labels on end users (Users > Tags), for segments, feature flag targeting and workflows. Tags cannot be deleted through the API: one removed from the file is left as it is.",
          "propertyNames": {
            "description": "Each key is the tag slug (lowercase letters and digits joined by single hyphens, at least 2 characters), which the SDK and workflows use.",
            "pattern": "^(?=.{2,100}$)[a-z0-9]+(?:-[a-z0-9]+)*$",
            "maxLength": 200
          },
          "additionalProperties": {
            "type": "object",
            "description": "User tag.",
            "additionalProperties": false,
            "properties": {
              "title": {
                "type": "string",
                "maxLength": 200,
                "description": "Name shown in the console. Unique: two tags cannot share a title.",
                "minLength": 2
              }
            },
            "required": [
              "title"
            ]
          },
          "examples": [
            {
              "vip": {
                "title": "VIP customer"
              }
            }
          ]
        },
        "audienceTags": {
          "type": "object",
          "description": "Labels on audience contacts (Audience > Tags), for campaigns, lists and workflows (the add-tag action refers to one). Tags cannot be deleted through the API: one removed from the file is left as it is.",
          "propertyNames": {
            "description": "Each key is the tag slug (lowercase letters and digits joined by single hyphens, at least 2 characters), which the SDK and workflows use.",
            "pattern": "^(?=.{2,100}$)[a-z0-9]+(?:-[a-z0-9]+)*$",
            "maxLength": 200
          },
          "additionalProperties": {
            "type": "object",
            "description": "Audience tag.",
            "additionalProperties": false,
            "properties": {
              "title": {
                "type": "string",
                "maxLength": 200,
                "description": "Name shown in the console. Unique: two tags cannot share a title.",
                "minLength": 2
              }
            },
            "required": [
              "title"
            ]
          },
          "examples": [
            {
              "newsletter": {
                "title": "Newsletter"
              }
            }
          ]
        },
        "collections": {
          "type": "object",
          "description": "Structured content and form data (Content > Collections). The fields describe the live version: changing them creates a new version and publishes it unless policy.publish is \"never\" (then it stays a draft, and later plans compare against that draft). Records stay with the version they were written to. A collection stated without fields gets no version.",
          "propertyNames": {
            "description": "Each key is the collection slug, which apps read records by (GET /api/collections/data/<slug>). Fixed once created.",
            "pattern": "^[a-z0-9][a-z0-9_-]{1,99}$",
            "maxLength": 200
          },
          "additionalProperties": {
            "type": "object",
            "description": "A collection.",
            "additionalProperties": false,
            "properties": {
              "name": {
                "type": "string",
                "maxLength": 200,
                "description": "Name shown in the console.",
                "minLength": 2
              },
              "fields": {
                "type": "array",
                "items": {
                  "type": "object",
                  "description": "A field.",
                  "additionalProperties": false,
                  "properties": {
                    "slug": {
                      "type": "string",
                      "maxLength": 100,
                      "description": "The field key records and form submissions store the value under. Unique within the collection.",
                      "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{1,99}$"
                    },
                    "title": {
                      "type": "string",
                      "maxLength": 200,
                      "description": "Label shown on forms and in the console.",
                      "minLength": 2
                    },
                    "type": {
                      "enum": [
                        "text",
                        "rich-text",
                        "number",
                        "bool",
                        "date",
                        "color",
                        "link",
                        "email",
                        "file"
                      ],
                      "description": "Value type: text, rich-text, number, bool, date, color, link, email or file (an upload; see maxMb and maxFiles)."
                    },
                    "helpText": {
                      "description": "Hint shown under the field. Empty, or at least 2 characters. Default empty.",
                      "anyOf": [
                        {
                          "type": "string",
                          "maxLength": 0
                        },
                        {
                          "type": "string",
                          "minLength": 2,
                          "maxLength": 500
                        }
                      ]
                    },
                    "required": {
                      "type": "boolean",
                      "description": "A record or submission must fill it in. Default false."
                    },
                    "defaultValue": {
                      "type": "string",
                      "maxLength": 2000,
                      "description": "Value a new record starts with. Stored as text whatever the type: write a number as \"3\" and a boolean as \"true\" or \"false\". Default empty."
                    },
                    "maxMb": {
                      "type": "number",
                      "description": "file fields: the most one file may be, in MB (0.1 to 100). A plan limit still binds below it. Default 5.",
                      "minimum": 0.1,
                      "maximum": 100
                    },
                    "maxFiles": {
                      "type": "integer",
                      "description": "file fields: how many files the field takes (1 to 10). More than one stores a list. Default 1.",
                      "minimum": 1,
                      "maximum": 10
                    }
                  },
                  "required": [
                    "slug",
                    "title",
                    "type"
                  ]
                },
                "maxItems": 200,
                "description": "The fields of the live version, in display order. Replaced whole when stated: a field left out is not in the new version.",
                "minItems": 1
              }
            },
            "required": [
              "name"
            ]
          },
          "examples": [
            {
              "leads": {
                "name": "Leads",
                "fields": [
                  {
                    "slug": "email",
                    "title": "Email",
                    "type": "email",
                    "required": true
                  },
                  {
                    "slug": "company",
                    "title": "Company",
                    "type": "text"
                  }
                ]
              }
            }
          ]
        },
        "formProtection": {
          "type": "object",
          "description": "The form captcha.",
          "additionalProperties": false,
          "properties": {
            "mode": {
              "enum": [
                "managed",
                "builtin",
                "turnstile",
                "hcaptcha",
                "recaptcha"
              ],
              "description": "managed (default), builtin, or your own turnstile, hcaptcha or recaptcha keys."
            },
            "siteKey": {
              "type": "string",
              "maxLength": 200,
              "description": "Your site key, for turnstile, hcaptcha or recaptcha. Public by design: it is rendered into the form page.",
              "pattern": "^[A-Za-z0-9_-]+$"
            },
            "secretKey": {
              "type": "string",
              "maxLength": 10000,
              "description": "Your secret key, which goes with siteKey. Checked with the provider when saved. Write-only: put \"${env:NAME}\" here and supply the value when you apply. It is never shown again."
            }
          },
          "required": [
            "mode"
          ]
        },
        "forms": {
          "type": "object",
          "description": "Public forms whose submissions become records of a collection (Content > Forms). A form writes into its collection's live version and follows it: when this apply publishes a new version of the collection, the form moves to it. Forms cannot be deleted, only archived.",
          "propertyNames": {
            "description": "Each key is a name you choose for the form (workflows refer to it by this key).",
            "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,99}$",
            "maxLength": 200
          },
          "additionalProperties": {
            "type": "object",
            "description": "A form.",
            "additionalProperties": false,
            "properties": {
              "name": {
                "type": "string",
                "maxLength": 200,
                "description": "Internal name, shown in the console. Unique across the organization.",
                "minLength": 2
              },
              "title": {
                "type": "string",
                "maxLength": 200,
                "description": "Heading on the hosted form.",
                "minLength": 2
              },
              "description": {
                "type": "string",
                "maxLength": 2000,
                "description": "Text under the heading on the hosted form.",
                "minLength": 2
              },
              "collection": {
                "type": "string",
                "maxLength": 100,
                "description": "The data.collections key whose records submissions become. The collection needs a live version (state its fields)."
              },
              "published": {
                "type": "boolean",
                "description": "The form accepts submissions at its public URL. Default false."
              },
              "archived": {
                "type": "boolean",
                "description": "Archived forms are hidden and refuse submissions; restoring one brings it back unpublished. Removing a form from the file never archives it unless you prune."
              },
              "protection": {
                "type": "object",
                "description": "Spam protection for this form. Fields left out keep their value.",
                "additionalProperties": false,
                "properties": {
                  "captcha": {
                    "type": "boolean",
                    "description": "Require the organization captcha (data.formProtection) on this form. Default false."
                  },
                  "maxLinks": {
                    "description": "Most links one submission may contain, across all fields (0 to 50). Default null: any number. Use null to clear it.",
                    "anyOf": [
                      {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 50
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "blockedWords": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "maxLength": 100,
                      "description": "A word or phrase, lowercase, without surrounding spaces.",
                      "minLength": 1
                    },
                    "maxItems": 200,
                    "description": "Words that mark a submission as suspicious, case-insensitive. Replaced whole when stated.",
                    "uniqueItems": true
                  },
                  "blockDisposableEmails": {
                    "type": "boolean",
                    "description": "Refuse email fields on known throwaway domains. Default false."
                  },
                  "blockedEmailDomains": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "maxLength": 253,
                      "description": "A domain, lowercase, e.g. example.com.",
                      "pattern": "^[a-z0-9.-]+\\.[a-z]{2,}$"
                    },
                    "maxItems": 200,
                    "description": "More email domains this form refuses. Replaced whole when stated.",
                    "uniqueItems": true
                  },
                  "dailyLimit": {
                    "description": "Most submissions the form accepts per day (1 to 100000). Default null: no cap. Use null to clear it.",
                    "anyOf": [
                      {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 100000
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "onSuspicious": {
                    "enum": [
                      "review",
                      "reject"
                    ],
                    "description": "What a submission that trips a content rule does: \"review\" (default) holds it until someone approves it, \"reject\" refuses it."
                  }
                }
              },
              "subscribe": {
                "type": "object",
                "description": "Collect email subscribers from this form. Fields left out keep their value.",
                "additionalProperties": false,
                "properties": {
                  "enabled": {
                    "type": "boolean",
                    "description": "Each submission adds the person to the audience. Default false."
                  },
                  "requireConfirmation": {
                    "type": "boolean",
                    "description": "Double opt-in: they join only after clicking a confirmation email. Default true."
                  },
                  "emailField": {
                    "type": "string",
                    "maxLength": 100,
                    "description": "Slug of the collection field holding the address. Default: the first email field."
                  },
                  "nameField": {
                    "type": "string",
                    "maxLength": 100,
                    "description": "Slug of the collection field holding the name. Default: a field named \"name\"."
                  }
                }
              }
            },
            "required": [
              "name",
              "title",
              "description",
              "collection"
            ]
          },
          "examples": [
            {
              "contact": {
                "name": "Contact us",
                "title": "Get in touch",
                "description": "We answer within a day.",
                "collection": "leads",
                "published": true,
                "protection": {
                  "captcha": true,
                  "maxLinks": 2
                }
              }
            }
          ]
        },
        "featureFlags": {
          "type": "object",
          "description": "Feature flags for end users (Users > Feature flags), checked per user with the SDK. Workspace flags are workspaces.features. Targeting individual users, lists or tags stays in the console. Flags cannot be deleted, only archived.",
          "propertyNames": {
            "description": "Each key is the feature id your app checks with the SDK (useUserFeatures().isFeatureEnabled). Fixed once created.",
            "pattern": "^[A-Za-z0-9][A-Za-z0-9_.-]{1,99}$",
            "maxLength": 200
          },
          "additionalProperties": {
            "type": "object",
            "description": "A feature flag.",
            "additionalProperties": false,
            "properties": {
              "name": {
                "type": "string",
                "maxLength": 200,
                "description": "Name shown in the console.",
                "minLength": 2
              },
              "description": {
                "type": "string",
                "maxLength": 1000,
                "description": "What the flag turns on.",
                "minLength": 2
              },
              "enabled": {
                "type": "boolean",
                "description": "The flag is live. Off, it is off for everyone whatever it targets. Default false."
              },
              "allowAll": {
                "type": "boolean",
                "description": "On for every user while enabled, rather than only the users it targets. Default false."
              },
              "archived": {
                "type": "boolean",
                "description": "Archived flags are off for everyone and hidden. Default false."
              }
            },
            "required": [
              "name",
              "description"
            ]
          },
          "examples": [
            {
              "new-editor": {
                "name": "New editor",
                "description": "The rebuilt document editor",
                "enabled": true,
                "allowAll": true
              }
            }
          ]
        },
        "storage": {
          "type": "object",
          "description": "Storage settings.",
          "additionalProperties": false,
          "properties": {
            "hardStop": {
              "type": "boolean",
              "description": "Stop uploads at the plan's included storage instead of billing overage beyond it. Default false."
            },
            "endUserUploads": {
              "type": "object",
              "description": "What end users may upload through the SDK. Fields left out keep their value.",
              "additionalProperties": false,
              "properties": {
                "enabled": {
                  "type": "boolean",
                  "description": "End users may upload files through the SDK. Default true."
                },
                "maxFileBytes": {
                  "type": "integer",
                  "description": "Largest file one end user may upload, in bytes: 102400 (100 KB) to 5242880 (5 MB, the default). It can be lowered, never raised.",
                  "minimum": 102400,
                  "maximum": 5242880
                },
                "perUserBytes": {
                  "description": "Most one end user may hold in all, in bytes (at least 102400). Default null: no per-user total. Use null to clear it.",
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": 102400,
                      "maximum": 1099511627776
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              }
            }
          }
        }
      }
    },
    "workflows": {
      "type": "object",
      "description": "Automations: a trigger node, then actions and conditions joined by edges, in the shape the console exports (Automations > Workflows > Export). Apply saves the flow as the draft and publishes it as a new version unless policy.publish is \"never\" or status is \"draft\"; running instances keep the version they started on. Node configs may refer to email templates, senders, forms, tags and collections of this file with { \"$ref\": \"<kind>.<key>\" }.",
      "propertyNames": {
        "description": "Each key is a name you choose for the workflow (it only lives in this file).",
        "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,99}$",
        "maxLength": 200
      },
      "additionalProperties": {
        "type": "object",
        "description": "A workflow.",
        "additionalProperties": false,
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 200,
            "description": "Name shown in the console. A workflow is matched by it the first time.",
            "minLength": 2
          },
          "description": {
            "description": "What the workflow does. Empty, or at least 2 characters. Default empty.",
            "anyOf": [
              {
                "type": "string",
                "maxLength": 0
              },
              {
                "type": "string",
                "minLength": 2,
                "maxLength": 2000
              }
            ]
          },
          "status": {
            "enum": [
              "active",
              "paused",
              "draft"
            ],
            "description": "active (default): published and running. paused: published, new triggers are held and running instances wait. draft: saved, not running (a published workflow is paused and moved back to draft)."
          },
          "trigger": {
            "type": "object",
            "description": "The trigger, as the console export writes it. Optional: it is always taken from the flow's trigger node on publish, so when stated it must match that node.",
            "additionalProperties": false,
            "properties": {
              "type": {
                "type": "string",
                "maxLength": 100,
                "description": "The trigger node type."
              },
              "config": {
                "type": "object",
                "description": "The trigger node config.",
                "maxProperties": 200
              }
            },
            "required": [
              "type"
            ]
          },
          "flow": {
            "type": "object",
            "description": "The flow graph. Compared whole against the saved draft, node by node and edge by edge.",
            "additionalProperties": false,
            "properties": {
              "nodes": {
                "type": "array",
                "items": {
                  "type": "object",
                  "description": "A node.",
                  "additionalProperties": false,
                  "properties": {
                    "id": {
                      "type": "string",
                      "maxLength": 100,
                      "description": "Node id, unique in the flow. Edges and merge tags ({{nodes.<id>.<output>}}) refer to it.",
                      "minLength": 1
                    },
                    "type": {
                      "type": "string",
                      "maxLength": 100,
                      "description": "Node type from the workflow catalog (GET /api/workflows/definitions), e.g. triggers.user.registered, actions.send_email, actions.delay, conditions.if_else.",
                      "pattern": "^(triggers|actions|conditions)\\.[a-z0-9_.]+$"
                    },
                    "kind": {
                      "enum": [
                        "trigger",
                        "action",
                        "condition"
                      ],
                      "description": "trigger, action or condition; must match the type prefix (triggers., actions., conditions.)."
                    },
                    "position": {
                      "type": "object",
                      "description": "Where the node sits in the builder. Cosmetic: a position change is saved but publishes nothing.",
                      "additionalProperties": false,
                      "properties": {
                        "x": {
                          "type": "number",
                          "description": "Horizontal position on the canvas. Default 0."
                        },
                        "y": {
                          "type": "number",
                          "description": "Vertical position on the canvas. Default 0."
                        }
                      }
                    },
                    "data": {
                      "type": "object",
                      "description": "The node label and inputs.",
                      "additionalProperties": false,
                      "properties": {
                        "label": {
                          "type": "string",
                          "maxLength": 200,
                          "description": "Name shown on the node. Cosmetic. Default empty."
                        },
                        "config": {
                          "type": "object",
                          "description": "The node inputs, keyed as in the catalog definition (e.g. send_email: mode, templateId, senderId, to). An email template, sender, form, tag or collection may be written { \"$ref\": \"email.templates.<key>\" } (also email.senders, data.forms, data.userTags, data.audienceTags, data.collections) instead of its raw id, so the file works in any organization. Other ids (audience lists, users) stay raw.",
                          "maxProperties": 200
                        },
                        "retryPolicy": {
                          "type": "object",
                          "description": "How a failed action retries: { \"maxAttempts\": 3, \"backoff\": \"exponential\", \"initialDelayMs\": 1000 }. Default: the node type's own policy.",
                          "maxProperties": 200
                        }
                      }
                    }
                  },
                  "required": [
                    "id",
                    "type",
                    "kind"
                  ]
                },
                "maxItems": 500,
                "description": "The nodes. Exactly one trigger node. Order does not matter.",
                "minItems": 1
              },
              "edges": {
                "type": "array",
                "items": {
                  "type": "object",
                  "description": "An edge from one node to the next.",
                  "additionalProperties": false,
                  "properties": {
                    "id": {
                      "type": "string",
                      "maxLength": 100,
                      "description": "Edge id, unique in the flow.",
                      "minLength": 1
                    },
                    "source": {
                      "type": "string",
                      "maxLength": 100,
                      "description": "The node id it leaves.",
                      "minLength": 1
                    },
                    "target": {
                      "type": "string",
                      "maxLength": 100,
                      "description": "The node id it enters.",
                      "minLength": 1
                    },
                    "sourceHandle": {
                      "description": "Which output of a condition it leaves from: \"true\"/\"false\" for if_else, a branch id for split_random. Default null. Use null to clear it.",
                      "anyOf": [
                        {
                          "type": "string",
                          "maxLength": 100
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "label": {
                      "type": "string",
                      "maxLength": 200,
                      "description": "Text on the edge. Cosmetic."
                    }
                  },
                  "required": [
                    "id",
                    "source",
                    "target"
                  ]
                },
                "maxItems": 1000,
                "description": "The edges between nodes. Order does not matter."
              }
            },
            "required": [
              "nodes",
              "edges"
            ]
          },
          "reEntry": {
            "type": "object",
            "description": "Whether the same person can enter the workflow again.",
            "additionalProperties": false,
            "properties": {
              "mode": {
                "enum": [
                  "always",
                  "once",
                  "cooldown"
                ],
                "description": "always (default): every trigger starts an instance. once: a person goes through it once ever. cooldown: again only after cooldownMinutes."
              },
              "cooldownMinutes": {
                "type": "integer",
                "description": "cooldown mode: minutes before the same person can enter again.",
                "minimum": 0,
                "maximum": 525600
              }
            },
            "required": [
              "mode"
            ]
          },
          "frequencyCap": {
            "type": "object",
            "description": "Per-person send caps. Stated fields are merged over the current caps.",
            "additionalProperties": false,
            "properties": {
              "maxEmailsPerDay": {
                "type": "integer",
                "description": "Most emails this workflow sends one person per day. 0 (default) is no cap.",
                "minimum": 0,
                "maximum": 100000
              },
              "maxPushPerDay": {
                "type": "integer",
                "description": "Most push notifications per person per day. 0 (default) is no cap.",
                "minimum": 0,
                "maximum": 100000
              }
            }
          },
          "executionLimits": {
            "type": "object",
            "description": "Safety limits on how much the workflow runs. Stated fields are merged over the current limits.",
            "additionalProperties": false,
            "properties": {
              "maxConcurrentInstances": {
                "type": "integer",
                "description": "Most instances running at once. 0 (default) is no limit.",
                "minimum": 0,
                "maximum": 1000000
              },
              "maxDurationMs": {
                "type": "integer",
                "description": "Longest an instance may run, in milliseconds. 0 (default) is no limit.",
                "minimum": 0,
                "maximum": 31536000000
              },
              "maxTriggersPerMinute": {
                "type": "integer",
                "description": "Most new instances per minute. 0 (default) is no limit.",
                "minimum": 0,
                "maximum": 1000000
              }
            }
          },
          "exitConditions": {
            "type": "array",
            "items": {
              "type": "object",
              "description": "An exit condition.",
              "additionalProperties": false,
              "properties": {
                "type": {
                  "enum": [
                    "field_check",
                    "audience_in_list",
                    "audience_not_in_list",
                    "instance_node_failed"
                  ],
                  "description": "field_check (params: field, operator, value), audience_in_list / audience_not_in_list (params: listId), or instance_node_failed."
                },
                "label": {
                  "type": "string",
                  "maxLength": 200,
                  "description": "Name shown in the console."
                },
                "enabled": {
                  "type": "boolean",
                  "description": "Checked before each action. Default true."
                },
                "params": {
                  "type": "object",
                  "description": "The condition parameters (see type).",
                  "maxProperties": 200
                }
              },
              "required": [
                "type"
              ]
            },
            "maxItems": 50,
            "description": "Conditions checked before every action; when met, the instance stops. Replaced whole when stated."
          },
          "exitConditionsCombinator": {
            "enum": [
              "AND",
              "OR"
            ],
            "description": "OR (default): stop when any condition is met. AND: only when all are."
          }
        },
        "required": [
          "name",
          "flow"
        ]
      },
      "examples": [
        {
          "welcome": {
            "name": "Welcome email",
            "flow": {
              "nodes": [
                {
                  "id": "trigger",
                  "type": "triggers.user.registered",
                  "kind": "trigger"
                },
                {
                  "id": "send",
                  "type": "actions.send_email",
                  "kind": "action",
                  "data": {
                    "config": {
                      "mode": "template",
                      "templateId": {
                        "$ref": "email.templates.welcome"
                      },
                      "senderId": {
                        "$ref": "email.senders.main"
                      },
                      "to": "{{trigger.email}}"
                    }
                  }
                }
              ],
              "edges": [
                {
                  "id": "e1",
                  "source": "trigger",
                  "target": "send"
                }
              ]
            }
          }
        }
      ]
    }
  }
}
