{
  "openapi": "3.1.0",
  "info": {
    "title": "Tune.Toys API",
    "version": "0.1.0",
    "summary": "Catalog, projects, library and developer platform of Tune.Toys.",
    "description": "Generated from the route declarations in services/api by tools/generate-openapi.mjs. Operations marked `x-tunetoys-stability: experimental` may change without notice before 1.0. Errors use the ApiError envelope; `requestId` echoes `X-Request-Id`. Native Player bearers (`ttna_…`) are read-only and documented in prose in docs/specs/http-api.md."
  },
  "jsonSchemaDialect": "https://spec.openapis.org/oas/3.1/dialect/base",
  "servers": [
    { "url": "https://tune.toys", "description": "Production" },
    { "url": "http://127.0.0.1:8787", "description": "Local development API" }
  ],
  "tags": [
    {
      "name": "agent",
      "description": "Server text proposals (signed-in sessions only)."
    },
    {
      "name": "ai",
      "description": "Node LLM completions and the allowlisted request proxy, with the caller’s own vault keys (signed-in sessions only)."
    },
    {
      "name": "auth",
      "description": "Account sessions. Never available to API keys."
    },
    {
      "name": "billing",
      "description": "Offers, checkout and entitlements. Never available to API keys."
    },
    {
      "name": "catalog",
      "description": "Public catalog, listings and immutable releases."
    },
    {
      "name": "community",
      "description": "Profiles, collections, comments and collaboration."
    },
    {
      "name": "connections",
      "description": "Connected services (Google Drive), enabled addons and the network allowlist. Tokens stay on the server, except the short-lived Picker drive.file access token."
    },
    {
      "name": "developer",
      "description": "Developer apps, API keys, usage, rate limits and webhooks. Management is session-only."
    },
    { "name": "distribution", "description": "distribution" },
    { "name": "email", "description": "email" },
    { "name": "embed", "description": "embed" },
    { "name": "exports", "description": "exports" },
    {
      "name": "library",
      "description": "The personal library and its sync feed."
    },
    { "name": "listings", "description": "listings" },
    { "name": "media", "description": "Media library and uploads." },
    {
      "name": "native",
      "description": "Player device authorization. Never available to API keys."
    },
    { "name": "notifications", "description": "notifications" },
    { "name": "posts", "description": "posts" },
    {
      "name": "projects",
      "description": "Owned draft projects and revision-checked authoring operations."
    },
    { "name": "publishers", "description": "publishers" },
    {
      "name": "sounds",
      "description": "The Sounds catalog: search and facets over the media index, detail with resolved metadata and sources, renditions, originals behind the reuse gate, likes, saves with the sync protocol, relations and beacons. Native Player grants need media:read (media:download for originals)."
    },
    { "name": "storefronts", "description": "storefronts" },
    { "name": "system", "description": "Health and public configuration." },
    {
      "name": "vault",
      "description": "Account secrets: write once, metadata only on read, used server-side by the proxy and LLM endpoint."
    },
    { "name": "versions", "description": "versions" }
  ],
  "paths": {
    "/v1/account/locale": {
      "get": {
        "operationId": "getAccountLocale",
        "summary": "Account language and time zone",
        "tags": ["notifications"],
        "security": [{ "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Notification result" },
          "304": { "description": "Not modified" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      },
      "put": {
        "operationId": "setAccountLocale",
        "summary": "Set account language (UI, email, push) and time zone (digests, quiet hours)",
        "tags": ["notifications"],
        "security": [{ "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Notification result" },
          "304": { "description": "Not modified" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/addons": {
      "get": {
        "operationId": "listEnabledAddons",
        "summary": "List the addons this account has enabled",
        "tags": ["connections"],
        "security": [{ "sessionCookie": [] }],
        "responses": {
          "200": {
            "description": "List the addons this account has enabled",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": ["addons"],
                  "properties": {
                    "addons": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "required": ["id", "enabledAt"],
                        "properties": {
                          "id": {
                            "type": "string",
                            "pattern": "^[a-z][a-z0-9-]{1,31}$"
                          },
                          "enabledAt": { "type": "string" }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      },
      "put": {
        "operationId": "putEnabledAddons",
        "summary": "Replace the set of enabled addons for this account",
        "tags": ["connections"],
        "security": [{ "sessionCookie": [] }],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": ["addons"],
                "properties": {
                  "addons": {
                    "type": "array",
                    "maxItems": 64,
                    "items": {
                      "type": "string",
                      "pattern": "^[a-z][a-z0-9-]{1,31}$"
                    }
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Replace the set of enabled addons for this account",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": ["addons"],
                  "properties": {
                    "addons": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "required": ["id", "enabledAt"],
                        "properties": {
                          "id": {
                            "type": "string",
                            "pattern": "^[a-z][a-z0-9-]{1,31}$"
                          },
                          "enabledAt": { "type": "string" }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/agent/proposals": {
      "post": {
        "operationId": "createAgentProposal",
        "summary": "Generate a revision-bound Toy edit proposal from a recipe brief",
        "tags": ["agent"],
        "security": [{ "sessionCookie": [] }],
        "responses": {
          "200": {
            "description": "Validated proposal candidate with usage and quota"
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/ai/complete": {
      "post": {
        "operationId": "completeAi",
        "summary": "Complete a chat with Anthropic, OpenAI or Gemini using the caller’s own vault key",
        "tags": ["ai"],
        "security": [{ "sessionCookie": [] }],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": ["provider", "messages"],
                "properties": {
                  "provider": {
                    "type": "string",
                    "enum": ["anthropic", "openai", "gemini"]
                  },
                  "model": {
                    "type": "string",
                    "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
                  },
                  "system": { "type": "string", "maxLength": 32768 },
                  "messages": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 64,
                    "items": {
                      "type": "object",
                      "required": ["role", "content"],
                      "properties": {
                        "role": {
                          "type": "string",
                          "enum": ["user", "assistant"]
                        },
                        "content": { "type": "string", "maxLength": 32768 }
                      },
                      "additionalProperties": false
                    }
                  },
                  "format": { "type": "string", "enum": ["text", "json"] },
                  "maxTokens": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 8192
                  },
                  "temperature": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 2
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Complete a chat with Anthropic, OpenAI or Gemini using the caller’s own vault key",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": ["text", "usage", "model"],
                  "properties": {
                    "text": { "type": "string" },
                    "json": {},
                    "usage": {
                      "type": "object",
                      "required": ["inputTokens", "outputTokens"],
                      "properties": {
                        "inputTokens": { "type": "integer" },
                        "outputTokens": { "type": "integer" }
                      }
                    },
                    "model": { "type": "string" }
                  }
                }
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/ai/models": {
      "get": {
        "operationId": "getAiModels",
        "summary": "Pinned model suggestions per provider and the caller’s daily allowance",
        "tags": ["ai"],
        "security": [{ "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Pinned models, limits and usage" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/artifacts/{id}/bytes": {
      "get": {
        "operationId": "getArtifactBytes",
        "summary": "Download a free or browser artifact with digest verification",
        "tags": ["versions"],
        "security": [{}, { "sessionCookie": [] }, { "nativeBearer": [] }],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Artifact bytes with X-Content-SHA256" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "description": "PURCHASE_REQUIRED" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session", "native"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/artifacts/{id}/tickets": {
      "post": {
        "operationId": "createDownloadTicket",
        "summary": "Issue a one-time, 15-minute download ticket (anonymous for free public artifacts)",
        "tags": ["distribution"],
        "security": [{}, { "sessionCookie": [] }, { "nativeBearer": [] }],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "201": {
            "description": "Ticket with tokenized URL, size and SHA-256"
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": {
            "description": "PURCHASE_REQUIRED, VERSION_NOT_COVERED or DEVICE_LIMIT"
          },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "410": { "description": "VERSION_YANKED" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session", "native"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/auth/email": {
      "post": {
        "operationId": "setAccountEmail",
        "summary": "Add or resend verification for a recovery address",
        "tags": ["auth"],
        "security": [{ "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/auth/login": {
      "post": {
        "operationId": "signIn",
        "summary": "Create a handle/password session",
        "tags": ["auth"],
        "security": [{}, { "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Account and CSRF token" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/auth/logout": {
      "post": {
        "operationId": "signOut",
        "summary": "Revoke the current session and expire its cookie",
        "tags": ["auth"],
        "security": [{ "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Signed out" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/auth/me": {
      "get": {
        "operationId": "getCurrentAccount",
        "summary": "Read the current account and browser CSRF token",
        "tags": ["auth"],
        "security": [{}, { "sessionCookie": [] }, { "nativeBearer": [] }],
        "responses": {
          "200": { "description": "Account or null, CSRF token or null" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session", "native"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/auth/oauth/{provider}/start": {
      "post": {
        "operationId": "startOAuth",
        "summary": "Start provider sign-in or explicit identity linking",
        "tags": ["auth"],
        "security": [{}, { "sessionCookie": [] }],
        "parameters": [
          {
            "name": "provider",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^(?:google|apple|github|spotify)$"
            }
          }
        ],
        "responses": {
          "200": { "description": "Fixed provider redirect" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/auth/options": {
      "get": {
        "operationId": "getAuthOptions",
        "summary": "List sign-in providers and email delivery availability",
        "tags": ["auth"],
        "security": [{}, { "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Provider and email availability" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/auth/password": {
      "post": {
        "operationId": "changePassword",
        "summary": "Set or replace the caller's password and end their other browser sessions",
        "tags": ["auth"],
        "security": [{ "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/auth/profile": {
      "get": {
        "operationId": "getAuthProfile",
        "summary": "Read owner-only email and connected-method metadata",
        "tags": ["auth"],
        "security": [{ "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Profile" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      },
      "patch": {
        "operationId": "updateAuthProfile",
        "summary": "Change the caller's display name",
        "tags": ["auth"],
        "security": [{ "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Public account" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/auth/recover": {
      "post": {
        "operationId": "recoverAccount",
        "summary": "Request password recovery email",
        "tags": ["auth"],
        "security": [{}, { "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/auth/register": {
      "post": {
        "operationId": "registerAccount",
        "summary": "Create a handle/password account and session",
        "tags": ["auth"],
        "security": [{}, { "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Account and CSRF token" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/auth/reset-password": {
      "post": {
        "operationId": "resetPassword",
        "summary": "Consume a reset token and replace the password",
        "tags": ["auth"],
        "security": [{}, { "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/auth/verify-email": {
      "post": {
        "operationId": "verifyEmail",
        "summary": "Consume an email verification token",
        "tags": ["auth"],
        "security": [{}, { "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/billing/checkout": {
      "post": {
        "operationId": "createCheckout",
        "summary": "Start a hosted checkout for an offer",
        "tags": ["billing"],
        "security": [{ "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Checkout redirect" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/billing/entitlements": {
      "get": {
        "operationId": "listBillingEntitlements",
        "summary": "List the caller's entitlements",
        "tags": ["billing"],
        "security": [{ "sessionCookie": [] }, { "nativeBearer": [] }],
        "responses": {
          "200": { "description": "Entitlements" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "native"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/billing/options": {
      "get": {
        "operationId": "getBillingOptions",
        "summary": "List configured offers",
        "tags": ["billing"],
        "security": [{}, { "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Billing offers and provider availability" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/billing/orders": {
      "get": {
        "operationId": "listBillingOrders",
        "summary": "List the caller's orders",
        "tags": ["billing"],
        "security": [{ "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Orders" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/billing/orders/{orderId}/portal": {
      "post": {
        "operationId": "openBillingPortal",
        "summary": "Open the provider billing portal for an order",
        "tags": ["billing"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "orderId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Portal redirect" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/billing/orders/{orderId}/sync": {
      "post": {
        "operationId": "synchronizeBillingOrder",
        "summary": "Reconcile an order with the provider",
        "tags": ["billing"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "orderId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Order" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/catalog": {
      "get": {
        "operationId": "getCatalog",
        "summary": "Search the public catalog",
        "tags": ["catalog"],
        "security": [
          {},
          { "sessionCookie": [] },
          { "nativeBearer": [] },
          { "apiKey": ["read:public"] },
          { "apiKeyHeader": ["read:public"] }
        ],
        "responses": {
          "200": {
            "description": "Catalog page",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session", "native", "key"],
        "x-tunetoys-scopes": ["read:public"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 2
      }
    },
    "/v1/certificates": {
      "get": {
        "operationId": "listLicenseCertificates",
        "summary": "The caller's certificates with offline states",
        "tags": ["distribution"],
        "security": [{ "sessionCookie": [] }, { "nativeBearer": [] }],
        "responses": {
          "200": { "description": "Certificates" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "native"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/certificates/{id}/refresh": {
      "post": {
        "operationId": "refreshLicenseCertificate",
        "summary": "Refresh a certificate, or learn that it was revoked",
        "tags": ["distribution"],
        "security": [{ "sessionCookie": [] }, { "nativeBearer": [] }],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "New certificate, or state revoked" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "native"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/community/activity": {
      "get": {
        "operationId": "listCommunityActivity",
        "summary": "List activity from followed accounts",
        "tags": ["community"],
        "security": [{ "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Community result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/community/avatar": {
      "put": {
        "operationId": "setCommunityAvatar",
        "summary": "Set the caller's avatar from owned media",
        "tags": ["community"],
        "security": [{ "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Community result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/community/avatars/{avatarId}": {
      "get": {
        "operationId": "getCommunityAvatar",
        "summary": "Read avatar image bytes",
        "tags": ["community"],
        "security": [{}, { "sessionCookie": [] }],
        "parameters": [
          {
            "name": "avatarId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "WebP image bytes" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/community/blocks": {
      "get": {
        "operationId": "listBlockedAccounts",
        "summary": "List accounts the caller blocked",
        "tags": ["community"],
        "security": [{ "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Community result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/community/collections": {
      "post": {
        "operationId": "createCollection",
        "summary": "Create a collection",
        "tags": ["community"],
        "security": [{ "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Community result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/community/collections/{collectionId}": {
      "get": {
        "operationId": "getCollection",
        "summary": "Read a collection page",
        "tags": ["community"],
        "security": [{}, { "sessionCookie": [] }],
        "parameters": [
          {
            "name": "collectionId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Community result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      },
      "put": {
        "operationId": "updateCollection",
        "summary": "Update a collection",
        "tags": ["community"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "collectionId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Community result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      },
      "delete": {
        "operationId": "deleteCollection",
        "summary": "Delete a collection at an expected version",
        "tags": ["community"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "collectionId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Community result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/community/collections/{collectionId}/items": {
      "put": {
        "operationId": "setCollectionSubject",
        "summary": "Add, move or remove a Toy or sound in a collection by subject (subjectType project|media)",
        "tags": ["community"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "collectionId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Community result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/community/collections/{collectionId}/toys/{toyId}": {
      "put": {
        "operationId": "setCollectionItem",
        "summary": "Add, move or remove a Toy in a collection",
        "tags": ["community"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "collectionId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          },
          {
            "name": "toyId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9.-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Community result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/community/invitations": {
      "get": {
        "operationId": "listInvitations",
        "summary": "List the caller's pending project invitations",
        "tags": ["community"],
        "security": [{ "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Community result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/community/profile": {
      "put": {
        "operationId": "updateCommunityProfile",
        "summary": "Update the caller's community profile",
        "tags": ["community"],
        "security": [{ "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Community result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/community/profiles/{handle}": {
      "get": {
        "operationId": "getCommunityProfile",
        "summary": "Read a public profile",
        "tags": ["community"],
        "security": [{}, { "sessionCookie": [] }],
        "parameters": [
          {
            "name": "handle",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-z0-9_.-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Community result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/community/profiles/{handle}/block": {
      "put": {
        "operationId": "setProfileBlock",
        "summary": "Block or unblock a profile",
        "tags": ["community"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "handle",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-z0-9_.-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Community result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/community/profiles/{handle}/collections": {
      "get": {
        "operationId": "listProfileCollections",
        "summary": "List a profile's collections",
        "tags": ["community"],
        "security": [{}, { "sessionCookie": [] }],
        "parameters": [
          {
            "name": "handle",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-z0-9_.-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Community result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/community/profiles/{handle}/follow": {
      "put": {
        "operationId": "setProfileFollow",
        "summary": "Follow or unfollow a profile",
        "tags": ["community"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "handle",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-z0-9_.-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Community result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/community/profiles/{handle}/followers": {
      "get": {
        "operationId": "listProfileFollowers",
        "summary": "List a profile's followers",
        "tags": ["community"],
        "security": [{}, { "sessionCookie": [] }],
        "parameters": [
          {
            "name": "handle",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-z0-9_.-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Community result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/community/profiles/{handle}/following": {
      "get": {
        "operationId": "listProfileFollowing",
        "summary": "List a profile's followed accounts",
        "tags": ["community"],
        "security": [{}, { "sessionCookie": [] }],
        "parameters": [
          {
            "name": "handle",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-z0-9_.-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Community result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/community/profiles/{handle}/likes": {
      "get": {
        "operationId": "listProfileLikes",
        "summary": "List Toys a profile liked",
        "tags": ["community"],
        "security": [{}, { "sessionCookie": [] }],
        "parameters": [
          {
            "name": "handle",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-z0-9_.-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Community result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/community/profiles/{handle}/toys": {
      "get": {
        "operationId": "listProfileToys",
        "summary": "List a profile's public Toys",
        "tags": ["community"],
        "security": [{}, { "sessionCookie": [] }],
        "parameters": [
          {
            "name": "handle",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-z0-9_.-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Community result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/community/projects/{projectId}/assets/{assetId}": {
      "get": {
        "operationId": "getSharedProjectAsset",
        "summary": "Download a shared project media asset",
        "tags": ["community"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9.-]+$" }
          },
          {
            "name": "assetId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-z][a-z0-9_-]{0,63}$" }
          }
        ],
        "responses": {
          "200": { "description": "Asset bytes (attachment)" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/community/projects/{projectId}/edits": {
      "post": {
        "operationId": "applyCollaborativeEdit",
        "summary": "Apply a collaborative project edit",
        "tags": ["community"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9.-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Community result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/community/projects/{projectId}/invitation": {
      "post": {
        "operationId": "respondProjectInvitation",
        "summary": "Accept or decline a project invitation",
        "tags": ["community"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9.-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Community result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/community/projects/{projectId}/members": {
      "post": {
        "operationId": "inviteProjectMember",
        "summary": "Invite a project member",
        "tags": ["community"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9.-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Community result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/community/projects/{projectId}/members/{accountId}": {
      "delete": {
        "operationId": "removeProjectMember",
        "summary": "Remove a project member",
        "tags": ["community"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9.-]+$" }
          },
          {
            "name": "accountId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Community result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/community/projects/{projectId}/presence": {
      "put": {
        "operationId": "updatePresence",
        "summary": "Publish collaboration presence",
        "tags": ["community"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9.-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Community result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/community/projects/{projectId}/presence/{sessionId}": {
      "delete": {
        "operationId": "leavePresence",
        "summary": "End a collaboration presence session",
        "tags": ["community"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9.-]+$" }
          },
          {
            "name": "sessionId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Community result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/community/projects/{projectId}/state": {
      "get": {
        "operationId": "getCollaborationState",
        "summary": "Read collaboration state since a source version",
        "tags": ["community"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9.-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Community result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/community/reports": {
      "post": {
        "operationId": "createReport",
        "summary": "Report content or an account",
        "tags": ["community"],
        "security": [{ "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Community result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      },
      "get": {
        "operationId": "listReports",
        "summary": "List reports for moderators",
        "tags": ["community"],
        "security": [{ "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Community result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/community/reports/{reportId}": {
      "patch": {
        "operationId": "reviewReport",
        "summary": "Review a report as a moderator",
        "tags": ["community"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "reportId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Community result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/community/shared": {
      "get": {
        "operationId": "listSharedProjects",
        "summary": "List projects shared with the caller",
        "tags": ["community"],
        "security": [{ "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Community result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/community/toys/{toyId}/likes": {
      "get": {
        "operationId": "getToyLikes",
        "summary": "Read like count and caller state for a Toy",
        "tags": ["community"],
        "security": [{}, { "sessionCookie": [] }],
        "parameters": [
          {
            "name": "toyId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9.-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Community result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      },
      "put": {
        "operationId": "setToyLike",
        "summary": "Like or unlike a Toy",
        "tags": ["community"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "toyId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9.-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Community result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/config": {
      "get": {
        "operationId": "getConfig",
        "summary": "Whether server text proposals are configured",
        "tags": ["system"],
        "security": [{}, { "sessionCookie": [] }, { "nativeBearer": [] }],
        "responses": {
          "200": { "description": "Public configuration" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session", "native"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/connections": {
      "get": {
        "operationId": "listConnections",
        "summary": "List connected services (labels and scopes, never tokens)",
        "tags": ["connections"],
        "security": [{ "sessionCookie": [] }],
        "responses": {
          "200": {
            "description": "List connected services (labels and scopes, never tokens)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": ["available", "connections"],
                  "properties": {
                    "available": {
                      "type": "object",
                      "properties": { "google-drive": { "type": "boolean" } }
                    },
                    "connections": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "required": [
                          "id",
                          "provider",
                          "label",
                          "scopes",
                          "createdAt",
                          "lastUsedAt"
                        ],
                        "properties": {
                          "id": { "type": "string" },
                          "provider": {
                            "type": "string",
                            "enum": ["google-drive"]
                          },
                          "label": { "type": "string" },
                          "scopes": {
                            "type": "array",
                            "items": { "type": "string" }
                          },
                          "createdAt": { "type": "string" },
                          "lastUsedAt": { "type": ["string", "null"] }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/connections/{id}": {
      "delete": {
        "operationId": "deleteConnection",
        "summary": "Disconnect a service and revoke its grant at the provider",
        "tags": ["connections"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[0-9a-f-]{36}$" }
          }
        ],
        "responses": {
          "200": { "description": "Disconnected" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/connections/{id}/files": {
      "get": {
        "operationId": "listDriveFiles",
        "summary": "List app-visible Drive files (parent, name search, page token)",
        "tags": ["connections"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[0-9a-f-]{36}$" }
          },
          {
            "name": "parent",
            "in": "query",
            "required": false,
            "schema": { "type": "string" }
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "schema": { "type": "string", "maxLength": 200 }
          },
          {
            "name": "pageToken",
            "in": "query",
            "required": false,
            "schema": { "type": "string" }
          },
          {
            "name": "pageSize",
            "in": "query",
            "required": false,
            "schema": { "type": "integer", "minimum": 1, "maximum": 100 }
          }
        ],
        "responses": {
          "200": {
            "description": "List app-visible Drive files (parent, name search, page token)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": ["files", "nextPageToken"],
                  "properties": {
                    "files": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": true
                      }
                    },
                    "nextPageToken": { "type": ["string", "null"] }
                  }
                }
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      },
      "post": {
        "operationId": "createDriveFile",
        "summary": "Create a Drive file from the raw request body (≤ 64 MiB); name, mimeType and parent in the query",
        "tags": ["connections"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[0-9a-f-]{36}$" }
          },
          {
            "name": "name",
            "in": "query",
            "required": true,
            "schema": { "type": "string", "maxLength": 255 }
          },
          {
            "name": "mimeType",
            "in": "query",
            "required": false,
            "schema": { "type": "string" }
          },
          {
            "name": "parent",
            "in": "query",
            "required": false,
            "schema": { "type": "string" }
          }
        ],
        "responses": {
          "201": {
            "description": "Create a Drive file from the raw request body (≤ 64 MiB); name, mimeType and parent in the query",
            "content": {
              "application/json": {
                "schema": { "type": "object", "additionalProperties": true }
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/connections/{id}/files/{fileId}": {
      "get": {
        "operationId": "getDriveFile",
        "summary": "Read Drive file metadata",
        "tags": ["connections"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[0-9a-f-]{36}$" }
          },
          {
            "name": "fileId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[A-Za-z0-9_-]{1,256}$" }
          }
        ],
        "responses": {
          "200": {
            "description": "Read Drive file metadata",
            "content": {
              "application/json": {
                "schema": { "type": "object", "additionalProperties": true }
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      },
      "patch": {
        "operationId": "updateDriveFile",
        "summary": "Rename (JSON { name }) or replace the bytes (raw body ≤ 64 MiB) of a Drive file",
        "tags": ["connections"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[0-9a-f-]{36}$" }
          },
          {
            "name": "fileId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[A-Za-z0-9_-]{1,256}$" }
          }
        ],
        "responses": {
          "200": {
            "description": "Rename (JSON { name }) or replace the bytes (raw body ≤ 64 MiB) of a Drive file",
            "content": {
              "application/json": {
                "schema": { "type": "object", "additionalProperties": true }
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      },
      "delete": {
        "operationId": "deleteDriveFile",
        "summary": "Delete a Drive file the app can see",
        "tags": ["connections"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[0-9a-f-]{36}$" }
          },
          {
            "name": "fileId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[A-Za-z0-9_-]{1,256}$" }
          }
        ],
        "responses": {
          "200": { "description": "Deleted" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/connections/{id}/files/{fileId}/content": {
      "get": {
        "operationId": "downloadDriveFile",
        "summary": "Stream Drive file bytes (≤ 64 MiB)",
        "tags": ["connections"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[0-9a-f-]{36}$" }
          },
          {
            "name": "fileId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[A-Za-z0-9_-]{1,256}$" }
          }
        ],
        "responses": {
          "200": { "description": "File bytes" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/connections/{id}/picker": {
      "get": {
        "operationId": "getDrivePicker",
        "summary": "Short-lived drive.file access token and Picker settings for the Google Drive picker",
        "tags": ["connections"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[0-9a-f-]{36}$" }
          }
        ],
        "responses": {
          "200": {
            "description": "Short-lived drive.file access token and Picker settings for the Google Drive picker",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "accessToken",
                    "expiresAt",
                    "developerKey",
                    "appId"
                  ],
                  "properties": {
                    "accessToken": { "type": "string" },
                    "expiresAt": { "type": "string" },
                    "developerKey": { "type": "string" },
                    "appId": { "type": "string" }
                  }
                }
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/connections/{provider}/start": {
      "post": {
        "operationId": "startConnection",
        "summary": "Start Google Drive consent (drive.file, offline) for this account",
        "tags": ["connections"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "provider",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^google-drive$" }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "returnTo": { "type": "string", "maxLength": 2048 }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Start Google Drive consent (drive.file, offline) for this account",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": ["url"],
                  "properties": { "url": { "type": "string" } }
                }
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/creators": {
      "get": {
        "operationId": "listCreators",
        "summary": "Creators with public Toys, sounds or chains: counts, filter by what they publish, sort by followers or newest",
        "tags": ["community"],
        "security": [{}, { "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Creator page" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 2
      }
    },
    "/v1/developer/apps": {
      "get": {
        "operationId": "listDeveloperApps",
        "summary": "List the caller's developer apps",
        "tags": ["developer"],
        "security": [{ "sessionCookie": [] }],
        "responses": {
          "200": {
            "description": "List the caller's developer apps",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": ["apps"],
                  "properties": {
                    "apps": {
                      "type": "array",
                      "items": { "$ref": "#/components/schemas/DeveloperApp" }
                    }
                  }
                }
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      },
      "post": {
        "operationId": "createDeveloperApp",
        "summary": "Create a developer app (at most 10 per account)",
        "tags": ["developer"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [{ "$ref": "#/components/parameters/IdempotencyKey" }],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": ["name"],
                "additionalProperties": false,
                "properties": {
                  "name": { "type": "string", "minLength": 1, "maxLength": 64 },
                  "description": { "type": "string", "maxLength": 500 },
                  "homepage": {
                    "type": ["string", "null"],
                    "pattern": "^https://"
                  },
                  "publisherId": { "type": ["string", "null"] }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Create a developer app (at most 10 per account)",
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/DeveloperApp" }
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/developer/apps/{appId}": {
      "get": {
        "operationId": "getDeveloperApp",
        "summary": "Read one app with its effective tier",
        "tags": ["developer"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "appId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Read one app with its effective tier",
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/DeveloperApp" }
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      },
      "patch": {
        "operationId": "updateDeveloperApp",
        "summary": "Update app fields at an expected version",
        "tags": ["developer"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "appId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": ["expectedVersion"],
                "additionalProperties": false,
                "properties": {
                  "expectedVersion": { "type": "integer", "minimum": 1 },
                  "name": { "type": "string", "minLength": 1, "maxLength": 64 },
                  "description": { "type": "string", "maxLength": 500 },
                  "homepage": {
                    "type": ["string", "null"],
                    "pattern": "^https://"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Update app fields at an expected version",
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/DeveloperApp" }
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      },
      "delete": {
        "operationId": "deleteDeveloperApp",
        "summary": "Delete an app; revokes its keys and disables its webhooks",
        "tags": ["developer"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "appId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          }
        ],
        "responses": {
          "200": { "description": "Deleted" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/developer/apps/{appId}/audit": {
      "get": {
        "operationId": "listDeveloperAudit",
        "summary": "Recent audit events of one app, newest first",
        "tags": ["developer"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "appId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          }
        ],
        "responses": {
          "200": { "description": "Audit events" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/developer/apps/{appId}/keys": {
      "get": {
        "operationId": "listApiKeys",
        "summary": "Key metadata for one app; never secrets",
        "tags": ["developer"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "appId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Key metadata for one app; never secrets",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": ["keys"],
                  "properties": {
                    "keys": {
                      "type": "array",
                      "items": { "$ref": "#/components/schemas/ApiKey" }
                    }
                  }
                }
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      },
      "post": {
        "operationId": "createApiKey",
        "summary": "Create a key; the secret is returned once",
        "tags": ["developer"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "appId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": ["name", "scopes"],
                "additionalProperties": false,
                "properties": {
                  "name": { "type": "string", "minLength": 1, "maxLength": 64 },
                  "scopes": { "$ref": "#/components/schemas/ApiKeyScopes" },
                  "expiresInDays": { "enum": [30, 90, 365] },
                  "ipAllowlist": {
                    "type": "array",
                    "maxItems": 16,
                    "items": { "type": "string" }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Create a key; the secret is returned once",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": ["key", "secret"],
                  "properties": {
                    "key": { "$ref": "#/components/schemas/ApiKey" },
                    "secret": {
                      "type": "string",
                      "pattern": "^tt_[a-z2-7]{8}_[A-Za-z0-9_-]{49}$",
                      "description": "The full key. Shown once; store it in a secret manager."
                    }
                  }
                }
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/developer/apps/{appId}/tier": {
      "get": {
        "operationId": "getDeveloperTier",
        "summary": "Effective tier, its limits and whether an upgrade can be purchased",
        "tags": ["developer"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "appId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          }
        ],
        "responses": {
          "200": { "description": "Tier and limits" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/developer/apps/{appId}/usage": {
      "get": {
        "operationId": "getApiUsage",
        "summary": "Hourly or daily usage series with per-key totals",
        "tags": ["developer"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["read:usage"] },
          { "apiKeyHeader": ["read:usage"] }
        ],
        "parameters": [
          {
            "name": "appId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          },
          {
            "name": "range",
            "in": "query",
            "required": false,
            "schema": { "enum": ["24h", "7d", "30d", "90d"] }
          },
          {
            "name": "granularity",
            "in": "query",
            "required": false,
            "schema": { "enum": ["hour", "day"] }
          }
        ],
        "responses": {
          "200": {
            "description": "Hourly or daily usage series with per-key totals",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/ApiUsage" }
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["read:usage"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/developer/apps/{appId}/usage.csv": {
      "get": {
        "operationId": "exportApiUsage",
        "summary": "Hourly usage as CSV (UTC, at most 90 days)",
        "tags": ["developer"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "appId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "text/csv: window_start,key_prefix,requests,rejected,bytes_out"
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/developer/apps/{appId}/webhooks": {
      "get": {
        "operationId": "listWebhooks",
        "summary": "Webhooks of one app",
        "tags": ["developer"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "appId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Webhooks of one app",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": ["webhooks"],
                  "properties": {
                    "webhooks": {
                      "type": "array",
                      "items": { "$ref": "#/components/schemas/Webhook" }
                    }
                  }
                }
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      },
      "post": {
        "operationId": "createWebhook",
        "summary": "Create a webhook (pro); sends a verification challenge",
        "tags": ["developer"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "appId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": ["url", "events"],
                "additionalProperties": false,
                "properties": {
                  "url": {
                    "type": "string",
                    "pattern": "^https://",
                    "maxLength": 2048
                  },
                  "events": {
                    "type": "array",
                    "minItems": 1,
                    "items": {
                      "enum": [
                        "version_published",
                        "listing_updated",
                        "review_created",
                        "purchase_completed",
                        "update_feed_changed"
                      ]
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Create a webhook (pro); sends a verification challenge",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": ["webhook", "secret"],
                  "properties": {
                    "webhook": { "$ref": "#/components/schemas/Webhook" },
                    "secret": {
                      "type": "string",
                      "description": "Signing secret, shown once."
                    }
                  }
                }
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/developer/deliveries/{deliveryId}/redeliver": {
      "post": {
        "operationId": "redeliverWebhook",
        "summary": "Queue another attempt of a delivered or failed event",
        "tags": ["developer"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "deliveryId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          }
        ],
        "responses": {
          "202": { "description": "Queued" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/developer/key": {
      "get": {
        "operationId": "getCurrentApiKey",
        "summary": "Introspect the presenting key: app, scopes, tier and expiry",
        "tags": ["developer"],
        "security": [{ "apiKey": [] }, { "apiKeyHeader": [] }],
        "responses": {
          "200": {
            "description": "Key, app and tier",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["key"],
        "x-tunetoys-rate-bucket": null,
        "x-tunetoys-cost": 0
      }
    },
    "/v1/developer/key/revoke": {
      "post": {
        "operationId": "revokeCurrentApiKey",
        "summary": "Self-revocation for leak response",
        "tags": ["developer"],
        "security": [{ "apiKey": [] }, { "apiKeyHeader": [] }],
        "responses": {
          "200": {
            "description": "Revoked",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["key"],
        "x-tunetoys-rate-bucket": null,
        "x-tunetoys-cost": 0
      }
    },
    "/v1/developer/keys/{keyId}": {
      "patch": {
        "operationId": "updateApiKey",
        "summary": "Rename a key, change its scopes or IP allowlist",
        "tags": ["developer"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "keyId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": ["expectedVersion"],
                "additionalProperties": false,
                "properties": {
                  "expectedVersion": { "type": "integer", "minimum": 1 },
                  "name": { "type": "string", "minLength": 1, "maxLength": 64 },
                  "scopes": { "$ref": "#/components/schemas/ApiKeyScopes" },
                  "ipAllowlist": {
                    "type": "array",
                    "maxItems": 16,
                    "items": { "type": "string" }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Rename a key, change its scopes or IP allowlist",
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/ApiKey" }
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/developer/keys/{keyId}/revoke": {
      "post": {
        "operationId": "revokeApiKey",
        "summary": "Revoke a key immediately",
        "tags": ["developer"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "keyId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Revoke a key immediately",
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/ApiKey" }
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/developer/keys/{keyId}/rotate": {
      "post": {
        "operationId": "rotateApiKey",
        "summary": "Issue a replacement key; the old key keeps working for the overlap",
        "tags": ["developer"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "keyId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "overlapHours": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 168
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Issue a replacement key; the old key keeps working for the overlap",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": ["key", "secret"],
                  "properties": {
                    "key": { "$ref": "#/components/schemas/ApiKey" },
                    "secret": {
                      "type": "string",
                      "pattern": "^tt_[a-z2-7]{8}_[A-Za-z0-9_-]{49}$",
                      "description": "The full key. Shown once; store it in a secret manager."
                    }
                  }
                }
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/developer/limits": {
      "get": {
        "operationId": "getRateLimits",
        "summary": "Current bucket and quota state for a key, or the tier policies",
        "tags": ["developer"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": [] },
          { "apiKeyHeader": [] }
        ],
        "responses": {
          "200": {
            "description": "Limit state",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-rate-bucket": null,
        "x-tunetoys-cost": 0
      }
    },
    "/v1/developer/scopes": {
      "get": {
        "operationId": "listApiKeyScopes",
        "summary": "Scopes a key may hold, with descriptions",
        "tags": ["developer"],
        "security": [
          {},
          { "sessionCookie": [] },
          { "apiKey": [] },
          { "apiKeyHeader": [] }
        ],
        "responses": {
          "200": {
            "description": "Scopes a key may hold, with descriptions",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": ["scopes"],
                  "properties": {
                    "scopes": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "required": ["scope", "description"],
                        "properties": {
                          "scope": {
                            "$ref": "#/components/schemas/PlatformEnums/$defs/ApiKeyScope"
                          },
                          "description": { "type": "string" }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session", "key"],
        "x-tunetoys-rate-bucket": null,
        "x-tunetoys-cost": 0
      }
    },
    "/v1/developer/webhooks/{webhookId}": {
      "patch": {
        "operationId": "updateWebhook",
        "summary": "Change events, URL or state; URL changes and re-enabling re-verify",
        "tags": ["developer"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "webhookId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": ["expectedVersion"],
                "additionalProperties": false,
                "properties": {
                  "expectedVersion": { "type": "integer", "minimum": 1 },
                  "url": {
                    "type": "string",
                    "pattern": "^https://",
                    "maxLength": 2048
                  },
                  "events": {
                    "type": "array",
                    "minItems": 1,
                    "items": {
                      "enum": [
                        "version_published",
                        "listing_updated",
                        "review_created",
                        "purchase_completed",
                        "update_feed_changed"
                      ]
                    }
                  },
                  "state": { "enum": ["active", "disabled"] }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Change events, URL or state; URL changes and re-enabling re-verify",
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/Webhook" }
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/developer/webhooks/{webhookId}/deliveries": {
      "get": {
        "operationId": "listWebhookDeliveries",
        "summary": "Delivery log: one row per attempt, newest first",
        "tags": ["developer"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "webhookId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          }
        ],
        "responses": {
          "200": { "description": "Deliveries" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/developer/webhooks/{webhookId}/test": {
      "post": {
        "operationId": "testWebhook",
        "summary": "Queue a signed webhook.test delivery",
        "tags": ["developer"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "webhookId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          }
        ],
        "responses": {
          "202": { "description": "Queued test event" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "expensive",
        "x-tunetoys-cost": 25
      }
    },
    "/v1/developer/webhooks/{webhookId}/verify": {
      "post": {
        "operationId": "verifyWebhook",
        "summary": "Resend the verification challenge",
        "tags": ["developer"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "webhookId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resend the verification challenge",
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/Webhook" }
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/distribution/keys": {
      "get": {
        "operationId": "listDistributionKeys",
        "summary": "Public Ed25519 keys by purpose (diagnostics; clients pin keys)",
        "tags": ["distribution"],
        "security": [{}, { "sessionCookie": [] }, { "nativeBearer": [] }],
        "responses": {
          "200": { "description": "Keys" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session", "native"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/downloads/{ticketId}": {
      "get": {
        "operationId": "downloadTicketBytes",
        "summary": "Artifact bytes for a ticket token (`?t=`): single Range, ETag digest, Repr-Digest",
        "tags": ["distribution"],
        "security": [{}, { "sessionCookie": [] }, { "nativeBearer": [] }],
        "parameters": [
          {
            "name": "ticketId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Artifact bytes" },
          "206": { "description": "Partial artifact bytes" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": {
            "description": "ENTITLEMENT_REVOKED, DEVICE_MISMATCH or TICKET_EXHAUSTED"
          },
          "404": { "$ref": "#/components/responses/NotFound" },
          "410": { "description": "TICKET_EXPIRED or TICKET_USED" },
          "416": { "description": "RANGE_INVALID" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session", "native"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/email/unsubscribe": {
      "get": {
        "operationId": "getEmailUnsubscribe",
        "summary": "Browser page that confirms an email unsubscribe; never mutates",
        "tags": ["email"],
        "security": [{}, { "sessionCookie": [] }],
        "responses": {
          "200": { "description": "HTML confirmation page" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "description": "Unknown or expired token" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      },
      "post": {
        "operationId": "postEmailUnsubscribe",
        "summary": "RFC 8058 one-click and page unsubscribe for one token scope",
        "tags": ["email"],
        "security": [{}],
        "responses": {
          "200": { "description": "Unsubscribed" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "description": "Unknown or expired token" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/embed/events": {
      "post": {
        "operationId": "recordEmbedPlay",
        "summary": "Count one in-frame play (bounded daily counter, no viewer data)",
        "tags": ["embed"],
        "security": [{}],
        "responses": {
          "202": { "description": "Accepted" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous"],
        "x-tunetoys-rate-bucket": null,
        "x-tunetoys-cost": 0
      }
    },
    "/v1/exports": {
      "post": {
        "operationId": "createExport",
        "summary": "Queue a take render, Frame video or screen-recording transcode",
        "tags": ["exports"],
        "security": [{ "sessionCookie": [] }],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": ["kind", "input"],
                "properties": {
                  "kind": {
                    "enum": ["take-audio", "take-video", "capture-transcode"]
                  },
                  "input": {
                    "type": "object",
                    "description": "Exactly one of `take` (inline, at most 8 MiB) or `mediaVersion`.",
                    "properties": {
                      "take": { "type": "object" },
                      "mediaVersion": { "type": "string" }
                    }
                  },
                  "format": { "enum": ["wav", "mp3", "ogg", "flac"] },
                  "preset": {
                    "enum": [
                      "youtube",
                      "shorts",
                      "instagram-square",
                      "x",
                      "web"
                    ]
                  },
                  "loudness": {
                    "type": "number",
                    "minimum": -30,
                    "maximum": -5
                  },
                  "sampleRate": { "enum": [44100, 48000, 88200, 96000] }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Queue a take render, Frame video or screen-recording transcode",
            "content": {
              "application/json": {
                "schema": { "type": "object", "additionalProperties": true }
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "422": { "description": "Take, input or duration refused" },
          "429": { "description": "Daily budget or active job limit" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      },
      "get": {
        "operationId": "listExports",
        "summary": "The caller's 50 newest export and convert jobs",
        "tags": ["exports"],
        "security": [{ "sessionCookie": [] }],
        "responses": {
          "200": {
            "description": "The caller's 50 newest export and convert jobs",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "exports": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": true
                      }
                    }
                  }
                }
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/exports/{exportId}": {
      "get": {
        "operationId": "getExport",
        "summary": "Export state, progress, warnings, error class and output",
        "tags": ["exports"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "exportId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[0-9a-f-]{36}$" }
          }
        ],
        "responses": {
          "200": {
            "description": "Export state, progress, warnings, error class and output",
            "content": {
              "application/json": {
                "schema": { "type": "object", "additionalProperties": true }
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      },
      "delete": {
        "operationId": "cancelExport",
        "summary": "Cancel a queued or running export; finished jobs are unchanged",
        "tags": ["exports"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "exportId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[0-9a-f-]{36}$" }
          }
        ],
        "responses": {
          "200": {
            "description": "Cancel a queued or running export; finished jobs are unchanged",
            "content": {
              "application/json": {
                "schema": { "type": "object", "additionalProperties": true }
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/exports/{exportId}/output": {
      "get": {
        "operationId": "getExportOutput",
        "summary": "Download a finished export as a sandboxed attachment",
        "tags": ["exports"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "exportId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[0-9a-f-]{36}$" }
          }
        ],
        "responses": {
          "200": { "description": "Output bytes" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "description": "Not finished" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/health": {
      "get": {
        "operationId": "getHealth",
        "summary": "Readiness and engine ABI",
        "tags": ["system"],
        "security": [{}, { "sessionCookie": [] }, { "nativeBearer": [] }],
        "responses": {
          "200": { "description": "Ready" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" },
          "503": { "description": "Database unavailable" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session", "native"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/install/{product}/{version}": {
      "get": {
        "operationId": "getInstallPage",
        "summary": "Install deep-link fallback page (HTML)",
        "tags": ["distribution"],
        "security": [{}, { "sessionCookie": [] }, { "nativeBearer": [] }],
        "parameters": [
          {
            "name": "product",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          },
          {
            "name": "version",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^(?:stable|beta|[0-9A-Za-z.+-]{5,64})$"
            }
          }
        ],
        "responses": {
          "200": { "description": "HTML page" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session", "native"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/installations": {
      "get": {
        "operationId": "listInstallations",
        "summary": "Installation records for the caller, optionally per device or product",
        "tags": ["distribution"],
        "security": [{ "sessionCookie": [] }, { "nativeBearer": [] }],
        "responses": {
          "200": { "description": "Installations" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "native"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      },
      "post": {
        "operationId": "recordInstallation",
        "summary": "Record a verified install on a Player or Installer device",
        "tags": ["distribution"],
        "security": [{ "sessionCookie": [] }, { "nativeBearer": [] }],
        "responses": {
          "200": { "description": "Existing installation updated" },
          "201": { "description": "Installation" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "native"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/installations/{id}": {
      "put": {
        "operationId": "updateInstallation",
        "summary": "Change state or version, report last seen, or roll back",
        "tags": ["distribution"],
        "security": [{ "sessionCookie": [] }, { "nativeBearer": [] }],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Installation" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": {
            "description": "INSTALLATION_STATE, NO_PREVIOUS_VERSION or VERSION_CONFLICT"
          },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "native"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/library": {
      "get": {
        "operationId": "listLibrary",
        "summary": "List the caller's library",
        "tags": ["library"],
        "security": [
          { "sessionCookie": [] },
          { "nativeBearer": [] },
          { "apiKey": ["read:library"] },
          { "apiKeyHeader": ["read:library"] }
        ],
        "responses": {
          "200": {
            "description": "Library items",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "native", "key"],
        "x-tunetoys-scopes": ["read:library"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 2
      }
    },
    "/v1/library/{itemId}": {
      "put": {
        "operationId": "annotateLibraryItem",
        "summary": "Write library bookmark, tags and pinned release",
        "tags": ["library"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["write:library"] },
          { "apiKeyHeader": ["write:library"] }
        ],
        "parameters": [
          {
            "name": "itemId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9.-]+$" }
          }
        ],
        "responses": {
          "200": {
            "description": "Library item",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["write:library"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      },
      "delete": {
        "operationId": "removeLibraryItem",
        "summary": "Remove a library item at an expected version",
        "tags": ["library"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["write:library"] },
          { "apiKeyHeader": ["write:library"] }
        ],
        "parameters": [
          {
            "name": "itemId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9.-]+$" }
          }
        ],
        "responses": {
          "200": {
            "description": "Removal",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["write:library"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/library/{itemId}/bookmark": {
      "put": {
        "operationId": "setLibraryBookmark",
        "summary": "Set the quick-bookmark flag",
        "tags": ["library"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["write:library"] },
          { "apiKeyHeader": ["write:library"] }
        ],
        "parameters": [
          {
            "name": "itemId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9.-]+$" }
          }
        ],
        "responses": {
          "200": {
            "description": "Library item",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["write:library"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/library/bookmarks": {
      "get": {
        "operationId": "getBookmarkStates",
        "summary": "Read quick-bookmark flags for listed Toys",
        "tags": ["library"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["read:library"] },
          { "apiKeyHeader": ["read:library"] }
        ],
        "responses": {
          "200": {
            "description": "Bookmark states",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["read:library"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/library/sync": {
      "get": {
        "operationId": "syncLibrary",
        "summary": "Read library events after a cursor",
        "tags": ["library"],
        "security": [
          { "sessionCookie": [] },
          { "nativeBearer": [] },
          { "apiKey": ["read:library"] },
          { "apiKeyHeader": ["read:library"] }
        ],
        "responses": {
          "200": {
            "description": "Library events",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "native", "key"],
        "x-tunetoys-scopes": ["read:library"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 2
      }
    },
    "/v1/listings/publishers": {
      "get": {
        "operationId": "listListingPublishers",
        "summary": "Publishers where the caller is an active member, with roles",
        "tags": ["listings"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["read:products"] },
          { "apiKeyHeader": ["read:products"] }
        ],
        "responses": {
          "200": {
            "description": "Publishers",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["read:products"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/media": {
      "get": {
        "operationId": "listMedia",
        "summary": "Search visible media (alias of GET /v1/sounds in the pre-0.0.8 item shape; kind= filters by family)",
        "tags": ["media"],
        "security": [{}, { "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Media page" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/media/{mediaId}": {
      "get": {
        "operationId": "getMedia",
        "summary": "Read media metadata",
        "tags": ["media"],
        "security": [{}, { "sessionCookie": [] }],
        "parameters": [
          {
            "name": "mediaId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Media item" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/media/{mediaId}/bytes": {
      "get": {
        "operationId": "getMediaBytes",
        "summary": "Download media bytes as a sandboxed attachment",
        "tags": ["media"],
        "security": [{}, { "sessionCookie": [] }],
        "parameters": [
          {
            "name": "mediaId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Media bytes" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/media/{mediaId}/convert": {
      "post": {
        "operationId": "convertMedia",
        "summary": "Queue a conversion of a library item into a new private library item",
        "tags": ["media", "exports"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "mediaId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": ["format"],
                "properties": {
                  "format": {
                    "enum": [
                      "wav",
                      "mp3",
                      "ogg",
                      "flac",
                      "mp4",
                      "webm",
                      "csv",
                      "tsv",
                      "json",
                      "ndjson"
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Queue a conversion of a library item into a new private library item",
            "content": {
              "application/json": {
                "schema": { "type": "object", "additionalProperties": true }
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "422": { "description": "Not convertible to that format" },
          "429": { "description": "Daily budget or active job limit" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/media/upload-access": {
      "get": {
        "operationId": "getMediaUploadAccess",
        "summary": "Read the caller's upload permission and policy mode",
        "tags": ["media"],
        "security": [{}, { "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Upload access" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/media/uploads": {
      "post": {
        "operationId": "beginMediaUpload",
        "summary": "Reserve an upload with its transfer facts, rights and catalog metadata in one request",
        "tags": ["media"],
        "security": [{ "sessionCookie": [] }],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "title",
                  "mediaType",
                  "sizeBytes",
                  "sha256",
                  "license",
                  "attribution",
                  "reusable",
                  "visibility"
                ],
                "additionalProperties": false,
                "properties": {
                  "title": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 128
                  },
                  "mediaType": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 128
                  },
                  "sizeBytes": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 16777216
                  },
                  "sha256": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
                  "filename": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 255
                  },
                  "license": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 128
                  },
                  "attribution": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 1024
                  },
                  "reusable": { "type": "boolean" },
                  "visibility": {
                    "$ref": "#/components/schemas/PlatformEnums/$defs/Visibility"
                  },
                  "tags": {
                    "type": "array",
                    "maxItems": 20,
                    "items": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 40
                    }
                  },
                  "artist": { "type": "string", "maxLength": 128 },
                  "description": { "type": "string", "maxLength": 4000 },
                  "soundType": {
                    "anyOf": [
                      {
                        "$ref": "#/components/schemas/PlatformEnums/$defs/SoundType"
                      },
                      { "type": "null" }
                    ]
                  },
                  "artwork": {
                    "anyOf": [
                      {
                        "$ref": "#/components/schemas/SoundItem/$defs/Artwork"
                      },
                      { "type": "null" }
                    ]
                  },
                  "declared": {
                    "$ref": "#/components/schemas/SoundItem/$defs/DeclaredMetadata"
                  },
                  "recordedAt": {
                    "type": ["string", "null"],
                    "minLength": 4,
                    "maxLength": 64
                  },
                  "recordedLocation": {
                    "anyOf": [
                      {
                        "$ref": "#/components/schemas/SoundItem/$defs/RecordedLocation"
                      },
                      { "type": "null" }
                    ]
                  },
                  "source": {
                    "anyOf": [
                      {
                        "$ref": "#/components/schemas/SoundItem/$defs/SoundSource"
                      },
                      { "type": "null" }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": { "description": "Upload reservation" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/media/uploads/{uploadId}/complete": {
      "post": {
        "operationId": "completeMediaUpload",
        "summary": "Verify and publish an uploaded media version",
        "tags": ["media"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "uploadId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Media item" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/native/authorize": {
      "get": {
        "operationId": "validateNativeAuthorization",
        "summary": "Validate a Player authorization request and loopback callback",
        "tags": ["native"],
        "security": [{}, { "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Validated request" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      },
      "post": {
        "operationId": "authorizeNativeClient",
        "summary": "Consent to a Player request and issue a short-lived code",
        "tags": ["native"],
        "security": [{ "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Authorization code and callback" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/native/devices": {
      "get": {
        "operationId": "listNativeDevices",
        "summary": "List the caller's authorized Player devices",
        "tags": ["native"],
        "security": [{ "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Devices" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/native/devices/{deviceId}/revoke": {
      "post": {
        "operationId": "revokeNativeDevice",
        "summary": "Revoke an owned Player device",
        "tags": ["native"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "deviceId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Revocation" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/network/allowlist": {
      "get": {
        "operationId": "getNetworkAllowlist",
        "summary": "Read the extra exact hosts this account allows for web nodes",
        "tags": ["connections"],
        "security": [{ "sessionCookie": [] }],
        "responses": {
          "200": {
            "description": "Read the extra exact hosts this account allows for web nodes",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": ["hosts"],
                  "properties": {
                    "hosts": {
                      "type": "array",
                      "maxItems": 32,
                      "items": {
                        "type": "string",
                        "minLength": 4,
                        "maxLength": 253
                      }
                    }
                  },
                  "additionalProperties": false
                }
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      },
      "put": {
        "operationId": "putNetworkAllowlist",
        "summary": "Replace the account network allowlist (exact hosts, at most 32; private ranges stay refused)",
        "tags": ["connections"],
        "security": [{ "sessionCookie": [] }],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": ["hosts"],
                "properties": {
                  "hosts": {
                    "type": "array",
                    "maxItems": 32,
                    "items": {
                      "type": "string",
                      "minLength": 4,
                      "maxLength": 253
                    }
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Replace the account network allowlist (exact hosts, at most 32; private ranges stay refused)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": ["hosts"],
                  "properties": {
                    "hosts": {
                      "type": "array",
                      "maxItems": 32,
                      "items": {
                        "type": "string",
                        "minLength": 4,
                        "maxLength": 253
                      }
                    }
                  },
                  "additionalProperties": false
                }
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/notifications": {
      "get": {
        "operationId": "listNotifications",
        "summary": "Page of the caller's rendered notifications (ETag)",
        "tags": ["notifications"],
        "security": [{ "sessionCookie": [] }, { "nativeBearer": [] }],
        "responses": {
          "200": { "description": "Notification result" },
          "304": { "description": "Not modified" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "native"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/notifications/{notificationId}/dismiss": {
      "post": {
        "operationId": "dismissNotification",
        "summary": "Dismiss one notification from every filter",
        "tags": ["notifications"],
        "security": [{ "sessionCookie": [] }, { "nativeBearer": [] }],
        "parameters": [
          {
            "name": "notificationId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[A-Za-z0-9_-]{1,128}$" }
          }
        ],
        "responses": {
          "200": { "description": "Notification result" },
          "304": { "description": "Not modified" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "native"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/notifications/{notificationId}/unread": {
      "post": {
        "operationId": "markNotificationUnread",
        "summary": "Mark one notification unread",
        "tags": ["notifications"],
        "security": [{ "sessionCookie": [] }, { "nativeBearer": [] }],
        "parameters": [
          {
            "name": "notificationId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[A-Za-z0-9_-]{1,128}$" }
          }
        ],
        "responses": {
          "200": { "description": "Notification result" },
          "304": { "description": "Not modified" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "native"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/notifications/channels/{channel}": {
      "put": {
        "operationId": "setNotificationChannel",
        "summary": "Digest cadence and quiet hours for one channel",
        "tags": ["notifications"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "channel",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^email|web_push$" }
          }
        ],
        "responses": {
          "200": { "description": "Notification result" },
          "304": { "description": "Not modified" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/notifications/preferences": {
      "get": {
        "operationId": "getNotificationPreferences",
        "summary": "Event × channel matrix, digests, quiet hours and channel availability",
        "tags": ["notifications"],
        "security": [{ "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Notification result" },
          "304": { "description": "Not modified" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      },
      "put": {
        "operationId": "setNotificationPreferences",
        "summary": "Change matrix cells; required events cannot be disabled",
        "tags": ["notifications"],
        "security": [{ "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Notification result" },
          "304": { "description": "Not modified" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/notifications/read": {
      "post": {
        "operationId": "markNotificationsRead",
        "summary": "Mark notifications read by id, or all in a filter",
        "tags": ["notifications"],
        "security": [{ "sessionCookie": [] }, { "nativeBearer": [] }],
        "responses": {
          "200": { "description": "Notification result" },
          "304": { "description": "Not modified" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "native"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/notifications/test": {
      "post": {
        "operationId": "sendTestNotification",
        "summary": "Send a test notification by email or web push (3 per hour)",
        "tags": ["notifications"],
        "security": [{ "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Notification result" },
          "304": { "description": "Not modified" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/notifications/unread-count": {
      "get": {
        "operationId": "countUnreadNotifications",
        "summary": "Unread notification count for polling (ETag)",
        "tags": ["notifications"],
        "security": [{ "sessionCookie": [] }, { "nativeBearer": [] }],
        "responses": {
          "200": { "description": "Notification result" },
          "304": { "description": "Not modified" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "native"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/offers/{offerId}": {
      "patch": {
        "operationId": "setOfferState",
        "summary": "Activate or deactivate a creator offer",
        "tags": ["publishers"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "offerId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]{1,64}$" }
          }
        ],
        "responses": {
          "200": { "description": "Offer" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/openapi.json": {
      "get": {
        "operationId": "getOpenApi",
        "summary": "This OpenAPI 3.1 document",
        "tags": ["developer"],
        "security": [
          {},
          { "sessionCookie": [] },
          { "nativeBearer": [] },
          { "apiKey": [] },
          { "apiKeyHeader": [] }
        ],
        "responses": {
          "200": {
            "description": "OpenAPI 3.1 document",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "304": { "description": "Not modified" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session", "native", "key"],
        "x-tunetoys-rate-bucket": null,
        "x-tunetoys-cost": 0
      }
    },
    "/v1/platform/targets": {
      "get": {
        "operationId": "listPlatformTargets",
        "summary": "The 13 target profiles with buildable formats and builder status",
        "tags": ["versions"],
        "security": [{}, { "sessionCookie": [] }, { "nativeBearer": [] }],
        "responses": {
          "200": { "description": "Target profile table" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session", "native"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/posts": {
      "get": {
        "operationId": "listPosts",
        "summary": "List root posts of a subject with inline replies",
        "tags": ["posts"],
        "security": [{}, { "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Post result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      },
      "post": {
        "operationId": "createPost",
        "summary": "Create a comment or reply",
        "tags": ["posts"],
        "security": [{ "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Post result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/posts/{postId}": {
      "get": {
        "operationId": "getPost",
        "summary": "Read a post with its visible replies",
        "tags": ["posts"],
        "security": [{}, { "sessionCookie": [] }],
        "parameters": [
          {
            "name": "postId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]{1,64}$" }
          }
        ],
        "responses": {
          "200": { "description": "Post result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      },
      "patch": {
        "operationId": "editPost",
        "summary": "Edit a post or resolve a project note",
        "tags": ["posts"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "postId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]{1,64}$" }
          }
        ],
        "responses": {
          "200": { "description": "Post result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      },
      "delete": {
        "operationId": "removePost",
        "summary": "Remove a post, leaving a tombstone",
        "tags": ["posts"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "postId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]{1,64}$" }
          }
        ],
        "responses": {
          "200": { "description": "Post result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/posts/{postId}/moderation": {
      "post": {
        "operationId": "moderatePost",
        "summary": "Remove, restore or clear the verified flag of a post (moderator)",
        "tags": ["posts"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "postId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]{1,64}$" }
          }
        ],
        "responses": {
          "200": { "description": "Post result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/posts/{postId}/pin": {
      "put": {
        "operationId": "setPostPin",
        "summary": "Pin or unpin a root post (subject owner, at most three)",
        "tags": ["posts"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "postId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]{1,64}$" }
          }
        ],
        "responses": {
          "200": { "description": "Post result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/posts/{postId}/reactions/{kind}": {
      "put": {
        "operationId": "setPostReaction",
        "summary": "Set or clear a like or helpful vote",
        "tags": ["posts"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "postId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]{1,64}$" }
          },
          {
            "name": "kind",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^like|helpful$" }
          }
        ],
        "responses": {
          "200": { "description": "Post result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/posts/{postId}/replies": {
      "get": {
        "operationId": "listPostReplies",
        "summary": "List every visible reply below a post",
        "tags": ["posts"],
        "security": [{}, { "sessionCookie": [] }],
        "parameters": [
          {
            "name": "postId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]{1,64}$" }
          }
        ],
        "responses": {
          "200": { "description": "Post result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/posts/{postId}/response": {
      "put": {
        "operationId": "savePublisherResponse",
        "summary": "Create or edit the publisher response to a review",
        "tags": ["posts"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "postId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]{1,64}$" }
          }
        ],
        "responses": {
          "200": { "description": "Post result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/posts/{postId}/revisions": {
      "get": {
        "operationId": "listPostRevisions",
        "summary": "List prior versions of a post (author or moderator)",
        "tags": ["posts"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "postId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]{1,64}$" }
          }
        ],
        "responses": {
          "200": { "description": "Post result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/products/{id}/aliases/{alias}": {
      "post": {
        "operationId": "moveProductAlias",
        "summary": "Move stable or beta with an expected-previous check",
        "tags": ["versions"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          },
          {
            "name": "alias",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^stable|beta$" }
          }
        ],
        "responses": {
          "200": { "description": "Product" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "description": "ALIAS_CONFLICT with the current target" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/products/{id}/certificate": {
      "post": {
        "operationId": "issueLicenseCertificate",
        "summary": "Issue a signed 30-day offline license certificate for an owned product",
        "tags": ["distribution"],
        "security": [{ "sessionCookie": [] }, { "nativeBearer": [] }],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "201": { "description": "Certificate envelope and state" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "description": "NO_LICENSE_GRANT" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "native"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/products/{id}/embed": {
      "get": {
        "operationId": "getProductEmbed",
        "summary": "Embed policy, origins, effective frame-ancestors and the Patch view opt-in",
        "tags": ["embed"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["read:products"] },
          { "apiKeyHeader": ["read:products"] }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Embed settings",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["read:products"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      },
      "patch": {
        "operationId": "updateProductEmbed",
        "summary": "Replace the embed policy and origin allowlist; optionally set the Patch view opt-in",
        "tags": ["embed"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["write:listings"] },
          { "apiKeyHeader": ["write:listings"] }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          },
          { "$ref": "#/components/parameters/IdempotencyKey" }
        ],
        "responses": {
          "200": {
            "description": "Embed settings",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "description": "Version conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "422": { "description": "Invalid origins" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["write:listings"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/products/{id}/embed/analytics": {
      "get": {
        "operationId": "getProductEmbedAnalytics",
        "summary": "Loads and plays per embedding origin for the last N days",
        "tags": ["embed"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["read:products"] },
          { "apiKeyHeader": ["read:products"] }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Bounded counters",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["read:products"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/products/{id}/feed/{channel}": {
      "get": {
        "operationId": "getUpdateFeed",
        "summary": "Signed update manifest (tunetoys.update-manifest/1) with its changelog text",
        "tags": ["distribution"],
        "security": [{}, { "sessionCookie": [] }, { "nativeBearer": [] }],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          },
          {
            "name": "channel",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^stable|beta$" }
          }
        ],
        "responses": {
          "200": { "description": "Envelope and changelog" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "description": "FEED_EMPTY" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session", "native"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/products/{id}/latest/{target}": {
      "get": {
        "operationId": "getLatestDesktopArtifact",
        "summary": "Latest installable desktop app artifact for macos, windows or linux (`?channel=`, Linux `?format=appimage|deb`)",
        "tags": ["distribution"],
        "security": [{}, { "sessionCookie": [] }, { "nativeBearer": [] }],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          },
          {
            "name": "target",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[^/]+$" }
          },
          {
            "name": "channel",
            "in": "query",
            "required": false,
            "schema": { "enum": ["stable", "beta"] }
          },
          {
            "name": "format",
            "in": "query",
            "required": false,
            "schema": { "enum": ["appimage", "deb"] }
          }
        ],
        "responses": {
          "200": { "description": "Version and artifact facts" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "description": "NOT_PUBLISHED or NOT_FOUND" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session", "native"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/products/{id}/versions": {
      "get": {
        "operationId": "listProductVersions",
        "summary": "List versions with matrix, artifacts and aliases (drafts for publisher members only)",
        "tags": ["versions"],
        "security": [{}, { "sessionCookie": [] }, { "nativeBearer": [] }],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Versions" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "description": "Unknown product" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session", "native"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      },
      "post": {
        "operationId": "createProductVersion",
        "summary": "Create a draft version pinned to project releases",
        "tags": ["versions"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["publish:releases"] },
          { "apiKeyHeader": ["publish:releases"] }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "201": {
            "description": "Draft version",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "description": "Validation" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "description": "Semver not increasing" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["publish:releases"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/products/{id}/versions/suggest": {
      "get": {
        "operationId": "suggestProductVersion",
        "summary": "Suggest the next semver from the public-control diff of the latest release",
        "tags": ["versions"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["publish:releases"] },
          { "apiKeyHeader": ["publish:releases"] }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "200": {
            "description": "Suggestion with added, removed and changed control IDs",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["publish:releases"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/products/{productId}/access": {
      "get": {
        "operationId": "getProductAccess",
        "summary": "The caller's access to a product's paid content",
        "tags": ["publishers"],
        "security": [{}, { "sessionCookie": [] }, { "nativeBearer": [] }],
        "parameters": [
          {
            "name": "productId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]{1,64}$" }
          }
        ],
        "responses": {
          "200": { "description": "Access level" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session", "native"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/products/{productId}/documents": {
      "get": {
        "operationId": "listListingDocuments",
        "summary": "Manuals, docs and FAQ documents",
        "tags": ["listings"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["read:products"] },
          { "apiKeyHeader": ["read:products"] }
        ],
        "parameters": [
          {
            "name": "productId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Documents",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["read:products"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      },
      "post": {
        "operationId": "createListingDocument",
        "summary": "Create a Markdown or PDF document",
        "tags": ["listings"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["write:listings"] },
          { "apiKeyHeader": ["write:listings"] }
        ],
        "parameters": [
          {
            "name": "productId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          },
          { "$ref": "#/components/parameters/IdempotencyKey" }
        ],
        "responses": {
          "200": {
            "description": "Document",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["write:listings"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/products/{productId}/documents/{documentId}": {
      "put": {
        "operationId": "updateListingDocument",
        "summary": "Update a document (title, slug, body, PDF or position)",
        "tags": ["listings"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["write:listings"] },
          { "apiKeyHeader": ["write:listings"] }
        ],
        "parameters": [
          {
            "name": "productId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          },
          {
            "name": "documentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          },
          { "$ref": "#/components/parameters/IdempotencyKey" }
        ],
        "responses": {
          "200": {
            "description": "Document",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["write:listings"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      },
      "delete": {
        "operationId": "deleteListingDocument",
        "summary": "Delete a document",
        "tags": ["listings"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["write:listings"] },
          { "apiKeyHeader": ["write:listings"] }
        ],
        "parameters": [
          {
            "name": "productId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          },
          {
            "name": "documentId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          },
          { "$ref": "#/components/parameters/IdempotencyKey" }
        ],
        "responses": {
          "200": {
            "description": "Deleted",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["write:listings"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/products/{productId}/listing": {
      "get": {
        "operationId": "getProductListing",
        "summary": "Listing, draft and published revisions, effective fields and checks",
        "tags": ["listings"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["read:products"] },
          { "apiKeyHeader": ["read:products"] }
        ],
        "parameters": [
          {
            "name": "productId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Listing editor state",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["read:products"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      },
      "patch": {
        "operationId": "updateProductListing",
        "summary": "Change listing visibility, default locale or product slug",
        "tags": ["listings"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "productId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          },
          { "$ref": "#/components/parameters/IdempotencyKey" }
        ],
        "responses": {
          "200": { "description": "Listing and product" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/products/{productId}/listing/assets": {
      "post": {
        "operationId": "attachListingAsset",
        "summary": "Attach an uploaded image as the thumbnail, social or marketing image",
        "tags": ["listings"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["write:listings"] },
          { "apiKeyHeader": ["write:listings"] }
        ],
        "parameters": [
          {
            "name": "productId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          },
          { "$ref": "#/components/parameters/IdempotencyKey" }
        ],
        "responses": {
          "200": {
            "description": "Listing asset",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["write:listings"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      },
      "get": {
        "operationId": "listListingAssets",
        "summary": "Generated listing asset slots with status, overrides, jobs and the daily budget",
        "tags": ["listings"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["read:products"] },
          { "apiKeyHeader": ["read:products"] }
        ],
        "parameters": [
          {
            "name": "productId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Asset slots",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["read:products"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/products/{productId}/listing/assets/{assetId}": {
      "delete": {
        "operationId": "removeListingAsset",
        "summary": "Remove an uploaded asset override (reset to generated)",
        "tags": ["listings"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["write:listings"] },
          { "apiKeyHeader": ["write:listings"] }
        ],
        "parameters": [
          {
            "name": "productId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          },
          {
            "name": "assetId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          },
          { "$ref": "#/components/parameters/IdempotencyKey" }
        ],
        "responses": {
          "200": {
            "description": "Removed",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["write:listings"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/products/{productId}/listing/assets/{assetId}/bytes": {
      "get": {
        "operationId": "getListingAssetBytes",
        "summary": "Member preview of a ready generated asset, whatever the listing visibility",
        "tags": ["listings"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["read:products"] },
          { "apiKeyHeader": ["read:products"] }
        ],
        "parameters": [
          {
            "name": "productId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          },
          {
            "name": "assetId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Asset bytes",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["read:products"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/products/{productId}/listing/assets/jobs/{jobId}/cancel": {
      "post": {
        "operationId": "cancelListingAssetJob",
        "summary": "Cancel a queued or running asset job; the previous ready asset stays",
        "tags": ["listings"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["write:listings"] },
          { "apiKeyHeader": ["write:listings"] }
        ],
        "parameters": [
          {
            "name": "productId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          },
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          },
          { "$ref": "#/components/parameters/IdempotencyKey" }
        ],
        "responses": {
          "200": {
            "description": "Cancelled",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "description": "Already finished" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["write:listings"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/products/{productId}/listing/draft": {
      "put": {
        "operationId": "saveListingDraft",
        "summary": "Save the draft revision (named top-level keys only)",
        "tags": ["listings"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["write:listings"] },
          { "apiKeyHeader": ["write:listings"] }
        ],
        "parameters": [
          {
            "name": "productId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          },
          { "$ref": "#/components/parameters/IdempotencyKey" }
        ],
        "responses": {
          "200": {
            "description": "Draft revision",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "description": "Version conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["write:listings"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      },
      "delete": {
        "operationId": "discardListingDraft",
        "summary": "Discard the unpublished draft revision",
        "tags": ["listings"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["write:listings"] },
          { "apiKeyHeader": ["write:listings"] }
        ],
        "parameters": [
          {
            "name": "productId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          },
          { "$ref": "#/components/parameters/IdempotencyKey" }
        ],
        "responses": {
          "200": {
            "description": "Discarded",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["write:listings"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/products/{productId}/listing/draft/overrides/{field}": {
      "delete": {
        "operationId": "resetListingField",
        "summary": "Reset one field (or all) to the generated value",
        "tags": ["listings"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["write:listings"] },
          { "apiKeyHeader": ["write:listings"] }
        ],
        "parameters": [
          {
            "name": "productId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          },
          {
            "name": "field",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z]{1,32}$" }
          },
          { "$ref": "#/components/parameters/IdempotencyKey" }
        ],
        "responses": {
          "200": {
            "description": "Draft revision",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["write:listings"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/products/{productId}/listing/gallery/video-links": {
      "post": {
        "operationId": "parseListingVideoLink",
        "summary": "Parse a YouTube or Vimeo URL to a canonical video id",
        "tags": ["listings"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["write:listings"] },
          { "apiKeyHeader": ["write:listings"] }
        ],
        "parameters": [
          {
            "name": "productId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Provider and video id",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["write:listings"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/products/{productId}/listing/publish": {
      "post": {
        "operationId": "publishListing",
        "summary": "Validate and publish the draft revision",
        "tags": ["listings"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "productId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          },
          { "$ref": "#/components/parameters/IdempotencyKey" }
        ],
        "responses": {
          "200": { "description": "Published revision" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "422": { "description": "Blocking checks" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/products/{productId}/listing/regenerate": {
      "post": {
        "operationId": "regenerateListingAssets",
        "summary": "Regenerate all generated assets, some kinds, or one variant (never touches uploaded overrides)",
        "tags": ["listings"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["write:listings"] },
          { "apiKeyHeader": ["write:listings"] }
        ],
        "parameters": [
          {
            "name": "productId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          },
          { "$ref": "#/components/parameters/IdempotencyKey" }
        ],
        "responses": {
          "202": {
            "description": "Jobs queued",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "description": "No published version" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "description": "Daily asset budget used" },
          "503": { "description": "Queue full" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["write:listings"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/products/{productId}/listing/revisions": {
      "get": {
        "operationId": "listListingRevisions",
        "summary": "Listing revision history",
        "tags": ["listings"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["read:products"] },
          { "apiKeyHeader": ["read:products"] }
        ],
        "parameters": [
          {
            "name": "productId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Revisions",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["read:products"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/products/{productId}/listing/revisions/{revisionId}/restore": {
      "post": {
        "operationId": "restoreListingRevision",
        "summary": "Copy a revision into the draft",
        "tags": ["listings"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["write:listings"] },
          { "apiKeyHeader": ["write:listings"] }
        ],
        "parameters": [
          {
            "name": "productId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          },
          {
            "name": "revisionId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          },
          { "$ref": "#/components/parameters/IdempotencyKey" }
        ],
        "responses": {
          "200": {
            "description": "Draft revision",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["write:listings"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/products/{productId}/listing/translations": {
      "get": {
        "operationId": "listListingTranslations",
        "summary": "Translations of the draft (or published) revision",
        "tags": ["listings"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["read:products"] },
          { "apiKeyHeader": ["read:products"] }
        ],
        "parameters": [
          {
            "name": "productId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Translations",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["read:products"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/products/{productId}/listing/translations/{locale}": {
      "put": {
        "operationId": "putListingTranslation",
        "summary": "Save translated fields and their state for the draft revision",
        "tags": ["listings"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["write:listings"] },
          { "apiKeyHeader": ["write:listings"] }
        ],
        "parameters": [
          {
            "name": "productId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          },
          {
            "name": "locale",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]{2,35}$" }
          },
          { "$ref": "#/components/parameters/IdempotencyKey" }
        ],
        "responses": {
          "200": {
            "description": "Translations",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["write:listings"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/products/{productId}/offers": {
      "get": {
        "operationId": "listProductOffers",
        "summary": "List active offers (managers also see inactive offers)",
        "tags": ["publishers"],
        "security": [{}, { "sessionCookie": [] }],
        "parameters": [
          {
            "name": "productId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]{1,64}$" }
          }
        ],
        "responses": {
          "200": { "description": "Offers" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      },
      "post": {
        "operationId": "createProductOffer",
        "summary": "Create a free or one-time creator offer (owner/finance)",
        "tags": ["publishers"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "productId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]{1,64}$" }
          }
        ],
        "responses": {
          "201": { "description": "Offer" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/products/{productId}/rating-summary": {
      "get": {
        "operationId": "getRatingSummary",
        "summary": "Read the review rating summary of a product",
        "tags": ["posts"],
        "security": [{}, { "sessionCookie": [] }],
        "parameters": [
          {
            "name": "productId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]{1,64}$" }
          }
        ],
        "responses": {
          "200": { "description": "Post result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/products/{productId}/review": {
      "get": {
        "operationId": "getMyReview",
        "summary": "Read the caller's review of a product with eligibility",
        "tags": ["posts"],
        "security": [{}, { "sessionCookie": [] }],
        "parameters": [
          {
            "name": "productId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]{1,64}$" }
          }
        ],
        "responses": {
          "200": { "description": "Post result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      },
      "put": {
        "operationId": "saveReview",
        "summary": "Create or edit the caller's review of a product",
        "tags": ["posts"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "productId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]{1,64}$" }
          }
        ],
        "responses": {
          "200": { "description": "Post result" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/projects": {
      "get": {
        "operationId": "listProjects",
        "summary": "List the caller's drafts, newest first",
        "tags": ["projects"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["read:projects"] },
          { "apiKeyHeader": ["read:projects"] }
        ],
        "responses": {
          "200": {
            "description": "Projects",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["read:projects"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 2
      },
      "post": {
        "operationId": "createProject",
        "summary": "Create an owned project from a validated document",
        "tags": ["projects"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["write:projects"] },
          { "apiKeyHeader": ["write:projects"] }
        ],
        "responses": {
          "201": {
            "description": "Project",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["write:projects"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/projects/{projectId}": {
      "get": {
        "operationId": "getProject",
        "summary": "Read an owned project",
        "tags": ["projects"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["read:projects"] },
          { "apiKeyHeader": ["read:projects"] }
        ],
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9.-]+$" }
          }
        ],
        "responses": {
          "200": {
            "description": "Project",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["read:projects"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      },
      "put": {
        "operationId": "saveProject",
        "summary": "Save a draft at an expected revision",
        "tags": ["projects"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["write:projects"] },
          { "apiKeyHeader": ["write:projects"] }
        ],
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9.-]+$" }
          }
        ],
        "responses": {
          "200": {
            "description": "Project",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["write:projects"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/projects/{projectId}/catalog": {
      "put": {
        "operationId": "updateProjectCatalog",
        "summary": "Update public discovery tags and category",
        "tags": ["projects"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9.-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Project" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/projects/{projectId}/listing": {
      "get": {
        "operationId": "getProjectListing",
        "summary": "Listing editor read model for a published Toy's product",
        "tags": ["listings"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["read:products"] },
          { "apiKeyHeader": ["read:products"] }
        ],
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9.-]+$" }
          }
        ],
        "responses": {
          "200": {
            "description": "Listing editor state",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["read:products"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/projects/{projectId}/operations": {
      "post": {
        "operationId": "applyProjectOperations",
        "summary": "Apply an authoring operation batch at an expected revision",
        "tags": ["projects"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["write:projects"] },
          { "apiKeyHeader": ["write:projects"] }
        ],
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9.-]+$" }
          }
        ],
        "responses": {
          "200": {
            "description": "Project",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["write:projects"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/projects/{projectId}/product": {
      "get": {
        "operationId": "getProjectProduct",
        "summary": "The product that wraps a published project, for version and download UI",
        "tags": ["versions"],
        "security": [{}, { "sessionCookie": [] }, { "nativeBearer": [] }],
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9._-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Product identity and aliases" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "description": "Not published" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session", "native"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/projects/{projectId}/publish": {
      "post": {
        "operationId": "publishProject",
        "summary": "Publish an immutable release",
        "tags": ["projects"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9.-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Release" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/projects/{projectId}/visibility": {
      "put": {
        "operationId": "setProjectVisibility",
        "summary": "Change listing visibility",
        "tags": ["projects"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "projectId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9.-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Project" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/proxy/request": {
      "post": {
        "operationId": "proxyRequest",
        "summary": "Make one allowlisted HTTPS request, optionally injecting a vault secret server-side",
        "tags": ["ai"],
        "security": [{ "sessionCookie": [] }],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": ["url"],
                "properties": {
                  "addon": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9-]{1,31}$"
                  },
                  "method": {
                    "type": "string",
                    "enum": ["GET", "HEAD", "POST", "PUT", "PATCH", "DELETE"]
                  },
                  "url": { "type": "string", "maxLength": 4096 },
                  "headers": {
                    "type": "object",
                    "maxProperties": 32,
                    "additionalProperties": {
                      "type": "string",
                      "maxLength": 4096
                    }
                  },
                  "body": { "type": "string" },
                  "auth": {
                    "type": "object",
                    "required": ["slot", "in", "name"],
                    "properties": {
                      "slot": { "type": "string" },
                      "in": { "type": "string", "enum": ["header", "query"] },
                      "name": { "type": "string" },
                      "scheme": { "type": "string" }
                    },
                    "additionalProperties": false
                  },
                  "parse": {
                    "type": "string",
                    "enum": ["json", "text", "bytes", "auto"]
                  },
                  "scrape": {
                    "type": "boolean",
                    "description": "web.scrape requests: robots.txt (RFC 9309, groups for TuneToys or *) is honoured on every hop; disallowed paths answer 403 ROBOTS_DISALLOWED."
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Make one allowlisted HTTPS request, optionally injecting a vault secret server-side",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "status",
                    "headers",
                    "kind",
                    "body",
                    "truncated"
                  ],
                  "properties": {
                    "status": { "type": "integer" },
                    "headers": {
                      "type": "object",
                      "additionalProperties": { "type": "string" }
                    },
                    "kind": {
                      "type": "string",
                      "enum": ["json", "text", "bytes"]
                    },
                    "body": {},
                    "truncated": { "type": "boolean" }
                  }
                }
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/publishers/{handle}/products": {
      "get": {
        "operationId": "listPublisherProducts",
        "summary": "A publisher's products with listing state, for members",
        "tags": ["listings"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["read:products"] },
          { "apiKeyHeader": ["read:products"] }
        ],
        "parameters": [
          {
            "name": "handle",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[A-Za-z0-9_.-]{1,64}$" }
          }
        ],
        "responses": {
          "200": {
            "description": "Products",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["read:products"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/publishers/{handle}/storefront": {
      "get": {
        "operationId": "getStorefront",
        "summary": "Published storefront, or the draft and revisions for members with ?draft=1",
        "tags": ["storefronts"],
        "security": [
          {},
          { "sessionCookie": [] },
          { "apiKey": ["read:public"] },
          { "apiKeyHeader": ["read:public"] }
        ],
        "parameters": [
          {
            "name": "handle",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[A-Za-z0-9_.-]{1,64}$" }
          }
        ],
        "responses": {
          "200": {
            "description": "Storefront",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session", "key"],
        "x-tunetoys-scopes": ["read:public"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/publishers/{handle}/storefront/draft": {
      "put": {
        "operationId": "saveStorefrontDraft",
        "summary": "Save theme tokens and sections to the draft revision",
        "tags": ["storefronts"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["write:listings"] },
          { "apiKeyHeader": ["write:listings"] }
        ],
        "parameters": [
          {
            "name": "handle",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[A-Za-z0-9_.-]{1,64}$" }
          },
          { "$ref": "#/components/parameters/IdempotencyKey" }
        ],
        "responses": {
          "200": {
            "description": "Draft revision",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "description": "Contrast or section rule failed" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["write:listings"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/publishers/{handle}/storefront/publish": {
      "post": {
        "operationId": "publishStorefront",
        "summary": "Validate references and publish the draft revision",
        "tags": ["storefronts"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "handle",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[A-Za-z0-9_.-]{1,64}$" }
          },
          { "$ref": "#/components/parameters/IdempotencyKey" }
        ],
        "responses": {
          "200": { "description": "Published revision" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/publishers/{handle}/storefront/revisions/{revisionId}/restore": {
      "post": {
        "operationId": "restoreStorefrontRevision",
        "summary": "Copy an older revision into a new draft",
        "tags": ["storefronts"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["write:listings"] },
          { "apiKeyHeader": ["write:listings"] }
        ],
        "parameters": [
          {
            "name": "handle",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[A-Za-z0-9_.-]{1,64}$" }
          },
          {
            "name": "revisionId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
            }
          },
          { "$ref": "#/components/parameters/IdempotencyKey" }
        ],
        "responses": {
          "200": {
            "description": "Draft revision",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["write:listings"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/publishers/{publisherId}": {
      "patch": {
        "operationId": "updatePublisher",
        "summary": "Update display name, support email or seller terms acceptance",
        "tags": ["publishers"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "publisherId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]{1,64}$" }
          }
        ],
        "responses": {
          "200": { "description": "Publisher" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/publishers/{publisherId}/connect": {
      "get": {
        "operationId": "getPublisherConnect",
        "summary": "Read Stripe Connect capability state (owner/finance)",
        "tags": ["publishers"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "publisherId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]{1,64}$" }
          }
        ],
        "responses": {
          "200": { "description": "Connect read model" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/publishers/{publisherId}/connect/onboard": {
      "post": {
        "operationId": "startPublisherConnectOnboarding",
        "summary": "Create or resume Stripe Express onboarding (owner only)",
        "tags": ["publishers"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "publisherId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]{1,64}$" }
          }
        ],
        "responses": {
          "200": { "description": "Hosted onboarding link and Connect state" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/publishers/{publisherId}/connect/sync": {
      "post": {
        "operationId": "syncPublisherConnect",
        "summary": "Reconcile Connect state with Stripe (owner/finance)",
        "tags": ["publishers"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "publisherId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]{1,64}$" }
          }
        ],
        "responses": {
          "200": { "description": "Connect read model" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/publishers/{publisherId}/members": {
      "get": {
        "operationId": "listPublisherMembers",
        "summary": "List publisher members and roles",
        "tags": ["publishers"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "publisherId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]{1,64}$" }
          }
        ],
        "responses": {
          "200": { "description": "Members" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      },
      "post": {
        "operationId": "addPublisherMember",
        "summary": "Add a member by handle with a role (owner only)",
        "tags": ["publishers"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "publisherId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]{1,64}$" }
          }
        ],
        "responses": {
          "200": { "description": "Members" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/publishers/{publisherId}/members/{accountId}": {
      "delete": {
        "operationId": "removePublisherMember",
        "summary": "Remove a member (owner only)",
        "tags": ["publishers"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "publisherId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]{1,64}$" }
          },
          {
            "name": "accountId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]{1,64}$" }
          }
        ],
        "responses": {
          "200": { "description": "Members" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/publishers/me": {
      "get": {
        "operationId": "getMyPublisher",
        "summary": "Read (creating on first use) the caller's personal publisher",
        "tags": ["publishers"],
        "security": [{ "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Publisher, role and payment state" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/push-subscriptions": {
      "get": {
        "operationId": "listPushSubscriptions",
        "summary": "The caller's push devices",
        "tags": ["notifications"],
        "security": [{ "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Notification result" },
          "304": { "description": "Not modified" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      },
      "post": {
        "operationId": "registerPushSubscription",
        "summary": "Register this browser for web push",
        "tags": ["notifications"],
        "security": [{ "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Notification result" },
          "304": { "description": "Not modified" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/push-subscriptions/{subscriptionId}": {
      "delete": {
        "operationId": "deletePushSubscription",
        "summary": "Remove a push device",
        "tags": ["notifications"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "subscriptionId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[A-Za-z0-9-]{1,64}$" }
          }
        ],
        "responses": {
          "200": { "description": "Notification result" },
          "304": { "description": "Not modified" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/push/vapid-public-key": {
      "get": {
        "operationId": "getVapidPublicKey",
        "summary": "Web push application server key",
        "tags": ["notifications"],
        "security": [{}, { "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Public key" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "description": "Not configured" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/releases/{digest}": {
      "get": {
        "operationId": "getRelease",
        "summary": "Read an immutable release",
        "tags": ["catalog"],
        "security": [
          {},
          { "sessionCookie": [] },
          { "nativeBearer": [] },
          { "apiKey": ["read:public"] },
          { "apiKeyHeader": ["read:public"] }
        ],
        "parameters": [
          {
            "name": "digest",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9.-]+$" }
          }
        ],
        "responses": {
          "200": {
            "description": "Release",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session", "native", "key"],
        "x-tunetoys-scopes": ["read:public"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/releases/{digest}/assets/{assetId}": {
      "get": {
        "operationId": "getReleaseAsset",
        "summary": "Download a release asset as a sandboxed attachment",
        "tags": ["catalog"],
        "security": [
          {},
          { "sessionCookie": [] },
          { "nativeBearer": [] },
          { "apiKey": ["read:public"] },
          { "apiKeyHeader": ["read:public"] }
        ],
        "parameters": [
          {
            "name": "digest",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-f0-9]{64}$" }
          },
          {
            "name": "assetId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-z][a-z0-9_-]{0,63}$" }
          }
        ],
        "responses": {
          "200": {
            "description": "Asset bytes",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session", "native", "key"],
        "x-tunetoys-scopes": ["read:public"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 5
      }
    },
    "/v1/releases/{digest}/engine": {
      "get": {
        "operationId": "getReleaseEngine",
        "summary": "Download the release engine WebAssembly",
        "tags": ["catalog"],
        "security": [
          {},
          { "sessionCookie": [] },
          { "nativeBearer": [] },
          { "apiKey": ["read:public"] },
          { "apiKeyHeader": ["read:public"] }
        ],
        "parameters": [
          {
            "name": "digest",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9.-]+$" }
          }
        ],
        "responses": {
          "200": {
            "description": "application/wasm bytes with X-Content-SHA256",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session", "native", "key"],
        "x-tunetoys-scopes": ["read:public"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 5
      }
    },
    "/v1/releases/{digest}/fork": {
      "post": {
        "operationId": "forkRelease",
        "summary": "Fork a release into a new owned project",
        "tags": ["projects"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["write:projects"] },
          { "apiKeyHeader": ["write:projects"] }
        ],
        "parameters": [
          {
            "name": "digest",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9.-]+$" }
          }
        ],
        "responses": {
          "201": {
            "description": "Project",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["write:projects"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/releases/{digest}/package": {
      "get": {
        "operationId": "getReleasePackage",
        "summary": "Download the canonical release package",
        "tags": ["catalog"],
        "security": [
          {},
          { "sessionCookie": [] },
          { "nativeBearer": [] },
          { "apiKey": ["read:public"] },
          { "apiKeyHeader": ["read:public"] }
        ],
        "parameters": [
          {
            "name": "digest",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9.-]+$" }
          }
        ],
        "responses": {
          "200": {
            "description": "application/vnd.tunetoys.release+json",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session", "native", "key"],
        "x-tunetoys-scopes": ["read:public"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 5
      }
    },
    "/v1/sounds": {
      "get": {
        "operationId": "searchSounds",
        "summary": "Search and filter public sounds (or the caller’s own with mine=1); page of 40",
        "tags": ["sounds"],
        "security": [{}, { "sessionCookie": [] }, { "nativeBearer": [] }],
        "responses": {
          "200": { "description": "Sound page with capabilities" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session", "native"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 2
      }
    },
    "/v1/sounds/{mediaId}": {
      "get": {
        "operationId": "getSound",
        "summary": "Item, current version, resolved fields with sources, renditions, counts and viewer state",
        "tags": ["sounds"],
        "security": [{}, { "sessionCookie": [] }, { "nativeBearer": [] }],
        "parameters": [
          {
            "name": "mediaId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Sound detail" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session", "native"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      },
      "patch": {
        "operationId": "updateSound",
        "summary": "Edit the catalog entry at an expected version (owner)",
        "tags": ["sounds"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "mediaId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Sound detail" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "description": "VERSION_CONFLICT" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      },
      "delete": {
        "operationId": "removeSound",
        "summary": "Remove a sound from the catalog; pinned release versions stay",
        "tags": ["sounds"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "mediaId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Removal with the pinned release count" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/sounds/{mediaId}/analysis": {
      "get": {
        "operationId": "getSoundAnalysis",
        "summary": "Every analysis run of the current version with the full report",
        "tags": ["sounds"],
        "security": [{}, { "sessionCookie": [] }, { "nativeBearer": [] }],
        "parameters": [
          {
            "name": "mediaId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Analysis runs" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session", "native"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/sounds/{mediaId}/bytes": {
      "get": {
        "operationId": "getSoundBytes",
        "summary": "Original bytes as a sandboxed attachment: the owner, or anyone when reusable; counted",
        "tags": ["sounds"],
        "security": [{ "sessionCookie": [] }, { "nativeBearer": [] }],
        "parameters": [
          {
            "name": "mediaId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Sound bytes" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "description": "MEDIA_RIGHTS or NATIVE_SCOPE" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "native"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 5
      }
    },
    "/v1/sounds/{mediaId}/events": {
      "post": {
        "operationId": "recordSoundEvent",
        "summary": "Play or preview beacon, bounded per address per day",
        "tags": ["sounds"],
        "security": [{}, { "sessionCookie": [] }, { "nativeBearer": [] }],
        "parameters": [
          {
            "name": "mediaId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Whether the beacon was counted" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session", "native"],
        "x-tunetoys-rate-bucket": null,
        "x-tunetoys-cost": 0
      }
    },
    "/v1/sounds/{mediaId}/like": {
      "put": {
        "operationId": "setSoundLike",
        "summary": "Like or unlike a sound",
        "tags": ["sounds"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "mediaId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Reaction state and counts" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/sounds/{mediaId}/relations": {
      "get": {
        "operationId": "listSoundRelations",
        "summary": "Relations in both directions the caller may read",
        "tags": ["sounds"],
        "security": [{}, { "sessionCookie": [] }, { "nativeBearer": [] }],
        "parameters": [
          {
            "name": "mediaId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Relations" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session", "native"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      },
      "put": {
        "operationId": "addSoundRelation",
        "summary": "Relate this sound to another (owner of either side)",
        "tags": ["sounds"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "mediaId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Relation" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      },
      "delete": {
        "operationId": "removeSoundRelation",
        "summary": "Remove a relation (owner of either side)",
        "tags": ["sounds"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "mediaId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Removal" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/sounds/{mediaId}/renditions/{kind}": {
      "get": {
        "operationId": "getSoundRendition",
        "summary": "Rendition bytes (peaks, preview, thumbnail, score page); 404 RENDITION_NOT_READY until produced",
        "tags": ["sounds"],
        "security": [{}, { "sessionCookie": [] }, { "nativeBearer": [] }],
        "parameters": [
          {
            "name": "mediaId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          },
          {
            "name": "kind",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-z-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Rendition bytes" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session", "native"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 2
      }
    },
    "/v1/sounds/{mediaId}/save": {
      "put": {
        "operationId": "setSoundSaved",
        "summary": "Save or unsave a sound (synced to hosts like library bookmarks)",
        "tags": ["sounds"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "mediaId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Reaction state and counts" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/sounds/facets": {
      "get": {
        "operationId": "getSoundFacets",
        "summary": "Facet counts for a sounds filter set",
        "tags": ["sounds"],
        "security": [{}, { "sessionCookie": [] }, { "nativeBearer": [] }],
        "responses": {
          "200": { "description": "Facet counts and total" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session", "native"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 3
      }
    },
    "/v1/sounds/saved": {
      "get": {
        "operationId": "listSavedSounds",
        "summary": "List the caller's saved sounds",
        "tags": ["sounds"],
        "security": [{ "sessionCookie": [] }, { "nativeBearer": [] }],
        "responses": {
          "200": { "description": "Saved sounds page" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "native"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/sounds/saved/sync": {
      "get": {
        "operationId": "syncSavedSounds",
        "summary": "Read saved-sound events after a cursor (the library sync protocol)",
        "tags": ["sounds"],
        "security": [{ "sessionCookie": [] }, { "nativeBearer": [] }],
        "responses": {
          "200": { "description": "Saved sound events" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "native"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/sounds/similar/{mediaId}": {
      "get": {
        "operationId": "getSimilarSounds",
        "summary": "Nearest sounds by embedding, or unsupported with the reason",
        "tags": ["sounds"],
        "security": [{}, { "sessionCookie": [] }, { "nativeBearer": [] }],
        "parameters": [
          {
            "name": "mediaId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Similar sounds or unsupported" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session", "native"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 3
      }
    },
    "/v1/subscriptions": {
      "get": {
        "operationId": "listSubscriptions",
        "summary": "Followed products, publishers, threads and docs pages",
        "tags": ["notifications"],
        "security": [{ "sessionCookie": [] }],
        "responses": {
          "200": { "description": "Notification result" },
          "304": { "description": "Not modified" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/subscriptions/{subjectType}/{subjectId}": {
      "get": {
        "operationId": "getSubscription",
        "summary": "Follow state for one subject",
        "tags": ["notifications"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "subjectType",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^product|publisher|thread|docs_page$"
            }
          },
          {
            "name": "subjectId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9._:-]{1,128}$"
            }
          }
        ],
        "responses": {
          "200": { "description": "Notification result" },
          "304": { "description": "Not modified" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      },
      "put": {
        "operationId": "followSubject",
        "summary": "Follow a product, publisher, thread or docs page",
        "tags": ["notifications"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "subjectType",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^product|publisher|thread|docs_page$"
            }
          },
          {
            "name": "subjectId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9._:-]{1,128}$"
            }
          }
        ],
        "responses": {
          "200": { "description": "Notification result" },
          "304": { "description": "Not modified" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      },
      "delete": {
        "operationId": "unfollowSubject",
        "summary": "Stop following a subject",
        "tags": ["notifications"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "subjectType",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^product|publisher|thread|docs_page$"
            }
          },
          {
            "name": "subjectId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9._:-]{1,128}$"
            }
          }
        ],
        "responses": {
          "200": { "description": "Notification result" },
          "304": { "description": "Not modified" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/toys/{toyId}": {
      "get": {
        "operationId": "getListing",
        "summary": "Read a public or authorized Toy listing",
        "tags": ["catalog"],
        "security": [
          {},
          { "sessionCookie": [] },
          { "nativeBearer": [] },
          { "apiKey": ["read:public"] },
          { "apiKeyHeader": ["read:public"] }
        ],
        "parameters": [
          {
            "name": "toyId",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9.-]+$" }
          }
        ],
        "responses": {
          "200": {
            "description": "Listing",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session", "native", "key"],
        "x-tunetoys-scopes": ["read:public"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/vault/secrets": {
      "get": {
        "operationId": "listVaultSecrets",
        "summary": "List vault secret metadata (never values)",
        "tags": ["vault"],
        "security": [{ "sessionCookie": [] }],
        "responses": {
          "200": {
            "description": "List vault secret metadata (never values)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": ["configured", "secrets"],
                  "properties": {
                    "configured": { "type": "boolean" },
                    "secrets": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "required": [
                          "id",
                          "slot",
                          "label",
                          "prefix",
                          "last4",
                          "createdAt"
                        ],
                        "properties": {
                          "id": { "type": "string" },
                          "slot": {
                            "type": "string",
                            "pattern": "^[a-z][a-z0-9-]{1,31}$"
                          },
                          "label": { "type": "string" },
                          "prefix": { "type": "string", "maxLength": 4 },
                          "last4": { "type": "string", "maxLength": 4 },
                          "createdAt": { "type": "string" },
                          "updatedAt": { "type": "string" },
                          "lastUsedAt": { "type": ["string", "null"] },
                          "useCount": { "type": "integer" },
                          "lastError": { "type": ["string", "null"] }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      },
      "post": {
        "operationId": "createVaultSecret",
        "summary": "Store a secret in a slot; returns metadata only",
        "tags": ["vault"],
        "security": [{ "sessionCookie": [] }],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": ["slot", "value"],
                "properties": {
                  "slot": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9-]{1,31}$"
                  },
                  "value": {
                    "type": "string",
                    "minLength": 16,
                    "maxLength": 4096
                  },
                  "label": { "type": "string", "maxLength": 64 }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Store a secret in a slot; returns metadata only",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "id",
                    "slot",
                    "label",
                    "prefix",
                    "last4",
                    "createdAt"
                  ],
                  "properties": {
                    "id": { "type": "string" },
                    "slot": {
                      "type": "string",
                      "pattern": "^[a-z][a-z0-9-]{1,31}$"
                    },
                    "label": { "type": "string" },
                    "prefix": { "type": "string", "maxLength": 4 },
                    "last4": { "type": "string", "maxLength": 4 },
                    "createdAt": { "type": "string" },
                    "updatedAt": { "type": "string" },
                    "lastUsedAt": { "type": ["string", "null"] },
                    "useCount": { "type": "integer" },
                    "lastError": { "type": ["string", "null"] }
                  }
                }
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/vault/secrets/{id}": {
      "put": {
        "operationId": "rotateVaultSecret",
        "summary": "Replace a secret value atomically (new prefix and last4)",
        "tags": ["vault"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[0-9a-f-]{36}$" }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": ["value"],
                "properties": {
                  "value": {
                    "type": "string",
                    "minLength": 16,
                    "maxLength": 4096
                  },
                  "label": { "type": "string", "maxLength": 64 }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Replace a secret value atomically (new prefix and last4)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "id",
                    "slot",
                    "label",
                    "prefix",
                    "last4",
                    "createdAt"
                  ],
                  "properties": {
                    "id": { "type": "string" },
                    "slot": {
                      "type": "string",
                      "pattern": "^[a-z][a-z0-9-]{1,31}$"
                    },
                    "label": { "type": "string" },
                    "prefix": { "type": "string", "maxLength": 4 },
                    "last4": { "type": "string", "maxLength": 4 },
                    "createdAt": { "type": "string" },
                    "updatedAt": { "type": "string" },
                    "lastUsedAt": { "type": ["string", "null"] },
                    "useCount": { "type": "integer" },
                    "lastError": { "type": ["string", "null"] }
                  }
                }
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      },
      "delete": {
        "operationId": "deleteVaultSecret",
        "summary": "Remove a secret",
        "tags": ["vault"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[0-9a-f-]{36}$" }
          }
        ],
        "responses": {
          "200": { "description": "Deleted" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/versions/{id}": {
      "get": {
        "operationId": "getProductVersion",
        "summary": "Read one version with its matrix and artifacts",
        "tags": ["versions"],
        "security": [{}, { "sessionCookie": [] }, { "nativeBearer": [] }],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Version" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session", "native"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      },
      "patch": {
        "operationId": "updateProductVersion",
        "summary": "Edit a draft, or the matrix claims of a published version",
        "tags": ["versions"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Version" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "description": "Frozen or conflicting" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/versions/{id}/artifacts": {
      "get": {
        "operationId": "listVersionArtifacts",
        "summary": "Registered artifacts of a version (public fields)",
        "tags": ["versions"],
        "security": [{}, { "sessionCookie": [] }, { "nativeBearer": [] }],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Artifacts" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session", "native"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      },
      "post": {
        "operationId": "registerVersionArtifact",
        "summary": "Upload and register an artifact (application/octet-stream body, metadata in the query)",
        "tags": ["versions"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["publish:releases"] },
          { "apiKeyHeader": ["publish:releases"] }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "201": {
            "description": "Artifact",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "422": {
            "description": "Digest mismatch, release mismatch or target not buildable"
          },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["publish:releases"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/versions/{id}/publish": {
      "post": {
        "operationId": "publishProductVersion",
        "summary": "Freeze and publish a version; creates the browser artifact",
        "tags": ["versions"],
        "security": [
          { "sessionCookie": [] },
          { "apiKey": ["publish:releases"] },
          { "apiKeyHeader": ["publish:releases"] }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "200": {
            "description": "Published version",
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session", "key"],
        "x-tunetoys-scopes": ["publish:releases"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/versions/{id}/targets": {
      "get": {
        "operationId": "listVersionTargets",
        "summary": "Platform matrix for a version: all 13 profiles",
        "tags": ["versions"],
        "security": [{}, { "sessionCookie": [] }, { "nativeBearer": [] }],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Targets and profile table" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["anonymous", "session", "native"],
        "x-tunetoys-rate-bucket": "read",
        "x-tunetoys-cost": 1
      }
    },
    "/v1/versions/{id}/yank": {
      "post": {
        "operationId": "yankProductVersion",
        "summary": "Withdraw a published version with a public reason",
        "tags": ["versions"],
        "security": [{ "sessionCookie": [] }],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": { "type": "string", "pattern": "^[a-zA-Z0-9-]+$" }
          }
        ],
        "responses": {
          "200": { "description": "Yanked version" },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "403": { "$ref": "#/components/responses/Forbidden" },
          "404": { "$ref": "#/components/responses/NotFound" },
          "409": { "$ref": "#/components/responses/Conflict" },
          "413": { "$ref": "#/components/responses/PayloadTooLarge" },
          "415": { "$ref": "#/components/responses/UnsupportedMediaType" },
          "429": { "$ref": "#/components/responses/RateLimited" }
        },
        "x-tunetoys-stability": "experimental",
        "x-tunetoys-auth": ["session"],
        "x-tunetoys-rate-bucket": "write",
        "x-tunetoys-cost": 1
      }
    }
  },
  "components": {
    "schemas": {
      "ApiError": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "$id": "https://tune.toys/schemas/platform/api-error.schema.json",
        "title": "ApiError",
        "description": "Error envelope returned by every failing API response. `requestId` echoes the X-Request-Id response header.",
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "error": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "code": {
                "type": "string",
                "minLength": 1,
                "maxLength": 64,
                "pattern": "^[A-Z][A-Z0-9_]*$",
                "description": "Stable machine-readable code, for example RATE_LIMIT, SCOPE or KEY_INVALID."
              },
              "message": {
                "type": "string",
                "minLength": 1,
                "maxLength": 500,
                "description": "Human-readable explanation; never parse it."
              },
              "details": {
                "type": "object",
                "maxProperties": 16,
                "description": "Bounded machine-readable context such as requiredScopes or rate-limit state."
              },
              "requestId": { "type": "string", "minLength": 1, "maxLength": 64 }
            },
            "required": ["code", "message"]
          }
        },
        "required": ["error"]
      },
      "ApiKey": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "$id": "https://tune.toys/schemas/platform/api-key.schema.json",
        "title": "ApiKey",
        "description": "Metadata of one developer API key. The secret is returned once at creation or rotation and never stored in plain text.",
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": { "$ref": "common.schema.json#/$defs/EntityId" },
          "appId": { "$ref": "common.schema.json#/$defs/EntityId" },
          "name": { "type": "string", "minLength": 1, "maxLength": 64 },
          "prefix": {
            "type": "string",
            "pattern": "^[a-z2-7]{8}$",
            "description": "Public identifier shown in the UI and logs as tt_<prefix>_…"
          },
          "scopes": {
            "type": "array",
            "minItems": 1,
            "maxItems": 9,
            "uniqueItems": true,
            "items": { "$ref": "enums.schema.json#/$defs/ApiKeyScope" }
          },
          "ipAllowlist": {
            "type": "array",
            "maxItems": 16,
            "items": { "type": "string", "minLength": 2, "maxLength": 64 },
            "description": "Optional CIDR entries evaluated against the socket address; empty allows any address."
          },
          "createdAt": { "$ref": "common.schema.json#/$defs/Timestamp" },
          "expiresAt": { "$ref": "common.schema.json#/$defs/Timestamp" },
          "lastUsedAt": {
            "anyOf": [
              { "$ref": "common.schema.json#/$defs/Timestamp" },
              { "type": "null" }
            ]
          },
          "revokedAt": {
            "anyOf": [
              { "$ref": "common.schema.json#/$defs/Timestamp" },
              { "type": "null" }
            ]
          },
          "replacedBy": {
            "anyOf": [
              { "$ref": "common.schema.json#/$defs/EntityId" },
              { "type": "null" }
            ]
          },
          "version": { "type": "integer", "minimum": 1 }
        },
        "required": [
          "id",
          "appId",
          "name",
          "prefix",
          "scopes",
          "ipAllowlist",
          "createdAt",
          "expiresAt",
          "lastUsedAt",
          "revokedAt",
          "replacedBy",
          "version"
        ]
      },
      "ApiKeyScopes": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "$id": "https://tune.toys/schemas/platform/api-key-scopes.schema.json",
        "title": "ApiKeyScopes",
        "description": "Scopes granted to one developer API key.",
        "type": "array",
        "items": { "$ref": "enums.schema.json#/$defs/ApiKeyScope" },
        "maxItems": 10,
        "minItems": 1,
        "uniqueItems": true
      },
      "ApiUsage": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "$id": "https://tune.toys/schemas/platform/api-usage.schema.json",
        "title": "ApiUsage",
        "description": "Metered usage of one developer app in UTC hourly or daily windows. Counters are informational and may lag by up to 30 seconds.",
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "appId": { "$ref": "common.schema.json#/$defs/EntityId" },
          "granularity": { "enum": ["hour", "day"] },
          "since": { "$ref": "common.schema.json#/$defs/Timestamp" },
          "series": {
            "type": "array",
            "maxItems": 2160,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "windowStart": {
                  "$ref": "common.schema.json#/$defs/Timestamp"
                },
                "requests": { "type": "integer", "minimum": 0 },
                "rejected": { "type": "integer", "minimum": 0 },
                "bytesOut": { "type": "integer", "minimum": 0 }
              },
              "required": ["windowStart", "requests", "rejected", "bytesOut"]
            }
          },
          "keys": {
            "type": "array",
            "maxItems": 100,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "keyId": { "$ref": "common.schema.json#/$defs/EntityId" },
                "prefix": { "type": "string", "pattern": "^[a-z2-7]{8}$" },
                "requests": { "type": "integer", "minimum": 0 },
                "rejected": { "type": "integer", "minimum": 0 },
                "bytesOut": { "type": "integer", "minimum": 0 }
              },
              "required": [
                "keyId",
                "prefix",
                "requests",
                "rejected",
                "bytesOut"
              ]
            }
          },
          "totals": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "requests": { "type": "integer", "minimum": 0 },
              "rejected": { "type": "integer", "minimum": 0 },
              "bytesOut": { "type": "integer", "minimum": 0 }
            },
            "required": ["requests", "rejected", "bytesOut"]
          }
        },
        "required": [
          "appId",
          "granularity",
          "since",
          "series",
          "keys",
          "totals"
        ]
      },
      "ArtifactDescriptor": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "$id": "https://tune.toys/schemas/platform/artifact.schema.json",
        "title": "ArtifactDescriptor",
        "description": "One registered build output of a product version. digest, size, inventory, targetProfile, format and arch never change; a correction is a new artifact.",
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": { "$ref": "common.schema.json#/$defs/EntityId" },
          "versionId": { "$ref": "common.schema.json#/$defs/EntityId" },
          "targetProfile": { "$ref": "enums.schema.json#/$defs/TargetProfile" },
          "format": { "$ref": "enums.schema.json#/$defs/ArtifactFormat" },
          "arch": { "$ref": "enums.schema.json#/$defs/ArtifactArch" },
          "digest": { "$ref": "common.schema.json#/$defs/Sha256Hex" },
          "size": { "$ref": "common.schema.json#/$defs/ByteSize" },
          "signatureState": {
            "$ref": "enums.schema.json#/$defs/SignatureState"
          },
          "qualificationState": {
            "$ref": "enums.schema.json#/$defs/QualificationState"
          },
          "inventory": { "$ref": "#/$defs/ArtifactInventory" },
          "minEngineVersion": { "$ref": "common.schema.json#/$defs/SemVer" },
          "hidden": {
            "type": "boolean",
            "description": "Hidden from the download chooser without yanking."
          }
        },
        "required": [
          "id",
          "versionId",
          "targetProfile",
          "format",
          "arch",
          "digest",
          "size",
          "signatureState",
          "qualificationState",
          "inventory",
          "minEngineVersion",
          "hidden"
        ],
        "$defs": {
          "ArtifactInventory": {
            "title": "ArtifactInventory",
            "description": "Declared contents of an artifact, verified against the unpacked archive and the version releases.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "releaseDigest": {
                "$ref": "common.schema.json#/$defs/Sha256Hex"
              },
              "engineDigest": { "$ref": "common.schema.json#/$defs/Sha256Hex" },
              "pluginContractDigest": {
                "$ref": "common.schema.json#/$defs/Sha256Hex"
              },
              "files": {
                "type": "array",
                "items": { "$ref": "#/$defs/ArtifactFile" },
                "maxItems": 4096
              }
            },
            "required": ["releaseDigest", "engineDigest", "files"]
          },
          "ArtifactFile": {
            "title": "ArtifactFile",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "path": {
                "type": "string",
                "minLength": 1,
                "maxLength": 1024,
                "pattern": "^(?!/)(?!.*(^|/)\\.\\.?(/|$))[A-Za-z0-9 ._+@()/-]+$",
                "description": "Relative archive path without dot segments."
              },
              "sha256": { "$ref": "common.schema.json#/$defs/Sha256Hex" },
              "size": { "$ref": "common.schema.json#/$defs/ByteSize" }
            },
            "required": ["path", "sha256", "size"]
          }
        }
      },
      "DeveloperApp": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "$id": "https://tune.toys/schemas/platform/developer-app.schema.json",
        "title": "DeveloperApp",
        "description": "A developer app groups API keys, usage, webhooks and a tier. `tier` is the last observed effective tier, computed from the owner's feature:api.pro grant.",
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": { "$ref": "common.schema.json#/$defs/EntityId" },
          "ownerAccountId": { "$ref": "common.schema.json#/$defs/EntityId" },
          "publisherId": {
            "anyOf": [
              { "$ref": "common.schema.json#/$defs/EntityId" },
              { "type": "null" }
            ]
          },
          "name": { "type": "string", "minLength": 1, "maxLength": 64 },
          "description": { "type": "string", "maxLength": 500 },
          "homepage": {
            "anyOf": [
              { "type": "string", "maxLength": 2048, "pattern": "^https://" },
              { "type": "null" }
            ]
          },
          "tier": { "enum": ["free", "pro"] },
          "state": { "enum": ["active", "suspended", "deleted"] },
          "createdAt": { "$ref": "common.schema.json#/$defs/Timestamp" },
          "updatedAt": { "$ref": "common.schema.json#/$defs/Timestamp" },
          "version": { "type": "integer", "minimum": 1 }
        },
        "required": [
          "id",
          "ownerAccountId",
          "publisherId",
          "name",
          "description",
          "homepage",
          "tier",
          "state",
          "createdAt",
          "updatedAt",
          "version"
        ]
      },
      "LicenseCertificate": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "$id": "https://tune.toys/schemas/platform/license-certificate.schema.json",
        "title": "LicenseCertificate",
        "description": "Offline license certificate payload (tunetoys.license-certificate/1), signed in a SignedEnvelope with the license key. Contains no device ID, email or handle. allowedMajor or until is absent for the all update policy.",
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "schema": { "const": "tunetoys.license-certificate/1" },
          "certificateId": { "$ref": "common.schema.json#/$defs/EntityId" },
          "accountId": { "$ref": "common.schema.json#/$defs/EntityId" },
          "productId": { "$ref": "common.schema.json#/$defs/EntityId" },
          "grantIds": {
            "type": "array",
            "items": { "$ref": "common.schema.json#/$defs/EntityId" },
            "maxItems": 32,
            "minItems": 1,
            "uniqueItems": true
          },
          "allowedMajor": { "type": "integer", "minimum": 0, "maximum": 65535 },
          "until": { "$ref": "common.schema.json#/$defs/Timestamp" },
          "issuedAt": { "$ref": "common.schema.json#/$defs/Timestamp" },
          "expiresAt": { "$ref": "common.schema.json#/$defs/Timestamp" },
          "graceSeconds": {
            "type": "integer",
            "minimum": 0,
            "maximum": 2592000
          },
          "keyId": { "$ref": "common.schema.json#/$defs/EntityId" }
        },
        "required": [
          "schema",
          "certificateId",
          "accountId",
          "productId",
          "grantIds",
          "issuedAt",
          "expiresAt",
          "graceSeconds",
          "keyId"
        ],
        "not": {
          "required": ["allowedMajor", "until"],
          "properties": { "allowedMajor": true, "until": true }
        }
      },
      "ListingRevisionContent": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "$id": "https://tune.toys/schemas/platform/listing-revision.schema.json",
        "title": "ListingRevisionContent",
        "description": "Content of one product listing revision. The effective value of a field is overrides[field] ?? generated[field].",
        "type": "object",
        "additionalProperties": false,
        "required": [
          "generated",
          "overrides",
          "bodyMd",
          "gallery",
          "trailer",
          "manuals",
          "seo"
        ],
        "properties": {
          "generated": { "$ref": "#/$defs/ListingFields" },
          "overrides": { "$ref": "#/$defs/ListingOverrides" },
          "bodyMd": {
            "type": "string",
            "maxLength": 65536,
            "description": "Creator Markdown body, sanitized on render; empty until authored."
          },
          "gallery": {
            "type": "array",
            "items": { "$ref": "#/$defs/GalleryCarousel" },
            "maxItems": 6,
            "description": "Ordered carousels. At most 40 items across all carousels (service rule)."
          },
          "trailer": {
            "anyOf": [{ "$ref": "#/$defs/TrailerItem" }, { "type": "null" }]
          },
          "manuals": {
            "type": "array",
            "items": { "$ref": "#/$defs/ManualReference" },
            "maxItems": 20,
            "uniqueItems": true
          },
          "seo": { "$ref": "#/$defs/ListingSeo" }
        },
        "$defs": {
          "ListingFields": {
            "title": "ListingFields",
            "description": "Generated baseline derived from the current stable version.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "title": { "type": "string", "minLength": 1, "maxLength": 80 },
              "tagline": { "type": "string", "maxLength": 140 },
              "description": { "type": "string", "maxLength": 500 },
              "category": {
                "type": "string",
                "minLength": 1,
                "maxLength": 48,
                "pattern": "^[a-z][a-z0-9-]{0,47}$"
              },
              "tags": {
                "type": "array",
                "items": { "type": "string", "minLength": 1, "maxLength": 32 },
                "maxItems": 12,
                "uniqueItems": true
              },
              "controls": {
                "type": "array",
                "items": { "$ref": "#/$defs/ControlSummary" },
                "maxItems": 64
              },
              "requirements": {
                "type": "array",
                "items": { "$ref": "#/$defs/RequirementSummary" },
                "maxItems": 16
              },
              "links": {
                "type": "array",
                "items": { "$ref": "common.schema.json#/$defs/ExternalLink" },
                "maxItems": 12
              }
            },
            "required": [
              "title",
              "tagline",
              "description",
              "tags",
              "controls",
              "requirements",
              "links"
            ]
          },
          "ListingOverrides": {
            "title": "ListingOverrides",
            "description": "Per-field creator values. Controls and requirements are factual: creators append notes instead of replacing them.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "title": { "type": "string", "minLength": 1, "maxLength": 80 },
              "tagline": { "type": "string", "maxLength": 140 },
              "description": { "type": "string", "maxLength": 500 },
              "category": {
                "type": "string",
                "minLength": 1,
                "maxLength": 48,
                "pattern": "^[a-z][a-z0-9-]{0,47}$"
              },
              "tags": {
                "type": "array",
                "items": { "type": "string", "minLength": 1, "maxLength": 32 },
                "maxItems": 12,
                "uniqueItems": true
              },
              "links": {
                "type": "array",
                "items": { "$ref": "common.schema.json#/$defs/ExternalLink" },
                "maxItems": 12
              },
              "controlsNotesMd": { "type": "string", "maxLength": 4096 },
              "requirementsNotesMd": { "type": "string", "maxLength": 4096 }
            }
          },
          "ControlSummary": {
            "title": "ControlSummary",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "label": { "type": "string", "minLength": 1, "maxLength": 80 },
              "kind": {
                "type": "string",
                "minLength": 1,
                "maxLength": 32,
                "pattern": "^[a-z][a-z0-9_-]{0,31}$"
              },
              "description": { "type": "string", "maxLength": 300 }
            },
            "required": ["label", "kind"]
          },
          "RequirementSummary": {
            "title": "RequirementSummary",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "label": { "type": "string", "minLength": 1, "maxLength": 120 },
              "detail": { "type": "string", "maxLength": 500 }
            },
            "required": ["label"]
          },
          "GalleryCarousel": {
            "title": "GalleryCarousel",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "key": {
                "type": "string",
                "minLength": 1,
                "maxLength": 32,
                "pattern": "^[a-z][a-z0-9_-]{0,31}$",
                "description": "Carousel key, main or creator-named."
              },
              "title": { "type": "string", "minLength": 1, "maxLength": 80 },
              "items": {
                "type": "array",
                "items": { "$ref": "#/$defs/GalleryItem" },
                "maxItems": 20,
                "minItems": 1,
                "description": "Items in display order."
              }
            },
            "required": ["key", "items"]
          },
          "GalleryItem": {
            "title": "GalleryItem",
            "oneOf": [
              { "$ref": "#/$defs/ImageGalleryItem" },
              { "$ref": "#/$defs/GifGalleryItem" },
              { "$ref": "#/$defs/VideoGalleryItem" },
              { "$ref": "#/$defs/AudioGalleryItem" },
              { "$ref": "#/$defs/YouTubeGalleryItem" },
              { "$ref": "#/$defs/VimeoGalleryItem" }
            ]
          },
          "TrailerItem": {
            "title": "TrailerItem",
            "description": "The single trailer slot shown first and larger.",
            "oneOf": [
              { "$ref": "#/$defs/VideoGalleryItem" },
              { "$ref": "#/$defs/YouTubeGalleryItem" },
              { "$ref": "#/$defs/VimeoGalleryItem" },
              { "$ref": "#/$defs/GifGalleryItem" }
            ]
          },
          "ImageGalleryItem": {
            "title": "ImageGalleryItem",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "id": {
                "$ref": "common.schema.json#/$defs/EntityId",
                "description": "Durable item identity within the listing."
              },
              "caption": { "type": "string", "maxLength": 200 },
              "origin": { "enum": ["generated", "uploaded"] },
              "kind": { "const": "image" },
              "source": { "$ref": "#/$defs/MediaSource" },
              "alt": { "type": "string", "minLength": 1, "maxLength": 300 }
            },
            "required": ["id", "kind", "source", "alt"]
          },
          "GifGalleryItem": {
            "title": "GifGalleryItem",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "id": {
                "$ref": "common.schema.json#/$defs/EntityId",
                "description": "Durable item identity within the listing."
              },
              "caption": { "type": "string", "maxLength": 200 },
              "origin": { "enum": ["generated", "uploaded"] },
              "kind": { "const": "gif" },
              "source": { "$ref": "#/$defs/MediaSource" },
              "alt": { "type": "string", "minLength": 1, "maxLength": 300 }
            },
            "required": ["id", "kind", "source", "alt"]
          },
          "VideoGalleryItem": {
            "title": "VideoGalleryItem",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "id": {
                "$ref": "common.schema.json#/$defs/EntityId",
                "description": "Durable item identity within the listing."
              },
              "caption": { "type": "string", "maxLength": 200 },
              "origin": { "enum": ["generated", "uploaded"] },
              "kind": { "const": "video" },
              "source": { "$ref": "#/$defs/MediaSource" },
              "alt": {
                "type": "string",
                "minLength": 1,
                "maxLength": 300,
                "description": "Alternative text of the poster."
              },
              "posterAssetId": { "$ref": "common.schema.json#/$defs/EntityId" },
              "transcript": {
                "type": "string",
                "minLength": 1,
                "maxLength": 20000
              },
              "captionsMediaId": {
                "$ref": "common.schema.json#/$defs/EntityId"
              }
            },
            "required": ["id", "kind", "source", "alt"],
            "anyOf": [
              {
                "required": ["transcript"],
                "properties": { "transcript": true }
              },
              {
                "required": ["captionsMediaId"],
                "properties": { "captionsMediaId": true }
              }
            ]
          },
          "AudioGalleryItem": {
            "title": "AudioGalleryItem",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "id": {
                "$ref": "common.schema.json#/$defs/EntityId",
                "description": "Durable item identity within the listing."
              },
              "caption": { "type": "string", "maxLength": 200 },
              "origin": { "enum": ["generated", "uploaded"] },
              "kind": { "const": "audio" },
              "source": { "$ref": "#/$defs/MediaSource" },
              "alt": {
                "type": "string",
                "minLength": 1,
                "maxLength": 300,
                "description": "Text description of the audio."
              },
              "transcript": {
                "type": "string",
                "minLength": 1,
                "maxLength": 20000
              },
              "captionsMediaId": {
                "$ref": "common.schema.json#/$defs/EntityId"
              },
              "decorative": { "type": "boolean" }
            },
            "required": ["id", "kind", "source", "alt"],
            "anyOf": [
              {
                "required": ["transcript"],
                "properties": { "transcript": true }
              },
              {
                "required": ["captionsMediaId"],
                "properties": { "captionsMediaId": true }
              },
              {
                "required": ["decorative"],
                "properties": { "decorative": { "const": true } }
              }
            ]
          },
          "YouTubeGalleryItem": {
            "title": "YouTubeGalleryItem",
            "description": "Stores only the canonical video ID; rendered through youtube-nocookie with a click-to-load poster.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "id": {
                "$ref": "common.schema.json#/$defs/EntityId",
                "description": "Durable item identity within the listing."
              },
              "caption": { "type": "string", "maxLength": 200 },
              "origin": { "enum": ["generated", "uploaded"] },
              "kind": { "const": "youtube" },
              "videoId": {
                "type": "string",
                "minLength": 11,
                "maxLength": 11,
                "pattern": "^[A-Za-z0-9_-]{11}$"
              },
              "alt": {
                "type": "string",
                "minLength": 1,
                "maxLength": 300,
                "description": "Alternative text of the poster."
              },
              "posterAssetId": { "$ref": "common.schema.json#/$defs/EntityId" }
            },
            "required": ["id", "kind", "videoId", "alt"]
          },
          "VimeoGalleryItem": {
            "title": "VimeoGalleryItem",
            "description": "Stores only the canonical video ID; rendered with dnt=1 and a click-to-load poster.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "id": {
                "$ref": "common.schema.json#/$defs/EntityId",
                "description": "Durable item identity within the listing."
              },
              "caption": { "type": "string", "maxLength": 200 },
              "origin": { "enum": ["generated", "uploaded"] },
              "kind": { "const": "vimeo" },
              "videoId": {
                "type": "string",
                "minLength": 6,
                "maxLength": 12,
                "pattern": "^[0-9]{6,12}$"
              },
              "alt": {
                "type": "string",
                "minLength": 1,
                "maxLength": 300,
                "description": "Alternative text of the poster."
              },
              "posterAssetId": { "$ref": "common.schema.json#/$defs/EntityId" }
            },
            "required": ["id", "kind", "videoId", "alt"]
          },
          "ManualReference": {
            "title": "ManualReference",
            "description": "Ordered reference to a listing document.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "documentId": { "$ref": "common.schema.json#/$defs/EntityId" },
              "kind": { "$ref": "enums.schema.json#/$defs/ListingDocumentKind" }
            },
            "required": ["documentId", "kind"]
          },
          "ListingSeo": {
            "title": "ListingSeo",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "title": { "type": "string", "minLength": 1, "maxLength": 70 },
              "description": { "type": "string", "maxLength": 160 },
              "imageAssetId": { "$ref": "common.schema.json#/$defs/EntityId" }
            }
          },
          "MediaSource": {
            "title": "MediaSource",
            "description": "Uploaded files reference an approved media library item or a listing asset row.",
            "oneOf": [
              {
                "type": "object",
                "additionalProperties": false,
                "required": ["mediaId"],
                "properties": {
                  "mediaId": { "$ref": "common.schema.json#/$defs/EntityId" }
                }
              },
              {
                "type": "object",
                "additionalProperties": false,
                "required": ["assetId"],
                "properties": {
                  "assetId": { "$ref": "common.schema.json#/$defs/EntityId" }
                }
              }
            ]
          }
        }
      },
      "MediaVocabulary": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "$id": "https://tune.toys/schemas/platform/media-vocabulary.schema.json",
        "title": "MediaVocabulary",
        "description": "The closed vocabularies of the Sounds catalog as one document (served to editors and used as the zero-shot tag prompts). The long lists (`Instrument`, `Genre`, `Mood`) are defined here; the short ones reference enums.schema.json. Generated TypeScript exports each titled list as a type and an as-const array.",
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "instruments": {
            "type": "array",
            "maxItems": 147,
            "uniqueItems": true,
            "items": { "$ref": "#/$defs/Instrument" }
          },
          "genres": {
            "type": "array",
            "maxItems": 44,
            "uniqueItems": true,
            "items": { "$ref": "#/$defs/Genre" }
          },
          "moods": {
            "type": "array",
            "maxItems": 24,
            "uniqueItems": true,
            "items": { "$ref": "#/$defs/Mood" }
          },
          "soundTypes": {
            "type": "array",
            "maxItems": 8,
            "uniqueItems": true,
            "items": { "$ref": "enums.schema.json#/$defs/SoundType" }
          },
          "modes": {
            "type": "array",
            "maxItems": 7,
            "uniqueItems": true,
            "items": { "$ref": "enums.schema.json#/$defs/MusicalMode" }
          },
          "relationKinds": {
            "type": "array",
            "maxItems": 7,
            "uniqueItems": true,
            "items": { "$ref": "enums.schema.json#/$defs/RelationKind" }
          },
          "renditionKinds": {
            "type": "array",
            "maxItems": 10,
            "uniqueItems": true,
            "items": { "$ref": "enums.schema.json#/$defs/RenditionKind" }
          },
          "analysisStates": {
            "type": "array",
            "maxItems": 5,
            "uniqueItems": true,
            "items": { "$ref": "enums.schema.json#/$defs/AnalysisState" }
          }
        },
        "required": [
          "instruments",
          "genres",
          "moods",
          "soundTypes",
          "modes",
          "relationKinds",
          "renditionKinds",
          "analysisStates"
        ],
        "$defs": {
          "Instrument": {
            "title": "Instrument",
            "description": "Instrument tag id. The first 128 are the General MIDI level 1 programs in program order (index = program number), so `instruments[program]` maps a MIDI program; the rest name sources General MIDI has no program for (drum parts, vocals, recordings, synth roles).",
            "type": "string",
            "enum": [
              "acoustic-grand-piano",
              "bright-acoustic-piano",
              "electric-grand-piano",
              "honky-tonk-piano",
              "electric-piano-1",
              "electric-piano-2",
              "harpsichord",
              "clavinet",
              "celesta",
              "glockenspiel",
              "music-box",
              "vibraphone",
              "marimba",
              "xylophone",
              "tubular-bells",
              "dulcimer",
              "drawbar-organ",
              "percussive-organ",
              "rock-organ",
              "church-organ",
              "reed-organ",
              "accordion",
              "harmonica",
              "tango-accordion",
              "acoustic-guitar-nylon",
              "acoustic-guitar-steel",
              "electric-guitar-jazz",
              "electric-guitar-clean",
              "electric-guitar-muted",
              "overdriven-guitar",
              "distortion-guitar",
              "guitar-harmonics",
              "acoustic-bass",
              "electric-bass-finger",
              "electric-bass-pick",
              "fretless-bass",
              "slap-bass-1",
              "slap-bass-2",
              "synth-bass-1",
              "synth-bass-2",
              "violin",
              "viola",
              "cello",
              "contrabass",
              "tremolo-strings",
              "pizzicato-strings",
              "orchestral-harp",
              "timpani",
              "string-ensemble-1",
              "string-ensemble-2",
              "synth-strings-1",
              "synth-strings-2",
              "choir-aahs",
              "voice-oohs",
              "synth-voice",
              "orchestra-hit",
              "trumpet",
              "trombone",
              "tuba",
              "muted-trumpet",
              "french-horn",
              "brass-section",
              "synth-brass-1",
              "synth-brass-2",
              "soprano-sax",
              "alto-sax",
              "tenor-sax",
              "baritone-sax",
              "oboe",
              "english-horn",
              "bassoon",
              "clarinet",
              "piccolo",
              "flute",
              "recorder",
              "pan-flute",
              "blown-bottle",
              "shakuhachi",
              "whistle",
              "ocarina",
              "lead-square",
              "lead-sawtooth",
              "lead-calliope",
              "lead-chiff",
              "lead-charang",
              "lead-voice",
              "lead-fifths",
              "lead-bass-lead",
              "pad-new-age",
              "pad-warm",
              "pad-polysynth",
              "pad-choir",
              "pad-bowed",
              "pad-metallic",
              "pad-halo",
              "pad-sweep",
              "fx-rain",
              "fx-soundtrack",
              "fx-crystal",
              "fx-atmosphere",
              "fx-brightness",
              "fx-goblins",
              "fx-echoes",
              "fx-sci-fi",
              "sitar",
              "banjo",
              "shamisen",
              "koto",
              "kalimba",
              "bagpipe",
              "fiddle",
              "shanai",
              "tinkle-bell",
              "agogo",
              "steel-drums",
              "woodblock",
              "taiko-drum",
              "melodic-tom",
              "synth-drum",
              "reverse-cymbal",
              "guitar-fret-noise",
              "breath-noise",
              "seashore",
              "bird-tweet",
              "telephone-ring",
              "helicopter",
              "applause",
              "gunshot",
              "drums",
              "percussion",
              "kick",
              "snare",
              "hi-hat",
              "clap",
              "cymbal",
              "tom",
              "vocals",
              "field-recording",
              "foley",
              "ambience",
              "noise",
              "fx",
              "synth-lead",
              "synth-pad",
              "synth-bass",
              "synth-pluck",
              "synth-keys"
            ]
          },
          "Genre": {
            "title": "Genre",
            "description": "Genre tag id.",
            "type": "string",
            "enum": [
              "ambient",
              "blues",
              "breakbeat",
              "chillout",
              "cinematic",
              "classical",
              "country",
              "dance",
              "deep-house",
              "disco",
              "drum-and-bass",
              "dub",
              "dubstep",
              "electronic",
              "experimental",
              "folk",
              "funk",
              "garage",
              "gospel",
              "grime",
              "hardcore",
              "hip-hop",
              "house",
              "indie",
              "industrial",
              "jazz",
              "latin",
              "lo-fi",
              "metal",
              "orchestral",
              "pop",
              "punk",
              "reggae",
              "reggaeton",
              "rnb",
              "rock",
              "soul",
              "soundtrack",
              "synthwave",
              "techno",
              "trance",
              "trap",
              "trip-hop",
              "world"
            ]
          },
          "Mood": {
            "title": "Mood",
            "description": "Mood tag id; the CLAP zero-shot prompts use the same list.",
            "type": "string",
            "enum": [
              "aggressive",
              "bright",
              "calm",
              "cold",
              "dark",
              "dreamy",
              "energetic",
              "epic",
              "euphoric",
              "gritty",
              "happy",
              "haunting",
              "hopeful",
              "intense",
              "melancholic",
              "mysterious",
              "nostalgic",
              "playful",
              "relaxed",
              "romantic",
              "sad",
              "tense",
              "uplifting",
              "warm"
            ]
          }
        }
      },
      "NotificationEvent": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "$id": "https://tune.toys/schemas/platform/notification-event.schema.json",
        "title": "NotificationEvent",
        "description": "Input of the single notify helper. params holds ICU arguments (ids, counts, handles), never rendered strings or private content.",
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "eventType": {
            "$ref": "enums.schema.json#/$defs/NotificationEventType"
          },
          "subject": { "$ref": "#/$defs/NotificationSubject" },
          "params": {
            "type": "object",
            "maxProperties": 32,
            "propertyNames": { "pattern": "^[a-z][A-Za-z0-9_]{0,31}$" },
            "additionalProperties": { "$ref": "#/$defs/NotificationParam" }
          },
          "actorAccountId": {
            "anyOf": [
              { "$ref": "common.schema.json#/$defs/EntityId" },
              { "type": "null" }
            ]
          },
          "dedupeKey": {
            "type": "string",
            "minLength": 1,
            "maxLength": 256,
            "description": "Deterministic from the source event; unique per account."
          },
          "groupKey": {
            "anyOf": [
              { "type": "string", "minLength": 1, "maxLength": 256 },
              { "type": "null" }
            ],
            "description": "Collapses unread notifications within 24 hours."
          }
        },
        "required": [
          "eventType",
          "subject",
          "params",
          "actorAccountId",
          "dedupeKey",
          "groupKey"
        ],
        "$defs": {
          "NotificationSubject": {
            "title": "NotificationSubject",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "type": {
                "type": "string",
                "minLength": 1,
                "maxLength": 32,
                "pattern": "^[a-z][a-z_]{0,31}$"
              },
              "id": { "$ref": "common.schema.json#/$defs/EntityId" }
            },
            "required": ["type", "id"]
          },
          "NotificationParam": {
            "title": "NotificationParam",
            "anyOf": [
              { "type": "string", "maxLength": 256 },
              { "type": "number" },
              { "type": "boolean" },
              { "type": "null" },
              {
                "type": "array",
                "items": { "type": "string", "maxLength": 256 },
                "maxItems": 3
              }
            ]
          }
        }
      },
      "PlatformCommon": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "$id": "https://tune.toys/schemas/platform/common.schema.json",
        "title": "PlatformCommon",
        "description": "Shared scalar formats referenced by the other platform contracts.",
        "$defs": {
          "EntityId": {
            "title": "EntityId",
            "description": "Durable random identity of a platform row; never a label, slug or array position.",
            "type": "string",
            "minLength": 1,
            "maxLength": 128,
            "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$"
          },
          "Sha256Hex": {
            "title": "Sha256Hex",
            "description": "Lowercase hexadecimal SHA-256 digest.",
            "type": "string",
            "minLength": 64,
            "maxLength": 64,
            "pattern": "^[0-9a-f]{64}$"
          },
          "Timestamp": {
            "title": "Timestamp",
            "description": "UTC ISO 8601 timestamp as produced by Date.prototype.toISOString.",
            "type": "string",
            "minLength": 20,
            "maxLength": 30,
            "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(\\.[0-9]{1,9})?Z$"
          },
          "SemVer": {
            "title": "SemVer",
            "description": "Semantic version 2.0.0 string.",
            "type": "string",
            "minLength": 5,
            "maxLength": 64,
            "pattern": "^(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)(-(0|[1-9][0-9]*|[0-9]*[A-Za-z-][0-9A-Za-z-]*)(\\.(0|[1-9][0-9]*|[0-9]*[A-Za-z-][0-9A-Za-z-]*))*)?(\\+[0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*)?$"
          },
          "ByteSize": {
            "title": "ByteSize",
            "description": "Byte count of a stored object.",
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "ExternalLink": {
            "title": "ExternalLink",
            "description": "Plain-text label and an https: or mailto: target.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "label": { "type": "string", "minLength": 1, "maxLength": 80 },
              "href": {
                "type": "string",
                "minLength": 1,
                "maxLength": 2048,
                "pattern": "^(https://|mailto:)[^\\s]+$"
              }
            },
            "required": ["label", "href"]
          }
        }
      },
      "PlatformEnums": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "$id": "https://tune.toys/schemas/platform/enums.schema.json",
        "title": "PlatformEnums",
        "description": "Closed platform enums. Generated TypeScript exports each as a type and an as-const array; this file is their single source.",
        "$defs": {
          "TargetProfile": {
            "title": "TargetProfile",
            "description": "Closed target profile shared with the exporters, matrix editor, download chooser and update feed.",
            "type": "string",
            "enum": [
              "browser",
              "macos-arm64",
              "macos-x64",
              "macos-universal",
              "windows-x64",
              "linux-x64",
              "ios",
              "android",
              "chrome-extension",
              "desktop-app-macos",
              "desktop-app-windows",
              "desktop-app-linux",
              "player-package"
            ]
          },
          "ArtifactFormat": {
            "title": "ArtifactFormat",
            "description": "Artifact format; formats multiply within a target profile.",
            "type": "string",
            "enum": [
              "web",
              "vst3",
              "au",
              "clap",
              "standalone",
              "installer",
              "player_package",
              "extension",
              "mobile"
            ]
          },
          "ArtifactArch": {
            "title": "ArtifactArch",
            "description": "CPU architecture of an artifact.",
            "type": "string",
            "enum": ["arm64", "x64", "universal", "any"]
          },
          "SignatureState": {
            "title": "SignatureState",
            "description": "Code-signature state read from the artifact inventory; the server never upgrades it by itself.",
            "type": "string",
            "enum": ["unsigned", "dev", "signed", "notarized"]
          },
          "QualificationState": {
            "title": "QualificationState",
            "description": "Artifact qualification; upgrades only, a new digest is a new artifact.",
            "type": "string",
            "enum": ["unqualified", "declared", "tested"]
          },
          "ProductKind": {
            "title": "ProductKind",
            "description": "What a product sells or distributes. `app` is an official application (the desktop app) whose versions carry artifacts directly and pin no Toy releases.",
            "type": "string",
            "enum": [
              "toy",
              "chain",
              "preset_pack",
              "sample_pack",
              "bundle",
              "app"
            ]
          },
          "ProductState": {
            "title": "ProductState",
            "description": "Product lifecycle state.",
            "type": "string",
            "enum": ["draft", "published", "unlisted", "delisted", "removed"]
          },
          "ProductVersionState": {
            "title": "ProductVersionState",
            "description": "Product version lifecycle state.",
            "type": "string",
            "enum": ["draft", "building", "published", "yanked"]
          },
          "PublisherKind": {
            "title": "PublisherKind",
            "description": "Personal publishers reuse the account handle; organizations have members.",
            "type": "string",
            "enum": ["personal", "organization"]
          },
          "PublisherState": {
            "title": "PublisherState",
            "description": "Publisher onboarding and enforcement state.",
            "type": "string",
            "enum": [
              "draft",
              "onboarding",
              "verified",
              "publishing_enabled",
              "restricted",
              "suspended"
            ]
          },
          "PublisherRole": {
            "title": "PublisherRole",
            "description": "Publisher member role.",
            "type": "string",
            "enum": ["owner", "release_manager", "editor", "finance", "support"]
          },
          "ListingVisibility": {
            "title": "ListingVisibility",
            "description": "Product listing visibility.",
            "type": "string",
            "enum": ["public", "unlisted", "private"]
          },
          "ListingAssetKind": {
            "title": "ListingAssetKind",
            "description": "Generated or uploaded listing asset kind; manual and marketing_image are upload-only.",
            "type": "string",
            "enum": [
              "thumbnail",
              "og",
              "social",
              "gif",
              "video",
              "audio_preview",
              "screenshot",
              "marketing_image",
              "manual",
              "readme",
              "llms",
              "manifest",
              "schema",
              "jsonld",
              "qr",
              "controls_sheet",
              "transcript"
            ]
          },
          "ListingDocumentKind": {
            "title": "ListingDocumentKind",
            "description": "Listing document kind.",
            "type": "string",
            "enum": ["manual", "docs", "changelog_page", "faq"]
          },
          "EmbedPolicy": {
            "title": "EmbedPolicy",
            "description": "Product embed policy; an empty allowlist behaves as none.",
            "type": "string",
            "enum": ["none", "any", "allowlist"]
          },
          "PostKind": {
            "title": "PostKind",
            "description": "Social post kind.",
            "type": "string",
            "enum": ["review", "comment", "reply"]
          },
          "PostSubjectType": {
            "title": "PostSubjectType",
            "description": "What a root post is about; `media` is a comment on a sound.",
            "type": "string",
            "enum": [
              "product",
              "project",
              "version",
              "storefront",
              "docs_page",
              "media"
            ]
          },
          "PostState": {
            "title": "PostState",
            "description": "Post visibility state; block hiding is applied per viewer at read time, never stored.",
            "type": "string",
            "enum": [
              "visible",
              "edited",
              "removed_by_author",
              "removed_by_owner",
              "removed_by_moderator"
            ]
          },
          "PostReactionKind": {
            "title": "PostReactionKind",
            "description": "Post reaction kind.",
            "type": "string",
            "enum": ["like", "helpful"]
          },
          "NotificationEventType": {
            "title": "NotificationEventType",
            "description": "Closed notification event type.",
            "type": "string",
            "enum": [
              "version_published",
              "version_yanked",
              "update_available",
              "install_failed",
              "purchase_receipt",
              "payment_failed",
              "subscription_renewed",
              "subscription_cancelled",
              "refund_processed",
              "review_on_your_product",
              "comment_on_your_work",
              "publisher_response",
              "reply",
              "mention",
              "like_milestone",
              "pinned",
              "follow",
              "collection_add",
              "invitation",
              "collaboration_edit",
              "report_resolved",
              "api_key_expiring",
              "api_limit_reached",
              "api_tier_changed",
              "docs_comment",
              "security_signin",
              "account_notice"
            ]
          },
          "NotificationChannel": {
            "title": "NotificationChannel",
            "description": "Notification delivery channel.",
            "type": "string",
            "enum": ["in_app", "email", "web_push", "native_push"]
          },
          "NotificationCategory": {
            "title": "NotificationCategory",
            "description": "Notification settings and filter category.",
            "type": "string",
            "enum": [
              "Updates",
              "Purchases",
              "Social",
              "Mentions",
              "System",
              "Developer",
              "Security"
            ]
          },
          "ApiKeyScope": {
            "title": "ApiKeyScope",
            "description": "Developer API key scope. No scope grants billing, device administration, moderation or another account's private data.",
            "type": "string",
            "enum": [
              "read:public",
              "read:library",
              "write:library",
              "read:projects",
              "write:projects",
              "read:products",
              "write:listings",
              "read:usage",
              "read:notifications",
              "publish:releases"
            ]
          },
          "InstallationState": {
            "title": "InstallationState",
            "description": "Installation record state.",
            "type": "string",
            "enum": [
              "installed",
              "update_available",
              "failed",
              "rolled_back",
              "removed"
            ]
          },
          "ReleaseChannel": {
            "title": "ReleaseChannel",
            "description": "Product version alias and update feed channel.",
            "type": "string",
            "enum": ["stable", "beta"]
          },
          "Visibility": {
            "title": "Visibility",
            "description": "Platform visibility of a project, media item or collection: `unlisted` is reachable by link and id, excluded from search and feeds.",
            "type": "string",
            "enum": ["public", "unlisted", "private"]
          },
          "MediaFamily": {
            "title": "MediaFamily",
            "description": "Media family of an admitted format; `score` covers MEI and MusicXML, the media type distinguishing the dialect.",
            "type": "string",
            "enum": [
              "audio",
              "midi",
              "score",
              "video",
              "image",
              "document",
              "csv",
              "tsv",
              "json",
              "ndjson",
              "take"
            ]
          },
          "MediaItemState": {
            "title": "MediaItemState",
            "description": "Catalog state of a media item; removed items stay for pinned release versions.",
            "type": "string",
            "enum": ["ready", "removed"]
          },
          "IngestState": {
            "title": "IngestState",
            "description": "Ingest state of a media version: bytes verified at completion, derived data ready, or refused by the probe.",
            "type": "string",
            "enum": ["verified", "ready", "rejected"]
          },
          "SoundType": {
            "title": "SoundType",
            "description": "Closed sound type, declared by the creator or estimated from duration and beat grid.",
            "type": "string",
            "enum": [
              "one-shot",
              "loop",
              "phrase",
              "recording",
              "stem",
              "track",
              "midi-clip",
              "score"
            ]
          },
          "MusicalMode": {
            "title": "MusicalMode",
            "description": "The seven diatonic modes; `tonality` and the Camelot code derive from the mode and root.",
            "type": "string",
            "enum": [
              "ionian",
              "dorian",
              "phrygian",
              "lydian",
              "mixolydian",
              "aeolian",
              "locrian"
            ]
          },
          "Tonality": {
            "title": "Tonality",
            "description": "Relative major or minor of a mode: ionian, lydian and mixolydian are major; the rest minor.",
            "type": "string",
            "enum": ["major", "minor"]
          },
          "MetadataSource": {
            "title": "MetadataSource",
            "description": "Where a resolved metadata value came from; declared wins over embedded over analysed.",
            "type": "string",
            "enum": ["declared", "embedded", "analysed"]
          },
          "RelationKind": {
            "title": "RelationKind",
            "description": "Directional relation between two media items.",
            "type": "string",
            "enum": [
              "recording-of",
              "transcription-of",
              "stem-of",
              "variant-of",
              "artwork-for",
              "part-of",
              "take-of"
            ]
          },
          "RenditionKind": {
            "title": "RenditionKind",
            "description": "Derived rendition of a media version.",
            "type": "string",
            "enum": [
              "peaks",
              "peaks-json",
              "preview-ogg",
              "preview-mp3",
              "thumbnail",
              "waveform-art",
              "poster",
              "score-page",
              "piano-roll",
              "beats"
            ]
          },
          "RenditionState": {
            "title": "RenditionState",
            "description": "Rendition outcome.",
            "type": "string",
            "enum": ["ready", "failed"]
          },
          "AnalysisState": {
            "title": "AnalysisState",
            "description": "State of one engine run over a media version.",
            "type": "string",
            "enum": ["queued", "running", "ready", "failed", "unsupported"]
          },
          "MediaJobKind": {
            "title": "MediaJobKind",
            "description": "Ingestion job kind, queued per media version.",
            "type": "string",
            "enum": ["probe", "renditions", "analysis", "embedding", "index"]
          },
          "ReactionKind": {
            "title": "ReactionKind",
            "description": "Reaction on a project or media item.",
            "type": "string",
            "enum": ["like"]
          },
          "ReactionSubjectType": {
            "title": "ReactionSubjectType",
            "description": "What a reaction is about.",
            "type": "string",
            "enum": ["project", "media"]
          },
          "CollectionSubjectType": {
            "title": "CollectionSubjectType",
            "description": "What a collection item points at.",
            "type": "string",
            "enum": ["project", "media"]
          }
        }
      },
      "PlatformMatrix": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "$id": "https://tune.toys/schemas/platform/platform-matrix.schema.json",
        "title": "PlatformMatrix",
        "description": "Per-version platform matrix: one entry per target profile. included means an artifact exists, supported is a creator claim, tested requires evidence.",
        "type": "array",
        "items": { "$ref": "#/$defs/VersionTargetEntry" },
        "maxItems": 13,
        "$defs": {
          "VersionTargetEntry": {
            "title": "VersionTargetEntry",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "targetProfile": {
                "$ref": "enums.schema.json#/$defs/TargetProfile"
              },
              "included": { "type": "boolean" },
              "supported": { "type": "boolean" },
              "tested": { "type": "boolean" },
              "notes": { "type": "string", "maxLength": 500 },
              "evidenceReportId": {
                "anyOf": [
                  { "$ref": "common.schema.json#/$defs/EntityId" },
                  { "type": "null" }
                ]
              }
            },
            "required": [
              "targetProfile",
              "included",
              "supported",
              "tested",
              "notes",
              "evidenceReportId"
            ],
            "if": { "properties": { "tested": { "const": true } } },
            "then": {
              "properties": {
                "included": { "const": true },
                "evidenceReportId": {
                  "$ref": "common.schema.json#/$defs/EntityId"
                }
              }
            }
          }
        }
      },
      "PostContent": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "$id": "https://tune.toys/schemas/platform/post.schema.json",
        "title": "PostContent",
        "description": "Author-supplied content of a review, comment or reply. Server-owned fields (author, verified owner, root, depth, pins, state) are not part of it. Replies inherit subject and team scope from their root.",
        "oneOf": [
          { "$ref": "#/$defs/ReviewPostContent" },
          { "$ref": "#/$defs/CommentPostContent" },
          { "$ref": "#/$defs/ReplyPostContent" }
        ],
        "$defs": {
          "PostSubject": {
            "title": "PostSubject",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "type": { "$ref": "enums.schema.json#/$defs/PostSubjectType" },
              "id": { "$ref": "common.schema.json#/$defs/EntityId" }
            },
            "required": ["type", "id"]
          },
          "PostAnchor": {
            "title": "PostAnchor",
            "description": "Durable anchor into the published release (public) or current draft (team).",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "definitionId": {
                "type": "string",
                "minLength": 1,
                "maxLength": 128
              },
              "nodeId": { "type": "string", "minLength": 1, "maxLength": 128 },
              "frameId": { "type": "string", "minLength": 1, "maxLength": 128 },
              "widgetId": { "type": "string", "minLength": 1, "maxLength": 128 }
            },
            "minProperties": 1,
            "dependentRequired": {
              "nodeId": ["definitionId"],
              "widgetId": ["frameId"]
            }
          },
          "ReviewPostContent": {
            "title": "ReviewPostContent",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "kind": { "const": "review" },
              "subject": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "type": { "const": "product" },
                  "id": { "$ref": "common.schema.json#/$defs/EntityId" }
                },
                "required": ["type", "id"]
              },
              "rating": { "type": "integer", "minimum": 1, "maximum": 5 },
              "title": { "type": "string", "minLength": 1, "maxLength": 120 },
              "bodyMd": { "type": "string", "maxLength": 8192 },
              "reviewedVersionId": {
                "$ref": "common.schema.json#/$defs/EntityId"
              }
            },
            "required": ["kind", "subject", "rating"]
          },
          "CommentPostContent": {
            "title": "CommentPostContent",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "kind": { "const": "comment" },
              "subject": { "$ref": "#/$defs/PostSubject" },
              "bodyMd": { "type": "string", "minLength": 1, "maxLength": 8192 },
              "anchor": { "$ref": "#/$defs/PostAnchor" },
              "teamOnly": { "type": "boolean" }
            },
            "required": ["kind", "subject", "bodyMd"],
            "if": {
              "properties": { "teamOnly": { "const": true } },
              "required": ["teamOnly"]
            },
            "then": {
              "properties": {
                "subject": {
                  "type": "object",
                  "properties": { "type": { "const": "project" } }
                }
              }
            }
          },
          "ReplyPostContent": {
            "title": "ReplyPostContent",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "kind": { "const": "reply" },
              "parentId": { "$ref": "common.schema.json#/$defs/EntityId" },
              "bodyMd": { "type": "string", "minLength": 1, "maxLength": 8192 }
            },
            "required": ["kind", "parentId", "bodyMd"]
          }
        }
      },
      "SignedEnvelope": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "$id": "https://tune.toys/schemas/platform/signed-envelope.schema.json",
        "title": "SignedEnvelope",
        "description": "Ed25519 envelope for update manifests and license certificates. The signature covers a purpose-specific domain prefix followed by the exact payload bytes; verifiers check it before parsing and never re-canonicalize.",
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "payload": {
            "type": "string",
            "minLength": 1,
            "maxLength": 1398104,
            "pattern": "^[A-Za-z0-9_-]+$",
            "description": "base64url of the exact canonical payload bytes (at most 1 MiB decoded)."
          },
          "alg": { "const": "ed25519" },
          "keyId": { "$ref": "common.schema.json#/$defs/EntityId" },
          "sig": {
            "type": "string",
            "minLength": 86,
            "maxLength": 86,
            "pattern": "^[A-Za-z0-9_-]{86}$",
            "description": "base64url Ed25519 signature without padding."
          }
        },
        "required": ["payload", "alg", "keyId", "sig"]
      },
      "SoundAnalysis": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "$id": "https://tune.toys/schemas/platform/media-analysis.schema.json",
        "title": "SoundAnalysis",
        "description": "One engine run over a media version: its state, the facet summary the index reads and the full report. A newer engine version appends a row; the resolved view takes the newest ready one.",
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "versionId": { "$ref": "common.schema.json#/$defs/EntityId" },
          "engine": { "type": "string", "minLength": 1, "maxLength": 64 },
          "engineVersion": { "$ref": "common.schema.json#/$defs/SemVer" },
          "state": { "$ref": "enums.schema.json#/$defs/AnalysisState" },
          "summary": {
            "anyOf": [{ "$ref": "#/$defs/AnalysisSummary" }, { "type": "null" }]
          },
          "report": {
            "anyOf": [{ "$ref": "#/$defs/AnalysisReport" }, { "type": "null" }]
          },
          "error": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 512,
                "description": "Failure or unsupported reason, plain text."
              },
              { "type": "null" }
            ]
          },
          "startedAt": {
            "anyOf": [
              { "$ref": "common.schema.json#/$defs/Timestamp" },
              { "type": "null" }
            ]
          },
          "finishedAt": {
            "anyOf": [
              { "$ref": "common.schema.json#/$defs/Timestamp" },
              { "type": "null" }
            ]
          }
        },
        "required": [
          "versionId",
          "engine",
          "engineVersion",
          "state",
          "summary",
          "report",
          "error",
          "startedAt",
          "finishedAt"
        ],
        "$defs": {
          "TagScore": {
            "title": "TagScore",
            "description": "A vocabulary id with its zero-shot score.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "id": { "type": "string", "minLength": 1, "maxLength": 64 },
              "score": {
                "type": "number",
                "minimum": 0,
                "maximum": 1,
                "description": "0 (a guess) to 1 (certain)."
              }
            },
            "required": ["id", "score"]
          },
          "TagScores": {
            "title": "TagScores",
            "description": "Optional stage-3 tag scores, present only when the embedding model ran.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "instruments": {
                "type": "array",
                "maxItems": 16,
                "uniqueItems": true,
                "items": { "$ref": "#/$defs/TagScore" }
              },
              "genres": {
                "type": "array",
                "maxItems": 16,
                "uniqueItems": true,
                "items": { "$ref": "#/$defs/TagScore" }
              },
              "moods": {
                "type": "array",
                "maxItems": 16,
                "uniqueItems": true,
                "items": { "$ref": "#/$defs/TagScore" }
              },
              "vocals": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "present": { "type": "boolean" },
                  "confidence": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 1,
                    "description": "0 (a guess) to 1 (certain)."
                  }
                },
                "required": ["present", "confidence"]
              }
            },
            "required": ["instruments", "genres", "moods"]
          },
          "AnalysisSummary": {
            "title": "AnalysisSummary",
            "description": "The subset the media index needs, each estimate with its confidence; null where the engine reported nothing.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "durationMs": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "tempo": {
                "anyOf": [
                  {
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                      "bpm": {
                        "type": "number",
                        "minimum": 1,
                        "maximum": 1000
                      },
                      "confidence": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 1,
                        "description": "0 (a guess) to 1 (certain)."
                      }
                    },
                    "required": ["bpm", "confidence"]
                  },
                  { "type": "null" }
                ]
              },
              "key": {
                "anyOf": [
                  {
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                      "root": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 11,
                        "description": "Pitch class of the key root: 0 = C … 11 = B."
                      },
                      "mode": {
                        "$ref": "enums.schema.json#/$defs/MusicalMode"
                      },
                      "tonality": {
                        "$ref": "enums.schema.json#/$defs/Tonality"
                      },
                      "camelot": {
                        "type": "string",
                        "pattern": "^(1[0-2]|[1-9])[AB]$",
                        "description": "Camelot wheel code: 1A–12A minor, 1B–12B major."
                      },
                      "confidence": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 1,
                        "description": "0 (a guess) to 1 (certain)."
                      }
                    },
                    "required": [
                      "root",
                      "mode",
                      "tonality",
                      "camelot",
                      "confidence"
                    ]
                  },
                  { "type": "null" }
                ]
              },
              "meter": {
                "anyOf": [
                  {
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                      "numerator": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 32
                      },
                      "denominator": {
                        "type": "integer",
                        "enum": [1, 2, 4, 8, 16]
                      },
                      "confidence": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 1,
                        "description": "0 (a guess) to 1 (certain)."
                      }
                    },
                    "required": ["numerator", "denominator", "confidence"]
                  },
                  { "type": "null" }
                ]
              },
              "loudnessLufs": {
                "anyOf": [
                  { "type": "number", "minimum": -100, "maximum": 10 },
                  { "type": "null" }
                ]
              },
              "rootMidi": {
                "anyOf": [
                  { "type": "integer", "minimum": 0, "maximum": 127 },
                  { "type": "null" }
                ]
              },
              "soundType": {
                "anyOf": [
                  { "$ref": "enums.schema.json#/$defs/SoundType" },
                  { "type": "null" }
                ]
              },
              "tags": {
                "anyOf": [{ "$ref": "#/$defs/TagScores" }, { "type": "null" }]
              }
            },
            "required": [
              "durationMs",
              "tempo",
              "key",
              "meter",
              "loudnessLufs",
              "rootMidi",
              "soundType",
              "tags"
            ]
          },
          "AnalysisEngine": {
            "title": "AnalysisEngine",
            "description": "The engine build that produced a report.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "name": { "type": "string", "minLength": 1, "maxLength": 64 },
              "version": { "$ref": "common.schema.json#/$defs/SemVer" },
              "target": { "type": "string", "enum": ["native", "wasm"] }
            },
            "required": ["name", "version", "target"]
          },
          "AnalysisInput": {
            "title": "AnalysisInput",
            "description": "What was decoded.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "sha256": { "$ref": "common.schema.json#/$defs/Sha256Hex" },
              "mediaType": {
                "type": "string",
                "minLength": 3,
                "maxLength": 128,
                "pattern": "^[a-z]+/[A-Za-z0-9!#$&^_.+-]+$",
                "description": "Admitted media type without parameters."
              },
              "sampleRate": {
                "type": "integer",
                "minimum": 1,
                "maximum": 1000000
              },
              "channels": { "type": "integer", "minimum": 1, "maximum": 64 },
              "bitDepth": {
                "anyOf": [
                  { "type": "integer", "minimum": 1, "maximum": 64 },
                  { "type": "null" }
                ]
              },
              "durationMs": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "decoded": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "sampleRate": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 1000000
                  },
                  "frames": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 9007199254740991
                  }
                },
                "required": ["sampleRate", "frames"]
              }
            },
            "required": [
              "sha256",
              "mediaType",
              "sampleRate",
              "channels",
              "bitDepth",
              "durationMs",
              "decoded"
            ]
          },
          "Loudness": {
            "title": "Loudness",
            "description": "EBU R128 loudness and level facts.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "integratedLufs": {
                "type": "number",
                "minimum": -100,
                "maximum": 10
              },
              "rangeLu": { "type": "number", "minimum": 0, "maximum": 100 },
              "truePeakDbtp": {
                "type": "number",
                "minimum": -100,
                "maximum": 20
              },
              "samplePeakDbfs": {
                "type": "number",
                "minimum": -100,
                "maximum": 20
              },
              "rmsDbfs": { "type": "number", "minimum": -100, "maximum": 20 },
              "dcOffset": { "type": "number", "minimum": -1, "maximum": 1 },
              "clippedSamples": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              }
            },
            "required": [
              "integratedLufs",
              "rangeLu",
              "truePeakDbtp",
              "samplePeakDbfs",
              "rmsDbfs",
              "dcOffset",
              "clippedSamples"
            ]
          },
          "TempoCandidate": {
            "title": "TempoCandidate",
            "description": "A tempo hypothesis and its score.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "bpm": { "type": "number", "minimum": 1, "maximum": 1000 },
              "score": {
                "type": "number",
                "minimum": 0,
                "maximum": 1,
                "description": "0 (a guess) to 1 (certain)."
              }
            },
            "required": ["bpm", "score"]
          },
          "Tempo": {
            "title": "Tempo",
            "description": "Tempo estimate from onset autocorrelation.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "bpm": { "type": "number", "minimum": 1, "maximum": 1000 },
              "confidence": {
                "type": "number",
                "minimum": 0,
                "maximum": 1,
                "description": "0 (a guess) to 1 (certain)."
              },
              "candidates": {
                "type": "array",
                "maxItems": 8,
                "uniqueItems": false,
                "items": { "$ref": "#/$defs/TempoCandidate" }
              },
              "beatsMs": {
                "type": "array",
                "maxItems": 100000,
                "items": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 9007199254740991
                }
              },
              "barAligned": { "type": "boolean" },
              "bars": {
                "anyOf": [
                  { "type": "number", "minimum": 0, "maximum": 1000000 },
                  { "type": "null" }
                ]
              }
            },
            "required": [
              "bpm",
              "confidence",
              "candidates",
              "beatsMs",
              "barAligned",
              "bars"
            ]
          },
          "MeterEstimate": {
            "title": "MeterEstimate",
            "description": "Meter estimate from beat grouping.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "numerator": { "type": "integer", "minimum": 1, "maximum": 32 },
              "denominator": { "type": "integer", "enum": [1, 2, 4, 8, 16] },
              "confidence": {
                "type": "number",
                "minimum": 0,
                "maximum": 1,
                "description": "0 (a guess) to 1 (certain)."
              }
            },
            "required": ["numerator", "denominator", "confidence"]
          },
          "KeyAlternative": {
            "title": "KeyAlternative",
            "description": "A lower-scoring key hypothesis.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "root": {
                "type": "integer",
                "minimum": 0,
                "maximum": 11,
                "description": "Pitch class of the key root: 0 = C … 11 = B."
              },
              "mode": { "$ref": "enums.schema.json#/$defs/MusicalMode" },
              "score": {
                "type": "number",
                "minimum": 0,
                "maximum": 1,
                "description": "0 (a guess) to 1 (certain)."
              }
            },
            "required": ["root", "mode", "score"]
          },
          "KeyEstimate": {
            "title": "KeyEstimate",
            "description": "Key estimate from profile correlation.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "root": {
                "type": "integer",
                "minimum": 0,
                "maximum": 11,
                "description": "Pitch class of the key root: 0 = C … 11 = B."
              },
              "mode": { "$ref": "enums.schema.json#/$defs/MusicalMode" },
              "tonality": { "$ref": "enums.schema.json#/$defs/Tonality" },
              "camelot": {
                "type": "string",
                "pattern": "^(1[0-2]|[1-9])[AB]$",
                "description": "Camelot wheel code: 1A–12A minor, 1B–12B major."
              },
              "confidence": {
                "type": "number",
                "minimum": 0,
                "maximum": 1,
                "description": "0 (a guess) to 1 (certain)."
              },
              "tuningCents": {
                "type": "number",
                "minimum": -50,
                "maximum": 50
              },
              "alternatives": {
                "type": "array",
                "maxItems": 8,
                "uniqueItems": false,
                "items": { "$ref": "#/$defs/KeyAlternative" }
              },
              "chroma": {
                "type": "array",
                "minItems": 12,
                "maxItems": 12,
                "items": { "type": "number", "minimum": 0, "maximum": 1 }
              }
            },
            "required": [
              "root",
              "mode",
              "tonality",
              "camelot",
              "confidence",
              "tuningCents",
              "alternatives",
              "chroma"
            ]
          },
          "Pitch": {
            "title": "Pitch",
            "description": "Root pitch of a tuned sound (pYIN on the attack).",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "midi": { "type": "integer", "minimum": 0, "maximum": 127 },
              "note": {
                "type": "string",
                "minLength": 2,
                "maxLength": 4,
                "pattern": "^[A-G][#b]?-?[0-9]$"
              },
              "cents": { "type": "number", "minimum": -50, "maximum": 50 },
              "confidence": {
                "type": "number",
                "minimum": 0,
                "maximum": 1,
                "description": "0 (a guess) to 1 (certain)."
              }
            },
            "required": ["midi", "note", "cents", "confidence"]
          },
          "Structure": {
            "title": "Structure",
            "description": "Temporal structure and quality flags.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "soundType": { "$ref": "enums.schema.json#/$defs/SoundType" },
              "oneShot": { "type": "boolean" },
              "silenceHeadMs": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "silenceTailMs": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "onsetCount": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "transientsPerSecond": {
                "type": "number",
                "minimum": 0,
                "maximum": 100000
              }
            },
            "required": [
              "soundType",
              "oneShot",
              "silenceHeadMs",
              "silenceTailMs",
              "onsetCount",
              "transientsPerSecond"
            ]
          },
          "Spectral": {
            "title": "Spectral",
            "description": "Spectral descriptors averaged over the file.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "centroidHz": {
                "type": "number",
                "minimum": 0,
                "maximum": 1000000
              },
              "rolloffHz": {
                "type": "number",
                "minimum": 0,
                "maximum": 1000000
              },
              "flatness": { "type": "number", "minimum": 0, "maximum": 1 },
              "bandwidthHz": {
                "type": "number",
                "minimum": 0,
                "maximum": 1000000
              },
              "zcr": { "type": "number", "minimum": 0, "maximum": 1 }
            },
            "required": [
              "centroidHz",
              "rolloffHz",
              "flatness",
              "bandwidthHz",
              "zcr"
            ]
          },
          "AnalysisReport": {
            "title": "AnalysisReport",
            "description": "The full `tt-analysis` report: stable field order, every number finite, at most 256 KiB. Sections the engine could not compute are null.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "engine": { "$ref": "#/$defs/AnalysisEngine" },
              "input": { "$ref": "#/$defs/AnalysisInput" },
              "loudness": {
                "anyOf": [{ "$ref": "#/$defs/Loudness" }, { "type": "null" }]
              },
              "tempo": {
                "anyOf": [{ "$ref": "#/$defs/Tempo" }, { "type": "null" }]
              },
              "meter": {
                "anyOf": [
                  { "$ref": "#/$defs/MeterEstimate" },
                  { "type": "null" }
                ]
              },
              "key": {
                "anyOf": [{ "$ref": "#/$defs/KeyEstimate" }, { "type": "null" }]
              },
              "pitch": {
                "anyOf": [{ "$ref": "#/$defs/Pitch" }, { "type": "null" }]
              },
              "structure": {
                "anyOf": [{ "$ref": "#/$defs/Structure" }, { "type": "null" }]
              },
              "spectral": {
                "anyOf": [{ "$ref": "#/$defs/Spectral" }, { "type": "null" }]
              },
              "tags": {
                "anyOf": [{ "$ref": "#/$defs/TagScores" }, { "type": "null" }]
              },
              "renditions": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "peaks": {
                    "anyOf": [
                      { "$ref": "common.schema.json#/$defs/EntityId" },
                      { "type": "null" }
                    ]
                  },
                  "beats": {
                    "anyOf": [
                      { "$ref": "common.schema.json#/$defs/EntityId" },
                      { "type": "null" }
                    ]
                  }
                },
                "required": ["peaks", "beats"]
              },
              "timing": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "decodeMs": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 9007199254740991
                  },
                  "analyzeMs": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 9007199254740991
                  }
                },
                "required": ["decodeMs", "analyzeMs"]
              }
            },
            "required": [
              "engine",
              "input",
              "loudness",
              "tempo",
              "meter",
              "key",
              "pitch",
              "structure",
              "spectral",
              "tags",
              "renditions",
              "timing"
            ]
          }
        }
      },
      "SoundItem": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "$id": "https://tune.toys/schemas/platform/media-item.schema.json",
        "title": "SoundItem",
        "description": "The mutable catalog entry of one upload: what people see and edit (title, artwork, tags, declared musical fields, visibility). Bytes and rights live on its versions. Server-owned counters and the resolved view are separate shapes here.",
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": { "$ref": "common.schema.json#/$defs/EntityId" },
          "ownerId": { "$ref": "common.schema.json#/$defs/EntityId" },
          "currentVersion": { "$ref": "common.schema.json#/$defs/EntityId" },
          "family": { "$ref": "enums.schema.json#/$defs/MediaFamily" },
          "title": { "type": "string", "minLength": 1, "maxLength": 128 },
          "artist": { "type": "string", "minLength": 0, "maxLength": 128 },
          "description": {
            "type": "string",
            "minLength": 0,
            "maxLength": 4000,
            "description": "Markdown rendered through @tunetoys/markdown."
          },
          "tags": {
            "type": "array",
            "maxItems": 20,
            "uniqueItems": true,
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 40,
              "pattern": "^[a-z0-9][a-z0-9 ._+#&/-]{0,39}$"
            },
            "description": "Lower-case tags, at most 20 × 40 characters."
          },
          "soundType": {
            "anyOf": [
              { "$ref": "enums.schema.json#/$defs/SoundType" },
              { "type": "null" }
            ]
          },
          "visibility": { "$ref": "enums.schema.json#/$defs/Visibility" },
          "state": { "$ref": "enums.schema.json#/$defs/MediaItemState" },
          "artwork": {
            "anyOf": [{ "$ref": "#/$defs/Artwork" }, { "type": "null" }]
          },
          "declared": { "$ref": "#/$defs/DeclaredMetadata" },
          "recordedAt": {
            "anyOf": [
              { "$ref": "common.schema.json#/$defs/Timestamp" },
              { "type": "null" }
            ]
          },
          "recordedLocation": {
            "anyOf": [
              { "$ref": "#/$defs/RecordedLocation" },
              { "type": "null" }
            ]
          },
          "source": {
            "anyOf": [{ "$ref": "#/$defs/SoundSource" }, { "type": "null" }]
          },
          "publishedAt": {
            "anyOf": [
              { "$ref": "common.schema.json#/$defs/Timestamp" },
              { "type": "null" }
            ]
          },
          "version": {
            "type": "integer",
            "minimum": 1,
            "maximum": 9007199254740991,
            "description": "Optimistic lock; a stale PATCH returns 409."
          },
          "createdAt": { "$ref": "common.schema.json#/$defs/Timestamp" },
          "updatedAt": { "$ref": "common.schema.json#/$defs/Timestamp" }
        },
        "required": [
          "id",
          "ownerId",
          "currentVersion",
          "family",
          "title",
          "artist",
          "description",
          "tags",
          "soundType",
          "visibility",
          "state",
          "artwork",
          "declared",
          "recordedAt",
          "recordedLocation",
          "source",
          "publishedAt",
          "version",
          "createdAt",
          "updatedAt"
        ],
        "$defs": {
          "Meter": {
            "title": "Meter",
            "description": "Time signature.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "numerator": { "type": "integer", "minimum": 1, "maximum": 32 },
              "denominator": { "type": "integer", "enum": [1, 2, 4, 8, 16] }
            },
            "required": ["numerator", "denominator"]
          },
          "Artwork": {
            "title": "Artwork",
            "description": "An image item the owner chose, or one of this item's own renditions.",
            "oneOf": [
              {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "mediaId": { "$ref": "common.schema.json#/$defs/EntityId" }
                },
                "required": ["mediaId"]
              },
              {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "rendition": {
                    "$ref": "enums.schema.json#/$defs/RenditionKind"
                  }
                },
                "required": ["rendition"]
              }
            ]
          },
          "DeclaredMetadata": {
            "title": "DeclaredMetadata",
            "description": "Musical fields the creator typed; every key optional, each overrides embedded and analysed values of the same field.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "tempoBpm": { "type": "number", "minimum": 20, "maximum": 400 },
              "meter": { "$ref": "#/$defs/Meter" },
              "keyRoot": {
                "type": "integer",
                "minimum": 0,
                "maximum": 11,
                "description": "Pitch class of the key root: 0 = C … 11 = B."
              },
              "mode": { "$ref": "enums.schema.json#/$defs/MusicalMode" },
              "tonality": { "$ref": "enums.schema.json#/$defs/Tonality" },
              "rootMidi": {
                "type": "integer",
                "minimum": 0,
                "maximum": 127,
                "description": "MIDI note of a tuned one-shot."
              },
              "instruments": {
                "type": "array",
                "maxItems": 8,
                "uniqueItems": true,
                "items": {
                  "$ref": "media-vocabulary.schema.json#/$defs/Instrument"
                }
              },
              "genres": {
                "type": "array",
                "maxItems": 4,
                "uniqueItems": true,
                "items": { "$ref": "media-vocabulary.schema.json#/$defs/Genre" }
              },
              "moods": {
                "type": "array",
                "maxItems": 3,
                "uniqueItems": true,
                "items": { "$ref": "media-vocabulary.schema.json#/$defs/Mood" }
              }
            }
          },
          "RecordedLocation": {
            "title": "RecordedLocation",
            "description": "Where a recording was made.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "name": { "type": "string", "minLength": 0, "maxLength": 128 },
              "lat": { "type": "number", "minimum": -90, "maximum": 90 },
              "lon": { "type": "number", "minimum": -180, "maximum": 180 }
            },
            "required": ["name"]
          },
          "SoundSource": {
            "title": "SoundSource",
            "description": "The Toy a sound was recorded or exported from.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "projectId": { "$ref": "common.schema.json#/$defs/EntityId" },
              "releaseDigest": {
                "$ref": "common.schema.json#/$defs/Sha256Hex"
              },
              "takeId": { "$ref": "common.schema.json#/$defs/EntityId" }
            },
            "required": ["projectId"]
          },
          "ResolvedNumber": {
            "title": "ResolvedNumber",
            "description": "A numeric field with its provenance.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "value": { "type": "number" },
              "source": { "$ref": "enums.schema.json#/$defs/MetadataSource" },
              "confidence": {
                "type": "number",
                "minimum": 0,
                "maximum": 1,
                "description": "0 (a guess) to 1 (certain)."
              }
            },
            "required": ["value", "source"]
          },
          "ResolvedKeyRoot": {
            "title": "ResolvedKeyRoot",
            "description": "The key root with its provenance.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "value": {
                "type": "integer",
                "minimum": 0,
                "maximum": 11,
                "description": "Pitch class of the key root: 0 = C … 11 = B."
              },
              "source": { "$ref": "enums.schema.json#/$defs/MetadataSource" },
              "confidence": {
                "type": "number",
                "minimum": 0,
                "maximum": 1,
                "description": "0 (a guess) to 1 (certain)."
              }
            },
            "required": ["value", "source"]
          },
          "ResolvedMode": {
            "title": "ResolvedMode",
            "description": "The mode with its provenance.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "value": { "$ref": "enums.schema.json#/$defs/MusicalMode" },
              "source": { "$ref": "enums.schema.json#/$defs/MetadataSource" },
              "confidence": {
                "type": "number",
                "minimum": 0,
                "maximum": 1,
                "description": "0 (a guess) to 1 (certain)."
              }
            },
            "required": ["value", "source"]
          },
          "ResolvedTonality": {
            "title": "ResolvedTonality",
            "description": "The tonality with its provenance.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "value": { "$ref": "enums.schema.json#/$defs/Tonality" },
              "source": { "$ref": "enums.schema.json#/$defs/MetadataSource" },
              "confidence": {
                "type": "number",
                "minimum": 0,
                "maximum": 1,
                "description": "0 (a guess) to 1 (certain)."
              }
            },
            "required": ["value", "source"]
          },
          "ResolvedCamelot": {
            "title": "ResolvedCamelot",
            "description": "The Camelot code derived from the resolved root and tonality.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "value": {
                "type": "string",
                "pattern": "^(1[0-2]|[1-9])[AB]$",
                "description": "Camelot wheel code: 1A–12A minor, 1B–12B major."
              },
              "source": { "$ref": "enums.schema.json#/$defs/MetadataSource" },
              "confidence": {
                "type": "number",
                "minimum": 0,
                "maximum": 1,
                "description": "0 (a guess) to 1 (certain)."
              }
            },
            "required": ["value", "source"]
          },
          "ResolvedMeter": {
            "title": "ResolvedMeter",
            "description": "The meter with its provenance.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "value": { "$ref": "#/$defs/Meter" },
              "source": { "$ref": "enums.schema.json#/$defs/MetadataSource" },
              "confidence": {
                "type": "number",
                "minimum": 0,
                "maximum": 1,
                "description": "0 (a guess) to 1 (certain)."
              }
            },
            "required": ["value", "source"]
          },
          "ResolvedSoundType": {
            "title": "ResolvedSoundType",
            "description": "The sound type with its provenance.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "value": { "$ref": "enums.schema.json#/$defs/SoundType" },
              "source": { "$ref": "enums.schema.json#/$defs/MetadataSource" },
              "confidence": {
                "type": "number",
                "minimum": 0,
                "maximum": 1,
                "description": "0 (a guess) to 1 (certain)."
              }
            },
            "required": ["value", "source"]
          },
          "ResolvedInstruments": {
            "title": "ResolvedInstruments",
            "description": "Instrument tags with their provenance.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "value": {
                "type": "array",
                "maxItems": 8,
                "uniqueItems": true,
                "items": {
                  "$ref": "media-vocabulary.schema.json#/$defs/Instrument"
                }
              },
              "source": { "$ref": "enums.schema.json#/$defs/MetadataSource" },
              "confidence": {
                "type": "number",
                "minimum": 0,
                "maximum": 1,
                "description": "0 (a guess) to 1 (certain)."
              }
            },
            "required": ["value", "source"]
          },
          "ResolvedGenres": {
            "title": "ResolvedGenres",
            "description": "Genre tags with their provenance.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "value": {
                "type": "array",
                "maxItems": 4,
                "uniqueItems": true,
                "items": { "$ref": "media-vocabulary.schema.json#/$defs/Genre" }
              },
              "source": { "$ref": "enums.schema.json#/$defs/MetadataSource" },
              "confidence": {
                "type": "number",
                "minimum": 0,
                "maximum": 1,
                "description": "0 (a guess) to 1 (certain)."
              }
            },
            "required": ["value", "source"]
          },
          "ResolvedMoods": {
            "title": "ResolvedMoods",
            "description": "Mood tags with their provenance.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "value": {
                "type": "array",
                "maxItems": 3,
                "uniqueItems": true,
                "items": { "$ref": "media-vocabulary.schema.json#/$defs/Mood" }
              },
              "source": { "$ref": "enums.schema.json#/$defs/MetadataSource" },
              "confidence": {
                "type": "number",
                "minimum": 0,
                "maximum": 1,
                "description": "0 (a guess) to 1 (certain)."
              }
            },
            "required": ["value", "source"]
          },
          "SoundResolvedFields": {
            "title": "SoundResolvedFields",
            "description": "The resolved musical fields of an item: declared › embedded › analysed, each keeping its source. A field absent from every layer is absent here.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "durationMs": { "$ref": "#/$defs/ResolvedNumber" },
              "tempoBpm": { "$ref": "#/$defs/ResolvedNumber" },
              "keyRoot": { "$ref": "#/$defs/ResolvedKeyRoot" },
              "mode": { "$ref": "#/$defs/ResolvedMode" },
              "tonality": { "$ref": "#/$defs/ResolvedTonality" },
              "camelot": { "$ref": "#/$defs/ResolvedCamelot" },
              "meter": { "$ref": "#/$defs/ResolvedMeter" },
              "rootMidi": { "$ref": "#/$defs/ResolvedNumber" },
              "loudnessLufs": { "$ref": "#/$defs/ResolvedNumber" },
              "soundType": { "$ref": "#/$defs/ResolvedSoundType" },
              "instruments": { "$ref": "#/$defs/ResolvedInstruments" },
              "genres": { "$ref": "#/$defs/ResolvedGenres" },
              "moods": { "$ref": "#/$defs/ResolvedMoods" }
            }
          }
        }
      },
      "SoundRelation": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "$id": "https://tune.toys/schemas/platform/media-relation.schema.json",
        "title": "SoundRelation",
        "description": "A directional relation between two media items, created by either owner. Symmetric in the UI; a relation to an item the viewer cannot read is omitted.",
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "fromMediaId": { "$ref": "common.schema.json#/$defs/EntityId" },
          "toMediaId": { "$ref": "common.schema.json#/$defs/EntityId" },
          "kind": { "$ref": "enums.schema.json#/$defs/RelationKind" },
          "note": { "type": "string", "minLength": 0, "maxLength": 200 },
          "createdBy": { "$ref": "common.schema.json#/$defs/EntityId" },
          "createdAt": { "$ref": "common.schema.json#/$defs/Timestamp" }
        },
        "required": [
          "fromMediaId",
          "toMediaId",
          "kind",
          "note",
          "createdBy",
          "createdAt"
        ]
      },
      "SoundRendition": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "$id": "https://tune.toys/schemas/platform/media-rendition.schema.json",
        "title": "SoundRendition",
        "description": "One derived artifact of a media version (peaks, preview, thumbnail, score page, piano roll, beats). Immutable; unique per version, kind, recipe, toolchain and profile.",
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": { "$ref": "common.schema.json#/$defs/EntityId" },
          "versionId": { "$ref": "common.schema.json#/$defs/EntityId" },
          "kind": { "$ref": "enums.schema.json#/$defs/RenditionKind" },
          "recipe": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64,
            "description": "Named recipe the worker applied (for example `preview-30s`)."
          },
          "toolchain": {
            "type": "string",
            "minLength": 1,
            "maxLength": 128,
            "description": "Tool and version that produced the bytes (for example `ffmpeg-7.1`)."
          },
          "profile": {
            "type": "string",
            "minLength": 0,
            "maxLength": 64,
            "description": "Variant within a kind (for example `512` for a thumbnail width); empty when there is one."
          },
          "sha256": {
            "anyOf": [
              { "$ref": "common.schema.json#/$defs/Sha256Hex" },
              { "type": "null" }
            ]
          },
          "sizeBytes": {
            "anyOf": [
              { "$ref": "common.schema.json#/$defs/ByteSize" },
              { "type": "null" }
            ]
          },
          "mediaType": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 3,
                "maxLength": 128,
                "pattern": "^[a-z]+/[A-Za-z0-9!#$&^_.+-]+$",
                "description": "Admitted media type without parameters."
              },
              { "type": "null" }
            ]
          },
          "meta": { "$ref": "#/$defs/RenditionMeta" },
          "state": { "$ref": "enums.schema.json#/$defs/RenditionState" },
          "error": {
            "anyOf": [
              { "type": "string", "minLength": 1, "maxLength": 512 },
              { "type": "null" }
            ]
          },
          "createdAt": { "$ref": "common.schema.json#/$defs/Timestamp" }
        },
        "required": [
          "id",
          "versionId",
          "kind",
          "recipe",
          "toolchain",
          "profile",
          "sha256",
          "sizeBytes",
          "mediaType",
          "meta",
          "state",
          "error",
          "createdAt"
        ],
        "$defs": {
          "RenditionMeta": {
            "title": "RenditionMeta",
            "description": "Facts a client needs before fetching the bytes.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "width": { "type": "integer", "minimum": 1, "maximum": 16384 },
              "height": { "type": "integer", "minimum": 1, "maximum": 16384 },
              "durationMs": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "sampleRate": {
                "type": "integer",
                "minimum": 1,
                "maximum": 1000000
              },
              "channels": { "type": "integer", "minimum": 1, "maximum": 64 },
              "points": {
                "type": "integer",
                "minimum": 1,
                "maximum": 1000000,
                "description": "Peak pairs per channel."
              },
              "resolutions": {
                "type": "array",
                "maxItems": 16,
                "uniqueItems": true,
                "items": { "type": "integer", "minimum": 1, "maximum": 1000000 }
              },
              "page": { "type": "integer", "minimum": 1, "maximum": 100000 },
              "pages": { "type": "integer", "minimum": 1, "maximum": 100000 },
              "loudnessLufs": {
                "type": "number",
                "minimum": -100,
                "maximum": 10
              },
              "truncated": {
                "type": "boolean",
                "description": "The preview was cut to the non-reusable cap."
              }
            }
          }
        }
      },
      "SoundSearchParams": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "$id": "https://tune.toys/schemas/platform/sound-search.schema.json",
        "title": "SoundSearchParams",
        "description": "Query of GET /v1/sounds and /v1/sounds/facets: every filter optional, bounded, and owned by the page URL. Facet counts answer for the same filter set.",
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "q": { "type": "string", "minLength": 0, "maxLength": 128 },
          "family": { "$ref": "enums.schema.json#/$defs/MediaFamily" },
          "soundType": { "$ref": "enums.schema.json#/$defs/SoundType" },
          "keyRoot": {
            "type": "integer",
            "minimum": 0,
            "maximum": 11,
            "description": "Pitch class of the key root: 0 = C … 11 = B."
          },
          "mode": { "$ref": "enums.schema.json#/$defs/MusicalMode" },
          "tonality": { "$ref": "enums.schema.json#/$defs/Tonality" },
          "camelot": {
            "type": "array",
            "maxItems": 24,
            "uniqueItems": true,
            "items": {
              "type": "string",
              "pattern": "^(1[0-2]|[1-9])[AB]$",
              "description": "Camelot wheel code: 1A–12A minor, 1B–12B major."
            }
          },
          "bpmMin": { "type": "number", "minimum": 20, "maximum": 400 },
          "bpmMax": { "type": "number", "minimum": 20, "maximum": 400 },
          "meter": {
            "type": "string",
            "pattern": "^[1-9][0-9]?/(1|2|4|8|16)$"
          },
          "instruments": {
            "type": "array",
            "maxItems": 8,
            "uniqueItems": true,
            "items": {
              "$ref": "media-vocabulary.schema.json#/$defs/Instrument"
            }
          },
          "genres": {
            "type": "array",
            "maxItems": 8,
            "uniqueItems": true,
            "items": { "$ref": "media-vocabulary.schema.json#/$defs/Genre" }
          },
          "moods": {
            "type": "array",
            "maxItems": 8,
            "uniqueItems": true,
            "items": { "$ref": "media-vocabulary.schema.json#/$defs/Mood" }
          },
          "tags": {
            "type": "array",
            "maxItems": 8,
            "uniqueItems": true,
            "items": { "type": "string", "minLength": 1, "maxLength": 40 }
          },
          "durationMinMs": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "durationMaxMs": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "license": { "type": "string", "minLength": 1, "maxLength": 128 },
          "reusable": { "type": "boolean" },
          "owner": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64,
            "description": "Account handle."
          },
          "mine": {
            "type": "boolean",
            "description": "Only the caller's items, any visibility."
          },
          "sort": { "$ref": "#/$defs/SoundSort" },
          "offset": { "type": "integer", "minimum": 0, "maximum": 10000 },
          "limit": { "type": "integer", "minimum": 1, "maximum": 40 }
        },
        "$defs": {
          "SoundSort": {
            "title": "SoundSort",
            "description": "Sort order of a sounds page.",
            "type": "string",
            "enum": [
              "relevance",
              "newest",
              "popular",
              "likes",
              "downloads",
              "duration",
              "tempo"
            ]
          },
          "FacetCount": {
            "title": "FacetCount",
            "description": "One facet value and how many items in the current filter set carry it.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "value": { "type": "string", "minLength": 1, "maxLength": 64 },
              "count": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              }
            },
            "required": ["value", "count"]
          },
          "SoundFacets": {
            "title": "SoundFacets",
            "description": "Facet counts for a filter set, one list per facet column of the media index.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "family": {
                "type": "array",
                "maxItems": 256,
                "items": { "$ref": "#/$defs/FacetCount" }
              },
              "soundType": {
                "type": "array",
                "maxItems": 256,
                "items": { "$ref": "#/$defs/FacetCount" }
              },
              "keyRoot": {
                "type": "array",
                "maxItems": 256,
                "items": { "$ref": "#/$defs/FacetCount" }
              },
              "mode": {
                "type": "array",
                "maxItems": 256,
                "items": { "$ref": "#/$defs/FacetCount" }
              },
              "tonality": {
                "type": "array",
                "maxItems": 256,
                "items": { "$ref": "#/$defs/FacetCount" }
              },
              "camelot": {
                "type": "array",
                "maxItems": 256,
                "items": { "$ref": "#/$defs/FacetCount" }
              },
              "meter": {
                "type": "array",
                "maxItems": 256,
                "items": { "$ref": "#/$defs/FacetCount" }
              },
              "instruments": {
                "type": "array",
                "maxItems": 256,
                "items": { "$ref": "#/$defs/FacetCount" }
              },
              "genres": {
                "type": "array",
                "maxItems": 256,
                "items": { "$ref": "#/$defs/FacetCount" }
              },
              "moods": {
                "type": "array",
                "maxItems": 256,
                "items": { "$ref": "#/$defs/FacetCount" }
              },
              "license": {
                "type": "array",
                "maxItems": 256,
                "items": { "$ref": "#/$defs/FacetCount" }
              },
              "channels": {
                "type": "array",
                "maxItems": 256,
                "items": { "$ref": "#/$defs/FacetCount" }
              },
              "sampleRate": {
                "type": "array",
                "maxItems": 256,
                "items": { "$ref": "#/$defs/FacetCount" }
              }
            },
            "required": [
              "family",
              "soundType",
              "keyRoot",
              "mode",
              "tonality",
              "camelot",
              "meter",
              "instruments",
              "genres",
              "moods",
              "license",
              "channels",
              "sampleRate"
            ]
          }
        }
      },
      "SoundVersion": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "$id": "https://tune.toys/schemas/platform/media-version.schema.json",
        "title": "SoundVersion",
        "description": "One immutable upload of a media item: bytes, digest, rights, what the probe found and the tags the file carried. Never edited after creation; releases pin versions.",
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": { "$ref": "common.schema.json#/$defs/EntityId" },
          "mediaId": { "$ref": "common.schema.json#/$defs/EntityId" },
          "sha256": { "$ref": "common.schema.json#/$defs/Sha256Hex" },
          "sizeBytes": { "$ref": "common.schema.json#/$defs/ByteSize" },
          "mediaType": {
            "type": "string",
            "minLength": 3,
            "maxLength": 128,
            "pattern": "^[a-z]+/[A-Za-z0-9!#$&^_.+-]+$",
            "description": "Admitted media type without parameters."
          },
          "filename": { "type": "string", "minLength": 1, "maxLength": 255 },
          "license": { "type": "string", "minLength": 1, "maxLength": 128 },
          "attribution": {
            "type": "string",
            "minLength": 0,
            "maxLength": 1024
          },
          "reusable": { "type": "boolean" },
          "probe": {
            "anyOf": [{ "$ref": "#/$defs/MediaProbe" }, { "type": "null" }]
          },
          "embedded": {
            "anyOf": [
              { "$ref": "#/$defs/EmbeddedMetadata" },
              { "type": "null" }
            ]
          },
          "ingestState": { "$ref": "enums.schema.json#/$defs/IngestState" },
          "createdAt": { "$ref": "common.schema.json#/$defs/Timestamp" }
        },
        "required": [
          "id",
          "mediaId",
          "sha256",
          "sizeBytes",
          "mediaType",
          "filename",
          "license",
          "attribution",
          "reusable",
          "probe",
          "embedded",
          "ingestState",
          "createdAt"
        ],
        "$defs": {
          "MediaProbe": {
            "title": "MediaProbe",
            "description": "Container facts read by the structural parser; keys apply per family.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "container": {
                "type": "string",
                "minLength": 1,
                "maxLength": 64
              },
              "codec": { "type": "string", "minLength": 1, "maxLength": 64 },
              "sampleRate": {
                "type": "integer",
                "minimum": 1,
                "maximum": 1000000
              },
              "bitDepth": { "type": "integer", "minimum": 1, "maximum": 64 },
              "channels": { "type": "integer", "minimum": 1, "maximum": 64 },
              "durationMs": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "bitRate": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "width": { "type": "integer", "minimum": 1, "maximum": 16384 },
              "height": { "type": "integer", "minimum": 1, "maximum": 16384 },
              "frameRate": { "type": "number", "minimum": 0, "maximum": 1000 },
              "hasAudio": { "type": "boolean" },
              "tracks": { "type": "integer", "minimum": 0, "maximum": 65535 },
              "ppq": { "type": "integer", "minimum": 1, "maximum": 32767 },
              "events": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "noteCount": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "parts": { "type": "integer", "minimum": 0, "maximum": 4096 },
              "measures": {
                "type": "integer",
                "minimum": 0,
                "maximum": 1000000
              }
            }
          },
          "EmbeddedKey": {
            "title": "EmbeddedKey",
            "description": "Key carried by a tag or key signature; tags name only major or minor.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "root": {
                "type": "integer",
                "minimum": 0,
                "maximum": 11,
                "description": "Pitch class of the key root: 0 = C … 11 = B."
              },
              "tonality": { "$ref": "enums.schema.json#/$defs/Tonality" },
              "mode": { "$ref": "enums.schema.json#/$defs/MusicalMode" }
            },
            "required": ["root"]
          },
          "EmbeddedMetadata": {
            "title": "EmbeddedMetadata",
            "description": "Tags parsed from the file (ID3, Vorbis, RIFF INFO, BWF, iXML, MP4 atoms, SMF meta events, MusicXML/MEI headers). Read once per version, never edited; declared values override them.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "title": { "type": "string", "minLength": 0, "maxLength": 128 },
              "artist": { "type": "string", "minLength": 0, "maxLength": 128 },
              "album": { "type": "string", "minLength": 0, "maxLength": 128 },
              "composer": {
                "type": "string",
                "minLength": 0,
                "maxLength": 128
              },
              "lyricist": {
                "type": "string",
                "minLength": 0,
                "maxLength": 128
              },
              "year": { "type": "integer", "minimum": 0, "maximum": 9999 },
              "trackNumber": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9999
              },
              "genre": {
                "type": "string",
                "minLength": 0,
                "maxLength": 64,
                "description": "Raw genre text; not the closed vocabulary."
              },
              "bpm": { "type": "number", "minimum": 1, "maximum": 1000 },
              "key": { "$ref": "#/$defs/EmbeddedKey" },
              "meter": { "$ref": "media-item.schema.json#/$defs/Meter" },
              "isrc": { "type": "string", "minLength": 12, "maxLength": 12 },
              "iswc": { "type": "string", "minLength": 11, "maxLength": 15 },
              "recordedAt": {
                "type": "string",
                "minLength": 0,
                "maxLength": 64,
                "description": "Raw date text as carried (BWF OriginationDate/Time, TDRC, DATE, encoding-date)."
              },
              "location": {
                "type": "string",
                "minLength": 0,
                "maxLength": 128
              },
              "originator": {
                "type": "string",
                "minLength": 0,
                "maxLength": 128
              },
              "device": { "type": "string", "minLength": 0, "maxLength": 128 },
              "comment": {
                "type": "string",
                "minLength": 0,
                "maxLength": 1024
              },
              "picture": {
                "type": "boolean",
                "description": "A picture was present and extracted to an image version."
              },
              "instruments": {
                "type": "array",
                "maxItems": 32,
                "uniqueItems": true,
                "items": {
                  "$ref": "media-vocabulary.schema.json#/$defs/Instrument"
                },
                "description": "From General MIDI programs or score-instrument parts."
              },
              "tempoChanges": {
                "type": "integer",
                "minimum": 0,
                "maximum": 1000000
              },
              "lyrics": { "type": "boolean" }
            }
          }
        }
      },
      "StorefrontRevisionContent": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "$id": "https://tune.toys/schemas/platform/storefront-revision.schema.json",
        "title": "StorefrontRevisionContent",
        "description": "Content of one publisher storefront revision: validated theme tokens and ordered typed sections. Storefronts are data, never code.",
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "theme": { "$ref": "#/$defs/StorefrontTheme" },
          "sections": {
            "type": "array",
            "items": { "$ref": "#/$defs/StorefrontSection" },
            "maxItems": 20
          }
        },
        "required": ["theme", "sections"],
        "$defs": {
          "StorefrontPalette": {
            "title": "StorefrontPalette",
            "description": "sRGB hex colors; the server rejects text/background and accentText/accent below 4.5:1 contrast.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "background": {
                "type": "string",
                "minLength": 7,
                "maxLength": 7,
                "pattern": "^#[0-9a-fA-F]{6}$"
              },
              "surface": {
                "type": "string",
                "minLength": 7,
                "maxLength": 7,
                "pattern": "^#[0-9a-fA-F]{6}$"
              },
              "text": {
                "type": "string",
                "minLength": 7,
                "maxLength": 7,
                "pattern": "^#[0-9a-fA-F]{6}$"
              },
              "accent": {
                "type": "string",
                "minLength": 7,
                "maxLength": 7,
                "pattern": "^#[0-9a-fA-F]{6}$"
              },
              "accentText": {
                "type": "string",
                "minLength": 7,
                "maxLength": 7,
                "pattern": "^#[0-9a-fA-F]{6}$"
              }
            },
            "required": [
              "background",
              "surface",
              "text",
              "accent",
              "accentText"
            ]
          },
          "StorefrontTheme": {
            "title": "StorefrontTheme",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "colorScheme": { "enum": ["light", "dark", "auto"] },
              "light": { "$ref": "#/$defs/StorefrontPalette" },
              "dark": { "$ref": "#/$defs/StorefrontPalette" },
              "typography": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "fontPreset": {
                    "enum": [
                      "brand",
                      "system-sans",
                      "system-serif",
                      "system-mono"
                    ]
                  },
                  "scale": { "enum": ["compact", "default", "large"] }
                },
                "required": ["fontPreset", "scale"]
              },
              "shape": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "radius": { "enum": ["none", "sm", "md", "lg"] },
                  "density": { "enum": ["compact", "default", "comfortable"] }
                },
                "required": ["radius", "density"]
              },
              "heroImage": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "mediaId": { "$ref": "common.schema.json#/$defs/EntityId" },
                  "alt": { "type": "string", "minLength": 1, "maxLength": 300 },
                  "focalPoint": {
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                      "x": { "type": "number", "minimum": 0, "maximum": 1 },
                      "y": { "type": "number", "minimum": 0, "maximum": 1 }
                    },
                    "required": ["x", "y"]
                  }
                },
                "required": ["mediaId", "alt", "focalPoint"]
              }
            },
            "required": ["colorScheme", "typography", "shape"],
            "allOf": [
              {
                "if": { "properties": { "colorScheme": { "const": "light" } } },
                "then": {
                  "required": ["light"],
                  "properties": { "light": true }
                }
              },
              {
                "if": { "properties": { "colorScheme": { "const": "dark" } } },
                "then": { "required": ["dark"], "properties": { "dark": true } }
              },
              {
                "if": { "properties": { "colorScheme": { "const": "auto" } } },
                "then": {
                  "required": ["light", "dark"],
                  "properties": { "light": true, "dark": true }
                }
              }
            ]
          },
          "StorefrontSection": {
            "title": "StorefrontSection",
            "oneOf": [
              { "$ref": "#/$defs/HeroSection" },
              { "$ref": "#/$defs/FeaturedSection" },
              { "$ref": "#/$defs/ProductGridSection" },
              { "$ref": "#/$defs/BundleSection" },
              { "$ref": "#/$defs/CollectionSection" },
              { "$ref": "#/$defs/MarkdownSection" },
              { "$ref": "#/$defs/VideoSection" },
              { "$ref": "#/$defs/LinksSection" }
            ]
          },
          "HeroSection": {
            "title": "HeroSection",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "id": { "$ref": "common.schema.json#/$defs/EntityId" },
              "type": { "const": "hero" },
              "visible": { "type": "boolean" },
              "props": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "title": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 80
                  },
                  "subtitle": { "type": "string", "maxLength": 200 },
                  "imageMediaId": {
                    "$ref": "common.schema.json#/$defs/EntityId"
                  },
                  "alt": { "type": "string", "minLength": 1, "maxLength": 300 },
                  "primaryAction": {
                    "oneOf": [
                      {
                        "type": "object",
                        "additionalProperties": false,
                        "properties": {
                          "productId": {
                            "$ref": "common.schema.json#/$defs/EntityId"
                          }
                        },
                        "required": ["productId"]
                      },
                      {
                        "type": "object",
                        "additionalProperties": false,
                        "properties": {
                          "path": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 512,
                            "pattern": "^/[^\\s]*$",
                            "description": "Internal same-origin link."
                          }
                        },
                        "required": ["path"]
                      }
                    ]
                  }
                },
                "required": ["title"]
              }
            },
            "required": ["id", "type", "visible", "props"]
          },
          "FeaturedSection": {
            "title": "FeaturedSection",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "id": { "$ref": "common.schema.json#/$defs/EntityId" },
              "type": { "const": "featured" },
              "visible": { "type": "boolean" },
              "props": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "productIds": {
                    "type": "array",
                    "items": { "$ref": "common.schema.json#/$defs/EntityId" },
                    "maxItems": 6,
                    "minItems": 1,
                    "uniqueItems": true
                  },
                  "layout": { "enum": ["spotlight", "row"] }
                },
                "required": ["productIds", "layout"]
              }
            },
            "required": ["id", "type", "visible", "props"]
          },
          "ProductGridSection": {
            "title": "ProductGridSection",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "id": { "$ref": "common.schema.json#/$defs/EntityId" },
              "type": { "const": "product_grid" },
              "visible": { "type": "boolean" },
              "props": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "source": { "enum": ["all", "kind", "tag", "manual"] },
                  "kind": { "$ref": "enums.schema.json#/$defs/ProductKind" },
                  "tag": { "type": "string", "minLength": 1, "maxLength": 32 },
                  "productIds": {
                    "type": "array",
                    "items": { "$ref": "common.schema.json#/$defs/EntityId" },
                    "maxItems": 48,
                    "uniqueItems": true
                  },
                  "sort": { "enum": ["recent", "title", "rating"] },
                  "limit": { "type": "integer", "minimum": 1, "maximum": 48 }
                },
                "required": ["source", "sort", "limit"]
              }
            },
            "required": ["id", "type", "visible", "props"]
          },
          "BundleSection": {
            "title": "BundleSection",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "id": { "$ref": "common.schema.json#/$defs/EntityId" },
              "type": { "const": "bundle" },
              "visible": { "type": "boolean" },
              "props": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "productId": { "$ref": "common.schema.json#/$defs/EntityId" }
                },
                "required": ["productId"]
              }
            },
            "required": ["id", "type", "visible", "props"]
          },
          "CollectionSection": {
            "title": "CollectionSection",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "id": { "$ref": "common.schema.json#/$defs/EntityId" },
              "type": { "const": "collection" },
              "visible": { "type": "boolean" },
              "props": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "title": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 80
                  },
                  "productIds": {
                    "type": "array",
                    "items": { "$ref": "common.schema.json#/$defs/EntityId" },
                    "maxItems": 24,
                    "minItems": 1,
                    "uniqueItems": true
                  }
                },
                "required": ["title", "productIds"]
              }
            },
            "required": ["id", "type", "visible", "props"]
          },
          "MarkdownSection": {
            "title": "MarkdownSection",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "id": { "$ref": "common.schema.json#/$defs/EntityId" },
              "type": { "const": "markdown" },
              "visible": { "type": "boolean" },
              "props": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "bodyMd": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 16384
                  }
                },
                "required": ["bodyMd"]
              }
            },
            "required": ["id", "type", "visible", "props"]
          },
          "VideoSection": {
            "title": "VideoSection",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "id": { "$ref": "common.schema.json#/$defs/EntityId" },
              "type": { "const": "video" },
              "visible": { "type": "boolean" },
              "props": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "item": {
                    "oneOf": [
                      {
                        "$ref": "listing-revision.schema.json#/$defs/VideoGalleryItem"
                      },
                      {
                        "$ref": "listing-revision.schema.json#/$defs/YouTubeGalleryItem"
                      },
                      {
                        "$ref": "listing-revision.schema.json#/$defs/VimeoGalleryItem"
                      }
                    ]
                  }
                },
                "required": ["item"]
              }
            },
            "required": ["id", "type", "visible", "props"]
          },
          "LinksSection": {
            "title": "LinksSection",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "id": { "$ref": "common.schema.json#/$defs/EntityId" },
              "type": { "const": "links" },
              "visible": { "type": "boolean" },
              "props": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "links": {
                    "type": "array",
                    "items": {
                      "$ref": "common.schema.json#/$defs/ExternalLink"
                    },
                    "maxItems": 12,
                    "minItems": 1
                  }
                },
                "required": ["links"]
              }
            },
            "required": ["id", "type", "visible", "props"]
          }
        }
      },
      "ToyDocument": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "$id": "https://tune.toys/schemas/toy-0.1.0.schema.json",
        "title": "ToyDocument",
        "description": "Draft local authoring contract. Validation is not runtime admission or a release certificate.",
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "format": { "const": "tune-toys" },
          "schemaVersion": { "const": "0.1.0" },
          "id": { "type": "string", "pattern": "^[a-z][a-z0-9_.-]{0,127}$" },
          "revision": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "title": { "type": "string", "minLength": 1, "maxLength": 128 },
          "description": { "type": "string", "maxLength": 4096 },
          "entrypoint": {
            "type": "string",
            "pattern": "^[a-z][a-z0-9_-]{0,63}$",
            "not": { "enum": ["constructor", "prototype"] }
          },
          "entryFrame": {
            "type": "string",
            "pattern": "^[a-z][a-z0-9_-]{0,63}$",
            "not": { "enum": ["constructor", "prototype"] }
          },
          "definitions": {
            "type": "object",
            "maxProperties": 64,
            "propertyNames": {
              "type": "string",
              "pattern": "^[a-z][a-z0-9_-]{0,63}$",
              "not": { "enum": ["constructor", "prototype"] }
            },
            "additionalProperties": { "$ref": "#/$defs/Definition" },
            "minProperties": 1
          },
          "frames": {
            "type": "object",
            "maxProperties": 64,
            "propertyNames": {
              "type": "string",
              "pattern": "^[a-z][a-z0-9_-]{0,63}$",
              "not": { "enum": ["constructor", "prototype"] }
            },
            "additionalProperties": { "$ref": "#/$defs/Frame" },
            "minProperties": 1
          },
          "assets": {
            "type": "object",
            "maxProperties": 64,
            "propertyNames": {
              "type": "string",
              "pattern": "^[a-z][a-z0-9_-]{0,63}$",
              "not": { "enum": ["constructor", "prototype"] }
            },
            "additionalProperties": { "$ref": "#/$defs/Asset" }
          },
          "extensions": {
            "type": "object",
            "maxProperties": 32,
            "propertyNames": {
              "type": "string",
              "pattern": "^[a-z][a-z0-9-]*[.][a-zA-Z0-9_.-]+$"
            },
            "additionalProperties": true
          },
          "theme": { "$ref": "#/$defs/Theme" },
          "transport": { "$ref": "#/$defs/Transport" },
          "tuning": { "$ref": "#/$defs/Tuning" },
          "previewAsset": {
            "type": "string",
            "pattern": "^[a-z][a-z0-9_-]{0,63}$",
            "not": { "enum": ["constructor", "prototype"] }
          },
          "styles": {
            "description": "Toy-wide reusable text/control styles keyed by durable identity.",
            "type": "object",
            "maxProperties": 64,
            "propertyNames": {
              "type": "string",
              "pattern": "^[a-z][a-z0-9_-]{0,63}$",
              "not": { "enum": ["constructor", "prototype"] }
            },
            "additionalProperties": { "$ref": "#/$defs/ReusableStyle" }
          }
        },
        "required": [
          "format",
          "schemaVersion",
          "id",
          "revision",
          "title",
          "entrypoint",
          "entryFrame",
          "definitions",
          "frames",
          "assets"
        ],
        "$defs": {
          "Port": {
            "oneOf": [
              {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "type": { "const": "audio" },
                  "channels": {
                    "oneOf": [
                      { "type": "integer", "minimum": 1, "maximum": 32 },
                      { "const": "auto" }
                    ]
                  },
                  "labels": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 32,
                    "items": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 64
                    }
                  }
                },
                "required": ["type", "channels"]
              },
              {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "type": { "const": "video" },
                  "streams": {
                    "oneOf": [
                      { "type": "integer", "minimum": 1, "maximum": 8 },
                      { "const": "auto" }
                    ]
                  },
                  "labels": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 8,
                    "items": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 64
                    }
                  }
                },
                "required": ["type", "streams"]
              },
              {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "type": { "const": "control" },
                  "lanes": {
                    "oneOf": [
                      { "type": "integer", "minimum": 1, "maximum": 32 },
                      { "const": "auto" }
                    ]
                  },
                  "labels": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 32,
                    "items": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 64
                    }
                  }
                },
                "required": ["type", "lanes"]
              },
              {
                "description": "Audio or control, resolved from the node's cables. Declared by Math and Compare; definition boundaries reject it.",
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "type": { "const": "signal" },
                  "lanes": {
                    "oneOf": [
                      { "type": "integer", "minimum": 1, "maximum": 32 },
                      { "const": "auto" }
                    ]
                  },
                  "labels": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 32,
                    "items": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 64
                    }
                  }
                },
                "required": ["type", "lanes"]
              },
              {
                "type": "object",
                "additionalProperties": false,
                "properties": { "type": { "const": "midi" } },
                "required": ["type"]
              },
              {
                "description": "One lane of structured host-domain messages; never enters the audio engine.",
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "type": { "const": "data" },
                  "data": { "$ref": "#/$defs/DataType" }
                },
                "required": ["type", "data"]
              }
            ]
          },
          "DataType": {
            "description": "Datatype of a data cable. Optional bounds apply to integer and number (min, max, unit), string (maxLength) and bytes (mime).",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "kind": {
                "enum": [
                  "trigger",
                  "boolean",
                  "integer",
                  "number",
                  "string",
                  "color",
                  "json",
                  "table",
                  "bytes",
                  "any"
                ]
              },
              "min": { "type": "number" },
              "max": { "type": "number" },
              "unit": { "type": "string", "maxLength": 16 },
              "maxLength": {
                "type": "integer",
                "minimum": 1,
                "maximum": 1048576
              },
              "mime": {
                "type": "string",
                "pattern": "^[a-z0-9.+-]{1,64}/[a-z0-9.+*-]{1,64}$"
              }
            },
            "required": ["kind"]
          },
          "DataSource": {
            "description": "The data output a widget shows: a node (or $in) of the Frame's definition and one of its ports.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "node": {
                "anyOf": [
                  {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] }
                  },
                  { "enum": ["$in"] }
                ]
              },
              "port": {
                "type": "string",
                "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                "not": { "enum": ["constructor", "prototype"] }
              }
            },
            "required": ["node", "port"]
          },
          "Node": {
            "oneOf": [
              {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "kind": { "const": "primitive" },
                  "type": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_.-]{0,127}$"
                  },
                  "version": { "enum": ["0.1.0", "0.2.0", "0.3.0"] },
                  "values": {
                    "type": "object",
                    "maxProperties": 64,
                    "propertyNames": {
                      "type": "string",
                      "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                      "not": { "enum": ["constructor", "prototype"] }
                    },
                    "additionalProperties": { "type": "number" }
                  },
                  "audio": { "$ref": "#/$defs/AudioConfiguration" },
                  "bus": {
                    "description": "Named wireless bus for bus.send and bus.receive; scoped to this definition.",
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] }
                  },
                  "data": {
                    "description": "Bounded portable node data the node's manifest admits: float tables, text, string lists or header rows. The manifest bounds each key; host data nodes keep the whole object within 64 KiB.",
                    "type": "object",
                    "maxProperties": 8,
                    "propertyNames": {
                      "type": "string",
                      "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                      "not": { "enum": ["constructor", "prototype"] }
                    },
                    "additionalProperties": {
                      "anyOf": [
                        {
                          "type": "array",
                          "minItems": 1,
                          "maxItems": 16384,
                          "items": { "type": "number" }
                        },
                        { "type": "string", "maxLength": 8192 },
                        {
                          "type": "array",
                          "maxItems": 64,
                          "items": { "type": "string", "maxLength": 1024 }
                        },
                        {
                          "type": "array",
                          "maxItems": 32,
                          "items": {
                            "type": "array",
                            "minItems": 2,
                            "maxItems": 2,
                            "items": { "type": "string", "maxLength": 1024 }
                          }
                        }
                      ]
                    }
                  }
                },
                "required": ["kind", "type", "version"]
              },
              {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "kind": { "const": "group" },
                  "definition": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] }
                  },
                  "values": {
                    "type": "object",
                    "maxProperties": 128,
                    "propertyNames": {
                      "type": "string",
                      "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                      "not": { "enum": ["constructor", "prototype"] }
                    },
                    "additionalProperties": { "type": "number" }
                  },
                  "voices": {
                    "description": "Polyphony: the compiler replicates this instance once per voice behind a note allocator and sums the replicas' audio outputs. Absent means 1 (one instance, no allocator).",
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 8
                  },
                  "mpe": {
                    "description": "MPE zone of a polyphonic instance: member-channel bend, pressure and CC74 reach only the voice holding that channel's note; master-channel messages reach every voice.",
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                      "zone": { "enum": ["lower", "upper"] },
                      "bend": {
                        "description": "Member-channel pitch-bend range in semitones (default 48). The allocator writes one combined bend per voice at this range.",
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 96
                      }
                    },
                    "required": ["zone"]
                  }
                },
                "required": ["kind", "definition"]
              }
            ]
          },
          "Parameter": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "label": { "type": "string", "minLength": 1, "maxLength": 128 },
              "min": { "type": "number" },
              "max": { "type": "number" },
              "default": { "type": "number" },
              "unit": {
                "type": "string",
                "maxLength": 24,
                "description": "Presentation only; values are stored unscaled. `linear` shows a gain as ×; `%` shows a stored fraction ×100 (0.7 reads 70 %); any other text is shown beside the number."
              },
              "scale": { "enum": ["linear", "log"] },
              "smoothingMs": {
                "type": "number",
                "minimum": 0,
                "maximum": 10000
              },
              "targets": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "properties": {
                    "node": {
                      "type": "string",
                      "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                      "not": { "enum": ["constructor", "prototype"] }
                    },
                    "parameter": {
                      "type": "string",
                      "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                      "not": { "enum": ["constructor", "prototype"] }
                    }
                  },
                  "required": ["node", "parameter"]
                },
                "maxItems": 32,
                "minItems": 1
              },
              "modulation": { "$ref": "#/$defs/Modulation" },
              "midi": { "$ref": "#/$defs/MidiBinding" }
            },
            "required": [
              "label",
              "min",
              "max",
              "default",
              "unit",
              "scale",
              "smoothingMs",
              "targets"
            ]
          },
          "Definition": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "title": { "type": "string", "minLength": 1, "maxLength": 128 },
              "inputs": {
                "type": "object",
                "maxProperties": 16,
                "propertyNames": {
                  "type": "string",
                  "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                  "not": { "enum": ["constructor", "prototype"] }
                },
                "additionalProperties": { "$ref": "#/$defs/Port" }
              },
              "outputs": {
                "type": "object",
                "maxProperties": 16,
                "propertyNames": {
                  "type": "string",
                  "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                  "not": { "enum": ["constructor", "prototype"] }
                },
                "additionalProperties": { "$ref": "#/$defs/Port" }
              },
              "parameters": {
                "type": "object",
                "maxProperties": 128,
                "propertyNames": {
                  "type": "string",
                  "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                  "not": { "enum": ["constructor", "prototype"] }
                },
                "additionalProperties": { "$ref": "#/$defs/Parameter" },
                "description": "Public controls for the definition. The 128-control budget accommodates the expanded DSP families; expanded programs remain capped at 4096 controls."
              },
              "nodes": {
                "type": "object",
                "maxProperties": 64,
                "propertyNames": {
                  "type": "string",
                  "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                  "not": { "enum": ["constructor", "prototype"] }
                },
                "additionalProperties": { "$ref": "#/$defs/Node" }
              },
              "connections": {
                "type": "object",
                "maxProperties": 256,
                "propertyNames": {
                  "type": "string",
                  "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                  "not": { "enum": ["constructor", "prototype"] }
                },
                "additionalProperties": {
                  "type": "object",
                  "additionalProperties": false,
                  "properties": {
                    "from": { "$ref": "#/$defs/Endpoint" },
                    "to": { "$ref": "#/$defs/Endpoint" }
                  },
                  "required": ["from", "to"]
                }
              },
              "presets": {
                "type": "object",
                "maxProperties": 64,
                "propertyNames": {
                  "type": "string",
                  "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                  "not": { "enum": ["constructor", "prototype"] }
                },
                "additionalProperties": { "$ref": "#/$defs/Preset" }
              }
            },
            "required": [
              "title",
              "inputs",
              "outputs",
              "parameters",
              "nodes",
              "connections"
            ]
          },
          "Endpoint": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "node": {
                "anyOf": [
                  {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] }
                  },
                  { "enum": ["$in", "$out"] }
                ]
              },
              "port": {
                "description": "A port name, or `@name` for the parameter socket that a one-lane control cable drives.",
                "type": "string",
                "pattern": "^@?[a-z][a-z0-9_-]{0,63}$",
                "not": { "enum": ["constructor", "prototype"] }
              }
            },
            "required": ["node", "port"]
          },
          "Bounds": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "x": { "type": "number" },
              "y": { "type": "number" },
              "width": {
                "type": "number",
                "exclusiveMinimum": 0,
                "maximum": 8192
              },
              "height": {
                "type": "number",
                "exclusiveMinimum": 0,
                "maximum": 8192
              }
            },
            "required": ["x", "y", "width", "height"]
          },
          "Widget": {
            "oneOf": [
              {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "kind": { "enum": ["knob", "slider"] },
                  "label": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 128
                  },
                  "parameter": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] }
                  },
                  "bounds": { "$ref": "#/$defs/Bounds" },
                  "style": { "$ref": "#/$defs/WidgetStyle" },
                  "name": {
                    "description": "Optional editor layer name, independent of content, labels and durable identity.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 128
                  },
                  "hidden": {
                    "description": "Omit this layer from Frame presentation; parameter bindings and DSP remain unchanged.",
                    "type": "boolean"
                  },
                  "locked": {
                    "description": "Protect this layer from browser design edits. Does not disable playback controls.",
                    "type": "boolean"
                  },
                  "folder": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional parent layer-folder identity within this Frame."
                  },
                  "styleRef": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional reference to a compatible reusable style in this Toy. Local style values override it."
                  },
                  "constraints": { "$ref": "#/$defs/LayoutConstraints" },
                  "orientation": { "enum": ["auto", "horizontal", "vertical"] }
                },
                "required": ["kind", "label", "parameter", "bounds"]
              },
              {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "kind": { "const": "envelope" },
                  "label": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 128
                  },
                  "bounds": { "$ref": "#/$defs/Bounds" },
                  "style": { "$ref": "#/$defs/WidgetStyle" },
                  "name": {
                    "description": "Optional editor layer name, independent of content, labels and durable identity.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 128
                  },
                  "hidden": {
                    "description": "Omit this layer from Frame presentation; parameter bindings and DSP remain unchanged.",
                    "type": "boolean"
                  },
                  "locked": {
                    "description": "Protect this layer from browser design edits. Does not disable playback controls.",
                    "type": "boolean"
                  },
                  "folder": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional parent layer-folder identity within this Frame."
                  },
                  "styleRef": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional reference to a compatible reusable style in this Toy. Local style values override it."
                  },
                  "parameters": {
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                      "attack": {
                        "type": "string",
                        "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                        "not": { "enum": ["constructor", "prototype"] }
                      },
                      "decay": {
                        "type": "string",
                        "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                        "not": { "enum": ["constructor", "prototype"] }
                      },
                      "sustain": {
                        "type": "string",
                        "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                        "not": { "enum": ["constructor", "prototype"] }
                      },
                      "release": {
                        "type": "string",
                        "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                        "not": { "enum": ["constructor", "prototype"] }
                      },
                      "gate": {
                        "type": "string",
                        "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                        "not": { "enum": ["constructor", "prototype"] }
                      },
                      "type": {
                        "type": "string",
                        "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                        "not": { "enum": ["constructor", "prototype"] }
                      },
                      "curve": {
                        "type": "string",
                        "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                        "not": { "enum": ["constructor", "prototype"] }
                      },
                      "loop": {
                        "type": "string",
                        "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                        "not": { "enum": ["constructor", "prototype"] }
                      },
                      "retrigger": {
                        "type": "string",
                        "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                        "not": { "enum": ["constructor", "prototype"] }
                      },
                      "hold": {
                        "type": "string",
                        "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                        "not": { "enum": ["constructor", "prototype"] }
                      }
                    },
                    "required": [
                      "attack",
                      "decay",
                      "sustain",
                      "release",
                      "gate",
                      "type",
                      "curve",
                      "loop",
                      "retrigger",
                      "hold"
                    ]
                  },
                  "constraints": { "$ref": "#/$defs/LayoutConstraints" }
                },
                "required": ["kind", "label", "parameters", "bounds"]
              },
              {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "kind": { "const": "filter" },
                  "label": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 128
                  },
                  "bounds": { "$ref": "#/$defs/Bounds" },
                  "style": { "$ref": "#/$defs/WidgetStyle" },
                  "name": {
                    "description": "Optional editor layer name, independent of content, labels and durable identity.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 128
                  },
                  "hidden": {
                    "description": "Omit this layer from Frame presentation; parameter bindings and DSP remain unchanged.",
                    "type": "boolean"
                  },
                  "locked": {
                    "description": "Protect this layer from browser design edits. Does not disable playback controls.",
                    "type": "boolean"
                  },
                  "folder": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional parent layer-folder identity within this Frame."
                  },
                  "styleRef": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional reference to a compatible reusable style in this Toy. Local style values override it."
                  },
                  "parameters": {
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                      "cutoff": {
                        "type": "string",
                        "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                        "not": { "enum": ["constructor", "prototype"] }
                      },
                      "resonance": {
                        "type": "string",
                        "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                        "not": { "enum": ["constructor", "prototype"] }
                      },
                      "mode": {
                        "type": "string",
                        "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                        "not": { "enum": ["constructor", "prototype"] }
                      },
                      "type": {
                        "type": "string",
                        "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                        "not": { "enum": ["constructor", "prototype"] }
                      },
                      "slope": {
                        "type": "string",
                        "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                        "not": { "enum": ["constructor", "prototype"] }
                      },
                      "compensation": {
                        "type": "string",
                        "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                        "not": { "enum": ["constructor", "prototype"] }
                      }
                    },
                    "required": ["cutoff"]
                  },
                  "model": { "enum": ["lowpass", "svf"] },
                  "constraints": { "$ref": "#/$defs/LayoutConstraints" }
                },
                "required": ["kind", "label", "parameters", "bounds", "model"]
              },
              {
                "description": "A node face: one processor's instrument screen (filter response, ADSR, transfer curve, tap train, waveform, EQ, wavetable stack, tuner, curve or step grid). Every role binds a distinct public control that targets that role's parameter of one node of the face's type; faces that draw node data also name that node.",
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "kind": { "const": "face" },
                  "label": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 128
                  },
                  "face": {
                    "enum": [
                      "lowpass",
                      "svf",
                      "envelope",
                      "compressor",
                      "limiter",
                      "delay",
                      "wave",
                      "sine",
                      "eq",
                      "wavetable",
                      "tuner",
                      "curve",
                      "step",
                      "poly",
                      "drive",
                      "reverb",
                      "chorus",
                      "lfo",
                      "math",
                      "compare",
                      "scale"
                    ]
                  },
                  "parameters": {
                    "description": "Face role to public control id. Every role of the face is bound.",
                    "type": "object",
                    "maxProperties": 32,
                    "propertyNames": {
                      "type": "string",
                      "pattern": "^[a-z][a-z0-9_]{0,63}$",
                      "not": { "enum": ["constructor", "prototype"] }
                    },
                    "additionalProperties": {
                      "type": "string",
                      "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                      "not": { "enum": ["constructor", "prototype"] }
                    }
                  },
                  "node": {
                    "description": "The processor node in this Frame's definition. Required for faces that draw node data (wavetable, tuner, curve, step); it also gives the face its live readings.",
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] }
                  },
                  "bounds": { "$ref": "#/$defs/Bounds" },
                  "style": { "$ref": "#/$defs/WidgetStyle" },
                  "name": {
                    "description": "Optional editor layer name, independent of content, labels and durable identity.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 128
                  },
                  "hidden": {
                    "description": "Omit this layer from Frame presentation; parameter bindings and DSP remain unchanged.",
                    "type": "boolean"
                  },
                  "locked": {
                    "description": "Protect this layer from browser design edits. Does not disable playback controls.",
                    "type": "boolean"
                  },
                  "folder": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional parent layer-folder identity within this Frame."
                  },
                  "styleRef": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional reference to a compatible reusable style in this Toy. Local style values override it."
                  },
                  "constraints": { "$ref": "#/$defs/LayoutConstraints" }
                },
                "required": ["kind", "label", "face", "parameters", "bounds"]
              },
              {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "kind": { "enum": ["toggle", "momentary", "trigger"] },
                  "label": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 128
                  },
                  "parameter": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] }
                  },
                  "bounds": { "$ref": "#/$defs/Bounds" },
                  "style": { "$ref": "#/$defs/WidgetStyle" },
                  "name": {
                    "description": "Optional editor layer name, independent of content, labels and durable identity.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 128
                  },
                  "hidden": {
                    "description": "Omit this layer from Frame presentation; parameter bindings and DSP remain unchanged.",
                    "type": "boolean"
                  },
                  "locked": {
                    "description": "Protect this layer from browser design edits. Does not disable playback controls.",
                    "type": "boolean"
                  },
                  "folder": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional parent layer-folder identity within this Frame."
                  },
                  "styleRef": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional reference to a compatible reusable style in this Toy. Local style values override it."
                  },
                  "onValue": {
                    "type": "number",
                    "description": "Pressed/on value; defaults to the bound public parameter maximum."
                  },
                  "offValue": {
                    "type": "number",
                    "description": "Released/off value; defaults to the bound public parameter minimum."
                  },
                  "pulseMs": {
                    "type": "number",
                    "minimum": 10,
                    "maximum": 2000,
                    "description": "Trigger pulse length in milliseconds, default 80. Only applies to trigger controls."
                  },
                  "constraints": { "$ref": "#/$defs/LayoutConstraints" },
                  "appearance": { "enum": ["button", "checkbox", "switch"] }
                },
                "required": ["kind", "label", "parameter", "bounds"]
              },
              {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "kind": { "const": "xy" },
                  "label": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 128
                  },
                  "bounds": { "$ref": "#/$defs/Bounds" },
                  "style": { "$ref": "#/$defs/WidgetStyle" },
                  "name": {
                    "description": "Optional editor layer name, independent of content, labels and durable identity.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 128
                  },
                  "hidden": {
                    "description": "Omit this layer from Frame presentation; parameter bindings and DSP remain unchanged.",
                    "type": "boolean"
                  },
                  "locked": {
                    "description": "Protect this layer from browser design edits. Does not disable playback controls.",
                    "type": "boolean"
                  },
                  "folder": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional parent layer-folder identity within this Frame."
                  },
                  "styleRef": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional reference to a compatible reusable style in this Toy. Local style values override it."
                  },
                  "xParameter": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] }
                  },
                  "yParameter": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] }
                  },
                  "constraints": { "$ref": "#/$defs/LayoutConstraints" },
                  "appearance": { "enum": ["pad", "joystick"] },
                  "spring": { "type": "boolean" }
                },
                "required": [
                  "kind",
                  "label",
                  "xParameter",
                  "yParameter",
                  "bounds"
                ]
              },
              {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "kind": { "const": "text" },
                  "text": { "type": "string", "maxLength": 4096 },
                  "bounds": { "$ref": "#/$defs/Bounds" },
                  "style": { "$ref": "#/$defs/WidgetStyle" },
                  "name": {
                    "description": "Optional editor layer name, independent of content, labels and durable identity.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 128
                  },
                  "hidden": {
                    "description": "Omit this layer from Frame presentation; parameter bindings and DSP remain unchanged.",
                    "type": "boolean"
                  },
                  "locked": {
                    "description": "Protect this layer from browser design edits. Does not disable playback controls.",
                    "type": "boolean"
                  },
                  "folder": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional parent layer-folder identity within this Frame."
                  },
                  "styleRef": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional reference to a compatible reusable style in this Toy. Local style values override it."
                  },
                  "constraints": { "$ref": "#/$defs/LayoutConstraints" }
                },
                "required": ["kind", "text", "bounds"]
              },
              {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "kind": { "const": "frame" },
                  "node": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Group instance for a nested Frame. Omit only for an inline Frame of the same definition."
                  },
                  "frame": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] }
                  },
                  "bounds": { "$ref": "#/$defs/Bounds" },
                  "style": { "$ref": "#/$defs/WidgetStyle" },
                  "name": {
                    "description": "Optional editor layer name, independent of content, labels and durable identity.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 128
                  },
                  "hidden": {
                    "description": "Omit this layer from Frame presentation; parameter bindings and DSP remain unchanged.",
                    "type": "boolean"
                  },
                  "locked": {
                    "description": "Protect this layer from browser design edits. Does not disable playback controls.",
                    "type": "boolean"
                  },
                  "folder": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional parent layer-folder identity within this Frame."
                  },
                  "styleRef": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional reference to a compatible reusable style in this Toy. Local style values override it."
                  },
                  "constraints": { "$ref": "#/$defs/LayoutConstraints" }
                },
                "required": ["kind", "frame", "bounds"]
              },
              {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "kind": { "const": "icon" },
                  "bounds": { "$ref": "#/$defs/Bounds" },
                  "style": { "$ref": "#/$defs/WidgetStyle" },
                  "name": {
                    "description": "Optional editor layer name, independent of content, labels and durable identity.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 128
                  },
                  "hidden": {
                    "description": "Omit this layer from Frame presentation; parameter bindings and DSP remain unchanged.",
                    "type": "boolean"
                  },
                  "locked": {
                    "description": "Protect this layer from browser design edits. Does not disable playback controls.",
                    "type": "boolean"
                  },
                  "icon": { "$ref": "#/$defs/IconName" },
                  "label": {
                    "description": "Accessible name for this icon; an empty string marks it decorative.",
                    "type": "string",
                    "maxLength": 128
                  },
                  "folder": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional parent layer-folder identity within this Frame."
                  },
                  "styleRef": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional reference to a compatible reusable style in this Toy. Local style values override it."
                  },
                  "appearance": { "$ref": "#/$defs/IconAppearance" },
                  "constraints": { "$ref": "#/$defs/LayoutConstraints" }
                },
                "required": ["kind", "icon", "label", "bounds"]
              },
              {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "kind": { "const": "meter" },
                  "label": { "type": "string", "maxLength": 128 },
                  "source": {
                    "anyOf": [
                      {
                        "type": "string",
                        "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                        "not": { "enum": ["constructor", "prototype"] }
                      },
                      { "enum": ["$in", "$out"] }
                    ]
                  },
                  "bounds": { "$ref": "#/$defs/Bounds" },
                  "style": { "$ref": "#/$defs/WidgetStyle" },
                  "name": {
                    "description": "Optional editor layer name, independent of content, labels and durable identity.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 128
                  },
                  "hidden": {
                    "description": "Omit this layer from Frame presentation; parameter bindings and DSP remain unchanged.",
                    "type": "boolean"
                  },
                  "locked": {
                    "description": "Protect this layer from browser design edits. Does not disable playback controls.",
                    "type": "boolean"
                  },
                  "folder": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional parent layer-folder identity within this Frame."
                  },
                  "styleRef": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional reference to a compatible reusable style in this Toy. Local style values override it."
                  },
                  "constraints": { "$ref": "#/$defs/LayoutConstraints" }
                },
                "required": ["kind", "label", "source", "bounds"]
              },
              {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "kind": { "const": "segmented" },
                  "bounds": { "$ref": "#/$defs/Bounds" },
                  "style": { "$ref": "#/$defs/WidgetStyle" },
                  "name": {
                    "description": "Optional editor layer name, independent of content, labels and durable identity.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 128
                  },
                  "hidden": {
                    "description": "Omit this layer from Frame presentation; parameter bindings and DSP remain unchanged.",
                    "type": "boolean"
                  },
                  "locked": {
                    "description": "Protect this layer from browser design edits. Does not disable playback controls.",
                    "type": "boolean"
                  },
                  "folder": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional parent layer-folder identity within this Frame."
                  },
                  "styleRef": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional reference to a compatible reusable style in this Toy. Local style values override it."
                  },
                  "constraints": { "$ref": "#/$defs/LayoutConstraints" },
                  "label": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 128
                  },
                  "parameter": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] }
                  },
                  "options": {
                    "type": "array",
                    "minItems": 2,
                    "maxItems": 16,
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "properties": {
                        "label": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 64
                        },
                        "value": { "type": "number" }
                      },
                      "required": ["label", "value"]
                    }
                  }
                },
                "required": ["kind", "bounds", "label", "parameter", "options"]
              },
              {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "kind": { "const": "image" },
                  "bounds": { "$ref": "#/$defs/Bounds" },
                  "style": { "$ref": "#/$defs/WidgetStyle" },
                  "name": {
                    "description": "Optional editor layer name, independent of content, labels and durable identity.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 128
                  },
                  "hidden": {
                    "description": "Omit this layer from Frame presentation; parameter bindings and DSP remain unchanged.",
                    "type": "boolean"
                  },
                  "locked": {
                    "description": "Protect this layer from browser design edits. Does not disable playback controls.",
                    "type": "boolean"
                  },
                  "folder": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional parent layer-folder identity within this Frame."
                  },
                  "styleRef": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional reference to a compatible reusable style in this Toy. Local style values override it."
                  },
                  "constraints": { "$ref": "#/$defs/LayoutConstraints" },
                  "label": { "type": "string", "maxLength": 128 },
                  "asset": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] }
                  },
                  "fit": { "enum": ["contain", "cover", "stretch"] }
                },
                "required": ["kind", "bounds", "label", "asset"]
              },
              {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "kind": { "const": "piano" },
                  "bounds": { "$ref": "#/$defs/Bounds" },
                  "style": { "$ref": "#/$defs/WidgetStyle" },
                  "name": {
                    "description": "Optional editor layer name, independent of content, labels and durable identity.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 128
                  },
                  "hidden": {
                    "description": "Omit this layer from Frame presentation; parameter bindings and DSP remain unchanged.",
                    "type": "boolean"
                  },
                  "locked": {
                    "description": "Protect this layer from browser design edits. Does not disable playback controls.",
                    "type": "boolean"
                  },
                  "folder": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional parent layer-folder identity within this Frame."
                  },
                  "styleRef": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional reference to a compatible reusable style in this Toy. Local style values override it."
                  },
                  "constraints": { "$ref": "#/$defs/LayoutConstraints" },
                  "label": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 128
                  },
                  "node": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_/-]{0,1023}$"
                  },
                  "firstNote": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 126
                  },
                  "lastNote": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 127
                  }
                },
                "required": ["kind", "bounds", "label", "node"]
              },
              {
                "description": "A lamp showing a color, boolean, number, integer or trigger data output. Hidden lamps never change execution.",
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "kind": { "const": "led" },
                  "label": { "type": "string", "maxLength": 128 },
                  "source": { "$ref": "#/$defs/DataSource" },
                  "bounds": { "$ref": "#/$defs/Bounds" },
                  "style": { "$ref": "#/$defs/WidgetStyle" },
                  "name": {
                    "description": "Optional editor layer name, independent of content, labels and durable identity.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 128
                  },
                  "hidden": {
                    "description": "Omit this layer from Frame presentation; parameter bindings and DSP remain unchanged.",
                    "type": "boolean"
                  },
                  "locked": {
                    "description": "Protect this layer from browser design edits. Does not disable playback controls.",
                    "type": "boolean"
                  },
                  "folder": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional parent layer-folder identity within this Frame."
                  },
                  "styleRef": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional reference to a compatible reusable style in this Toy. Local style values override it."
                  },
                  "constraints": { "$ref": "#/$defs/LayoutConstraints" },
                  "shape": { "enum": ["round", "square", "bar"] },
                  "onColor": {
                    "type": "string",
                    "pattern": "^#[0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?$"
                  },
                  "offColor": {
                    "type": "string",
                    "pattern": "^#[0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?$"
                  },
                  "glow": { "type": "boolean" },
                  "pulseMs": {
                    "type": "integer",
                    "minimum": 10,
                    "maximum": 2000
                  }
                },
                "required": ["kind", "label", "source", "bounds"]
              },
              {
                "description": "A sandboxed page bound to a web.frame node; it loads after a click and relays messages only with the node's declared origin.",
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "kind": { "const": "web" },
                  "label": { "type": "string", "maxLength": 128 },
                  "source": { "$ref": "#/$defs/DataSource" },
                  "bounds": { "$ref": "#/$defs/Bounds" },
                  "style": { "$ref": "#/$defs/WidgetStyle" },
                  "name": {
                    "description": "Optional editor layer name, independent of content, labels and durable identity.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 128
                  },
                  "hidden": {
                    "description": "Omit this layer from Frame presentation; parameter bindings and DSP remain unchanged.",
                    "type": "boolean"
                  },
                  "locked": {
                    "description": "Protect this layer from browser design edits. Does not disable playback controls.",
                    "type": "boolean"
                  },
                  "folder": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional parent layer-folder identity within this Frame."
                  },
                  "styleRef": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional reference to a compatible reusable style in this Toy. Local style values override it."
                  },
                  "constraints": { "$ref": "#/$defs/LayoutConstraints" },
                  "showOrigin": { "type": "boolean" }
                },
                "required": ["kind", "label", "source", "bounds"]
              },
              {
                "description": "Draws strokes onto a video.paint node's surface; strokes are runtime state, never source. Place it over the Screen that shows the paint so strokes stay aligned.",
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "kind": { "const": "paint" },
                  "label": { "type": "string", "maxLength": 128 },
                  "source": { "$ref": "#/$defs/DataSource" },
                  "bounds": { "$ref": "#/$defs/Bounds" },
                  "style": { "$ref": "#/$defs/WidgetStyle" },
                  "name": {
                    "description": "Optional editor layer name, independent of content, labels and durable identity.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 128
                  },
                  "hidden": {
                    "description": "Omit this layer from Frame presentation; parameter bindings and DSP remain unchanged.",
                    "type": "boolean"
                  },
                  "locked": {
                    "description": "Protect this layer from browser design edits. Does not disable playback controls.",
                    "type": "boolean"
                  },
                  "folder": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional parent layer-folder identity within this Frame."
                  },
                  "styleRef": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional reference to a compatible reusable style in this Toy. Local style values override it."
                  },
                  "constraints": { "$ref": "#/$defs/LayoutConstraints" },
                  "color": {
                    "type": "string",
                    "pattern": "^#[0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?$"
                  },
                  "width": { "type": "number", "minimum": 1, "maximum": 64 },
                  "opacity": { "type": "number", "minimum": 0.05, "maximum": 1 }
                },
                "required": ["kind", "label", "source", "bounds"]
              },
              {
                "description": "Draws one frame of a std.wavetable node's table; each gesture is one source edit.",
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "kind": { "const": "curve" },
                  "label": { "type": "string", "maxLength": 128 },
                  "node": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] }
                  },
                  "bounds": { "$ref": "#/$defs/Bounds" },
                  "style": { "$ref": "#/$defs/WidgetStyle" },
                  "name": {
                    "description": "Optional editor layer name, independent of content, labels and durable identity.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 128
                  },
                  "hidden": {
                    "description": "Omit this layer from Frame presentation; parameter bindings and DSP remain unchanged.",
                    "type": "boolean"
                  },
                  "locked": {
                    "description": "Protect this layer from browser design edits. Does not disable playback controls.",
                    "type": "boolean"
                  },
                  "folder": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional parent layer-folder identity within this Frame."
                  },
                  "styleRef": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional reference to a compatible reusable style in this Toy. Local style values override it."
                  },
                  "constraints": { "$ref": "#/$defs/LayoutConstraints" },
                  "tableFrame": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 7
                  },
                  "color": {
                    "type": "string",
                    "pattern": "^#[0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?$"
                  }
                },
                "required": ["kind", "label", "node", "bounds"]
              },
              {
                "description": "A multiview face of a video.switch node: program/preview tally, click to cue, Take and transition. Public controls stay the authority.",
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "kind": { "const": "switcher" },
                  "label": { "type": "string", "maxLength": 128 },
                  "node": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] }
                  },
                  "parameters": {
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                      "program": {
                        "type": "string",
                        "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                        "not": { "enum": ["constructor", "prototype"] }
                      },
                      "preview": {
                        "type": "string",
                        "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                        "not": { "enum": ["constructor", "prototype"] }
                      },
                      "transition": {
                        "type": "string",
                        "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                        "not": { "enum": ["constructor", "prototype"] }
                      }
                    },
                    "required": ["program", "preview"]
                  },
                  "bounds": { "$ref": "#/$defs/Bounds" },
                  "style": { "$ref": "#/$defs/WidgetStyle" },
                  "name": {
                    "description": "Optional editor layer name, independent of content, labels and durable identity.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 128
                  },
                  "hidden": {
                    "description": "Omit this layer from Frame presentation; parameter bindings and DSP remain unchanged.",
                    "type": "boolean"
                  },
                  "locked": {
                    "description": "Protect this layer from browser design edits. Does not disable playback controls.",
                    "type": "boolean"
                  },
                  "folder": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional parent layer-folder identity within this Frame."
                  },
                  "styleRef": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional reference to a compatible reusable style in this Toy. Local style values override it."
                  },
                  "constraints": { "$ref": "#/$defs/LayoutConstraints" }
                },
                "required": ["kind", "label", "node", "parameters", "bounds"]
              },
              {
                "description": "Shows one public parameter's effective value or one lane of a control output, formatted with a unit.",
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "kind": { "const": "readout" },
                  "label": { "type": "string", "maxLength": 128 },
                  "parameter": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] }
                  },
                  "source": { "$ref": "#/$defs/DataSource" },
                  "lane": { "type": "integer", "minimum": 0, "maximum": 31 },
                  "bounds": { "$ref": "#/$defs/Bounds" },
                  "style": { "$ref": "#/$defs/WidgetStyle" },
                  "name": {
                    "description": "Optional editor layer name, independent of content, labels and durable identity.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 128
                  },
                  "hidden": {
                    "description": "Omit this layer from Frame presentation; parameter bindings and DSP remain unchanged.",
                    "type": "boolean"
                  },
                  "locked": {
                    "description": "Protect this layer from browser design edits. Does not disable playback controls.",
                    "type": "boolean"
                  },
                  "folder": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional parent layer-folder identity within this Frame."
                  },
                  "styleRef": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional reference to a compatible reusable style in this Toy. Local style values override it."
                  },
                  "constraints": { "$ref": "#/$defs/LayoutConstraints" },
                  "format": {
                    "enum": ["number", "percent", "integer", "boolean"]
                  },
                  "precision": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 6
                  },
                  "unit": { "type": "string", "maxLength": 16 }
                },
                "required": ["kind", "label", "bounds"]
              },
              {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "kind": { "const": "scope" },
                  "label": { "type": "string", "maxLength": 128 },
                  "source": {
                    "description": "Audio source in this definition.",
                    "anyOf": [
                      {
                        "type": "string",
                        "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                        "not": { "enum": ["constructor", "prototype"] }
                      },
                      { "enum": ["$in", "$out"] }
                    ]
                  },
                  "port": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Audio port to inspect; omit for the source's first audio port."
                  },
                  "bounds": { "$ref": "#/$defs/Bounds" },
                  "style": { "$ref": "#/$defs/WidgetStyle" },
                  "name": {
                    "description": "Optional editor layer name, independent of content, labels and durable identity.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 128
                  },
                  "hidden": {
                    "description": "Omit this layer from Frame presentation; parameter bindings and DSP remain unchanged.",
                    "type": "boolean"
                  },
                  "locked": {
                    "description": "Protect this layer from browser design edits. Does not disable playback controls.",
                    "type": "boolean"
                  },
                  "folder": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional parent layer-folder identity within this Frame."
                  },
                  "styleRef": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional reference to a compatible reusable style in this Toy. Local style values override it."
                  },
                  "constraints": { "$ref": "#/$defs/LayoutConstraints" },
                  "mode": {
                    "enum": ["scope", "spectrum", "spectrogram", "xy", "tuner"]
                  },
                  "channel": { "type": "integer", "minimum": 0, "maximum": 31 }
                },
                "required": ["kind", "label", "source", "bounds"]
              },
              {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "kind": { "const": "screen" },
                  "bounds": { "$ref": "#/$defs/Bounds" },
                  "style": { "$ref": "#/$defs/WidgetStyle" },
                  "name": {
                    "description": "Optional editor layer name, independent of content, labels and durable identity.",
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 128
                  },
                  "hidden": {
                    "description": "Omit this layer from Frame presentation; parameter bindings and DSP remain unchanged.",
                    "type": "boolean"
                  },
                  "locked": {
                    "description": "Protect this layer from browser design edits. Does not disable playback controls.",
                    "type": "boolean"
                  },
                  "folder": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional parent layer-folder identity within this Frame."
                  },
                  "styleRef": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] },
                    "description": "Optional reference to a compatible reusable style in this Toy. Local style values override it."
                  },
                  "constraints": { "$ref": "#/$defs/LayoutConstraints" },
                  "label": { "type": "string", "maxLength": 128 },
                  "asset": {
                    "type": "string",
                    "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                    "not": { "enum": ["constructor", "prototype"] }
                  },
                  "fit": { "enum": ["contain", "cover", "stretch"] },
                  "mode": { "enum": ["image", "video", "scene", "live"] },
                  "scene": { "enum": ["cube", "pyramid"] },
                  "stream": {
                    "description": "For `live` Screens on a bundled video port: which stream to show (0-based).",
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 15
                  },
                  "source": {
                    "description": "For `live` Screens: the video output port of a node in this Frame's definition.",
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                      "node": {
                        "type": "string",
                        "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                        "not": { "enum": ["constructor", "prototype"] }
                      },
                      "port": {
                        "type": "string",
                        "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                        "not": { "enum": ["constructor", "prototype"] }
                      }
                    },
                    "required": ["node", "port"]
                  }
                },
                "required": ["kind", "bounds", "label", "mode"]
              }
            ]
          },
          "Frame": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "definition": {
                "type": "string",
                "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                "not": { "enum": ["constructor", "prototype"] }
              },
              "title": { "type": "string", "minLength": 1, "maxLength": 128 },
              "width": {
                "type": "number",
                "exclusiveMinimum": 0,
                "maximum": 8192
              },
              "height": {
                "type": "number",
                "exclusiveMinimum": 0,
                "maximum": 8192
              },
              "widgets": {
                "type": "object",
                "maxProperties": 128,
                "propertyNames": {
                  "type": "string",
                  "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                  "not": { "enum": ["constructor", "prototype"] }
                },
                "additionalProperties": { "$ref": "#/$defs/Widget" }
              },
              "theme": { "$ref": "#/$defs/Theme" },
              "layerFolders": {
                "type": "object",
                "maxProperties": 64,
                "propertyNames": {
                  "type": "string",
                  "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                  "not": { "enum": ["constructor", "prototype"] }
                },
                "additionalProperties": { "$ref": "#/$defs/LayerFolder" }
              },
              "layout": { "$ref": "#/$defs/ResponsiveLayout" }
            },
            "required": ["definition", "title", "width", "height", "widgets"]
          },
          "Asset": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "path": {
                "type": "string",
                "pattern": "^assets/[a-zA-Z0-9_./-]+$",
                "maxLength": 240
              },
              "sha256": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
              "sizeBytes": {
                "type": "integer",
                "minimum": 0,
                "maximum": 134217728
              },
              "mediaType": { "type": "string", "maxLength": 128 },
              "license": { "type": "string", "minLength": 1, "maxLength": 128 },
              "mediaId": {
                "type": "string",
                "pattern": "^[a-zA-Z0-9_-]{1,128}$"
              },
              "mediaVersion": {
                "type": "string",
                "pattern": "^[a-zA-Z0-9_-]{1,128}$"
              },
              "attribution": { "type": "string", "maxLength": 1024 }
            },
            "required": ["path", "sha256", "sizeBytes", "mediaType", "license"]
          },
          "ThemePreset": {
            "type": "string",
            "enum": ["neutral-dark", "neutral-light", "warm", "midnight"]
          },
          "FontFamily": {
            "type": "string",
            "enum": ["sans", "display", "mono", "serif"]
          },
          "ThemeTokens": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "background": {
                "type": "string",
                "pattern": "^#[0-9a-fA-F]{6}$"
              },
              "surface": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" },
              "text": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" },
              "muted": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" },
              "accent": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" },
              "border": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" },
              "fontFamily": { "$ref": "#/$defs/FontFamily" },
              "fontSize": { "type": "number", "minimum": 6, "maximum": 120 },
              "radius": { "type": "number", "minimum": 0, "maximum": 40 },
              "screen": {
                "description": "Instrument screen glass behind node faces, signal plots and curves. Omitted: the default dark glass.",
                "type": "string",
                "pattern": "^#[0-9a-fA-F]{6}$"
              },
              "screenTrace": {
                "description": "One trace colour for every face on the screen, replacing each face's own tone. A widget accent still overrides it.",
                "type": "string",
                "pattern": "^#[0-9a-fA-F]{6}$"
              },
              "screenGlow": {
                "description": "Strength of the neon underlay under screen traces, 0 for none.",
                "type": "number",
                "minimum": 0,
                "maximum": 1
              }
            }
          },
          "Theme": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "preset": { "$ref": "#/$defs/ThemePreset" },
              "overrides": { "$ref": "#/$defs/ThemeTokens" }
            }
          },
          "WidgetStyle": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "color": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" },
              "background": {
                "type": "string",
                "pattern": "^#[0-9a-fA-F]{6}$"
              },
              "accent": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" },
              "borderColor": {
                "type": "string",
                "pattern": "^#[0-9a-fA-F]{6}$"
              },
              "fontFamily": { "$ref": "#/$defs/FontFamily" },
              "fontSize": { "type": "number", "minimum": 6, "maximum": 120 },
              "fontWeight": {
                "type": "integer",
                "enum": [300, 400, 500, 600, 700]
              },
              "letterSpacing": {
                "type": "number",
                "minimum": -2,
                "maximum": 20
              },
              "textAlign": {
                "type": "string",
                "enum": ["left", "center", "right"]
              },
              "borderWidth": { "type": "number", "minimum": 0, "maximum": 8 },
              "borderRadius": { "type": "number", "minimum": 0, "maximum": 80 },
              "opacity": { "type": "number", "minimum": 0, "maximum": 1 },
              "zIndex": { "type": "integer", "minimum": 0, "maximum": 255 }
            }
          },
          "IconName": {
            "description": "Bundled icon identity. Glyphs are local, inert and versioned with the Frame renderer.",
            "type": "string",
            "enum": [
              "a-arrow-down",
              "a-arrow-up",
              "a-large-small",
              "accessibility",
              "activity",
              "ad",
              "air-vent",
              "airplay",
              "alarm-clock",
              "alarm-clock-check",
              "alarm-clock-minus",
              "alarm-clock-off",
              "alarm-clock-plus",
              "alarm-smoke",
              "align-center-horizontal",
              "align-center-vertical",
              "align-end-horizontal",
              "align-end-vertical",
              "align-horizontal-distribute-center",
              "align-horizontal-distribute-end",
              "align-horizontal-distribute-start",
              "align-horizontal-justify-center",
              "align-horizontal-justify-end",
              "align-horizontal-justify-start",
              "align-horizontal-space-around",
              "align-horizontal-space-between",
              "align-start-horizontal",
              "align-start-vertical",
              "align-vertical-distribute-center",
              "align-vertical-distribute-end",
              "align-vertical-distribute-start",
              "align-vertical-justify-center",
              "align-vertical-justify-end",
              "align-vertical-justify-start",
              "align-vertical-space-around",
              "align-vertical-space-between",
              "ambulance",
              "ampersand",
              "ampersands",
              "amphora",
              "anchor",
              "angle",
              "antenna",
              "anvil",
              "aperture",
              "app-window",
              "app-window-mac",
              "apple",
              "archive",
              "archive-arrow-down",
              "archive-arrow-up",
              "archive-x",
              "armchair",
              "armenian-dram",
              "arrow-big-down",
              "arrow-big-down-dash",
              "arrow-big-left",
              "arrow-big-left-dash",
              "arrow-big-right",
              "arrow-big-right-dash",
              "arrow-big-up",
              "arrow-big-up-dash",
              "arrow-down",
              "arrow-down-0-1",
              "arrow-down-1-0",
              "arrow-down-a-z",
              "arrow-down-from-line",
              "arrow-down-left",
              "arrow-down-narrow-wide",
              "arrow-down-right",
              "arrow-down-to-dot",
              "arrow-down-to-line",
              "arrow-down-up",
              "arrow-down-wide-narrow",
              "arrow-down-z-a",
              "arrow-left",
              "arrow-left-from-line",
              "arrow-left-right",
              "arrow-left-to-line",
              "arrow-right",
              "arrow-right-from-line",
              "arrow-right-left",
              "arrow-right-to-line",
              "arrow-up",
              "arrow-up-0-1",
              "arrow-up-1-0",
              "arrow-up-a-z",
              "arrow-up-down",
              "arrow-up-from-dot",
              "arrow-up-from-line",
              "arrow-up-left",
              "arrow-up-narrow-wide",
              "arrow-up-right",
              "arrow-up-to-line",
              "arrow-up-wide-narrow",
              "arrow-up-z-a",
              "arrows-up-from-line",
              "asterisk",
              "astroid",
              "at-sign",
              "atom",
              "audio-lines",
              "audio-lines-off",
              "audio-lines-x",
              "audio-waveform",
              "avocado",
              "award",
              "axe",
              "axis-3d",
              "azerbaijani-manat",
              "baby",
              "backpack",
              "bacon",
              "badge",
              "badge-alert",
              "badge-cent",
              "badge-check",
              "badge-dollar-sign",
              "badge-euro",
              "badge-indian-rupee",
              "badge-info",
              "badge-japanese-yen",
              "badge-minus",
              "badge-percent",
              "badge-plus",
              "badge-pound-sterling",
              "badge-question-mark",
              "badge-russian-ruble",
              "badge-swiss-franc",
              "badge-turkish-lira",
              "badge-x",
              "baggage-claim",
              "ball-wave",
              "balloon",
              "ban",
              "banana",
              "bandage",
              "bangladeshi-taka",
              "banknote",
              "banknote-arrow-down",
              "banknote-arrow-up",
              "banknote-check",
              "banknote-x",
              "barcode",
              "barrel",
              "baseline",
              "bath",
              "battery",
              "battery-charging",
              "battery-full",
              "battery-low",
              "battery-medium",
              "battery-plus",
              "battery-warning",
              "beaker",
              "bean",
              "bean-off",
              "bed",
              "bed-double",
              "bed-single",
              "beef",
              "beef-off",
              "beer",
              "beer-off",
              "belarusian-ruble",
              "bell",
              "bell-check",
              "bell-dot",
              "bell-electric",
              "bell-minus",
              "bell-off",
              "bell-plus",
              "bell-ring",
              "between-horizontal-end",
              "between-horizontal-start",
              "between-vertical-end",
              "between-vertical-start",
              "biceps-flexed",
              "bike",
              "binary",
              "binoculars",
              "biohazard",
              "bird",
              "birdhouse",
              "bitcoin",
              "blend",
              "blender",
              "blinds",
              "blocks",
              "bluetooth",
              "bluetooth-connected",
              "bluetooth-off",
              "bluetooth-searching",
              "bolt",
              "bomb",
              "bone",
              "bone-fracture",
              "book",
              "book-a",
              "book-alert",
              "book-audio",
              "book-bookmark",
              "book-check",
              "book-copy",
              "book-dashed",
              "book-down",
              "book-headphones",
              "book-heart",
              "book-image",
              "book-key",
              "book-lock",
              "book-minus",
              "book-open",
              "book-open-check",
              "book-open-text",
              "book-plus",
              "book-search",
              "book-text",
              "book-type",
              "book-up",
              "book-up-2",
              "book-user",
              "book-x",
              "bookmark",
              "bookmark-check",
              "bookmark-minus",
              "bookmark-off",
              "bookmark-plus",
              "bookmark-x",
              "boom-box",
              "bot",
              "bot-message-square",
              "bot-off",
              "bottle-wine",
              "bow-arrow",
              "box",
              "boxes",
              "boxes-linked",
              "braces",
              "brackets",
              "brain",
              "brain-circuit",
              "brain-cog",
              "brain-off",
              "brand-1001tracklists",
              "brand-1and1",
              "brand-1dot1dot1dot1",
              "brand-1panel",
              "brand-1password",
              "brand-2fas",
              "brand-2k",
              "brand-30secondsofcode",
              "brand-365datascience",
              "brand-3m",
              "brand-42",
              "brand-4chan",
              "brand-4d",
              "brand-500px",
              "brand-7zip",
              "brand-99designs",
              "brand-9gag",
              "brand-abb",
              "brand-abbott",
              "brand-abbvie",
              "brand-abdownloadmanager",
              "brand-aboutdotme",
              "brand-abstract",
              "brand-abusedotch",
              "brand-academia",
              "brand-accenture",
              "brand-accusoft",
              "brand-accuweather",
              "brand-acer",
              "brand-acm",
              "brand-acode",
              "brand-actigraph",
              "brand-activeloop",
              "brand-activision",
              "brand-activitypub",
              "brand-actix",
              "brand-actualbudget",
              "brand-acura",
              "brand-ada",
              "brand-adafruit",
              "brand-adaway",
              "brand-adblock",
              "brand-adblockplus",
              "brand-addydotio",
              "brand-adguard",
              "brand-adidas",
              "brand-adminer",
              "brand-adonisjs",
              "brand-adp",
              "brand-adroll",
              "brand-adventofcode",
              "brand-adyen",
              "brand-aegisauthenticator",
              "brand-aeroflot",
              "brand-aeromexico",
              "brand-afdian",
              "brand-affine",
              "brand-aframe",
              "brand-afterpay",
              "brand-aftership",
              "brand-agentskills",
              "brand-agora",
              "brand-aib",
              "brand-aidungeon",
              "brand-aiohttp",
              "brand-aiqfome",
              "brand-airasia",
              "brand-airbnb",
              "brand-airbrake",
              "brand-airbus",
              "brand-airbyte",
              "brand-aircall",
              "brand-aircanada",
              "brand-airchina",
              "brand-airfrance",
              "brand-airindia",
              "brand-airplayaudio",
              "brand-airplayvideo",
              "brand-airserbia",
              "brand-airtable",
              "brand-airtel",
              "brand-airtransat",
              "brand-ajv",
              "brand-akamai",
              "brand-akasaair",
              "brand-akaunting",
              "brand-akiflow",
              "brand-alacritty",
              "brand-alamy",
              "brand-albertheijn",
              "brand-alby",
              "brand-alchemy",
              "brand-aldinord",
              "brand-aldisud",
              "brand-alfred",
              "brand-algolia",
              "brand-algorand",
              "brand-alibabacloud",
              "brand-alibabadotcom",
              "brand-alienware",
              "brand-aliexpress",
              "brand-alipay",
              "brand-alist",
              "brand-allegro",
              "brand-alliedmodders",
              "brand-alltrails",
              "brand-almalinux",
              "brand-alpinedotjs",
              "brand-alpinelinux",
              "brand-alternativeto",
              "brand-alwaysdata",
              "brand-amd",
              "brand-ameba",
              "brand-americanairlines",
              "brand-americanexpress",
              "brand-amg",
              "brand-amp",
              "brand-amul",
              "brand-ana",
              "brand-anaconda",
              "brand-analogue",
              "brand-andela",
              "brand-android",
              "brand-androidauto",
              "brand-androidstudio",
              "brand-angular",
              "brand-anichart",
              "brand-anilist",
              "brand-animalplanet",
              "brand-animedotjs",
              "brand-ankermake",
              "brand-anki",
              "brand-ansible",
              "brand-answer",
              "brand-ansys",
              "brand-anta",
              "brand-antdesign",
              "brand-antena3",
              "brand-antennapod",
              "brand-anthropic",
              "brand-antv",
              "brand-anycubic",
              "brand-anydesk",
              "brand-anytype",
              "brand-apache",
              "brand-apacheairflow",
              "brand-apacheant",
              "brand-apachearrow",
              "brand-apacheavro",
              "brand-apachecassandra",
              "brand-apachecloudstack",
              "brand-apachecordova",
              "brand-apachecouchdb",
              "brand-apachedolphinscheduler",
              "brand-apachedoris",
              "brand-apachedruid",
              "brand-apacheecharts",
              "brand-apacheflink",
              "brand-apachefreemarker",
              "brand-apachegroovy",
              "brand-apacheguacamole",
              "brand-apachehadoop",
              "brand-apachehbase",
              "brand-apachehive",
              "brand-apachejmeter",
              "brand-apachekafka",
              "brand-apachekylin",
              "brand-apachelucene",
              "brand-apachemaven",
              "brand-apachenetbeanside",
              "brand-apachenifi",
              "brand-apacheopenoffice",
              "brand-apacheparquet",
              "brand-apachepdfbox",
              "brand-apachepulsar",
              "brand-apacherocketmq",
              "brand-apachesolr",
              "brand-apachespark",
              "brand-apachestorm",
              "brand-apachesuperset",
              "brand-apachetomcat",
              "brand-aparat",
              "brand-apifox",
              "brand-apmterminals",
              "brand-apollographql",
              "brand-apostrophe",
              "brand-appgallery",
              "brand-appian",
              "brand-appimage",
              "brand-appium",
              "brand-apple",
              "brand-applearcade",
              "brand-applemusic",
              "brand-applenews",
              "brand-applepay",
              "brand-applepodcasts",
              "brand-appletv",
              "brand-appmanager",
              "brand-appsignal",
              "brand-appsmith",
              "brand-appstore",
              "brand-appveyor",
              "brand-appwrite",
              "brand-aqua",
              "brand-aral",
              "brand-arangodb",
              "brand-arc",
              "brand-arcgis",
              "brand-archicad",
              "brand-archiveofourown",
              "brand-archlinux",
              "brand-ardour",
              "brand-arduino",
              "brand-argo",
              "brand-argos",
              "brand-ariakit",
              "brand-arkecosystem",
              "brand-arlo",
              "brand-arm",
              "brand-armkeil",
              "brand-arstechnica",
              "brand-artifacthub",
              "brand-artixlinux",
              "brand-artstation",
              "brand-arxiv",
              "brand-asahilinux",
              "brand-asana",
              "brand-asciidoctor",
              "brand-asciinema",
              "brand-asda",
              "brand-aseprite",
              "brand-assemblyscript",
              "brand-asterisk",
              "brand-astonmartin",
              "brand-astra",
              "brand-astral",
              "brand-astro",
              "brand-asus",
              "brand-atandt",
              "brand-atari",
              "brand-atlasos",
              "brand-atlassian",
              "brand-auchan",
              "brand-audacity",
              "brand-audi",
              "brand-audible",
              "brand-audiobookshelf",
              "brand-audioboom",
              "brand-audiomack",
              "brand-audiotechnica",
              "brand-aurelia",
              "brand-autentique",
              "brand-auth0",
              "brand-authelia",
              "brand-authentik",
              "brand-autocad",
              "brand-autocannon",
              "brand-autodesk",
              "brand-autodeskmaya",
              "brand-autodeskrevit",
              "brand-autohotkey",
              "brand-autoit",
              "brand-automattic",
              "brand-autoprefixer",
              "brand-autozone",
              "brand-avajs",
              "brand-avaloniaui",
              "brand-avast",
              "brand-avianca",
              "brand-avira",
              "brand-avm",
              "brand-await",
              "brand-awesomelists",
              "brand-awesomewm",
              "brand-awwwards",
              "brand-axios",
              "brand-axisbank",
              "brand-b4x",
              "brand-babel",
              "brand-babelio",
              "brand-babylondotjs",
              "brand-backblaze",
              "brand-backbone",
              "brand-backbonedotjs",
              "brand-backendless",
              "brand-backstage",
              "brand-backstagecasting",
              "brand-badoo",
              "brand-baidu",
              "brand-bakalari",
              "brand-bamboo",
              "brand-bambulab",
              "brand-bandcamp",
              "brand-bandlab",
              "brand-bandrautomation",
              "brand-bandsintown",
              "brand-bankofamerica",
              "brand-barclays",
              "brand-baremetrics",
              "brand-barmenia",
              "brand-basecamp",
              "brand-baserow",
              "brand-baseui",
              "brand-basicattentiontoken",
              "brand-bastyon",
              "brand-bat",
              "brand-bata",
              "brand-battledotnet",
              "brand-bazel",
              "brand-beatport",
              "brand-beats",
              "brand-beatsbydre",
              "brand-beatstars",
              "brand-beekeeperstudio",
              "brand-behance",
              "brand-beijingsubway",
              "brand-bem",
              "brand-bentley",
              "brand-bento",
              "brand-bentobox",
              "brand-bentoml",
              "brand-bereal",
              "brand-betfair",
              "brand-betterauth",
              "brand-betterdiscord",
              "brand-betterstack",
              "brand-bevy",
              "brand-bigbasket",
              "brand-bigbluebutton",
              "brand-bigcartel",
              "brand-bigcommerce",
              "brand-bilibili",
              "brand-billboard",
              "brand-bim",
              "brand-binance",
              "brand-bioconductor",
              "brand-biolink",
              "brand-biome",
              "brand-bisecthosting",
              "brand-bit",
              "brand-bitbucket",
              "brand-bitcoin",
              "brand-bitcoincash",
              "brand-bitcoinsv",
              "brand-bitcomet",
              "brand-bitdefender",
              "brand-bitly",
              "brand-bitrise",
              "brand-bitsy",
              "brand-bittorrent",
              "brand-bitwarden",
              "brand-bitwig",
              "brand-black",
              "brand-blackberry",
              "brand-blackmagicdesign",
              "brand-blazemeter",
              "brand-blazor",
              "brand-blender",
              "brand-blibli",
              "brand-blockbench",
              "brand-blockchaindotcom",
              "brand-blogger",
              "brand-bloglovin",
              "brand-blueprint",
              "brand-bluesky",
              "brand-bluesound",
              "brand-bluetooth",
              "brand-bmcsoftware",
              "brand-bmw",
              "brand-bnbchain",
              "brand-boardgamegeek",
              "brand-boat",
              "brand-boehringeringelheim",
              "brand-boeing",
              "brand-bohemiainteractive",
              "brand-bombardier",
              "brand-bookalope",
              "brand-bookbub",
              "brand-bookingdotcom",
              "brand-bookmeter",
              "brand-bookmyshow",
              "brand-bookstack",
              "brand-boost",
              "brand-boosty",
              "brand-boots",
              "brand-bootstrap",
              "brand-borgbackup",
              "brand-bosch",
              "brand-bose",
              "brand-botblecms",
              "brand-boulanger",
              "brand-bower",
              "brand-box",
              "brand-boxysvg",
              "brand-braintree",
              "brand-braintrust",
              "brand-brandfetch",
              "brand-brandfolder",
              "brand-brave",
              "brand-breaker",
              "brand-brenntag",
              "brand-brevo",
              "brand-brex",
              "brand-bricks",
              "brand-britishairways",
              "brand-broadcom",
              "brand-bruno",
              "brand-bsd",
              "brand-bspwm",
              "brand-bt",
              "brand-buddy",
              "brand-budibase",
              "brand-buefy",
              "brand-buffer",
              "brand-bugatti",
              "brand-bugcrowd",
              "brand-buhl",
              "brand-buildkite",
              "brand-builtbybit",
              "brand-bukalapak",
              "brand-bulma",
              "brand-bun",
              "brand-bungie",
              "brand-bunnydotnet",
              "brand-bunq",
              "brand-burgerking",
              "brand-burpsuite",
              "brand-burton",
              "brand-buymeacoffee",
              "brand-buysellads",
              "brand-buzzfeed",
              "brand-bvg",
              "brand-byjus",
              "brand-bytedance",
              "brand-c",
              "brand-cachet",
              "brand-cachyos",
              "brand-caddy",
              "brand-cadillac",
              "brand-cafepress",
              "brand-cairographics",
              "brand-cairometro",
              "brand-caixabank",
              "brand-cakephp",
              "brand-caldotcom",
              "brand-calendly",
              "brand-calibreweb",
              "brand-campaignmonitor",
              "brand-camunda",
              "brand-canonical",
              "brand-canvas",
              "brand-capacitor",
              "brand-caprover",
              "brand-cardano",
              "brand-cardmarket",
              "brand-carlsberggroup",
              "brand-carrd",
              "brand-carrefour",
              "brand-carthrottle",
              "brand-carto",
              "brand-cashapp",
              "brand-castbox",
              "brand-castorama",
              "brand-castro",
              "brand-caterpillar",
              "brand-cbc",
              "brand-cbs",
              "brand-ccc",
              "brand-ccleaner",
              "brand-cdprojekt",
              "brand-ce",
              "brand-celery",
              "brand-celestron",
              "brand-centos",
              "brand-ceph",
              "brand-cesium",
              "brand-chai",
              "brand-chainguard",
              "brand-chainlink",
              "brand-chakraui",
              "brand-changedetection",
              "brand-channel4",
              "brand-charles",
              "brand-chartdotjs",
              "brand-chartmogul",
              "brand-chase",
              "brand-chatbot",
              "brand-chatwoot",
              "brand-checkio",
              "brand-checkmarx",
              "brand-checkmk",
              "brand-chedraui",
              "brand-cheerio",
              "brand-chef",
              "brand-chemex",
              "brand-chessdotcom",
              "brand-chevrolet",
              "brand-chianetwork",
              "brand-chinaeasternairlines",
              "brand-chinarailway",
              "brand-chinasouthernairlines",
              "brand-chocolatey",
              "brand-chromatic",
              "brand-chromewebstore",
              "brand-chrysler",
              "brand-chupachups",
              "brand-cilium",
              "brand-cinema4d",
              "brand-cinnamon",
              "brand-cinny",
              "brand-circle",
              "brand-circleci",
              "brand-circuitverse",
              "brand-cirrusci",
              "brand-cisco",
              "brand-citrix",
              "brand-citroen",
              "brand-civicrm",
              "brand-civo",
              "brand-clarifai",
              "brand-claris",
              "brand-clarivate",
              "brand-claude",
              "brand-claudecode",
              "brand-clerk",
              "brand-clevercloud",
              "brand-clickhouse",
              "brand-clickup",
              "brand-cline",
              "brand-clion",
              "brand-clockify",
              "brand-clojure",
              "brand-cloud66",
              "brand-cloudbees",
              "brand-cloudcannon",
              "brand-cloudera",
              "brand-cloudflare",
              "brand-cloudflarepages",
              "brand-cloudflareworkers",
              "brand-cloudfoundry",
              "brand-cloudinary",
              "brand-cloudnativebuild",
              "brand-cloudron",
              "brand-cloudsmith",
              "brand-cloudways",
              "brand-clubforce",
              "brand-clubhouse",
              "brand-clyp",
              "brand-cmake",
              "brand-cncf",
              "brand-cnes",
              "brand-cnet",
              "brand-cnn",
              "brand-cobalt",
              "brand-cocacola",
              "brand-cockpit",
              "brand-cockroachlabs",
              "brand-cocoapods",
              "brand-cocos",
              "brand-coda",
              "brand-codacy",
              "brand-codeberg",
              "brand-codeblocks",
              "brand-codebuddy",
              "brand-codecademy",
              "brand-codeceptjs",
              "brand-codechef",
              "brand-codeclimate",
              "brand-codecov",
              "brand-codecrafters",
              "brand-codefactor",
              "brand-codeforces",
              "brand-codefresh",
              "brand-codeigniter",
              "brand-codemagic",
              "brand-codementor",
              "brand-codemirror",
              "brand-codenewbie",
              "brand-codeproject",
              "brand-coder",
              "brand-coderabbit",
              "brand-codersrank",
              "brand-coderwall",
              "brand-codesandbox",
              "brand-codeship",
              "brand-codesignal",
              "brand-codestream",
              "brand-codewars",
              "brand-codingame",
              "brand-codingninjas",
              "brand-codio",
              "brand-coffeescript",
              "brand-coggle",
              "brand-coinbase",
              "brand-coinmarketcap",
              "brand-collaboraonline",
              "brand-comicfury",
              "brand-comma",
              "brand-commerzbank",
              "brand-commitlint",
              "brand-commodore",
              "brand-commonlisp",
              "brand-commonworkflowlanguage",
              "brand-compilerexplorer",
              "brand-composer",
              "brand-comptia",
              "brand-comsol",
              "brand-conan",
              "brand-concourse",
              "brand-condaforge",
              "brand-conekta",
              "brand-confluence",
              "brand-construct3",
              "brand-consul",
              "brand-contabo",
              "brand-contactlesspayment",
              "brand-containerd",
              "brand-contao",
              "brand-contensis",
              "brand-contentful",
              "brand-contentstack",
              "brand-continente",
              "brand-contributorcovenant",
              "brand-conventionalcommits",
              "brand-convertio",
              "brand-convex",
              "brand-cookiecutter",
              "brand-coolermaster",
              "brand-coolify",
              "brand-coop",
              "brand-copaairlines",
              "brand-coppel",
              "brand-cora",
              "brand-coreboot",
              "brand-coreldraw",
              "brand-coronaengine",
              "brand-coronarenderer",
              "brand-corsair",
              "brand-couchbase",
              "brand-counterstrike",
              "brand-countingworkspro",
              "brand-coursera",
              "brand-coveralls",
              "brand-coze",
              "brand-cpanel",
              "brand-cplusplus",
              "brand-cplusplusbuilder",
              "brand-craftcms",
              "brand-craftsman",
              "brand-cratedb",
              "brand-crayon",
              "brand-creality",
              "brand-createreactapp",
              "brand-creativecommons",
              "brand-creativetechnology",
              "brand-credly",
              "brand-crehana",
              "brand-crewai",
              "brand-crewunited",
              "brand-criticalrole",
              "brand-crowdin",
              "brand-crowdsource",
              "brand-crunchbase",
              "brand-crunchyroll",
              "brand-cryengine",
              "brand-cryptomator",
              "brand-cryptpad",
              "brand-crystal",
              "brand-csdn",
              "brand-css",
              "brand-cssdesignawards",
              "brand-cssmodules",
              "brand-csswizardry",
              "brand-cts",
              "brand-cucumber",
              "brand-cultura",
              "brand-curl",
              "brand-curseforge",
              "brand-cursor",
              "brand-customink",
              "brand-cyberdefenders",
              "brand-cycling74",
              "brand-cypress",
              "brand-cytoscapedotjs",
              "brand-d",
              "brand-d3",
              "brand-dacia",
              "brand-daf",
              "brand-dailydotdev",
              "brand-dailymotion",
              "brand-daisyui",
              "brand-dapr",
              "brand-darkreader",
              "brand-dart",
              "brand-darty",
              "brand-daserste",
              "brand-dash",
              "brand-dash0",
              "brand-dashlane",
              "brand-dask",
              "brand-dassaultsystemes",
              "brand-databricks",
              "brand-datacamp",
              "brand-datadog",
              "brand-datadotai",
              "brand-datagrip",
              "brand-dataiku",
              "brand-datastax",
              "brand-datefns",
              "brand-datev",
              "brand-datocms",
              "brand-datto",
              "brand-davinciresolve",
              "brand-dazhongdianping",
              "brand-dazn",
              "brand-dbeaver",
              "brand-dblp",
              "brand-dcentertainment",
              "brand-debian",
              "brand-debridlink",
              "brand-decapcms",
              "brand-decentraland",
              "brand-dedge",
              "brand-deepcool",
              "brand-deepgram",
              "brand-deepin",
              "brand-deepl",
              "brand-deepmind",
              "brand-deepnote",
              "brand-deepseek",
              "brand-deezer",
              "brand-deliveroo",
              "brand-dell",
              "brand-delonghi",
              "brand-delphi",
              "brand-delta",
              "brand-deluge",
              "brand-deno",
              "brand-denodeploy",
              "brand-denon",
              "brand-dependabot",
              "brand-dependencycheck",
              "brand-depositphotos",
              "brand-derspiegel",
              "brand-deutschebahn",
              "brand-deutschebank",
              "brand-deutschepost",
              "brand-deutschetelekom",
              "brand-deutschewelle",
              "brand-devbox",
              "brand-devdotto",
              "brand-developmentcontainers",
              "brand-devexpress",
              "brand-deviantart",
              "brand-devpost",
              "brand-devrant",
              "brand-devuan",
              "brand-dgraph",
              "brand-dhl",
              "brand-diagramsdotnet",
              "brand-dialogflow",
              "brand-diaspora",
              "brand-dicebear",
              "brand-dictionarydotcom",
              "brand-dify",
              "brand-digg",
              "brand-digikeyelectronics",
              "brand-digitalocean",
              "brand-dinersclub",
              "brand-dior",
              "brand-directus",
              "brand-discogs",
              "brand-discord",
              "brand-discorddotjs",
              "brand-discourse",
              "brand-discover",
              "brand-disqus",
              "brand-disroot",
              "brand-distrobox",
              "brand-distrokid",
              "brand-django",
              "brand-dji",
              "brand-dlib",
              "brand-dlna",
              "brand-dlthub",
              "brand-dm",
              "brand-dmm",
              "brand-docker",
              "brand-docsdotrs",
              "brand-docsify",
              "brand-doctrine",
              "brand-docusaurus",
              "brand-dodopayments",
              "brand-dogecoin",
              "brand-doi",
              "brand-dolby",
              "brand-dolibarr",
              "brand-dolphin",
              "brand-doordash",
              "brand-dota2",
              "brand-dotenv",
              "brand-dotnet",
              "brand-douban",
              "brand-doubanread",
              "brand-dovecot",
              "brand-dovetail",
              "brand-downdetector",
              "brand-doxygen",
              "brand-dpd",
              "brand-dragonframe",
              "brand-draugiemdotlv",
              "brand-dreamstime",
              "brand-dribbble",
              "brand-drizzle",
              "brand-drone",
              "brand-drooble",
              "brand-dropbox",
              "brand-drupal",
              "brand-dsautomobiles",
              "brand-dts",
              "brand-dtube",
              "brand-ducati",
              "brand-duckdb",
              "brand-duckduckgo",
              "brand-dungeonsanddragons",
              "brand-dunked",
              "brand-dunzo",
              "brand-duolingo",
              "brand-duplicati",
              "brand-dvc",
              "brand-dwavesystems",
              "brand-dwm",
              "brand-dynatrace",
              "brand-e",
              "brand-e3",
              "brand-ea",
              "brand-eac",
              "brand-eagle",
              "brand-easyeda",
              "brand-easyjet",
              "brand-ebay",
              "brand-ebox",
              "brand-eclipseadoptium",
              "brand-eclipseche",
              "brand-eclipseide",
              "brand-eclipsejetty",
              "brand-eclipsemosquitto",
              "brand-eclipsevertdotx",
              "brand-ecosia",
              "brand-ecovacs",
              "brand-edeka",
              "brand-edgeimpulse",
              "brand-editorconfig",
              "brand-edotleclerc",
              "brand-educative",
              "brand-edx",
              "brand-effect",
              "brand-egghead",
              "brand-egnyte",
              "brand-eight",
              "brand-eightsleep",
              "brand-ejs",
              "brand-elastic",
              "brand-elasticcloud",
              "brand-elasticsearch",
              "brand-elasticstack",
              "brand-elavon",
              "brand-electron",
              "brand-electronbuilder",
              "brand-electronfiddle",
              "brand-elegoo",
              "brand-element",
              "brand-elementary",
              "brand-elementor",
              "brand-elevenlabs",
              "brand-eleventy",
              "brand-elgato",
              "brand-elixir",
              "brand-elk",
              "brand-elm",
              "brand-elsevier",
              "brand-embarcadero",
              "brand-embark",
              "brand-emberdotjs",
              "brand-emby",
              "brand-emirates",
              "brand-emlakjet",
              "brand-endeavouros",
              "brand-enpass",
              "brand-ens",
              "brand-ente",
              "brand-enterprisedb",
              "brand-envato",
              "brand-envoyproxy",
              "brand-epel",
              "brand-epicgames",
              "brand-epson",
              "brand-equinixmetal",
              "brand-eraser",
              "brand-ericsson",
              "brand-erlang",
              "brand-erpnext",
              "brand-esbuild",
              "brand-esea",
              "brand-eslgaming",
              "brand-eslint",
              "brand-esotericsoftware",
              "brand-esphome",
              "brand-espressif",
              "brand-esri",
              "brand-etcd",
              "brand-ethereum",
              "brand-ethers",
              "brand-ethiopianairlines",
              "brand-etihadairways",
              "brand-etsy",
              "brand-europeanunion",
              "brand-eventstore",
              "brand-evernote",
              "brand-everydotorg",
              "brand-excalidraw",
              "brand-exercism",
              "brand-exordo",
              "brand-exoscale",
              "brand-expedia",
              "brand-expensify",
              "brand-expertsexchange",
              "brand-expo",
              "brand-express",
              "brand-expressdotcom",
              "brand-expressvpn",
              "brand-eyeem",
              "brand-f1",
              "brand-f5",
              "brand-facebook",
              "brand-facebookgaming",
              "brand-facebooklive",
              "brand-faceit",
              "brand-facepunch",
              "brand-fairphone",
              "brand-faker",
              "brand-falco",
              "brand-falcon",
              "brand-fampay",
              "brand-fandango",
              "brand-fandom",
              "brand-fanfou",
              "brand-fantom",
              "brand-farcaster",
              "brand-fareharbor",
              "brand-farfetch",
              "brand-fastapi",
              "brand-fastify",
              "brand-fastlane",
              "brand-fastly",
              "brand-fathom",
              "brand-fauna",
              "brand-favro",
              "brand-fawry",
              "brand-fcc",
              "brand-fdroid",
              "brand-fedex",
              "brand-fedora",
              "brand-feedly",
              "brand-ferrari",
              "brand-ferrarinv",
              "brand-ferretdb",
              "brand-ffmpeg",
              "brand-fi",
              "brand-fiat",
              "brand-fidoalliance",
              "brand-fifa",
              "brand-fig",
              "brand-figma",
              "brand-figshare",
              "brand-fila",
              "brand-filament",
              "brand-filedotio",
              "brand-filen",
              "brand-files",
              "brand-filezilla",
              "brand-fillout",
              "brand-fineco",
              "brand-fing",
              "brand-firebase",
              "brand-firefish",
              "brand-fireflyiii",
              "brand-firefox",
              "brand-firefoxbrowser",
              "brand-fireship",
              "brand-firewalla",
              "brand-first",
              "brand-fishaudio",
              "brand-fishshell",
              "brand-fitbit",
              "brand-fivem",
              "brand-fiverr",
              "brand-fizz",
              "brand-flashforge",
              "brand-flask",
              "brand-flat",
              "brand-flathub",
              "brand-flatpak",
              "brand-flickr",
              "brand-flightaware",
              "brand-flipboard",
              "brand-floatplane",
              "brand-flood",
              "brand-floorp",
              "brand-flower",
              "brand-fluentbit",
              "brand-fluentd",
              "brand-fluke",
              "brand-flutter",
              "brand-flux",
              "brand-fluxer",
              "brand-flydotio",
              "brand-flyway",
              "brand-fmod",
              "brand-fnac",
              "brand-folium",
              "brand-folo",
              "brand-fonoma",
              "brand-fontawesome",
              "brand-fontbase",
              "brand-fontforge",
              "brand-foobar2000",
              "brand-foodpanda",
              "brand-ford",
              "brand-forgejo",
              "brand-formbricks",
              "brand-formik",
              "brand-formspree",
              "brand-formstack",
              "brand-fortinet",
              "brand-fortnite",
              "brand-fortran",
              "brand-fossa",
              "brand-fossilscm",
              "brand-foundryvirtualtabletop",
              "brand-foursquare",
              "brand-fox",
              "brand-foxtel",
              "brand-fozzy",
              "brand-framer",
              "brand-framework",
              "brand-framework7",
              "brand-franprix",
              "brand-frappe",
              "brand-fraunhofergesellschaft",
              "brand-freebsd",
              "brand-freecad",
              "brand-freecodecamp",
              "brand-freedesktopdotorg",
              "brand-freelancer",
              "brand-freelancermap",
              "brand-freenas",
              "brand-freenet",
              "brand-freepik",
              "brand-freetube",
              "brand-fresh",
              "brand-freshrss",
              "brand-frigate",
              "brand-fritz",
              "brand-frontendmentor",
              "brand-frontify",
              "brand-fsharp",
              "brand-fubo",
              "brand-fueler",
              "brand-fugacloud",
              "brand-fujifilm",
              "brand-fujitsu",
              "brand-furaffinity",
              "brand-furrynetwork",
              "brand-fusionauth",
              "brand-futurelearn",
              "brand-fyle",
              "brand-g2",
              "brand-g2a",
              "brand-g2g",
              "brand-galaxus",
              "brand-gamebanana",
              "brand-gamedeveloper",
              "brand-gamejolt",
              "brand-gameloft",
              "brand-gamemaker",
              "brand-gamescience",
              "brand-gandi",
              "brand-garmin",
              "brand-garudalinux",
              "brand-gatling",
              "brand-gatsby",
              "brand-gcore",
              "brand-gdal",
              "brand-geeksforgeeks",
              "brand-generalelectric",
              "brand-generalmotors",
              "brand-genius",
              "brand-gentoo",
              "brand-geocaching",
              "brand-geode",
              "brand-geopandas",
              "brand-gerrit",
              "brand-getx",
              "brand-ghost",
              "brand-ghostery",
              "brand-ghostfolio",
              "brand-ghostty",
              "brand-gimp",
              "brand-gin",
              "brand-giphy",
              "brand-git",
              "brand-gitbook",
              "brand-gitcode",
              "brand-gitconnected",
              "brand-gitea",
              "brand-gitee",
              "brand-gitextensions",
              "brand-gitforwindows",
              "brand-github",
              "brand-githubactions",
              "brand-githubcopilot",
              "brand-githubpages",
              "brand-githubsponsors",
              "brand-gitignoredotio",
              "brand-gitkraken",
              "brand-gitlab",
              "brand-gitlfs",
              "brand-gitpod",
              "brand-gitter",
              "brand-glance",
              "brand-glass",
              "brand-glassdoor",
              "brand-gldotinet",
              "brand-gleam",
              "brand-glide",
              "brand-glitch",
              "brand-globus",
              "brand-glovo",
              "brand-gltf",
              "brand-gmail",
              "brand-gmx",
              "brand-gnome",
              "brand-gnometerminal",
              "brand-gnu",
              "brand-gnubash",
              "brand-gnuemacs",
              "brand-gnuicecat",
              "brand-gnuprivacyguard",
              "brand-gnusocial",
              "brand-go",
              "brand-gocd",
              "brand-godaddy",
              "brand-godotengine",
              "brand-gofundme",
              "brand-gogdotcom",
              "brand-gojek",
              "brand-goland",
              "brand-goldmansachs",
              "brand-goodreads",
              "brand-google",
              "brand-googleadmob",
              "brand-googleads",
              "brand-googleadsense",
              "brand-googleanalytics",
              "brand-googleappsscript",
              "brand-googleassistant",
              "brand-googleauthenticator",
              "brand-googlebigquery",
              "brand-googlebigtable",
              "brand-googlecalendar",
              "brand-googlecampaignmanager360",
              "brand-googlecardboard",
              "brand-googlecast",
              "brand-googlechat",
              "brand-googlechrome",
              "brand-googlechronicle",
              "brand-googleclassroom",
              "brand-googlecloud",
              "brand-googlecloudcomposer",
              "brand-googlecloudspanner",
              "brand-googlecloudstorage",
              "brand-googlecolab",
              "brand-googlecontaineroptimizedos",
              "brand-googledataflow",
              "brand-googledataproc",
              "brand-googledisplayandvideo360",
              "brand-googledocs",
              "brand-googledrive",
              "brand-googleearth",
              "brand-googleearthengine",
              "brand-googlefonts",
              "brand-googleforms",
              "brand-googlegemini",
              "brand-googlehome",
              "brand-googlejules",
              "brand-googlekeep",
              "brand-googlelens",
              "brand-googlemaps",
              "brand-googlemarketingplatform",
              "brand-googlemeet",
              "brand-googlemessages",
              "brand-googlenearby",
              "brand-googlenews",
              "brand-googlepay",
              "brand-googlephotos",
              "brand-googleplay",
              "brand-googlepubsub",
              "brand-googlescholar",
              "brand-googlesearchconsole",
              "brand-googlesheets",
              "brand-googleslides",
              "brand-googlestreetview",
              "brand-googlesummerofcode",
              "brand-googletagmanager",
              "brand-googletasks",
              "brand-googletranslate",
              "brand-googletv",
              "brand-gotomeeting",
              "brand-gplv3",
              "brand-grab",
              "brand-gradio",
              "brand-gradle",
              "brand-gradleplaypublisher",
              "brand-grafana",
              "brand-grammarly",
              "brand-grandfrais",
              "brand-grapheneos",
              "brand-graphite",
              "brand-graphiteeditor",
              "brand-graphql",
              "brand-grav",
              "brand-gravatar",
              "brand-graylog",
              "brand-greasyfork",
              "brand-greatlearning",
              "brand-greenhouse",
              "brand-greensock",
              "brand-greptimedb",
              "brand-griddotai",
              "brand-gridsome",
              "brand-grocy",
              "brand-groupme",
              "brand-groupon",
              "brand-grunt",
              "brand-gsap",
              "brand-gsk",
              "brand-gsma",
              "brand-gsmarenadotcom",
              "brand-gstreamer",
              "brand-gtk",
              "brand-guangzhoumetro",
              "brand-guilded",
              "brand-guitarpro",
              "brand-gulp",
              "brand-gumroad",
              "brand-gumtree",
              "brand-gunicorn",
              "brand-gurobi",
              "brand-gusto",
              "brand-gutenberg",
              "brand-h2database",
              "brand-h3",
              "brand-habr",
              "brand-hackaday",
              "brand-hackclub",
              "brand-hackerearth",
              "brand-hackernoon",
              "brand-hackerone",
              "brand-hackerrank",
              "brand-hackmd",
              "brand-hackster",
              "brand-hackthebox",
              "brand-hal",
              "brand-handlebarsdotjs",
              "brand-handm",
              "brand-handshake",
              "brand-handshakeprotocol",
              "brand-happycow",
              "brand-harbor",
              "brand-harmonyos",
              "brand-hashcat",
              "brand-hashicorp",
              "brand-hashnode",
              "brand-haskell",
              "brand-hasura",
              "brand-hatenabookmark",
              "brand-haveibeenpwned",
              "brand-havells",
              "brand-haxe",
              "brand-haystack",
              "brand-hbo",
              "brand-hbomax",
              "brand-hcl",
              "brand-hdfcbank",
              "brand-headlessui",
              "brand-headphonezone",
              "brand-headspace",
              "brand-hearth",
              "brand-hearthisdotat",
              "brand-hedera",
              "brand-hedgedoc",
              "brand-helium",
              "brand-heliumbrowser",
              "brand-helix",
              "brand-hellofresh",
              "brand-hellyhansen",
              "brand-helm",
              "brand-helpdesk",
              "brand-helpscout",
              "brand-hepsiemlak",
              "brand-here",
              "brand-hermes",
              "brand-heroicgameslauncher",
              "brand-heroui",
              "brand-hetzner",
              "brand-hevy",
              "brand-hexlet",
              "brand-hexo",
              "brand-hey",
              "brand-hibernate",
              "brand-hibob",
              "brand-hilton",
              "brand-hiltonhotelsandresorts",
              "brand-hitachi",
              "brand-hive",
              "brand-hiveblockchain",
              "brand-hivemq",
              "brand-homarr",
              "brand-homeadvisor",
              "brand-homeassistant",
              "brand-homeassistantcommunitystore",
              "brand-homebrew",
              "brand-homebridge",
              "brand-homepage",
              "brand-homify",
              "brand-honda",
              "brand-honey",
              "brand-honeybadger",
              "brand-honeygain",
              "brand-hono",
              "brand-honor",
              "brand-hootsuite",
              "brand-hoppscotch",
              "brand-hostinger",
              "brand-hotelsdotcom",
              "brand-hotjar",
              "brand-hotwire",
              "brand-houdini",
              "brand-houzz",
              "brand-hp",
              "brand-hsbc",
              "brand-htc",
              "brand-htcvive",
              "brand-html5",
              "brand-htmlacademy",
              "brand-htmx",
              "brand-htop",
              "brand-httpie",
              "brand-huawei",
              "brand-hubspot",
              "brand-huggingface",
              "brand-hugo",
              "brand-humblebundle",
              "brand-humhub",
              "brand-hungryjacks",
              "brand-husqvarna",
              "brand-hyper",
              "brand-hyperskill",
              "brand-hyperx",
              "brand-hypothesis",
              "brand-hyprland",
              "brand-hyundai",
              "brand-i18next",
              "brand-i3",
              "brand-iata",
              "brand-ibeacon",
              "brand-iberia",
              "brand-iced",
              "brand-iceland",
              "brand-icicibank",
              "brand-icinga",
              "brand-icloud",
              "brand-icomoon",
              "brand-icon",
              "brand-iconfinder",
              "brand-iconify",
              "brand-iconjar",
              "brand-icons8",
              "brand-icq",
              "brand-ieee",
              "brand-ifixit",
              "brand-ifood",
              "brand-ifttt",
              "brand-igdb",
              "brand-ign",
              "brand-iheartradio",
              "brand-ikea",
              "brand-iledefrancemobilites",
              "brand-ilovepdf",
              "brand-imagedotsc",
              "brand-imagej",
              "brand-imagetoolbox",
              "brand-imdb",
              "brand-imessage",
              "brand-imgur",
              "brand-immer",
              "brand-immersivetranslate",
              "brand-immich",
              "brand-imou",
              "brand-improvmx",
              "brand-indeed",
              "brand-indiansuperleague",
              "brand-indiehackers",
              "brand-indieweb",
              "brand-indigo",
              "brand-inductiveautomation",
              "brand-inertia",
              "brand-infiniti",
              "brand-infinityfree",
              "brand-influxdb",
              "brand-infomaniak",
              "brand-infoq",
              "brand-infosys",
              "brand-infracost",
              "brand-infuse",
              "brand-ingress",
              "brand-inkdrop",
              "brand-inkscape",
              "brand-inoreader",
              "brand-inquirer",
              "brand-insomnia",
              "brand-inspire",
              "brand-insta360",
              "brand-instacart",
              "brand-instagram",
              "brand-instapaper",
              "brand-instatus",
              "brand-instructables",
              "brand-instructure",
              "brand-intel",
              "brand-intellijidea",
              "brand-interactiondesignfoundation",
              "brand-interactjs",
              "brand-interbase",
              "brand-intercom",
              "brand-intermarche",
              "brand-internetarchive",
              "brand-internetcomputer",
              "brand-intigriti",
              "brand-intuit",
              "brand-invidious",
              "brand-invoiceninja",
              "brand-iobroker",
              "brand-ionic",
              "brand-ionos",
              "brand-ios",
              "brand-iota",
              "brand-ipfs",
              "brand-iris",
              "brand-irobot",
              "brand-isc2",
              "brand-isro",
              "brand-issuu",
              "brand-istio",
              "brand-itchdotio",
              "brand-iterm2",
              "brand-itunes",
              "brand-itvx",
              "brand-iveco",
              "brand-jabber",
              "brand-jaeger",
              "brand-jameson",
              "brand-jamstack",
              "brand-japanairlines",
              "brand-jasmine",
              "brand-javascript",
              "brand-jbl",
              "brand-jcb",
              "brand-jdoodle",
              "brand-jeep",
              "brand-jekyll",
              "brand-jellyfin",
              "brand-jenkins",
              "brand-jest",
              "brand-jet",
              "brand-jetblue",
              "brand-jetbrains",
              "brand-jetpackcompose",
              "brand-jfrog",
              "brand-jfrogpipelines",
              "brand-jhipster",
              "brand-jinja",
              "brand-jio",
              "brand-jira",
              "brand-jirasoftware",
              "brand-jitpack",
              "brand-jitsi",
              "brand-johndeere",
              "brand-joomla",
              "brand-joplin",
              "brand-jordan",
              "brand-jouav",
              "brand-jovian",
              "brand-jpeg",
              "brand-jquery",
              "brand-jrgroup",
              "brand-jsdelivr",
              "brand-jsfiddle",
              "brand-json",
              "brand-jsonwebtokens",
              "brand-jsr",
              "brand-jss",
              "brand-juce",
              "brand-juejin",
              "brand-juke",
              "brand-julia",
              "brand-junipernetworks",
              "brand-junit5",
              "brand-jupyter",
              "brand-just",
              "brand-justeat",
              "brand-justgiving",
              "brand-k3s",
              "brand-k6",
              "brand-kaggle",
              "brand-kagi",
              "brand-kahoot",
              "brand-kaios",
              "brand-kakao",
              "brand-kakaotalk",
              "brand-kalilinux",
              "brand-kamailio",
              "brand-kando",
              "brand-kaniko",
              "brand-karakeep",
              "brand-karlsruherverkehrsverbund",
              "brand-kasasmart",
              "brand-kashflow",
              "brand-kaspersky",
              "brand-katana",
              "brand-kaufland",
              "brand-kde",
              "brand-kdeneon",
              "brand-kdenlive",
              "brand-kdeplasma",
              "brand-kedro",
              "brand-keenetic",
              "brand-keepachangelog",
              "brand-keepassxc",
              "brand-keeper",
              "brand-keeweb",
              "brand-kenmei",
              "brand-kentico",
              "brand-keploy",
              "brand-keras",
              "brand-keybase",
              "brand-keycdn",
              "brand-keycloak",
              "brand-keystone",
              "brand-kfc",
              "brand-khanacademy",
              "brand-khronosgroup",
              "brand-kia",
              "brand-kibana",
              "brand-kicad",
              "brand-kick",
              "brand-kickstarter",
              "brand-kik",
              "brand-kimi",
              "brand-kingstontechnology",
              "brand-kinopoisk",
              "brand-kinsta",
              "brand-kirby",
              "brand-kit",
              "brand-kitsu",
              "brand-kiwix",
              "brand-klarna",
              "brand-kleinanzeigen",
              "brand-klm",
              "brand-klook",
              "brand-knative",
              "brand-knexdotjs",
              "brand-knime",
              "brand-knip",
              "brand-knowledgebase",
              "brand-known",
              "brand-koa",
              "brand-koc",
              "brand-kodak",
              "brand-kodi",
              "brand-kodular",
              "brand-koenigsegg",
              "brand-kofax",
              "brand-kofi",
              "brand-komoot",
              "brand-konami",
              "brand-kong",
              "brand-kongregate",
              "brand-konva",
              "brand-koreader",
              "brand-kotlin",
              "brand-koyeb",
              "brand-kred",
              "brand-krita",
              "brand-ktm",
              "brand-ktor",
              "brand-kuaishou",
              "brand-kubernetes",
              "brand-kubespray",
              "brand-kubuntu",
              "brand-kucoin",
              "brand-kueski",
              "brand-kuma",
              "brand-kununu",
              "brand-kuula",
              "brand-kx",
              "brand-kyocera",
              "brand-labex",
              "brand-labview",
              "brand-lada",
              "brand-lamborghini",
              "brand-langchain",
              "brand-langchaincorporate",
              "brand-langflow",
              "brand-langgraph",
              "brand-languagetool",
              "brand-lapce",
              "brand-laragon",
              "brand-laravel",
              "brand-laravelhorizon",
              "brand-laravelnova",
              "brand-lastdotfm",
              "brand-lastpass",
              "brand-latex",
              "brand-launchpad",
              "brand-lazarus",
              "brand-lazyvim",
              "brand-lbry",
              "brand-leaderprice",
              "brand-leaflet",
              "brand-leagueoflegends",
              "brand-leanpub",
              "brand-leetcode",
              "brand-lefthook",
              "brand-legacygames",
              "brand-leica",
              "brand-lemmy",
              "brand-lemonsqueezy",
              "brand-lenovo",
              "brand-lens",
              "brand-leptos",
              "brand-lequipe",
              "brand-lerna",
              "brand-leroymerlin",
              "brand-leslibraires",
              "brand-less",
              "brand-letsencrypt",
              "brand-letterboxd",
              "brand-levelsdotfyi",
              "brand-lg",
              "brand-liberadotchat",
              "brand-liberapay",
              "brand-librariesdotio",
              "brand-librarything",
              "brand-libreoffice",
              "brand-libreofficebase",
              "brand-libreofficecalc",
              "brand-libreofficedraw",
              "brand-libreofficeimpress",
              "brand-libreofficemath",
              "brand-libreofficewriter",
              "brand-libretranslate",
              "brand-libretube",
              "brand-librewolf",
              "brand-libuv",
              "brand-lichess",
              "brand-lidl",
              "brand-lifx",
              "brand-lightburn",
              "brand-lighthouse",
              "brand-lightning",
              "brand-limesurvey",
              "brand-line",
              "brand-lineageos",
              "brand-linear",
              "brand-lining",
              "brand-linkerd",
              "brand-linkfire",
              "brand-linksys",
              "brand-linktree",
              "brand-linkvertise",
              "brand-linphone",
              "brand-lintcode",
              "brand-linux",
              "brand-linuxcontainers",
              "brand-linuxfoundation",
              "brand-linuxmint",
              "brand-linuxprofessionalinstitute",
              "brand-linuxserver",
              "brand-lionair",
              "brand-liquibase",
              "brand-listenhub",
              "brand-listmonk",
              "brand-lit",
              "brand-litecoin",
              "brand-literal",
              "brand-litiengine",
              "brand-livechat",
              "brand-livejournal",
              "brand-livekit",
              "brand-livewire",
              "brand-llvm",
              "brand-lmms",
              "brand-lmstudio",
              "brand-lobsters",
              "brand-local",
              "brand-localsend",
              "brand-localxpose",
              "brand-locust",
              "brand-lodash",
              "brand-logmein",
              "brand-logseq",
              "brand-logstash",
              "brand-longhorn",
              "brand-looker",
              "brand-loom",
              "brand-loop",
              "brand-loopback",
              "brand-loops",
              "brand-lootcrate",
              "brand-lospec",
              "brand-lotpolishairlines",
              "brand-lottiefiles",
              "brand-ltspice",
              "brand-lua",
              "brand-luanti",
              "brand-luau",
              "brand-lubuntu",
              "brand-lucia",
              "brand-lucid",
              "brand-lucide",
              "brand-ludwig",
              "brand-lufthansa",
              "brand-lumen",
              "brand-lunacy",
              "brand-luogu",
              "brand-lutris",
              "brand-lvgl",
              "brand-lydia",
              "brand-lyft",
              "brand-m5stack",
              "brand-maas",
              "brand-macos",
              "brand-macpaw",
              "brand-macports",
              "brand-macys",
              "brand-magasinsu",
              "brand-magic",
              "brand-magisk",
              "brand-mahindra",
              "brand-mailbox",
              "brand-mailchimp",
              "brand-maildotcom",
              "brand-maildotru",
              "brand-mailgun",
              "brand-mailtrap",
              "brand-mainwp",
              "brand-majorleaguehacking",
              "brand-make",
              "brand-makerbot",
              "brand-malt",
              "brand-malwarebytes",
              "brand-mambaui",
              "brand-mamp",
              "brand-man",
              "brand-manageiq",
              "brand-mangacollec",
              "brand-mangaupdates",
              "brand-manjaro",
              "brand-mantine",
              "brand-mapbox",
              "brand-mapillary",
              "brand-maplibre",
              "brand-maptiler",
              "brand-mariadb",
              "brand-mariadbfoundation",
              "brand-markdown",
              "brand-marko",
              "brand-marriott",
              "brand-marvelapp",
              "brand-maserati",
              "brand-mastercard",
              "brand-mastercomfig",
              "brand-mastodon",
              "brand-materialdesign",
              "brand-materialdesignicons",
              "brand-materialformkdocs",
              "brand-matillion",
              "brand-matomo",
              "brand-matrix",
              "brand-matterdotjs",
              "brand-mattermost",
              "brand-matternet",
              "brand-mautic",
              "brand-max",
              "brand-maxplanckgesellschaft",
              "brand-maytag",
              "brand-mazda",
              "brand-maze",
              "brand-mcafee",
              "brand-mcdonalds",
              "brand-mclaren",
              "brand-mdblist",
              "brand-mdbook",
              "brand-mdnwebdocs",
              "brand-mdx",
              "brand-mealie",
              "brand-mediafire",
              "brand-mediamarkt",
              "brand-mediapipe",
              "brand-mediatek",
              "brand-medibangpaint",
              "brand-medium",
              "brand-medusa",
              "brand-meetup",
              "brand-mega",
              "brand-meilisearch",
              "brand-meituan",
              "brand-meizu",
              "brand-mendeley",
              "brand-mentorcruise",
              "brand-mercadopago",
              "brand-merck",
              "brand-mercurial",
              "brand-mermaid",
              "brand-messenger",
              "brand-meta",
              "brand-metaai",
              "brand-metabase",
              "brand-metacritic",
              "brand-metafilter",
              "brand-metager",
              "brand-metasploit",
              "brand-meteor",
              "brand-metro",
              "brand-metrodelaciudaddemexico",
              "brand-metrodemadrid",
              "brand-metrodeparis",
              "brand-mewe",
              "brand-mezmo",
              "brand-mg",
              "brand-microbit",
              "brand-microdotblog",
              "brand-microeditor",
              "brand-micropython",
              "brand-microstation",
              "brand-microstrategy",
              "brand-midi",
              "brand-migadu",
              "brand-mihon",
              "brand-mihoyo",
              "brand-mikrotik",
              "brand-milanote",
              "brand-milvus",
              "brand-minds",
              "brand-mingww64",
              "brand-mini",
              "brand-minimax",
              "brand-minio",
              "brand-mintlify",
              "brand-minutemailer",
              "brand-miraheze",
              "brand-miro",
              "brand-misskey",
              "brand-mistralai",
              "brand-mitsubishi",
              "brand-mix",
              "brand-mixcloud",
              "brand-mixpanel",
              "brand-mlb",
              "brand-mlflow",
              "brand-mobx",
              "brand-mobxstatetree",
              "brand-mocha",
              "brand-mockserviceworker",
              "brand-modal",
              "brand-modelcontextprotocol",
              "brand-modelscope",
              "brand-modin",
              "brand-modrinth",
              "brand-modx",
              "brand-mojeek",
              "brand-moleculer",
              "brand-momenteo",
              "brand-monero",
              "brand-moneygram",
              "brand-mongodb",
              "brand-mongoose",
              "brand-mongoosedotws",
              "brand-monica",
              "brand-monkeytie",
              "brand-monkeytype",
              "brand-monogame",
              "brand-monoprix",
              "brand-monster",
              "brand-monzo",
              "brand-moo",
              "brand-moodle",
              "brand-moonrepo",
              "brand-moonshotai",
              "brand-moq",
              "brand-moqups",
              "brand-morrisons",
              "brand-moscowmetro",
              "brand-motorola",
              "brand-movistar",
              "brand-mozilla",
              "brand-mpv",
              "brand-mqtt",
              "brand-msi",
              "brand-msibusiness",
              "brand-mta",
              "brand-mtr",
              "brand-mubi",
              "brand-mui",
              "brand-muller",
              "brand-mullvad",
              "brand-multisim",
              "brand-mumble",
              "brand-muo",
              "brand-mural",
              "brand-musicbrainz",
              "brand-mxlinux",
              "brand-myanimelist",
              "brand-myget",
              "brand-myob",
              "brand-myshows",
              "brand-myspace",
              "brand-mysql",
              "brand-n26",
              "brand-n8n",
              "brand-namebase",
              "brand-namecheap",
              "brand-namemc",
              "brand-namesilo",
              "brand-namuwiki",
              "brand-nano",
              "brand-nanostores",
              "brand-napster",
              "brand-nasa",
              "brand-nationalgrid",
              "brand-nationalrail",
              "brand-nativescript",
              "brand-natsdotio",
              "brand-naver",
              "brand-nba",
              "brand-nbb",
              "brand-nbc",
              "brand-ndi",
              "brand-ndr",
              "brand-near",
              "brand-nebula",
              "brand-nec",
              "brand-nederlandsespoorwegen",
              "brand-neo4j",
              "brand-neon",
              "brand-neovim",
              "brand-neptune",
              "brand-nestjs",
              "brand-netapp",
              "brand-netbsd",
              "brand-netcup",
              "brand-netdata",
              "brand-neteasecloudmusic",
              "brand-netflix",
              "brand-netgear",
              "brand-netim",
              "brand-netlify",
              "brand-nette",
              "brand-netto",
              "brand-neutralinojs",
              "brand-newbalance",
              "brand-newegg",
              "brand-newgrounds",
              "brand-newjapanprowrestling",
              "brand-newpipe",
              "brand-newrelic",
              "brand-newyorktimes",
              "brand-nexon",
              "brand-nextbike",
              "brand-nextbilliondotai",
              "brand-nextcloud",
              "brand-nextdns",
              "brand-nextdoor",
              "brand-nextdotjs",
              "brand-nextflow",
              "brand-nextra",
              "brand-nfc",
              "brand-nfcore",
              "brand-nginx",
              "brand-nginxproxymanager",
              "brand-ngrok",
              "brand-ngrx",
              "brand-nhl",
              "brand-nhost",
              "brand-nicehash",
              "brand-niconico",
              "brand-nike",
              "brand-nikon",
              "brand-nim",
              "brand-niri",
              "brand-nissan",
              "brand-nixos",
              "brand-nobaralinux",
              "brand-nodebb",
              "brand-nodedotjs",
              "brand-nodegui",
              "brand-nodemon",
              "brand-nodered",
              "brand-nokia",
              "brand-nomad",
              "brand-norco",
              "brand-nordicsemiconductor",
              "brand-nordvpn",
              "brand-normalizedotcss",
              "brand-norton",
              "brand-norwegian",
              "brand-note",
              "brand-notebooklm",
              "brand-notepadplusplus",
              "brand-notion",
              "brand-notist",
              "brand-nounproject",
              "brand-novu",
              "brand-now",
              "brand-npm",
              "brand-nrwl",
              "brand-nsis",
              "brand-ntfy",
              "brand-nubank",
              "brand-nucleo",
              "brand-nuget",
              "brand-nuke",
              "brand-numba",
              "brand-numpy",
              "brand-nunjucks",
              "brand-nushell",
              "brand-nutanix",
              "brand-nuxt",
              "brand-nvidia",
              "brand-nvm",
              "brand-nx",
              "brand-nxp",
              "brand-nzxt",
              "brand-o2",
              "brand-obb",
              "brand-observable",
              "brand-obsidian",
              "brand-obsstudio",
              "brand-obtainium",
              "brand-ocaml",
              "brand-oclc",
              "brand-oclif",
              "brand-octanerender",
              "brand-octave",
              "brand-octobercms",
              "brand-octoprint",
              "brand-octopusdeploy",
              "brand-oculus",
              "brand-odido",
              "brand-odin",
              "brand-odnoklassniki",
              "brand-odoo",
              "brand-odysee",
              "brand-ohdear",
              "brand-okcupid",
              "brand-okta",
              "brand-okx",
              "brand-ollama",
              "brand-omadacloud",
              "brand-omarchy",
              "brand-oneplus",
              "brand-onestream",
              "brand-onlyfans",
              "brand-onlyoffice",
              "brand-onnx",
              "brand-onstar",
              "brand-opel",
              "brand-open3d",
              "brand-openaccess",
              "brand-openaigym",
              "brand-openapiinitiative",
              "brand-openbadges",
              "brand-openbao",
              "brand-openbsd",
              "brand-openbugbounty",
              "brand-opencage",
              "brand-opencode",
              "brand-opencollective",
              "brand-opencontainersinitiative",
              "brand-opencritic",
              "brand-opencv",
              "brand-openfaas",
              "brand-opengl",
              "brand-openhab",
              "brand-openid",
              "brand-openjdk",
              "brand-openjsfoundation",
              "brand-openlayers",
              "brand-openmediavault",
              "brand-openmined",
              "brand-opennebula",
              "brand-openproject",
              "brand-openrouter",
              "brand-openscad",
              "brand-opensea",
              "brand-opensearch",
              "brand-opensourcehardware",
              "brand-opensourceinitiative",
              "brand-openssl",
              "brand-openstack",
              "brand-openstreetmap",
              "brand-opensuse",
              "brand-opentelemetry",
              "brand-opentext",
              "brand-opentofu",
              "brand-opentui",
              "brand-openverse",
              "brand-openvpn",
              "brand-openwrt",
              "brand-openzeppelin",
              "brand-openzfs",
              "brand-opera",
              "brand-operagx",
              "brand-opnsense",
              "brand-oppo",
              "brand-opsgenie",
              "brand-opslevel",
              "brand-optimism",
              "brand-optuna",
              "brand-orange",
              "brand-orchardcore",
              "brand-orcid",
              "brand-oreilly",
              "brand-org",
              "brand-organicmaps",
              "brand-origin",
              "brand-ory",
              "brand-osano",
              "brand-osf",
              "brand-osgeo",
              "brand-oshkosh",
              "brand-osmand",
              "brand-osmc",
              "brand-osu",
              "brand-otto",
              "brand-outline",
              "brand-overcast",
              "brand-overleaf",
              "brand-ovh",
              "brand-owasp",
              "brand-owncloud",
              "brand-oxc",
              "brand-oxygen",
              "brand-oyo",
              "brand-p5dotjs",
              "brand-packagist",
              "brand-packer",
              "brand-packt",
              "brand-paddle",
              "brand-paddlepaddle",
              "brand-paddypower",
              "brand-padlet",
              "brand-pagekit",
              "brand-pagerduty",
              "brand-pagespeedinsights",
              "brand-pagseguro",
              "brand-palantir",
              "brand-paloaltonetworks",
              "brand-paloaltosoftware",
              "brand-panasonic",
              "brand-pandas",
              "brand-pandoc",
              "brand-pandora",
              "brand-pangolin",
              "brand-pantheon",
              "brand-paperlessngx",
              "brand-paperspace",
              "brand-paperswithcode",
              "brand-paradoxinteractive",
              "brand-paramountplus",
              "brand-paritysubstrate",
              "brand-parrotsecurity",
              "brand-parsedotly",
              "brand-passbolt",
              "brand-passport",
              "brand-pastebin",
              "brand-patreon",
              "brand-payback",
              "brand-paychex",
              "brand-payhip",
              "brand-payloadcms",
              "brand-payoneer",
              "brand-paypal",
              "brand-paysafe",
              "brand-paytm",
              "brand-pcgamingwiki",
              "brand-pdm",
              "brand-pdq",
              "brand-peakdesign",
              "brand-pearson",
              "brand-peerlist",
              "brand-peertube",
              "brand-pegasusairlines",
              "brand-pelican",
              "brand-peloton",
              "brand-penny",
              "brand-penpot",
              "brand-percy",
              "brand-perforce",
              "brand-perl",
              "brand-perplexity",
              "brand-persistent",
              "brand-personio",
              "brand-petsathome",
              "brand-peugeot",
              "brand-pexels",
              "brand-pfsense",
              "brand-phabricator",
              "brand-philipshue",
              "brand-phoenixframework",
              "brand-phonepe",
              "brand-phosphoricons",
              "brand-photobucket",
              "brand-photocrowd",
              "brand-photon",
              "brand-photopea",
              "brand-php",
              "brand-phpbb",
              "brand-phpmyadmin",
              "brand-phpstorm",
              "brand-pi",
              "brand-piaggiogroup",
              "brand-piapro",
              "brand-picardsurgeles",
              "brand-picartodottv",
              "brand-picnic",
              "brand-picpay",
              "brand-picrew",
              "brand-picsart",
              "brand-picxy",
              "brand-pihole",
              "brand-pimcore",
              "brand-pinboard",
              "brand-pinescript",
              "brand-pinetwork",
              "brand-pingdom",
              "brand-pinia",
              "brand-pino",
              "brand-pinterest",
              "brand-pioneerdj",
              "brand-pipecat",
              "brand-piped",
              "brand-pipx",
              "brand-pivotaltracker",
              "brand-piwigo",
              "brand-pix",
              "brand-pixabay",
              "brand-pixelfed",
              "brand-pixiv",
              "brand-pixlr",
              "brand-pkgsrc",
              "brand-plane",
              "brand-planet",
              "brand-planetscale",
              "brand-plangrid",
              "brand-platformdotsh",
              "brand-platformio",
              "brand-platzi",
              "brand-plausibleanalytics",
              "brand-playcanvas",
              "brand-playerdotme",
              "brand-playerfm",
              "brand-playstation",
              "brand-playstation2",
              "brand-playstation3",
              "brand-playstation4",
              "brand-playstation5",
              "brand-playstationportable",
              "brand-playstationvita",
              "brand-pleroma",
              "brand-plesk",
              "brand-plex",
              "brand-plotly",
              "brand-plume",
              "brand-pluralsight",
              "brand-plurk",
              "brand-pm2",
              "brand-pnpm",
              "brand-pocketbase",
              "brand-pocketcasts",
              "brand-podcastaddict",
              "brand-podcastindex",
              "brand-podman",
              "brand-poe",
              "brand-poetry",
              "brand-polars",
              "brand-polestar",
              "brand-polkadot",
              "brand-poly",
              "brand-polygon",
              "brand-polymerproject",
              "brand-polywork",
              "brand-pomerium",
              "brand-pond5",
              "brand-popos",
              "brand-porkbun",
              "brand-porsche",
              "brand-portableappsdotcom",
              "brand-portainer",
              "brand-portswigger",
              "brand-posit",
              "brand-postcss",
              "brand-postgresql",
              "brand-posthog",
              "brand-postiz",
              "brand-postman",
              "brand-postmates",
              "brand-powers",
              "brand-prdotco",
              "brand-preact",
              "brand-precommit",
              "brand-prefect",
              "brand-prek",
              "brand-premid",
              "brand-premierleague",
              "brand-prepbytes",
              "brand-prestashop",
              "brand-presto",
              "brand-prettier",
              "brand-pretzel",
              "brand-prevention",
              "brand-prezi",
              "brand-primefaces",
              "brand-primeng",
              "brand-primereact",
              "brand-primevue",
              "brand-printables",
              "brand-prisma",
              "brand-prismic",
              "brand-privatedivision",
              "brand-privateinternetaccess",
              "brand-probot",
              "brand-processingfoundation",
              "brand-processon",
              "brand-processwire",
              "brand-producthunt",
              "brand-progate",
              "brand-progress",
              "brand-prometheus",
              "brand-pronounsdotpage",
              "brand-prosemirror",
              "brand-prosieben",
              "brand-proteus",
              "brand-protocolsdotio",
              "brand-protodotio",
              "brand-proton",
              "brand-protoncalendar",
              "brand-protondb",
              "brand-protondrive",
              "brand-protonmail",
              "brand-protonvpn",
              "brand-protools",
              "brand-protractor",
              "brand-proxmox",
              "brand-pterodactyl",
              "brand-pubg",
              "brand-publons",
              "brand-pubmed",
              "brand-pug",
              "brand-pulumi",
              "brand-puma",
              "brand-puppet",
              "brand-puppeteer",
              "brand-purescript",
              "brand-purgecss",
              "brand-purism",
              "brand-pushbullet",
              "brand-pusher",
              "brand-pwa",
              "brand-pycharm",
              "brand-pycqa",
              "brand-pydantic",
              "brand-pyg",
              "brand-pypi",
              "brand-pypy",
              "brand-pyscaffold",
              "brand-pysyft",
              "brand-pytest",
              "brand-python",
              "brand-pythonanywhere",
              "brand-pytorch",
              "brand-pyup",
              "brand-qantas",
              "brand-qase",
              "brand-qatarairways",
              "brand-qbittorrent",
              "brand-qdrant",
              "brand-qemu",
              "brand-qgis",
              "brand-qi",
              "brand-qiita",
              "brand-qiskit",
              "brand-qiwi",
              "brand-qlik",
              "brand-qlty",
              "brand-qmk",
              "brand-qnap",
              "brand-qodo",
              "brand-qq",
              "brand-qt",
              "brand-quad9",
              "brand-qualcomm",
              "brand-qualtrics",
              "brand-qualys",
              "brand-quantcast",
              "brand-quantconnect",
              "brand-quarkus",
              "brand-quarto",
              "brand-quasar",
              "brand-qubesos",
              "brand-quest",
              "brand-quickbooks",
              "brand-quicklook",
              "brand-quicktime",
              "brand-quicktype",
              "brand-quizlet",
              "brand-quora",
              "brand-qwant",
              "brand-qwen",
              "brand-qwik",
              "brand-qwiklabs",
              "brand-qzone",
              "brand-r",
              "brand-r3",
              "brand-rabbitmq",
              "brand-racket",
              "brand-radar",
              "brand-radarr",
              "brand-radiantearth",
              "brand-radiofrance",
              "brand-radixui",
              "brand-radstudio",
              "brand-railway",
              "brand-rainmeter",
              "brand-rainyun",
              "brand-rakuten",
              "brand-rakutenkobo",
              "brand-ram",
              "brand-rancher",
              "brand-rapid",
              "brand-rarible",
              "brand-rasa",
              "brand-raspberrypi",
              "brand-ratatui",
              "brand-ravelry",
              "brand-ray",
              "brand-raycast",
              "brand-raylib",
              "brand-razer",
              "brand-razorpay",
              "brand-rclone",
              "brand-react",
              "brand-reactbootstrap",
              "brand-reacthookform",
              "brand-reactiveresume",
              "brand-reactivex",
              "brand-reactos",
              "brand-reactquery",
              "brand-reactrouter",
              "brand-reacttable",
              "brand-readdotcv",
              "brand-readme",
              "brand-readthedocs",
              "brand-reason",
              "brand-reasonstudios",
              "brand-recoil",
              "brand-red",
              "brand-redash",
              "brand-redbubble",
              "brand-redbull",
              "brand-redcandlegames",
              "brand-reddit",
              "brand-redhat",
              "brand-redhatopenshift",
              "brand-redis",
              "brand-redmine",
              "brand-redox",
              "brand-redragon",
              "brand-redsys",
              "brand-redux",
              "brand-reduxsaga",
              "brand-redwoodjs",
              "brand-reebok",
              "brand-refine",
              "brand-refinedgithub",
              "brand-reflex",
              "brand-rekaui",
              "brand-relay",
              "brand-relianceindustrieslimited",
              "brand-remark",
              "brand-remedyentertainment",
              "brand-remix",
              "brand-removedotbg",
              "brand-renault",
              "brand-render",
              "brand-renovate",
              "brand-renpy",
              "brand-renren",
              "brand-replicate",
              "brand-replit",
              "brand-republicofgamers",
              "brand-rescript",
              "brand-rescuetime",
              "brand-researchgate",
              "brand-resend",
              "brand-resharper",
              "brand-resurrectionremixos",
              "brand-retool",
              "brand-retroachievements",
              "brand-retroarch",
              "brand-retropie",
              "brand-revanced",
              "brand-revealdotjs",
              "brand-revenuecat",
              "brand-reverbnation",
              "brand-revoltdotchat",
              "brand-revolut",
              "brand-rewe",
              "brand-rezgo",
              "brand-rhinoceros",
              "brand-rich",
              "brand-rider",
              "brand-rimacautomobili",
              "brand-rime",
              "brand-ring",
              "brand-riotgames",
              "brand-ripple",
              "brand-riscv",
              "brand-riseup",
              "brand-ritzcarlton",
              "brand-rive",
              "brand-roadmapdotsh",
              "brand-roamresearch",
              "brand-robinhood",
              "brand-roblox",
              "brand-robloxstudio",
              "brand-roboflow",
              "brand-robotframework",
              "brand-rocket",
              "brand-rocketdotchat",
              "brand-rocksdb",
              "brand-rockstargames",
              "brand-rockwellautomation",
              "brand-rockylinux",
              "brand-roku",
              "brand-roll20",
              "brand-rollbar",
              "brand-rolldown",
              "brand-rollsroyce",
              "brand-rollupdotjs",
              "brand-rook",
              "brand-roon",
              "brand-root",
              "brand-rootme",
              "brand-roots",
              "brand-rootsbedrock",
              "brand-rootssage",
              "brand-ros",
              "brand-rossmann",
              "brand-rotaryinternational",
              "brand-rottentomatoes",
              "brand-roundcube",
              "brand-rsocket",
              "brand-rss",
              "brand-rstudioide",
              "brand-rte",
              "brand-rtl",
              "brand-rtlzwei",
              "brand-rtm",
              "brand-rubocop",
              "brand-ruby",
              "brand-rubygems",
              "brand-rubymine",
              "brand-rubyonrails",
              "brand-rubysinatra",
              "brand-ruff",
              "brand-rumahweb",
              "brand-rumble",
              "brand-rundeck",
              "brand-runkeeper",
              "brand-runkit",
              "brand-runrundotit",
              "brand-rust",
              "brand-rustdesk",
              "brand-rustfs",
              "brand-rxdb",
              "brand-ryanair",
              "brand-rye",
              "brand-s7airlines",
              "brand-sabanci",
              "brand-safari",
              "brand-sage",
              "brand-sagemath",
              "brand-sahibinden",
              "brand-sailfishos",
              "brand-sailsdotjs",
              "brand-salla",
              "brand-saltproject",
              "brand-samsclub",
              "brand-samsung",
              "brand-samsungpay",
              "brand-sanfranciscomunicipalrailway",
              "brand-sanic",
              "brand-sanity",
              "brand-saopaulometro",
              "brand-sap",
              "brand-sartorius",
              "brand-sass",
              "brand-sat1",
              "brand-satellite",
              "brand-saturn",
              "brand-saucelabs",
              "brand-saudia",
              "brand-scala",
              "brand-scalar",
              "brand-scaleway",
              "brand-scan",
              "brand-scania",
              "brand-schneiderelectric",
              "brand-scikitlearn",
              "brand-scilab",
              "brand-scipy",
              "brand-scopus",
              "brand-scpfoundation",
              "brand-scrapbox",
              "brand-scrapy",
              "brand-scratch",
              "brand-screencastify",
              "brand-scrimba",
              "brand-scrollreveal",
              "brand-scrumalliance",
              "brand-scrutinizerci",
              "brand-scylladb",
              "brand-seafile",
              "brand-seagate",
              "brand-searxng",
              "brand-seat",
              "brand-seatgeek",
              "brand-securityscorecard",
              "brand-sefaria",
              "brand-sega",
              "brand-selenium",
              "brand-sellfy",
              "brand-semanticrelease",
              "brand-semanticscholar",
              "brand-semanticui",
              "brand-semanticuireact",
              "brand-semanticweb",
              "brand-semaphoreci",
              "brand-semrush",
              "brand-semver",
              "brand-sencha",
              "brand-sennheiser",
              "brand-sensu",
              "brand-sentry",
              "brand-sepa",
              "brand-sequelize",
              "brand-servbay",
              "brand-serverfault",
              "brand-serverless",
              "brand-session",
              "brand-sessionize",
              "brand-setapp",
              "brand-setuptools",
              "brand-sfml",
              "brand-shadcnui",
              "brand-shadow",
              "brand-shanghaimetro",
              "brand-sharex",
              "brand-sharp",
              "brand-shazam",
              "brand-shell",
              "brand-shelly",
              "brand-shenzhenmetro",
              "brand-shieldsdotio",
              "brand-shikimori",
              "brand-shopee",
              "brand-shopify",
              "brand-shopware",
              "brand-shortcut",
              "brand-showpad",
              "brand-showtime",
              "brand-showwcase",
              "brand-sidekiq",
              "brand-sidequest",
              "brand-siemens",
              "brand-sifive",
              "brand-signal",
              "brand-silverairways",
              "brand-similarweb",
              "brand-simkl",
              "brand-simpleanalytics",
              "brand-simpleicons",
              "brand-simplelocalize",
              "brand-simplelogin",
              "brand-simplenote",
              "brand-simplex",
              "brand-sinaweibo",
              "brand-singaporeairlines",
              "brand-singlestore",
              "brand-sitecore",
              "brand-sitepoint",
              "brand-siyuan",
              "brand-skaffold",
              "brand-skeleton",
              "brand-sketch",
              "brand-sketchfab",
              "brand-sketchup",
              "brand-skillshare",
              "brand-skoda",
              "brand-sky",
              "brand-skypack",
              "brand-slackware",
              "brand-slashdot",
              "brand-slickpic",
              "brand-slides",
              "brand-slideshare",
              "brand-slint",
              "brand-smart",
              "brand-smartthings",
              "brand-smashingmagazine",
              "brand-smoothcomp",
              "brand-smrt",
              "brand-smugmug",
              "brand-snapchat",
              "brand-snapcraft",
              "brand-snapdragon",
              "brand-sncf",
              "brand-snort",
              "brand-snowflake",
              "brand-snowpack",
              "brand-snyk",
              "brand-socialblade",
              "brand-society6",
              "brand-socket",
              "brand-socketdotio",
              "brand-softcatala",
              "brand-softpedia",
              "brand-sogou",
              "brand-solana",
              "brand-solid",
              "brand-solidity",
              "brand-sololearn",
              "brand-solus",
              "brand-solveddotac",
              "brand-sonar",
              "brand-sonarqubecloud",
              "brand-sonarqubeforide",
              "brand-sonarqubeserver",
              "brand-sonarr",
              "brand-sonatype",
              "brand-songkick",
              "brand-songoda",
              "brand-sonicwall",
              "brand-sonos",
              "brand-sony",
              "brand-soriana",
              "brand-soundcharts",
              "brand-soundcloud",
              "brand-sourceengine",
              "brand-sourceforge",
              "brand-sourcehut",
              "brand-sourcetree",
              "brand-southwestairlines",
              "brand-spacemacs",
              "brand-spaceship",
              "brand-spacex",
              "brand-spacy",
              "brand-sparkar",
              "brand-sparkasse",
              "brand-sparkfun",
              "brand-sparkpost",
              "brand-spdx",
              "brand-speakerdeck",
              "brand-spectrum",
              "brand-speedtest",
              "brand-speedypage",
              "brand-sphinx",
              "brand-spidermonkey",
              "brand-spigotmc",
              "brand-spine",
              "brand-spinnaker",
              "brand-splunk",
              "brand-spoj",
              "brand-spond",
              "brand-spotify",
              "brand-spotlight",
              "brand-spreadshirt",
              "brand-spreaker",
              "brand-spring",
              "brand-springboot",
              "brand-springcreators",
              "brand-springsecurity",
              "brand-spyderide",
              "brand-sqlalchemy",
              "brand-sqlite",
              "brand-square",
              "brand-squareenix",
              "brand-squarespace",
              "brand-srgssr",
              "brand-ssrn",
              "brand-sst",
              "brand-stackbit",
              "brand-stackblitz",
              "brand-stackedit",
              "brand-stackexchange",
              "brand-stackhawk",
              "brand-stackoverflow",
              "brand-stackshare",
              "brand-stadia",
              "brand-staffbase",
              "brand-stagetimer",
              "brand-standardjs",
              "brand-standardresume",
              "brand-starbucks",
              "brand-stardock",
              "brand-starlingbank",
              "brand-starship",
              "brand-startdotgg",
              "brand-startpage",
              "brand-startrek",
              "brand-starz",
              "brand-statamic",
              "brand-statista",
              "brand-statuspage",
              "brand-statuspal",
              "brand-steam",
              "brand-steamdb",
              "brand-steamdeck",
              "brand-steamworks",
              "brand-steelseries",
              "brand-steem",
              "brand-steemit",
              "brand-steinberg",
              "brand-stellar",
              "brand-stencil",
              "brand-stencyl",
              "brand-stimulus",
              "brand-stmicroelectronics",
              "brand-stockx",
              "brand-stopstalk",
              "brand-storyblok",
              "brand-storybook",
              "brand-strapi",
              "brand-strava",
              "brand-streamlabs",
              "brand-streamlit",
              "brand-streamrunners",
              "brand-stremio",
              "brand-stripe",
              "brand-strongswan",
              "brand-stryker",
              "brand-stubhub",
              "brand-studio3t",
              "brand-styledcomponents",
              "brand-stylelint",
              "brand-styleshare",
              "brand-stylus",
              "brand-subaru",
              "brand-sublimetext",
              "brand-substack",
              "brand-subtitleedit",
              "brand-subversion",
              "brand-suckless",
              "brand-sui",
              "brand-suitest",
              "brand-sumologic",
              "brand-suno",
              "brand-sunrise",
              "brand-supabase",
              "brand-supercell",
              "brand-supercrease",
              "brand-supermicro",
              "brand-superuser",
              "brand-surfshark",
              "brand-surrealdb",
              "brand-surveymonkey",
              "brand-suse",
              "brand-suzuki",
              "brand-svelte",
              "brand-svg",
              "brand-svgdotjs",
              "brand-svgo",
              "brand-svgtrace",
              "brand-swagger",
              "brand-swarm",
              "brand-sway",
              "brand-swc",
              "brand-swift",
              "brand-swiggy",
              "brand-swiper",
              "brand-swisscows",
              "brand-swr",
              "brand-symantec",
              "brand-symbolab",
              "brand-symfony",
              "brand-symphony",
              "brand-sympy",
              "brand-syncthing",
              "brand-synology",
              "brand-system76",
              "brand-tabelog",
              "brand-tablecheck",
              "brand-tacobell",
              "brand-tado",
              "brand-taichigraphics",
              "brand-taichilang",
              "brand-tails",
              "brand-tailscale",
              "brand-tailwindcss",
              "brand-taipy",
              "brand-taketwointeractivesoftware",
              "brand-talend",
              "brand-talenthouse",
              "brand-talos",
              "brand-tamiya",
              "brand-tampermonkey",
              "brand-tangled",
              "brand-tanstack",
              "brand-taobao",
              "brand-tapas",
              "brand-target",
              "brand-tarom",
              "brand-tarteaucitron",
              "brand-task",
              "brand-tasmota",
              "brand-tata",
              "brand-tauri",
              "brand-taxbuzz",
              "brand-tcs",
              "brand-teal",
              "brand-teamcity",
              "brand-teamspeak",
              "brand-teamviewer",
              "brand-techcrunch",
              "brand-ted",
              "brand-teepublic",
              "brand-teespring",
              "brand-tekton",
              "brand-tele5",
              "brand-telefonica",
              "brand-telegram",
              "brand-telegraph",
              "brand-telenor",
              "brand-telequebec",
              "brand-temporal",
              "brand-tensorflow",
              "brand-teradata",
              "brand-teratail",
              "brand-termius",
              "brand-terraform",
              "brand-tesco",
              "brand-tesla",
              "brand-testcafe",
              "brand-testin",
              "brand-testinglibrary",
              "brand-testrail",
              "brand-tether",
              "brand-textpattern",
              "brand-textual",
              "brand-tga",
              "brand-thangs",
              "brand-thanos",
              "brand-thealgorithms",
              "brand-theboringcompany",
              "brand-theconversation",
              "brand-thefinals",
              "brand-theguardian",
              "brand-theirishtimes",
              "brand-themighty",
              "brand-themodelsresource",
              "brand-themoviedatabase",
              "brand-thenorthface",
              "brand-theodinproject",
              "brand-theplanetarysociety",
              "brand-theregister",
              "brand-thesoundsresource",
              "brand-thespritersresource",
              "brand-thestorygraph",
              "brand-thewashingtonpost",
              "brand-theweatherchannel",
              "brand-thingiverse",
              "brand-things",
              "brand-thinkpad",
              "brand-thirdweb",
              "brand-threadless",
              "brand-threads",
              "brand-threedotjs",
              "brand-threema",
              "brand-thumbtack",
              "brand-thunderbird",
              "brand-thunderstore",
              "brand-thurgauerkantonalbank",
              "brand-thymeleaf",
              "brand-ticketmaster",
              "brand-tickettailor",
              "brand-ticktick",
              "brand-tidal",
              "brand-tidb",
              "brand-tiddlywiki",
              "brand-tide",
              "brand-tidyverse",
              "brand-tietoevry",
              "brand-tiktok",
              "brand-tildapublishing",
              "brand-tile",
              "brand-timescale",
              "brand-tina",
              "brand-tinder",
              "brand-tindie",
              "brand-tinkercad",
              "brand-tinygrad",
              "brand-tinyletter",
              "brand-tistory",
              "brand-tldraw",
              "brand-tmux",
              "brand-todoist",
              "brand-toggl",
              "brand-toggltrack",
              "brand-tokio",
              "brand-tokyometro",
              "brand-toll",
              "brand-toml",
              "brand-tomorrowland",
              "brand-tomtom",
              "brand-ton",
              "brand-topcoder",
              "brand-topdotgg",
              "brand-toptal",
              "brand-torbrowser",
              "brand-torizon",
              "brand-torproject",
              "brand-toshiba",
              "brand-totvs",
              "brand-tourbox",
              "brand-tower",
              "brand-toyota",
              "brand-tplink",
              "brand-tqdm",
              "brand-traccar",
              "brand-tradingview",
              "brand-trae",
              "brand-traefikmesh",
              "brand-traefikproxy",
              "brand-trailforks",
              "brand-trainerroad",
              "brand-trakt",
              "brand-transifex",
              "brand-transmission",
              "brand-transportforireland",
              "brand-transportforlondon",
              "brand-travisci",
              "brand-treehouse",
              "brand-trello",
              "brand-trendmicro",
              "brand-tresorit",
              "brand-treyarch",
              "brand-trezor",
              "brand-tricentis",
              "brand-trilium",
              "brand-triller",
              "brand-trillertv",
              "brand-trimble",
              "brand-trino",
              "brand-tripadvisor",
              "brand-tripdotcom",
              "brand-trivago",
              "brand-trivy",
              "brand-trmnl",
              "brand-trove",
              "brand-trpc",
              "brand-truenas",
              "brand-trueup",
              "brand-trulia",
              "brand-trustedshops",
              "brand-trustpilot",
              "brand-tryhackme",
              "brand-tryitonline",
              "brand-tsnode",
              "brand-tubi",
              "brand-tui",
              "brand-tumblr",
              "brand-turbo",
              "brand-turborepo",
              "brand-turbosquid",
              "brand-turkishairlines",
              "brand-turso",
              "brand-tuta",
              "brand-tuxedocomputers",
              "brand-tv4play",
              "brand-tvtime",
              "brand-twenty",
              "brand-twinkly",
              "brand-twinmotion",
              "brand-twitch",
              "brand-ty",
              "brand-typeform",
              "brand-typeorm",
              "brand-typer",
              "brand-typescript",
              "brand-typo3",
              "brand-typst",
              "brand-uber",
              "brand-ubereats",
              "brand-ubiquiti",
              "brand-ubisoft",
              "brand-ublockorigin",
              "brand-ubuntu",
              "brand-ubuntumate",
              "brand-udacity",
              "brand-udemy",
              "brand-udotsdotnews",
              "brand-ufc",
              "brand-uikit",
              "brand-uipath",
              "brand-ukca",
              "brand-ultralytics",
              "brand-ulule",
              "brand-umami",
              "brand-umbraco",
              "brand-umbrel",
              "brand-uml",
              "brand-unacademy",
              "brand-underarmour",
              "brand-underscoredotjs",
              "brand-undertale",
              "brand-unicode",
              "brand-unilever",
              "brand-uniqlo",
              "brand-uniqloja",
              "brand-unitedairlines",
              "brand-unitednations",
              "brand-unity",
              "brand-unjs",
              "brand-unlicense",
              "brand-unocss",
              "brand-unpkg",
              "brand-unraid",
              "brand-unrealengine",
              "brand-unsplash",
              "brand-unstop",
              "brand-untappd",
              "brand-upcloud",
              "brand-uphold",
              "brand-uplabs",
              "brand-upptime",
              "brand-ups",
              "brand-upstash",
              "brand-uptimekuma",
              "brand-upwork",
              "brand-uservoice",
              "brand-usps",
              "brand-utorrent",
              "brand-uv",
              "brand-v",
              "brand-v0",
              "brand-v2ex",
              "brand-v8",
              "brand-vaadin",
              "brand-vagrant",
              "brand-vala",
              "brand-valorant",
              "brand-valve",
              "brand-vanillaextract",
              "brand-vapor",
              "brand-vault",
              "brand-vaultwarden",
              "brand-vauxhall",
              "brand-vbulletin",
              "brand-vectary",
              "brand-vectorlogozone",
              "brand-vectorworks",
              "brand-veeam",
              "brand-veed",
              "brand-veepee",
              "brand-vega",
              "brand-vegas",
              "brand-velocity",
              "brand-velog",
              "brand-vencord",
              "brand-venmo",
              "brand-vercel",
              "brand-verdaccio",
              "brand-veritas",
              "brand-verizon",
              "brand-vespa",
              "brand-vestel",
              "brand-vexxhost",
              "brand-vfairs",
              "brand-viadeo",
              "brand-viaplay",
              "brand-viber",
              "brand-viblo",
              "brand-victoriametrics",
              "brand-victronenergy",
              "brand-vikunja",
              "brand-vim",
              "brand-vimeo",
              "brand-vimeolivestream",
              "brand-vinted",
              "brand-virgin",
              "brand-virginatlantic",
              "brand-virginmedia",
              "brand-virtualbox",
              "brand-virustotal",
              "brand-visa",
              "brand-visualparadigm",
              "brand-visx",
              "brand-vite",
              "brand-vitepress",
              "brand-vitess",
              "brand-vitest",
              "brand-vivaldi",
              "brand-vivawallet",
              "brand-vivino",
              "brand-vivint",
              "brand-vivo",
              "brand-vk",
              "brand-vlcmediaplayer",
              "brand-vllm",
              "brand-vmware",
              "brand-vodafone",
              "brand-voelkner",
              "brand-voidlinux",
              "brand-voipdotms",
              "brand-volkswagen",
              "brand-volvo",
              "brand-vonage",
              "brand-vorondesign",
              "brand-vowpalwabbit",
              "brand-vox",
              "brand-vrchat",
              "brand-vsco",
              "brand-vscodium",
              "brand-vtex",
              "brand-vuedotjs",
              "brand-vuetify",
              "brand-vueuse",
              "brand-vulkan",
              "brand-vultr",
              "brand-vyond",
              "brand-w3schools",
              "brand-wacom",
              "brand-wagmi",
              "brand-wagtail",
              "brand-wails",
              "brand-wakatime",
              "brand-walkman",
              "brand-wallabag",
              "brand-walletconnect",
              "brand-wantedly",
              "brand-wappalyzer",
              "brand-warp",
              "brand-wasabi",
              "brand-wasmcloud",
              "brand-wasmer",
              "brand-watchtower",
              "brand-wattpad",
              "brand-wayland",
              "brand-waze",
              "brand-wazirx",
              "brand-wearos",
              "brand-weasyl",
              "brand-web3dotjs",
              "brand-webassembly",
              "brand-webauthn",
              "brand-webawesome",
              "brand-webcomponentsdotorg",
              "brand-webdotde",
              "brand-webdriverio",
              "brand-webex",
              "brand-webflow",
              "brand-webgl",
              "brand-webgpu",
              "brand-weblate",
              "brand-webmin",
              "brand-webmoney",
              "brand-webpack",
              "brand-webrtc",
              "brand-webstorm",
              "brand-webtoon",
              "brand-webtrees",
              "brand-wechat",
              "brand-wegame",
              "brand-weightsandbiases",
              "brand-welcometothejungle",
              "brand-wellfound",
              "brand-wellsfargo",
              "brand-wemo",
              "brand-weread",
              "brand-westernunion",
              "brand-wetransfer",
              "brand-wezterm",
              "brand-wgpu",
              "brand-what3words",
              "brand-whatsapp",
              "brand-wheniwork",
              "brand-wikibooks",
              "brand-wikidata",
              "brand-wikidotgg",
              "brand-wikidotjs",
              "brand-wikimediacommons",
              "brand-wikimediafoundation",
              "brand-wikipedia",
              "brand-wikiquote",
              "brand-wikisource",
              "brand-wikiversity",
              "brand-wikivoyage",
              "brand-winamp",
              "brand-windsurf",
              "brand-wine",
              "brand-wipro",
              "brand-wire",
              "brand-wireguard",
              "brand-wireshark",
              "brand-wise",
              "brand-wish",
              "brand-wistia",
              "brand-wix",
              "brand-wizzair",
              "brand-wolfram",
              "brand-wolframlanguage",
              "brand-wolframmathematica",
              "brand-wondershare",
              "brand-wondersharefilmora",
              "brand-woo",
              "brand-woocommerce",
              "brand-wordpress",
              "brand-workplace",
              "brand-worldhealthorganization",
              "brand-wpengine",
              "brand-wpexplorer",
              "brand-wprocket",
              "brand-writedotas",
              "brand-wwe",
              "brand-wwise",
              "brand-wxt",
              "brand-wykop",
              "brand-wyze",
              "brand-x",
              "brand-xampp",
              "brand-xcode",
              "brand-xdadevelopers",
              "brand-xdotorg",
              "brand-xendit",
              "brand-xero",
              "brand-xfce",
              "brand-xiaohongshu",
              "brand-xiaomi",
              "brand-xing",
              "brand-xml",
              "brand-xmpp",
              "brand-xo",
              "brand-xrp",
              "brand-xsplit",
              "brand-xstate",
              "brand-xubuntu",
              "brand-xyflow",
              "brand-yaak",
              "brand-yabai",
              "brand-yale",
              "brand-yamahacorporation",
              "brand-yamahamotorcorporation",
              "brand-yaml",
              "brand-yandexcloud",
              "brand-yarn",
              "brand-ycombinator",
              "brand-yelp",
              "brand-yeti",
              "brand-yew",
              "brand-yii",
              "brand-yoast",
              "brand-yolo",
              "brand-youhodler",
              "brand-youtube",
              "brand-youtubegaming",
              "brand-youtubekids",
              "brand-youtubemusic",
              "brand-youtubeshorts",
              "brand-youtubestudio",
              "brand-youtubetv",
              "brand-yr",
              "brand-yubico",
              "brand-yunohost",
              "brand-zabka",
              "brand-zaim",
              "brand-zalando",
              "brand-zalo",
              "brand-zap",
              "brand-zapier",
              "brand-zara",
              "brand-zazzle",
              "brand-zcash",
              "brand-zcool",
              "brand-zdf",
              "brand-zdotai",
              "brand-zebpay",
              "brand-zebratechnologies",
              "brand-zectrix",
              "brand-zedindustries",
              "brand-zelle",
              "brand-zenbrowser",
              "brand-zend",
              "brand-zendesk",
              "brand-zenn",
              "brand-zenodo",
              "brand-zensar",
              "brand-zerodha",
              "brand-zerotier",
              "brand-zettlr",
              "brand-zhihu",
              "brand-zig",
              "brand-zigbee",
              "brand-zigbee2mqtt",
              "brand-ziggo",
              "brand-zilch",
              "brand-zillow",
              "brand-zincsearch",
              "brand-zingat",
              "brand-zod",
              "brand-zoho",
              "brand-zoiper",
              "brand-zola",
              "brand-zomato",
              "brand-zoom",
              "brand-zorin",
              "brand-zotero",
              "brand-zsh",
              "brand-zulip",
              "brand-zx",
              "brand-zyte",
              "brick-wall",
              "brick-wall-fire",
              "brick-wall-shield",
              "bridge",
              "briefcase",
              "briefcase-business",
              "briefcase-conveyor-belt",
              "briefcase-medical",
              "briefcase-plus",
              "bring-to-front",
              "broccoli",
              "broom",
              "broom-sparkles",
              "brush",
              "brush-cleaning",
              "bubbles",
              "bug",
              "bug-off",
              "bug-play",
              "building",
              "building-complex",
              "building-complex-plus",
              "bus",
              "bus-front",
              "cable",
              "cable-car",
              "cake",
              "cake-slice",
              "calculator",
              "calendar",
              "calendar-1",
              "calendar-arrow-down",
              "calendar-arrow-left",
              "calendar-arrow-right",
              "calendar-arrow-up",
              "calendar-check",
              "calendar-check-2",
              "calendar-chevrons-left",
              "calendar-chevrons-right",
              "calendar-clock",
              "calendar-cog",
              "calendar-days",
              "calendar-fold",
              "calendar-heart",
              "calendar-minus",
              "calendar-minus-2",
              "calendar-off",
              "calendar-plus",
              "calendar-plus-2",
              "calendar-range",
              "calendar-search",
              "calendar-sync",
              "calendar-x",
              "calendar-x-2",
              "calendars",
              "camera",
              "camera-off",
              "can",
              "can-soda",
              "candy",
              "candy-cane",
              "candy-off",
              "cannabis",
              "cannabis-off",
              "captions",
              "captions-off",
              "car",
              "car-battery",
              "car-front",
              "car-taxi-front",
              "caravan",
              "card-sim",
              "carrot",
              "carton",
              "carton-off",
              "case-lower",
              "case-sensitive",
              "case-upper",
              "cassette-tape",
              "cast",
              "castle",
              "cat",
              "cctv",
              "cctv-off",
              "certificate",
              "chart-area",
              "chart-bar",
              "chart-bar-big",
              "chart-bar-decreasing",
              "chart-bar-increasing",
              "chart-bar-stacked",
              "chart-bell-curve",
              "chart-candlestick",
              "chart-column",
              "chart-column-big",
              "chart-column-decreasing",
              "chart-column-increasing",
              "chart-column-stacked",
              "chart-gantt",
              "chart-line",
              "chart-network",
              "chart-no-axes-column",
              "chart-no-axes-column-decreasing",
              "chart-no-axes-column-increasing",
              "chart-no-axes-combined",
              "chart-no-axes-gantt",
              "chart-pie",
              "chart-quadrant",
              "chart-radar",
              "chart-scatter",
              "chart-spline",
              "check",
              "check-check",
              "check-line",
              "chef-hat",
              "cherry",
              "chess-bishop",
              "chess-king",
              "chess-knight",
              "chess-pawn",
              "chess-queen",
              "chess-rook",
              "chevron-down",
              "chevron-first",
              "chevron-last",
              "chevron-left",
              "chevron-right",
              "chevron-up",
              "chevrons-down",
              "chevrons-down-up",
              "chevrons-left",
              "chevrons-left-right",
              "chevrons-left-right-ellipsis",
              "chevrons-right",
              "chevrons-right-left",
              "chevrons-up",
              "chevrons-up-down",
              "church",
              "cigarette",
              "cigarette-off",
              "circle",
              "circle-alert",
              "circle-arrow-down",
              "circle-arrow-left",
              "circle-arrow-out-down-left",
              "circle-arrow-out-down-right",
              "circle-arrow-out-up-left",
              "circle-arrow-out-up-right",
              "circle-arrow-right",
              "circle-arrow-up",
              "circle-check",
              "circle-check-big",
              "circle-chevron-down",
              "circle-chevron-left",
              "circle-chevron-right",
              "circle-chevron-up",
              "circle-chevrons-down",
              "circle-chevrons-left",
              "circle-chevrons-right",
              "circle-chevrons-up",
              "circle-dashed",
              "circle-dashed-check",
              "circle-divide",
              "circle-dollar-sign",
              "circle-dot",
              "circle-dot-dashed",
              "circle-ellipsis",
              "circle-equal",
              "circle-euro",
              "circle-fading-arrow-up",
              "circle-fading-play",
              "circle-fading-plus",
              "circle-gauge",
              "circle-help",
              "circle-letter-a",
              "circle-letter-b",
              "circle-letter-c",
              "circle-letter-d",
              "circle-letter-e",
              "circle-letter-f",
              "circle-letter-g",
              "circle-letter-h",
              "circle-letter-i",
              "circle-letter-j",
              "circle-letter-k",
              "circle-letter-l",
              "circle-letter-m",
              "circle-letter-n",
              "circle-letter-o",
              "circle-letter-p",
              "circle-letter-p-off",
              "circle-letter-q",
              "circle-letter-r",
              "circle-letter-s",
              "circle-letter-t",
              "circle-letter-u",
              "circle-letter-v",
              "circle-letter-w",
              "circle-letter-x",
              "circle-letter-y",
              "circle-letter-z",
              "circle-minus",
              "circle-off",
              "circle-pause",
              "circle-percent",
              "circle-pile",
              "circle-play",
              "circle-plus",
              "circle-pound-sterling",
              "circle-power",
              "circle-question-mark",
              "circle-slash",
              "circle-slash-2",
              "circle-small",
              "circle-star",
              "circle-stop",
              "circle-user",
              "circle-user-round",
              "circle-x",
              "circuit-board",
              "citrus",
              "clapperboard",
              "clef-alto",
              "clef-bass",
              "clef-treble",
              "clipboard",
              "clipboard-check",
              "clipboard-clock",
              "clipboard-copy",
              "clipboard-list",
              "clipboard-minus",
              "clipboard-paste",
              "clipboard-pen",
              "clipboard-pen-line",
              "clipboard-plus",
              "clipboard-type",
              "clipboard-x",
              "clock",
              "clock-1",
              "clock-10",
              "clock-11",
              "clock-12",
              "clock-2",
              "clock-3",
              "clock-4",
              "clock-5",
              "clock-6",
              "clock-7",
              "clock-8",
              "clock-9",
              "clock-alert",
              "clock-arrow-down",
              "clock-arrow-left",
              "clock-arrow-right",
              "clock-arrow-up",
              "clock-check",
              "clock-fading",
              "clock-plus",
              "closed-caption",
              "cloud",
              "cloud-alert",
              "cloud-backup",
              "cloud-check",
              "cloud-cog",
              "cloud-download",
              "cloud-drizzle",
              "cloud-fog",
              "cloud-hail",
              "cloud-lightning",
              "cloud-moon",
              "cloud-moon-rain",
              "cloud-off",
              "cloud-rain",
              "cloud-rain-wind",
              "cloud-snow",
              "cloud-sun",
              "cloud-sun-rain",
              "cloud-sync",
              "cloud-upload",
              "cloudy",
              "clover",
              "club",
              "code",
              "code-xml",
              "coffee",
              "cog",
              "coins",
              "columns-2",
              "columns-3",
              "columns-3-cog",
              "columns-4",
              "combine",
              "command",
              "compass",
              "component",
              "computer",
              "concierge-bell",
              "cone",
              "construction",
              "contact",
              "contact-round",
              "container",
              "contrast",
              "cookie",
              "cooking-pot",
              "copy",
              "copy-check",
              "copy-minus",
              "copy-plus",
              "copy-slash",
              "copy-x",
              "copyleft",
              "corner-down-left",
              "corner-down-right",
              "corner-left-down",
              "corner-left-up",
              "corner-right-down",
              "corner-right-up",
              "corner-up-left",
              "corner-up-right",
              "cpu",
              "cpu-ai",
              "creative-commons",
              "credit-card",
              "credit-card-check",
              "credit-card-minus",
              "credit-card-plus",
              "credit-card-reader",
              "credit-card-x",
              "croissant",
              "crop",
              "cross",
              "crosshair",
              "crown",
              "cuboid",
              "cup-soda",
              "cupcake",
              "currency",
              "cylinder",
              "dam",
              "database",
              "database-arrow-down",
              "database-arrow-up",
              "database-backup",
              "database-check",
              "database-cog",
              "database-minus",
              "database-plus",
              "database-search",
              "database-x",
              "database-zap",
              "decimals-arrow-left",
              "decimals-arrow-right",
              "delete",
              "dessert",
              "diameter",
              "diamond",
              "diamond-minus",
              "diamond-percent",
              "diamond-plus",
              "dice-1",
              "dice-2",
              "dice-3",
              "dice-4",
              "dice-5",
              "dice-6",
              "dices",
              "diff",
              "disc",
              "disc-2",
              "disc-3",
              "disc-album",
              "divide",
              "dna",
              "dna-off",
              "dock",
              "dog",
              "dollar-sign",
              "dome",
              "donut",
              "door-closed",
              "door-closed-cog",
              "door-closed-locked",
              "door-closed-package",
              "door-open",
              "door-stairwell",
              "dot",
              "download",
              "drafting-compass",
              "drama",
              "drill",
              "drone",
              "droplet",
              "droplet-off",
              "droplets",
              "drum",
              "drumstick",
              "dumbbell",
              "ear",
              "ear-off",
              "earbuds",
              "earbuds-off",
              "earth",
              "earth-lock",
              "eclipse",
              "egg",
              "egg-fried",
              "egg-off",
              "eighth-note",
              "eighth-notes",
              "eject",
              "ellipse",
              "ellipsis",
              "ellipsis-vertical",
              "emirati-dirham",
              "engine",
              "equal",
              "equal-approximately",
              "equal-approximately-not",
              "equal-not",
              "eraser",
              "ethernet-port",
              "euro",
              "ev-charger",
              "expand",
              "external-link",
              "eye",
              "eye-closed",
              "eye-dashed",
              "eye-off",
              "face-angry",
              "face-expressionless",
              "face-grinning",
              "face-neutral",
              "face-slightly-frowning",
              "face-slightly-smiling",
              "face-slightly-smiling-plus",
              "factory",
              "fan",
              "fast-forward",
              "faucet",
              "feather",
              "fence",
              "ferris-wheel",
              "file",
              "file-archive",
              "file-audio",
              "file-axis-3d",
              "file-badge",
              "file-box",
              "file-braces",
              "file-braces-corner",
              "file-chart-column",
              "file-chart-column-increasing",
              "file-chart-line",
              "file-chart-pie",
              "file-check",
              "file-check-corner",
              "file-clock",
              "file-code",
              "file-code-corner",
              "file-cog",
              "file-database",
              "file-diff",
              "file-digit",
              "file-down",
              "file-exclamation-point",
              "file-headphone",
              "file-heart",
              "file-image",
              "file-input",
              "file-key",
              "file-lock",
              "file-minus",
              "file-minus-corner",
              "file-music",
              "file-output",
              "file-pen",
              "file-pen-line",
              "file-play",
              "file-plus",
              "file-plus-corner",
              "file-question-mark",
              "file-scan",
              "file-search",
              "file-search-corner",
              "file-signal",
              "file-sliders",
              "file-spreadsheet",
              "file-stack",
              "file-symlink",
              "file-terminal",
              "file-text",
              "file-type",
              "file-type-corner",
              "file-up",
              "file-user",
              "file-video-camera",
              "file-volume",
              "file-x",
              "file-x-corner",
              "files",
              "film",
              "filter",
              "fingerprint-pattern",
              "fire-extinguisher",
              "fish",
              "fish-off",
              "fish-symbol",
              "fishing-hook",
              "fishing-rod",
              "flag",
              "flag-off",
              "flag-triangle-left",
              "flag-triangle-right",
              "flame",
              "flame-kindling",
              "flashlight",
              "flashlight-off",
              "flask-conical",
              "flask-conical-off",
              "flask-round",
              "flower",
              "flower-2",
              "focus",
              "fold-horizontal",
              "fold-vertical",
              "folder",
              "folder-archive",
              "folder-bookmark",
              "folder-check",
              "folder-clock",
              "folder-closed",
              "folder-code",
              "folder-cog",
              "folder-dot",
              "folder-down",
              "folder-git",
              "folder-git-2",
              "folder-heart",
              "folder-input",
              "folder-kanban",
              "folder-key",
              "folder-lock",
              "folder-minus",
              "folder-open",
              "folder-open-dot",
              "folder-output",
              "folder-pen",
              "folder-plus",
              "folder-root",
              "folder-search",
              "folder-search-2",
              "folder-symlink",
              "folder-sync",
              "folder-tree",
              "folder-up",
              "folder-user",
              "folder-users",
              "folder-x",
              "folders",
              "footprints",
              "forklift",
              "form",
              "forward",
              "frame",
              "frown",
              "fuel",
              "fullscreen",
              "funnel",
              "funnel-plus",
              "funnel-x",
              "galaxy",
              "gallery-horizontal",
              "gallery-horizontal-end",
              "gallery-thumbnails",
              "gallery-vertical",
              "gallery-vertical-end",
              "gamepad",
              "gamepad-2",
              "gamepad-directional",
              "gap-horizontal",
              "gap-vertical",
              "gauge",
              "gavel",
              "gem",
              "georgian-lari",
              "germ",
              "germ-off",
              "ghost",
              "gift",
              "git-branch",
              "git-branch-minus",
              "git-branch-plus",
              "git-commit-horizontal",
              "git-commit-vertical",
              "git-compare",
              "git-compare-arrows",
              "git-fork",
              "git-graph",
              "git-merge",
              "git-merge-conflict",
              "git-pull-request",
              "git-pull-request-arrow",
              "git-pull-request-closed",
              "git-pull-request-create",
              "git-pull-request-create-arrow",
              "git-pull-request-draft",
              "glass-water",
              "glasses",
              "globe",
              "globe-check",
              "globe-code",
              "globe-lock",
              "globe-off",
              "globe-x",
              "goal",
              "gpu",
              "graduation-cap",
              "grape",
              "graph-hub",
              "graph-star",
              "grid-2x2",
              "grid-2x2-check",
              "grid-2x2-plus",
              "grid-2x2-x",
              "grid-3x2",
              "grid-3x3",
              "grip",
              "grip-horizontal",
              "grip-vertical",
              "groceries",
              "group",
              "guitar",
              "guitar-electric",
              "half-note",
              "ham",
              "hamburger",
              "hammer",
              "hand",
              "hand-coins",
              "hand-fist",
              "hand-grab",
              "hand-heart",
              "hand-helping",
              "hand-metal",
              "hand-platter",
              "handbag",
              "handle-bottom-right",
              "handshake",
              "hard-drive",
              "hard-drive-download",
              "hard-drive-upload",
              "hard-hat",
              "hash",
              "hat-glasses",
              "haze",
              "hd",
              "hdmi-port",
              "heading-1",
              "heading-2",
              "heading-3",
              "heading-4",
              "heading-5",
              "heading-6",
              "headphone-off",
              "headphones",
              "headset",
              "heart",
              "heart-crack",
              "heart-handshake",
              "heart-minus",
              "heart-off",
              "heart-plus",
              "heart-pulse",
              "heart-x",
              "heater",
              "helicopter",
              "hexagon",
              "highlighter",
              "hiking-stick",
              "hockey-stick",
              "hop",
              "hop-off",
              "hospital",
              "hot-air-balloon",
              "hotel",
              "hourglass",
              "hourglass-cog",
              "house",
              "house-cog",
              "house-heart",
              "house-plug",
              "house-plus",
              "house-wifi",
              "houses",
              "ice-cream-bowl",
              "ice-cream-cone",
              "id-card",
              "id-card-lanyard",
              "image",
              "image-down",
              "image-minus",
              "image-off",
              "image-play",
              "image-plus",
              "image-up",
              "image-upscale",
              "images",
              "import",
              "inbox",
              "indian-rupee",
              "infinity",
              "info",
              "inspection-panel",
              "italic",
              "iteration-ccw",
              "iteration-cw",
              "iv-bag",
              "japanese-yen",
              "joystick",
              "kanban",
              "kayak",
              "kazakh-tenge",
              "key",
              "key-round",
              "key-square",
              "keyboard",
              "keyboard-music",
              "keyboard-off",
              "lambda",
              "lamp",
              "lamp-ceiling",
              "lamp-desk",
              "lamp-floor",
              "lamp-wall-down",
              "lamp-wall-up",
              "land-plot",
              "landmark",
              "languages",
              "laptop",
              "laptop-minimal",
              "laptop-minimal-check",
              "laser",
              "lasso",
              "lasso-select",
              "layer-arrow-down",
              "layer-arrow-up",
              "layers",
              "layers-2",
              "layers-arrow-down",
              "layers-arrow-up",
              "layers-minus",
              "layers-plus",
              "layout-arrow-down",
              "layout-arrow-right",
              "layout-dashboard",
              "layout-freeform",
              "layout-grid",
              "layout-grid-circles",
              "layout-list",
              "layout-panel-left",
              "layout-panel-top",
              "layout-template",
              "leaf",
              "leafy-green",
              "lectern",
              "lens",
              "lens-concave",
              "lens-convex",
              "letter-a",
              "letter-b",
              "letter-c",
              "letter-d",
              "letter-e",
              "letter-f",
              "letter-g",
              "letter-h",
              "letter-i",
              "letter-j",
              "letter-k",
              "letter-l",
              "letter-m",
              "letter-n",
              "letter-o",
              "letter-p",
              "letter-q",
              "letter-r",
              "letter-s",
              "letter-spacing",
              "letter-t",
              "letter-u",
              "letter-v",
              "letter-w",
              "letter-x",
              "letter-y",
              "letter-z",
              "letters",
              "library",
              "library-big",
              "life-buoy",
              "ligature",
              "lightbulb",
              "lightbulb-off",
              "lighthouse",
              "line-dot-bottom-vertical",
              "line-dot-left-horizontal",
              "line-dot-right-horizontal",
              "line-dot-top-vertical",
              "line-height",
              "line-squiggle",
              "line-style",
              "link",
              "link-2",
              "link-2-off",
              "list",
              "list-check",
              "list-checks",
              "list-chevrons-down-up",
              "list-chevrons-up-down",
              "list-clock",
              "list-collapse",
              "list-end",
              "list-filter",
              "list-filter-plus",
              "list-indent-decrease",
              "list-indent-increase",
              "list-minus",
              "list-music",
              "list-ordered",
              "list-plus",
              "list-restart",
              "list-sort-ascending",
              "list-sort-descending",
              "list-start",
              "list-todo",
              "list-tree",
              "list-video",
              "list-x",
              "loader",
              "loader-circle",
              "loader-pinwheel",
              "locate",
              "locate-fixed",
              "locate-off",
              "lock",
              "lock-keyhole",
              "lock-keyhole-open",
              "lock-open",
              "log-in",
              "log-out",
              "logs",
              "lollipop",
              "luggage",
              "magnet",
              "mail",
              "mail-badge",
              "mail-check",
              "mail-clock",
              "mail-dot",
              "mail-minus",
              "mail-open",
              "mail-pen",
              "mail-plus",
              "mail-question-mark",
              "mail-search",
              "mail-warning",
              "mail-x",
              "mailbox",
              "mails",
              "map",
              "map-minus",
              "map-pin",
              "map-pin-check",
              "map-pin-check-inside",
              "map-pin-house",
              "map-pin-minus",
              "map-pin-minus-inside",
              "map-pin-off",
              "map-pin-pen",
              "map-pin-plus",
              "map-pin-plus-inside",
              "map-pin-search",
              "map-pin-x",
              "map-pin-x-inside",
              "map-pinned",
              "map-plus",
              "margin",
              "margin-bottom",
              "margin-horizontal",
              "margin-left",
              "margin-right",
              "margin-top",
              "margin-vertical",
              "mars",
              "mars-stroke",
              "martini",
              "maximize",
              "maximize-2",
              "medal",
              "megaphone",
              "megaphone-off",
              "memory-stick",
              "menu",
              "merge",
              "message-circle",
              "message-circle-check",
              "message-circle-code",
              "message-circle-dashed",
              "message-circle-dashed-check",
              "message-circle-heart",
              "message-circle-more",
              "message-circle-off",
              "message-circle-plus",
              "message-circle-question-mark",
              "message-circle-reply",
              "message-circle-text",
              "message-circle-warning",
              "message-circle-x",
              "message-square",
              "message-square-check",
              "message-square-code",
              "message-square-dashed",
              "message-square-diff",
              "message-square-dot",
              "message-square-heart",
              "message-square-lock",
              "message-square-more",
              "message-square-off",
              "message-square-plus",
              "message-square-quote",
              "message-square-reply",
              "message-square-share",
              "message-square-text",
              "message-square-warning",
              "message-square-x",
              "messages-circle",
              "messages-square",
              "metronome",
              "mic",
              "mic-audio-lines",
              "mic-off",
              "mic-signal",
              "mic-vocal",
              "microchip",
              "microscope",
              "microwave",
              "midi-port",
              "milestone",
              "milk",
              "milk-off",
              "minimize",
              "minimize-2",
              "minus",
              "mirror-rectangular",
              "mirror-round",
              "monitor",
              "monitor-activity",
              "monitor-check",
              "monitor-cloud",
              "monitor-cog",
              "monitor-dot",
              "monitor-down",
              "monitor-off",
              "monitor-pause",
              "monitor-pc",
              "monitor-play",
              "monitor-smartphone",
              "monitor-speaker",
              "monitor-stop",
              "monitor-up",
              "monitor-x",
              "moon",
              "moon-star",
              "mop",
              "mop-sparkles",
              "mosque",
              "motorbike",
              "mountain",
              "mountain-snow",
              "mouse",
              "mouse-left",
              "mouse-off",
              "mouse-pointer",
              "mouse-pointer-2",
              "mouse-pointer-2-off",
              "mouse-pointer-ban",
              "mouse-pointer-click",
              "mouse-right",
              "mouth",
              "mouth-off",
              "move",
              "move-3d",
              "move-diagonal",
              "move-diagonal-2",
              "move-down",
              "move-down-left",
              "move-down-right",
              "move-horizontal",
              "move-left",
              "move-right",
              "move-up",
              "move-up-left",
              "move-up-right",
              "move-vertical",
              "music",
              "music-2",
              "music-3",
              "music-4",
              "navigation",
              "navigation-2",
              "navigation-2-off",
              "navigation-off",
              "nepali-rupee",
              "network",
              "newspaper",
              "nfc",
              "non-binary",
              "notebook",
              "notebook-dot",
              "notebook-pen",
              "notebook-tabs",
              "notebook-text",
              "notepad-text",
              "notepad-text-dashed",
              "numbers",
              "nut",
              "nut-off",
              "octagon",
              "octagon-alert",
              "octagon-minus",
              "octagon-pause",
              "octagon-x",
              "omega",
              "option",
              "orbit",
              "origami",
              "package",
              "package-2",
              "package-check",
              "package-minus",
              "package-open",
              "package-plus",
              "package-search",
              "package-x",
              "paint-bucket",
              "paint-roller",
              "paintbrush",
              "paintbrush-vertical",
              "palette",
              "panda",
              "panel-bottom",
              "panel-bottom-close",
              "panel-bottom-dashed",
              "panel-bottom-open",
              "panel-left",
              "panel-left-close",
              "panel-left-dashed",
              "panel-left-open",
              "panel-left-right-dashed",
              "panel-right",
              "panel-right-close",
              "panel-right-dashed",
              "panel-right-open",
              "panel-top",
              "panel-top-bottom-dashed",
              "panel-top-close",
              "panel-top-dashed",
              "panel-top-open",
              "panels-left-bottom",
              "panels-right-bottom",
              "panels-top-left",
              "paper-bag",
              "paperclip",
              "parasol",
              "parentheses",
              "park",
              "parking-meter",
              "party-popper",
              "pause",
              "paw-print",
              "pc-case",
              "pen",
              "pen-line",
              "pen-off",
              "pen-tool",
              "pencil",
              "pencil-line",
              "pencil-off",
              "pencil-ruler",
              "pencil-sparkles",
              "pentagon",
              "percent",
              "perfume-bottle",
              "person-standing",
              "phi",
              "philippine-peso",
              "phone",
              "phone-call",
              "phone-forwarded",
              "phone-incoming",
              "phone-log",
              "phone-missed",
              "phone-off",
              "phone-outgoing",
              "pi",
              "piano",
              "pickaxe",
              "picture-in-picture",
              "picture-in-picture-2",
              "piggy-bank",
              "pilcrow",
              "pilcrow-left",
              "pilcrow-right",
              "pill",
              "pill-bottle",
              "pin",
              "pin-off",
              "pipette",
              "pizza",
              "plane",
              "plane-landing",
              "plane-takeoff",
              "plant-pot",
              "play",
              "play-off",
              "playing-card",
              "playing-cards",
              "playing-cards-fan",
              "plug",
              "plug-2",
              "plug-zap",
              "plus",
              "pocket-knife",
              "podcast",
              "podium",
              "pointer",
              "pointer-off",
              "popcorn",
              "popsicle",
              "pound-sterling",
              "power",
              "power-off",
              "presentation",
              "printer",
              "printer-3d",
              "printer-check",
              "printer-x",
              "projector",
              "proportions",
              "puzzle",
              "pyramid",
              "qr-code",
              "quote",
              "rabbit",
              "radar",
              "radiation",
              "radical",
              "radio",
              "radio-off",
              "radio-receiver",
              "radio-tower",
              "radius",
              "rainbow",
              "rat",
              "ratio",
              "receipt",
              "receipt-cent",
              "receipt-euro",
              "receipt-indian-rupee",
              "receipt-japanese-yen",
              "receipt-pound-sterling",
              "receipt-russian-ruble",
              "receipt-swiss-franc",
              "receipt-text",
              "receipt-turkish-lira",
              "rectangle-circle",
              "rectangle-ellipsis",
              "rectangle-goggles",
              "rectangle-horizontal",
              "rectangle-vertical",
              "recycle",
              "redo",
              "redo-2",
              "redo-dot",
              "refresh-ccw",
              "refresh-ccw-dot",
              "refresh-cw",
              "refresh-cw-off",
              "refrigerator",
              "regex",
              "remove-formatting",
              "repeat",
              "repeat-1",
              "repeat-2",
              "repeat-off",
              "replace",
              "replace-all",
              "reply",
              "reply-all",
              "rewind",
              "ribbon",
              "road",
              "robot-arm",
              "robot-vacuum",
              "rocket",
              "rocking-chair",
              "roller-coaster",
              "rose",
              "rotate-3d",
              "rotate-ccw",
              "rotate-ccw-clock",
              "rotate-ccw-key",
              "rotate-ccw-square",
              "rotate-cw",
              "rotate-cw-clock",
              "rotate-cw-fading-clock",
              "rotate-cw-square",
              "route",
              "route-off",
              "router",
              "rows-2",
              "rows-3",
              "rows-4",
              "rss",
              "rugby-ball",
              "ruler",
              "ruler-dimension-line",
              "russian-ruble",
              "sailboat",
              "salad",
              "sandwich",
              "satellite",
              "satellite-dish",
              "saudi-riyal",
              "save",
              "save-all",
              "save-check",
              "save-off",
              "save-pen",
              "save-plus",
              "scale",
              "scale-3d",
              "scaling",
              "scan",
              "scan-barcode",
              "scan-box",
              "scan-eye",
              "scan-face",
              "scan-heart",
              "scan-line",
              "scan-qr-code",
              "scan-search",
              "scan-square",
              "scan-text",
              "school",
              "scissors",
              "scissors-line-dashed",
              "scooter",
              "scratch-blocks",
              "screen-share",
              "screen-share-off",
              "screw",
              "scroll",
              "scroll-text",
              "search",
              "search-alert",
              "search-check",
              "search-code",
              "search-slash",
              "search-x",
              "section",
              "send",
              "send-horizontal",
              "send-to-back",
              "separator-horizontal",
              "separator-vertical",
              "server",
              "server-cog",
              "server-crash",
              "server-nas",
              "server-off",
              "server-plus",
              "settings",
              "settings-2",
              "shapes",
              "share",
              "share-2",
              "sheet",
              "shell",
              "shelving-unit",
              "shield",
              "shield-alert",
              "shield-ban",
              "shield-check",
              "shield-cog",
              "shield-cog-corner",
              "shield-ellipsis",
              "shield-half",
              "shield-house",
              "shield-keyhole",
              "shield-lock",
              "shield-minus",
              "shield-off",
              "shield-plus",
              "shield-question-mark",
              "shield-user",
              "shield-x",
              "ship",
              "ship-cargo",
              "ship-wheel",
              "shirt",
              "shopping-bag",
              "shopping-basket",
              "shopping-cart",
              "shopping-cart-minus",
              "shopping-cart-plus",
              "shovel",
              "shower-head",
              "shredder",
              "shrimp",
              "shrimp-off",
              "shrink",
              "shrub",
              "shuffle",
              "sigma",
              "signal",
              "signal-high",
              "signal-low",
              "signal-medium",
              "signal-zero",
              "signature",
              "signpost",
              "signpost-big",
              "siren",
              "siren-off",
              "sixteenth-notes",
              "skip-back",
              "skip-forward",
              "skull",
              "slash",
              "slice",
              "sliders-horizontal",
              "sliders-vertical",
              "smartphone",
              "smartphone-charging",
              "smartphone-nfc",
              "smartphone-user-round",
              "smile",
              "snail",
              "snowflake",
              "soap-dispenser-droplet",
              "sofa",
              "solar-panel",
              "soup",
              "space",
              "spade",
              "sparkle",
              "sparkles",
              "speaker",
              "speech",
              "spell-check",
              "spell-check-2",
              "spline",
              "spline-pointer",
              "split",
              "spool",
              "sport-shoe",
              "spotlight",
              "spray-can",
              "sprout",
              "square",
              "square-activity",
              "square-arrow-down",
              "square-arrow-down-left",
              "square-arrow-down-right",
              "square-arrow-left",
              "square-arrow-out-down-left",
              "square-arrow-out-down-right",
              "square-arrow-out-up-left",
              "square-arrow-out-up-right",
              "square-arrow-right",
              "square-arrow-right-enter",
              "square-arrow-right-exit",
              "square-arrow-up",
              "square-arrow-up-left",
              "square-arrow-up-right",
              "square-asterisk",
              "square-bookmark",
              "square-bottom-dashed-scissors",
              "square-centerline-dashed-horizontal",
              "square-centerline-dashed-vertical",
              "square-chart-gantt",
              "square-check",
              "square-check-big",
              "square-chevron-down",
              "square-chevron-left",
              "square-chevron-right",
              "square-chevron-up",
              "square-chevrons-down",
              "square-chevrons-left",
              "square-chevrons-right",
              "square-chevrons-up",
              "square-code",
              "square-dashed",
              "square-dashed-bottom",
              "square-dashed-bottom-code",
              "square-dashed-kanban",
              "square-dashed-mouse-pointer",
              "square-dashed-plus",
              "square-dashed-text",
              "square-dashed-top-solid",
              "square-dashed-x",
              "square-dashed-x-corner",
              "square-dimensions",
              "square-divide",
              "square-dot",
              "square-equal",
              "square-exclamation-point",
              "square-function",
              "square-kanban",
              "square-kanban-plus",
              "square-letter-a",
              "square-letter-b",
              "square-letter-c",
              "square-letter-d",
              "square-letter-e",
              "square-letter-f",
              "square-letter-g",
              "square-letter-h",
              "square-letter-i",
              "square-letter-j",
              "square-letter-k",
              "square-letter-l",
              "square-letter-m",
              "square-letter-n",
              "square-letter-o",
              "square-letter-p",
              "square-letter-p-off",
              "square-letter-q",
              "square-letter-r",
              "square-letter-s",
              "square-letter-t",
              "square-letter-u",
              "square-letter-v",
              "square-letter-w",
              "square-letter-x",
              "square-letter-y",
              "square-letter-z",
              "square-library",
              "square-menu",
              "square-minus",
              "square-mouse-pointer",
              "square-off",
              "square-padding",
              "square-padding-bottom",
              "square-padding-horizontal",
              "square-padding-left",
              "square-padding-right",
              "square-padding-top",
              "square-padding-vertical",
              "square-pause",
              "square-pen",
              "square-percent",
              "square-pi",
              "square-pilcrow",
              "square-play",
              "square-plus",
              "square-power",
              "square-radical",
              "square-round-corner",
              "square-scissors",
              "square-sigma",
              "square-slash",
              "square-sparkles",
              "square-split-horizontal",
              "square-split-vertical",
              "square-square",
              "square-stack",
              "square-star",
              "square-stop",
              "square-terminal",
              "square-text",
              "square-user",
              "square-user-round",
              "square-x",
              "squares-exclude",
              "squares-intersect",
              "squares-subtract",
              "squares-unite",
              "squircle",
              "squircle-dashed",
              "squirrel",
              "stamp",
              "star",
              "star-check",
              "star-half",
              "star-minus",
              "star-off",
              "star-plus",
              "star-x",
              "step-back",
              "step-forward",
              "stethoscope",
              "sticker",
              "sticky-note",
              "sticky-note-check",
              "sticky-note-minus",
              "sticky-note-off",
              "sticky-note-plus",
              "sticky-note-x",
              "sticky-notes",
              "stone",
              "store",
              "stretch-horizontal",
              "stretch-vertical",
              "strikethrough",
              "subscript",
              "summary",
              "sun",
              "sun-dim",
              "sun-medium",
              "sun-moon",
              "sun-snow",
              "sunrise",
              "sunset",
              "superscript",
              "swatch-book",
              "swiss-franc",
              "switch-camera",
              "sword",
              "swords",
              "syringe",
              "table",
              "table-2",
              "table-cells-merge",
              "table-cells-split",
              "table-columns-split",
              "table-of-contents",
              "table-properties",
              "table-rows-split",
              "tablet",
              "tablet-smartphone",
              "tablets",
              "tag",
              "tag-plus",
              "tag-x",
              "tags",
              "tally-1",
              "tally-2",
              "tally-3",
              "tally-4",
              "tally-5",
              "tangent",
              "target",
              "telescope",
              "tent",
              "tent-tree",
              "terminal",
              "test-tube",
              "test-tube-diagonal",
              "test-tubes",
              "text-align-center",
              "text-align-end",
              "text-align-justify",
              "text-align-justify-center",
              "text-align-justify-end",
              "text-align-justify-start",
              "text-align-start",
              "text-cursor",
              "text-cursor-input",
              "text-initial",
              "text-quote",
              "text-search",
              "text-wrap",
              "theater",
              "thermometer",
              "thermometer-snowflake",
              "thermometer-sun",
              "thumbs-down",
              "thumbs-up",
              "tic-tac-toe",
              "ticket",
              "ticket-check",
              "ticket-minus",
              "ticket-percent",
              "ticket-plus",
              "ticket-slash",
              "ticket-x",
              "tickets",
              "tickets-plane",
              "timeline",
              "timer",
              "timer-off",
              "timer-reset",
              "toggle-left",
              "toggle-right",
              "toilet",
              "tombstone",
              "tool-case",
              "toolbox",
              "toothbrush",
              "toothbrush-sparkles",
              "tornado",
              "torus",
              "touchpad",
              "touchpad-off",
              "towel-rack",
              "tower-control",
              "toy-blank",
              "toy-brick",
              "toy-effect",
              "toy-instrument",
              "toy-template",
              "tractor",
              "traffic-cone",
              "trailer",
              "train-front",
              "train-front-tunnel",
              "train-track",
              "tram-front",
              "transgender",
              "trash",
              "trash-2",
              "trash-off",
              "tree-deciduous",
              "tree-palm",
              "tree-pine",
              "trees",
              "trending-down",
              "trending-up",
              "trending-up-down",
              "triangle",
              "triangle-alert",
              "triangle-dashed",
              "triangle-right",
              "triangles-centerline-dashed-horizontal",
              "triangles-centerline-dashed-vertical",
              "trophy",
              "truck",
              "truck-electric",
              "tube-lotion",
              "turkish-lira",
              "turntable",
              "turtle",
              "tv",
              "tv-minimal",
              "tv-minimal-play",
              "type",
              "type-outline",
              "umbrella",
              "umbrella-off",
              "underline",
              "undo",
              "undo-2",
              "undo-dot",
              "unfold-horizontal",
              "unfold-vertical",
              "ungroup",
              "university",
              "unlink",
              "unlink-2",
              "unplug",
              "upload",
              "usb",
              "usb-c-port",
              "user",
              "user-check",
              "user-cog",
              "user-group",
              "user-key",
              "user-lock",
              "user-minus",
              "user-pen",
              "user-plus",
              "user-round",
              "user-round-arrow-left",
              "user-round-check",
              "user-round-cog",
              "user-round-group",
              "user-round-key",
              "user-round-minus",
              "user-round-pen",
              "user-round-plus",
              "user-round-search",
              "user-round-shield",
              "user-round-star",
              "user-round-x",
              "user-search",
              "user-shield",
              "user-star",
              "user-x",
              "users",
              "users-collaboration",
              "users-round",
              "users-round-collaboration",
              "utensils",
              "utensils-crossed",
              "utility-pole",
              "van",
              "variable",
              "vault",
              "vector-polygon",
              "vector-square",
              "vegan",
              "venetian-mask",
              "venus",
              "venus-and-mars",
              "vibrate",
              "vibrate-off",
              "video",
              "video-off",
              "videotape",
              "view",
              "virus",
              "virus-off",
              "voicemail",
              "volleyball",
              "volume",
              "volume-1",
              "volume-2",
              "volume-off",
              "volume-x",
              "vote",
              "wallet",
              "wallet-cards",
              "wallet-minimal",
              "wallpaper",
              "wand",
              "wand-sparkles",
              "warehouse",
              "washing-machine",
              "watch",
              "waves",
              "waves-arrow-down",
              "waves-arrow-up",
              "waves-horizontal",
              "waves-ladder",
              "waves-vertical",
              "waypoints",
              "webcam",
              "webcam-off",
              "webhook",
              "webhook-off",
              "weight",
              "weight-tilde",
              "wheat",
              "wheat-off",
              "whistle",
              "whole-word",
              "wifi",
              "wifi-cog",
              "wifi-high",
              "wifi-lock",
              "wifi-low",
              "wifi-off",
              "wifi-pen",
              "wifi-sync",
              "wifi-zero",
              "wind",
              "wind-arrow-down",
              "wind-arrow-up",
              "wine",
              "wine-off",
              "workflow",
              "worm",
              "wrench",
              "wrench-off",
              "x",
              "x-line-top",
              "zap",
              "zap-off",
              "zodiac-aquarius",
              "zodiac-aries",
              "zodiac-cancer",
              "zodiac-capricorn",
              "zodiac-gemini",
              "zodiac-leo",
              "zodiac-libra",
              "zodiac-ophiuchus",
              "zodiac-pisces",
              "zodiac-sagittarius",
              "zodiac-scorpio",
              "zodiac-taurus",
              "zodiac-virgo",
              "zoom-in",
              "zoom-out"
            ]
          },
          "LayerFolder": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "name": { "type": "string", "minLength": 1, "maxLength": 128 },
              "parent": {
                "type": "string",
                "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                "not": { "enum": ["constructor", "prototype"] }
              },
              "zIndex": { "type": "integer", "minimum": 0, "maximum": 255 },
              "hidden": { "type": "boolean" },
              "locked": { "type": "boolean" }
            },
            "required": ["name", "zIndex"]
          },
          "Tuning": {
            "description": "How instruments map MIDI notes to pitch, and what a Tuner set to Toy measures against: a preset from packages/node-catalog/tunings.json, or custom cents and a period. The semantic validator requires exactly one of the two, and custom degrees that start at 0, ascend and stay below the period. Absent means 12-TET at A4 = 440 Hz.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "preset": {
                "enum": [
                  "12-tet",
                  "19-edo",
                  "22-edo",
                  "24-edo",
                  "31-edo",
                  "53-edo",
                  "just",
                  "pythagorean",
                  "bohlen-pierce"
                ]
              },
              "cents": {
                "description": "Custom degrees in cents above the root: 0 first, ascending.",
                "type": "array",
                "minItems": 1,
                "maxItems": 128,
                "items": { "type": "number", "minimum": 0, "maximum": 9600 }
              },
              "period": {
                "description": "Custom period in cents: 1200 for an octave, about 1901.955 for a tritave.",
                "type": "number",
                "minimum": 1,
                "maximum": 9600
              },
              "root": {
                "description": "Tonic pitch class, C = 0, of root-anchored tunings; MIDI note 60 + root plays it at its 12-TET pitch from reference.",
                "type": "integer",
                "minimum": 0,
                "maximum": 11
              },
              "reference": {
                "description": "Frequency of A4 in Hz.",
                "type": "number",
                "minimum": 400,
                "maximum": 480
              }
            },
            "required": ["root", "reference"]
          },
          "Transport": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "bpm": { "type": "number", "minimum": 20, "maximum": 400 },
              "numerator": { "type": "integer", "minimum": 1, "maximum": 32 },
              "denominator": { "enum": [1, 2, 4, 8, 16] }
            },
            "required": ["bpm", "numerator", "denominator"]
          },
          "Modulation": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "shape": { "enum": ["sine", "triangle"] },
              "mode": { "enum": ["add", "replace"] },
              "rateHz": { "type": "number", "minimum": 0.01, "maximum": 40 },
              "depth": { "type": "number", "minimum": -1, "maximum": 1 },
              "beats": { "type": "number", "minimum": 0.0625, "maximum": 64 }
            },
            "required": ["shape", "mode", "rateHz", "depth"]
          },
          "MidiBinding": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "channel": { "type": "integer", "minimum": 1, "maximum": 16 },
              "cc": { "type": "integer", "minimum": 0, "maximum": 119 }
            },
            "required": ["channel", "cc"]
          },
          "Preset": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "name": { "type": "string", "minLength": 1, "maxLength": 128 },
              "values": {
                "type": "object",
                "maxProperties": 128,
                "propertyNames": {
                  "type": "string",
                  "pattern": "^[a-z][a-z0-9_-]{0,63}$",
                  "not": { "enum": ["constructor", "prototype"] }
                },
                "additionalProperties": { "type": "number" },
                "minProperties": 1
              }
            },
            "required": ["name", "values"]
          },
          "AppearanceStyle": {
            "description": "Reusable visual values. Geometry, layer depth, bindings and content belong to each element.",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "color": { "$ref": "#/$defs/WidgetStyle/properties/color" },
              "background": {
                "$ref": "#/$defs/WidgetStyle/properties/background"
              },
              "accent": { "$ref": "#/$defs/WidgetStyle/properties/accent" },
              "borderColor": {
                "$ref": "#/$defs/WidgetStyle/properties/borderColor"
              },
              "fontFamily": {
                "$ref": "#/$defs/WidgetStyle/properties/fontFamily"
              },
              "fontSize": { "$ref": "#/$defs/WidgetStyle/properties/fontSize" },
              "fontWeight": {
                "$ref": "#/$defs/WidgetStyle/properties/fontWeight"
              },
              "letterSpacing": {
                "$ref": "#/$defs/WidgetStyle/properties/letterSpacing"
              },
              "textAlign": {
                "$ref": "#/$defs/WidgetStyle/properties/textAlign"
              },
              "borderWidth": {
                "$ref": "#/$defs/WidgetStyle/properties/borderWidth"
              },
              "borderRadius": {
                "$ref": "#/$defs/WidgetStyle/properties/borderRadius"
              },
              "opacity": { "$ref": "#/$defs/WidgetStyle/properties/opacity" }
            }
          },
          "ReusableStyle": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "name": { "type": "string", "minLength": 1, "maxLength": 128 },
              "kind": { "type": "string", "enum": ["text", "control"] },
              "values": { "$ref": "#/$defs/AppearanceStyle" }
            },
            "required": ["name", "kind", "values"]
          },
          "AudioConfiguration": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "channels": { "type": "integer", "minimum": 1, "maximum": 32 },
              "policy": { "enum": ["strict", "broadcast", "pad", "repeat"] },
              "firstChannel": {
                "type": "integer",
                "minimum": 1,
                "maximum": 32
              },
              "routes": {
                "type": "array",
                "maxItems": 256,
                "items": {
                  "type": "object",
                  "additionalProperties": false,
                  "properties": {
                    "from": { "type": "integer", "minimum": 1, "maximum": 32 },
                    "to": { "type": "integer", "minimum": 1, "maximum": 32 },
                    "gain": { "type": "number", "minimum": -8, "maximum": 8 }
                  },
                  "required": ["from", "to", "gain"]
                }
              }
            }
          },
          "IconAppearance": {
            "type": "object",
            "additionalProperties": false,
            "description": "Optional portable SVG paints and stroke width. Missing values preserve bundled geometry defaults.",
            "properties": {
              "fill": { "$ref": "#/$defs/IconPaint" },
              "stroke": { "$ref": "#/$defs/IconPaint" },
              "strokeWidth": { "type": "number", "minimum": 0, "maximum": 4 }
            }
          },
          "IconPaint": {
            "type": "string",
            "pattern": "^(none|currentColor|#[0-9a-fA-F]{6})$"
          },
          "ResponsiveLayout": {
            "type": "object",
            "additionalProperties": false,
            "description": "Responsive viewport limits. Absent layout preserves fixed Frame scaling.",
            "properties": {
              "minWidth": {
                "type": "number",
                "exclusiveMinimum": 0,
                "maximum": 8192
              },
              "maxWidth": {
                "type": "number",
                "exclusiveMinimum": 0,
                "maximum": 8192
              },
              "minHeight": {
                "type": "number",
                "exclusiveMinimum": 0,
                "maximum": 8192
              },
              "maxHeight": {
                "type": "number",
                "exclusiveMinimum": 0,
                "maximum": 8192
              }
            }
          },
          "LayoutConstraints": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "horizontal": {
                "enum": ["start", "end", "center", "stretch", "scale"]
              },
              "vertical": {
                "enum": ["start", "end", "center", "stretch", "scale"]
              },
              "minWidth": {
                "type": "number",
                "exclusiveMinimum": 0,
                "maximum": 8192
              },
              "maxWidth": {
                "type": "number",
                "exclusiveMinimum": 0,
                "maximum": 8192
              },
              "minHeight": {
                "type": "number",
                "exclusiveMinimum": 0,
                "maximum": 8192
              },
              "maxHeight": {
                "type": "number",
                "exclusiveMinimum": 0,
                "maximum": 8192
              }
            }
          }
        }
      },
      "UpdateManifest": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "$id": "https://tune.toys/schemas/platform/update-manifest.schema.json",
        "title": "UpdateManifest",
        "description": "Signed update feed payload for one product and channel (tunetoys.update-manifest/1). Lists artifact digests, never URLs or tickets. Signed in a SignedEnvelope with the update_feed key.",
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "schema": { "const": "tunetoys.update-manifest/1" },
          "productId": { "$ref": "common.schema.json#/$defs/EntityId" },
          "channel": { "$ref": "enums.schema.json#/$defs/ReleaseChannel" },
          "sequence": {
            "type": "integer",
            "minimum": 1,
            "maximum": 9007199254740991,
            "description": "Monotonic per product and channel."
          },
          "issuedAt": { "$ref": "common.schema.json#/$defs/Timestamp" },
          "expiresAt": { "$ref": "common.schema.json#/$defs/Timestamp" },
          "version": { "$ref": "#/$defs/UpdateManifestVersion" },
          "artifacts": {
            "type": "array",
            "items": { "$ref": "#/$defs/UpdateManifestArtifact" },
            "maxItems": 64
          },
          "yanked": {
            "type": "array",
            "items": { "$ref": "common.schema.json#/$defs/EntityId" },
            "maxItems": 256,
            "uniqueItems": true,
            "description": "Version IDs withdrawn since the previous manifest."
          },
          "keyId": { "$ref": "common.schema.json#/$defs/EntityId" }
        },
        "required": [
          "schema",
          "productId",
          "channel",
          "sequence",
          "issuedAt",
          "expiresAt",
          "version",
          "artifacts",
          "yanked",
          "keyId"
        ],
        "$defs": {
          "UpdateManifestVersion": {
            "title": "UpdateManifestVersion",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "versionId": { "$ref": "common.schema.json#/$defs/EntityId" },
              "semver": { "$ref": "common.schema.json#/$defs/SemVer" },
              "publishedAt": { "$ref": "common.schema.json#/$defs/Timestamp" },
              "kind": {
                "type": "string",
                "enum": ["toy", "app"],
                "default": "toy",
                "description": "`app` versions (the desktop app) carry artifacts directly and pin no Toy releases, so their releaseDigests is empty. Absent means `toy`."
              },
              "releaseDigests": {
                "type": "array",
                "items": { "$ref": "common.schema.json#/$defs/Sha256Hex" },
                "maxItems": 64,
                "uniqueItems": true,
                "description": "Toy releases the version pins: at least one for a Toy version, none for an app version."
              },
              "minEngineVersion": {
                "$ref": "common.schema.json#/$defs/SemVer"
              },
              "changelogSha256": {
                "$ref": "common.schema.json#/$defs/Sha256Hex",
                "description": "Changelog text is fetched separately and checked against this digest."
              }
            },
            "required": [
              "versionId",
              "semver",
              "publishedAt",
              "releaseDigests",
              "minEngineVersion",
              "changelogSha256"
            ],
            "if": {
              "properties": { "kind": { "const": "app" } },
              "required": ["kind"]
            },
            "then": {
              "properties": {
                "releaseDigests": { "type": "array", "maxItems": 0 }
              }
            },
            "else": {
              "properties": {
                "releaseDigests": { "type": "array", "minItems": 1 }
              }
            }
          },
          "UpdateManifestArtifact": {
            "title": "UpdateManifestArtifact",
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "artifactId": { "$ref": "common.schema.json#/$defs/EntityId" },
              "targetProfile": {
                "$ref": "enums.schema.json#/$defs/TargetProfile"
              },
              "format": { "$ref": "enums.schema.json#/$defs/ArtifactFormat" },
              "arch": { "$ref": "enums.schema.json#/$defs/ArtifactArch" },
              "size": { "$ref": "common.schema.json#/$defs/ByteSize" },
              "sha256": { "$ref": "common.schema.json#/$defs/Sha256Hex" },
              "signatureState": {
                "$ref": "enums.schema.json#/$defs/SignatureState"
              },
              "qualificationState": {
                "$ref": "enums.schema.json#/$defs/QualificationState"
              },
              "inventorySha256": {
                "$ref": "common.schema.json#/$defs/Sha256Hex"
              },
              "pluginContractDigest": {
                "$ref": "common.schema.json#/$defs/Sha256Hex"
              }
            },
            "required": [
              "artifactId",
              "targetProfile",
              "format",
              "arch",
              "size",
              "sha256",
              "signatureState",
              "qualificationState",
              "inventorySha256"
            ]
          }
        }
      },
      "Webhook": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "$id": "https://tune.toys/schemas/platform/webhook.schema.json",
        "title": "Webhook",
        "description": "A pro-tier webhook endpoint. Deliveries are signed with TuneToys-Signature: t=<unix seconds>,v1=<hex HMAC-SHA256(secret, t + \".\" + body)>.",
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": { "$ref": "common.schema.json#/$defs/EntityId" },
          "appId": { "$ref": "common.schema.json#/$defs/EntityId" },
          "url": {
            "type": "string",
            "maxLength": 2048,
            "pattern": "^https://"
          },
          "events": {
            "type": "array",
            "minItems": 1,
            "maxItems": 5,
            "uniqueItems": true,
            "items": {
              "enum": [
                "version_published",
                "listing_updated",
                "review_created",
                "purchase_completed",
                "update_feed_changed"
              ]
            }
          },
          "state": { "enum": ["pending", "active", "paused", "disabled"] },
          "verifiedAt": {
            "anyOf": [
              { "$ref": "common.schema.json#/$defs/Timestamp" },
              { "type": "null" }
            ]
          },
          "createdAt": { "$ref": "common.schema.json#/$defs/Timestamp" },
          "updatedAt": { "$ref": "common.schema.json#/$defs/Timestamp" },
          "version": { "type": "integer", "minimum": 1 }
        },
        "required": [
          "id",
          "appId",
          "url",
          "events",
          "state",
          "verifiedAt",
          "createdAt",
          "updatedAt",
          "version"
        ]
      }
    },
    "responses": {
      "BadRequest": {
        "description": "Invalid request, or MIXED_AUTH when credentials are combined.",
        "content": {
          "application/json": {
            "schema": { "$ref": "#/components/schemas/ApiError" }
          }
        }
      },
      "Unauthorized": {
        "description": "Missing session, or KEY_INVALID for a malformed, unknown, expired or revoked key.",
        "content": {
          "application/json": {
            "schema": { "$ref": "#/components/schemas/ApiError" }
          }
        }
      },
      "Forbidden": {
        "description": "AUTH_MODE, SCOPE (details.requiredScopes), KEY_NETWORK, ORIGIN or CSRF.",
        "content": {
          "application/json": {
            "schema": { "$ref": "#/components/schemas/ApiError" }
          }
        }
      },
      "NotFound": {
        "description": "Not found or not visible to the caller.",
        "content": {
          "application/json": {
            "schema": { "$ref": "#/components/schemas/ApiError" }
          }
        }
      },
      "Conflict": {
        "description": "VERSION_CONFLICT, IDEMPOTENCY_CONFLICT or another state conflict.",
        "content": {
          "application/json": {
            "schema": { "$ref": "#/components/schemas/ApiError" }
          }
        }
      },
      "PayloadTooLarge": {
        "description": "Request body exceeds 2 MiB.",
        "content": {
          "application/json": {
            "schema": { "$ref": "#/components/schemas/ApiError" }
          }
        }
      },
      "UnsupportedMediaType": {
        "description": "Request bodies must be application/json.",
        "content": {
          "application/json": {
            "schema": { "$ref": "#/components/schemas/ApiError" }
          }
        }
      },
      "RateLimited": {
        "description": "RATE_LIMIT: details carry bucket, limit, remaining, resetSeconds and quota.",
        "headers": {
          "Retry-After": { "$ref": "#/components/headers/RetryAfter" },
          "RateLimit-Limit": { "$ref": "#/components/headers/RateLimitLimit" },
          "RateLimit-Remaining": {
            "$ref": "#/components/headers/RateLimitRemaining"
          },
          "RateLimit-Reset": { "$ref": "#/components/headers/RateLimitReset" }
        },
        "content": {
          "application/json": {
            "schema": { "$ref": "#/components/schemas/ApiError" }
          }
        }
      }
    },
    "headers": {
      "RateLimitLimit": {
        "description": "Sustained limit of the most constrained bucket (per minute, or per day for the quota).",
        "schema": { "type": "integer" }
      },
      "RateLimitRemaining": {
        "description": "Requests left before the bucket rejects.",
        "schema": { "type": "integer" }
      },
      "RateLimitReset": {
        "description": "Seconds until the bucket is full again.",
        "schema": { "type": "integer" }
      },
      "RetryAfter": {
        "description": "Seconds to wait before retrying.",
        "schema": { "type": "integer" }
      }
    },
    "parameters": {
      "IdempotencyKey": {
        "name": "Idempotency-Key",
        "in": "header",
        "required": true,
        "description": "Unique per logical write; a retry with the same key and body replays the result.",
        "schema": { "type": "string", "minLength": 1, "maxLength": 128 }
      }
    },
    "securitySchemes": {
      "sessionCookie": {
        "type": "apiKey",
        "in": "cookie",
        "name": "__Host-tunetoys",
        "description": "Browser session. Writes also need Origin, `X-TuneToys-Request: 1` and `X-CSRF-Token`. Never combine with a key."
      },
      "nativeBearer": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "ttna_…",
        "description": "Player device token; GET-only library, release and sounds reads within the granted scopes (library:read, releases:read, distribution:install, media:read, media:download)."
      },
      "apiKey": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "tt_<prefix>_<secret>",
        "description": "Developer API key. Scopes listed per operation must all be granted. Key requests are exempt from Origin/CSRF checks and must not send cookies."
      },
      "apiKeyHeader": {
        "type": "apiKey",
        "in": "header",
        "name": "X-TuneToys-Key",
        "description": "Alternative header for the developer API key."
      }
    }
  }
}
