{"openapi":"3.1.0","info":{"title":"Sonenta API","description":"The Sonenta localization API. This is the machine-readable contract for\nprogrammatic clients (and coding agents) pushing content and publishing bundles.\n\n## Authentication\nEvery call carries an `Authorization` header — either:\n- `Authorization: ApiKey <token>` — a project/org API key (programmatic), or\n- `Authorization: Bearer <jwt>` — a user session token.\n\nScopes that matter: `project:read` (read), `project:write` (create keys, write\ntranslation values, import), `cdn:write` (publish). Version creation needs\n`*` (owner) and is rarely needed — publishing targets the existing production\nversion.\n\n## Agent quickstart (REST, API key)\n1. **Create a namespace** — `POST /v1/projects/{project_id}/namespaces`\n   `{ \"slug\": \"common\", \"name\": \"Common\" }` (idempotent).\n2. **Create keys** — `POST /v1/projects/{project_id}/keys`\n   `{ \"namespace_uuid\": \"...\", \"name\": \"hero.title\" }` (or `/keys/bulk`).\n3. **Write translation VALUES** — NOT `PATCH /keys` (metadata only; a `value`\n   there is rejected). Use either:\n   - per string: `PUT /v1/projects/{project_id}/translations/{key_id}/{language_id}`\n     `{ \"value\": \"Bonjour\", \"status\": \"translated\" }` — `{language_id}` is the\n     language **UUID** (from `GET /v1/projects/{id}/languages`), not the code.\n   - bulk i18next tree: `POST /v1/projects/{project_id}/i18next/import`.\n4. **Publish to the CDN** — `POST /v1/projects/{project_id}/cdn/releases`\n   `{ \"language_code\": \"fr\", \"namespace\": \"common\" }` (publishes the production\n   version; do not create a version).\n5. **Discover where bundles live** —\n   `GET /v1/orgs/{org_id}/projects/{project_id}/distribution` returns the CDN\n   `base_url`, a `url_template`, and the published bundle URLs. Never hard-code\n   the CDN host — read it here.\n","version":"0.1.0"},"servers":[{"url":"https://api.sonenta.dev","description":"Production (canonical)"},{"url":"https://api.sonenta.com","description":"Brand alias (dual-serves the same backend)"}],"paths":{"/health":{"get":{"tags":["meta"],"summary":"Health","operationId":"meta_health","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Meta Health"}}}}}}},"/v1/auth/signup":{"post":{"tags":["auth"],"summary":"Signup","operationId":"auth_signup","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/login":{"post":{"tags":["auth"],"summary":"Login","operationId":"auth_login","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/app__routes__auth__TokenOut"},{"$ref":"#/components/schemas/MfaChallengeOut"}],"title":"Response Auth Login"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/refresh":{"post":{"tags":["auth"],"summary":"Refresh","operationId":"auth_refresh","parameters":[{"name":"vrb_refresh","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vrb Refresh"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/app__routes__auth__RefreshIn"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes__auth__TokenOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/logout":{"post":{"tags":["auth"],"summary":"Logout","operationId":"auth_logout","parameters":[{"name":"vrb_refresh","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vrb Refresh"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/logout-all":{"post":{"tags":["auth"],"summary":"Logout All","operationId":"auth_logout_all","responses":{"204":{"description":"Successful Response"}}}},"/v1/auth/me":{"get":{"tags":["auth"],"summary":"Me","operationId":"auth_me","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOut"}}}}}}},"/v1/auth/verify-email/resend":{"post":{"tags":["auth"],"summary":"Resend Verify Email","operationId":"auth_resend_verify_email","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenericOk"}}}}}}},"/v1/auth/verify-email/confirm":{"post":{"tags":["auth"],"summary":"Confirm Verify Email","operationId":"auth_confirm_verify_email","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyEmailIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenericOk"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/password-reset/request":{"post":{"tags":["auth"],"summary":"Password Reset Request","description":"Always returns 200 — never disclose whether an account exists.","operationId":"auth_password_reset_request","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetRequestIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenericOk"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/password-reset/confirm":{"post":{"tags":["auth"],"summary":"Password Reset Confirm","operationId":"auth_password_reset_confirm","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetConfirmIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenericOk"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/password/change":{"post":{"tags":["auth"],"summary":"Password Change","operationId":"auth_password_change","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordChangeIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenericOk"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/centrifugo-token":{"post":{"tags":["auth"],"summary":"Centrifugo Token","description":"Mint a Centrifugo connection JWT scoped to ONE project channel.\n\n`kind` selects which per-project channel (`translations` default, used\nby `@sonenta/react-i18next` with `liveUpdates: true`; or `missing`,\nused by the client-admin missing-key dashboard). Auth: Bearer JWT\n(user) OR Bearer ApiKey, associated with the requested project\n(membership for users, scope/project_uuid for keys).\n\nTenant isolation (task 583): the client supplies only `project_uuid`\nand `kind`. The route 403s unless the principal is authorized on that\nproject, then derives `org_uuid` + the exact channel from the\nSERVER-SIDE project doc and binds it via the JWT `channels` claim.\nA client can never obtain a token for an org/project it is not a\nmember of, nor for an arbitrary channel.","operationId":"auth_centrifugo_token","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CentrifugoTokenIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CentrifugoTokenOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/sessions":{"get":{"tags":["auth"],"summary":"List Sessions","description":"List the caller's active sessions with IP + geolocation + device, marking\nthe current one (GitHub/Google-style \"where you're logged in\").\n\nOne row per active session (the refresh token rotates on every refresh, so\n`created_at`/`last_active` is the last activity + ip/device reflect the\nlatest use). Geo is null for private/localhost/unknown IPs or when the geo\nDB is not configured.","operationId":"auth_list_sessions","parameters":[{"name":"vrb_refresh","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vrb Refresh"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionsListOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/sessions/{jti}":{"delete":{"tags":["auth"],"summary":"Revoke Session","description":"Revoke a single refresh token by `jti`. Caller must own it.","operationId":"auth_revoke_session","parameters":[{"name":"jti","in":"path","required":true,"schema":{"type":"string","title":"Jti"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/device/start":{"post":{"tags":["auth"],"summary":"Device Start","description":"PUBLIC. The CLI begins a login: returns a device_code (polled) + a user_code\n(typed by the human into the dashboard /activate page).","operationId":"auth_device_start","responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceStartOut"}}}}}}},"/v1/auth/device/pending":{"get":{"tags":["auth"],"summary":"Device Pending","description":"ACCOUNT-JWT. The dashboard /activate page fetches the pending request by the\nuser-typed code so it can show what (and from where) is being authorized.","operationId":"auth_device_pending","parameters":[{"name":"user_code","in":"query","required":true,"schema":{"type":"string","title":"User Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevicePendingOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/device/approve":{"post":{"tags":["auth"],"summary":"Device Approve","description":"ACCOUNT-JWT. Called by the dashboard /activate page: the signed-in user\napproves the pending CLI login, binding it to their account (+ optional org).","operationId":"auth_device_approve","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceApproveIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceApproveOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/device/token":{"post":{"tags":["auth"],"summary":"Device Token","description":"PUBLIC, polled by the CLI. While the user hasn't approved -> 400\n\"authorization_pending\". Once approved -> the access token + a refresh token IN\nTHE BODY (one-shot: the device_code is consumed). On expiry -> 400 \"expired_token\".","operationId":"auth_device_token","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceTokenIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes__auth__TokenOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/mfa/status":{"get":{"tags":["auth"],"summary":"Status ","operationId":"auth_status_","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MfaStatusOut"}}}}}}},"/v1/auth/mfa/enroll/totp":{"post":{"tags":["auth"],"summary":"Enroll Totp","operationId":"auth_enroll_totp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrollTotpIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrollTotpOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/mfa/confirm/totp":{"post":{"tags":["auth"],"summary":"Confirm Totp","operationId":"auth_confirm_totp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmTotpIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecoveryCodesOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/mfa/enroll/email":{"post":{"tags":["auth"],"summary":"Enroll Email","operationId":"auth_enroll_email","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrollEmailOut"}}}}}}},"/v1/auth/mfa/confirm/email":{"post":{"tags":["auth"],"summary":"Confirm Email","operationId":"auth_confirm_email","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmEmailIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmEmailOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/mfa/send-email-code":{"post":{"tags":["auth"],"summary":"Send Email Code","operationId":"auth_send_email_code","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendEmailCodeIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendEmailCodeOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/mfa/recovery-codes/regenerate":{"post":{"tags":["auth"],"summary":"Regenerate Recovery Codes","operationId":"auth_regenerate_recovery_codes","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegenerateRecoveryIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecoveryCodesOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/mfa/disable":{"post":{"tags":["auth"],"summary":"Disable","operationId":"auth_disable","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisableIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisableOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/mfa/verify":{"post":{"tags":["auth"],"summary":"Verify","operationId":"auth_verify","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes__auth__TokenOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/oauth/{provider}/start":{"get":{"tags":["auth-oauth"],"summary":"Oauth Start","operationId":"auth_oauth_oauth_start","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"next","in":"query","required":false,"schema":{"type":"string","default":"/","title":"Next"}},{"name":"app","in":"query","required":false,"schema":{"enum":["client","platform"],"type":"string","default":"client","title":"App"}},{"name":"link","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Link"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/oauth/{provider}/callback":{"get":{"tags":["auth-oauth"],"summary":"Oauth Callback","operationId":"auth_oauth_oauth_callback","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},{"name":"error_description","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Description"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/oauth/confirm-link":{"post":{"tags":["auth-oauth"],"summary":"Oauth Confirm Link","description":"Finalize a link_required handoff.\n\nThe callback handed the browser a short ticket because the OAuth email\nmatched an existing account that had no identity bound for this provider.\nThe user re-authenticated through any pre-existing factor (password or\nalready-linked OAuth) and POSTs back here with the ticket. We require\nthat the authenticated principal matches the ticket's user_uuid — this\nis the security gate that prevents account-takeover via provider-side\nemail reassignment.","operationId":"auth_oauth_oauth_confirm_link","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmLinkIn"}}},"required":true},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/oauth/{provider}":{"delete":{"tags":["auth-oauth"],"summary":"Oauth Unlink","description":"Unlink an OAuth provider from the authenticated user. Refuses if it\nwould leave the user with NO way to log back in (no password AND no\nother OAuth identity).","operationId":"auth_oauth_oauth_unlink","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/agents":{"get":{"tags":["agents"],"summary":"List Agents","description":"PUBLIC catalogue. No auth, no plan.\n\n⚠️ Call it WITHOUT credentials: the response carries `ACAO: *` and no\n`Allow-Credentials`, so a cookie makes the browser discard it with no usable\nerror. `/v1/agents` is registered in the public-CORS prefix list.","operationId":"agents_list_agents","parameters":[{"name":"schema_version","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Schema Version"}},{"name":"locale","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locale"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agents List Agents"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["agents"],"summary":"Create Agent","description":"Platform staff only. Publishes a NEW agent to the catalogue.\n\nUntil now a new agent was provisioned by a one-off script run on the box\nwith the app's Mongo connection (`scripts/seed_agent_code_analysis.py`).\nThis is that script as a route, with the guards the script could not have:\nthe caller is identified, the write is audited, and a second create on the\nsame `id` is refused instead of silently upserting over the first.\n\nThe moment this returns 201 the agent is DISTRIBUTABLE: the public catalogue\nlists it on the next read (edge cache: 300 s) and every paid client can\nfetch and install it. So the content is validated as an installable file —\na frontmatter with the `version:` the update loop keys on and a `name:`\nequal to the served id — but it is stored VERBATIM, never re-serialised.","operationId":"agents_create_agent","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentCreateIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agents Create Agent"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/agents/{agent_id}":{"get":{"tags":["agents"],"summary":"Get Agent","description":"Content — authenticated AND on a paid plan.\n\nTakes an API KEY as well as a browser session. This is the product's nominal\npath, not an edge case: the CLI authenticates with `snt_live_...`, and\n`agents add` is the whole reason the content moved to the server. Requiring\na user session made the endpoint unreachable by the client it exists for.\n\n`is_staff` BYPASSES the plan gate: the gate is a commercial boundary for\ncustomers ACQUIRING agents, while staff editing is an internal operation on\nour own product. A right to write that did not imply a right to read would be\nincoherent.","operationId":"agents_get_agent","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"schema_version","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Schema Version"}},{"name":"locale","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locale"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agents Get Agent"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["agents"],"summary":"Patch Agent","description":"Platform staff only. The editor loads and saves SOURCE text.","operationId":"agents_patch_agent","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentPatchIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agents Patch Agent"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/support/messages":{"post":{"tags":["support"],"summary":"Create Support Message","description":"Take a message and hand it to a human. 202, never 200 — see below.","operationId":"support_create_support_message","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupportMessageIn"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Support Create Support Message"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/skills":{"head":{"tags":["skills"],"summary":"List Skills","description":"PUBLIC catalogue. No auth, no plan.\n\n⚠️ Call it WITHOUT credentials: the response carries `ACAO: *` and no\n`Allow-Credentials`, so a cookie makes the browser discard it with no usable\nerror.","operationId":"skills_list_skills","parameters":[{"name":"schema_version","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Schema Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Skills List Skills"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["skills"],"summary":"List Skills","description":"PUBLIC catalogue. No auth, no plan.\n\n⚠️ Call it WITHOUT credentials: the response carries `ACAO: *` and no\n`Allow-Credentials`, so a cookie makes the browser discard it with no usable\nerror.","operationId":"skills_list_skills_2","parameters":[{"name":"schema_version","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Schema Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Skills List Skills"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/skills/{skill_id}":{"head":{"tags":["skills"],"summary":"Get Skill","description":"The SKILL.md — API key OR user session, and a paid plan.\n\nTakes an API key because that is how the CLI authenticates; requiring a user\nsession made agent installation impossible until it was fixed.","operationId":"skills_get_skill","parameters":[{"name":"skill_id","in":"path","required":true,"schema":{"type":"string","title":"Skill Id"}},{"name":"schema_version","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Schema Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Skills Get Skill"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["skills"],"summary":"Get Skill","description":"The SKILL.md — API key OR user session, and a paid plan.\n\nTakes an API key because that is how the CLI authenticates; requiring a user\nsession made agent installation impossible until it was fixed.","operationId":"skills_get_skill_2","parameters":[{"name":"skill_id","in":"path","required":true,"schema":{"type":"string","title":"Skill Id"}},{"name":"schema_version","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Schema Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Skills Get Skill"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["skills"],"summary":"Patch Skill","description":"Platform staff only. The editor loads and saves SOURCE text.","operationId":"skills_patch_skill","parameters":[{"name":"skill_id","in":"path","required":true,"schema":{"type":"string","title":"Skill Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillPatchIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Skills Patch Skill"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs":{"get":{"tags":["organizations"],"summary":"List Orgs","operationId":"organizations_list_orgs","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgListOut"}}}}}},"post":{"tags":["organizations"],"summary":"Create Org","operationId":"organizations_create_org","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgCreateIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}":{"delete":{"tags":["organizations"],"summary":"Delete Org","description":"Owner-only soft-delete of an org + cascade.\n\nGuard-rail: an org that is still being billed cannot be deleted → 409\n`active_subscription`; cancel or downgrade to Free first. \"Billed\" spans the\nmain plan (`plan != free` with a LIVE Stripe/MoR sub) AND any active paid\nadd-on (feedback / in-context).\nOtherwise the org is soft-deleted and cascaded (projects soft-deleted,\npending invitations revoked, dedicated Bunny zones deprovisioned). The\ndefinitive purge of keys/translations/releases + membership rows runs in a\nbackground job. Success = 204.","operationId":"organizations_delete_org","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["organizations"],"summary":"Get Org","description":"Org detail with month-to-date CDN usage embedded.","operationId":"organizations_get_org","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgDetailOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/usage/summary":{"get":{"tags":["organizations"],"summary":"Get Usage Summary","description":"Current-period MCP consumption snapshot for client-admin.\n\nPeriod is the calendar month in UTC. Counters come from Redis (fail-open\nto zero on cache errors); caps come from `effective_limits` (plan\ndefaults + per-org overrides).","operationId":"organizations_get_usage_summary","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgUsageSummaryOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/usage/timeseries":{"get":{"tags":["organizations"],"summary":"Get Usage Timeseries","description":"Daily aggregates from `usage_events` for the consumption chart.\n\nBuckets by calendar date in the requested IANA timezone (DST-aware via\nMongo's `$dateToString` `timezone` arg). Returns exactly `days` points,\nzero-filling any date with no events. p95 latency is computed via\nMongo's t-digest `$percentile` aggregator.","operationId":"organizations_get_usage_timeseries","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":30,"title":"Days"}},{"name":"tz","in":"query","required":false,"schema":{"type":"string","description":"IANA timezone (e.g. America/Toronto)","default":"UTC","title":"Tz"},"description":"IANA timezone (e.g. America/Toronto)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgUsageTimeseriesOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/usage/events":{"get":{"tags":["organizations"],"summary":"List Usage Events","description":"Paginated, filterable MCP call log for the Activity Log page.\n\nOrdered ts DESC with `uuid` as a stable tiebreak. Cursor pagination\nvia opaque `base64(ts_iso|uuid)`. Org owners/admins see every row;\nplain members are scoped to their own `user_uuid` server-side — a\nmember querying another user's rows gets an empty page rather than\na 403 (parity with the chart endpoints).","operationId":"organizations_list_usage_events","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"cmd","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cmd"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"enum":["read","write","bulk","ai"],"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"status_class","in":"query","required":false,"schema":{"anyOf":[{"enum":["2xx","4xx","5xx"],"type":"string"},{"type":"null"}],"title":"Status Class"}},{"name":"from_ts","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"From Ts"}},{"name":"to_ts","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"To Ts"}},{"name":"token_uuid","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token Uuid"}},{"name":"user_uuid","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Uuid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgUsageEventsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/usage/cdn":{"get":{"tags":["organizations"],"summary":"Get Cdn Usage","description":"Month-to-date CDN bytes egress + plan-cap percentage for this org.","operationId":"organizations_get_cdn_usage","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgCdnUsageOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/usage/cdn/timeseries":{"get":{"tags":["organizations"],"summary":"Get Cdn Usage Timeseries","description":"Exact per-day CDN egress + storage (GB) for the org, last `days` days.\n\nBilling-grade history from `cdn_usage_daily` (task 916) — zero-filled,\noldest→newest. Pass `project_id` to scope to one project. Both dimensions\nare returned: bandwidth (metered/pay-as-you-go) and storage (snapshot).","operationId":"organizations_get_cdn_usage_timeseries","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"project_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"scope the series to a single project","title":"Project Id"},"description":"scope the series to a single project"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgCdnTimeseriesOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/usage/quota":{"get":{"tags":["organizations"],"summary":"Get Quota Usage","description":"Per-org quota usage across the three billable dimensions (task 917).\n\n`strings` = variant-counts-as-string total (base keys + overlay values +\nsurface overrides + plural extras) vs the per-tier keys cap → `signal`\n`upgrade_required` when over. `storage_gb`/`bandwidth_gb` = CDN usage vs the\nincluded quota → `signal` `metered_overage` when over (distinct path: CDN\noverflow is pay-as-you-go, strings overflow is a hard tier change).","operationId":"organizations_get_quota_usage","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgQuotaUsageOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/cdn-overage-mode":{"get":{"tags":["organizations"],"summary":"Get Cdn Overage Mode","description":"Read the org's CDN overage handling (task 918). `pay_as_you_go` (default)\nmeters the excess; `hard_cap` blocks new key-create/publish once STORAGE is\nover quota (bandwidth always meters either way).","operationId":"organizations_get_cdn_overage_mode","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CdnOverageModeOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["organizations"],"summary":"Set Cdn Overage Mode","description":"Set the org's CDN overage mode (owner/admin only). Switching to\n`hard_cap` opts into blocking new writes when storage is over the included\nquota; `pay_as_you_go` reverts to metered overage.","operationId":"organizations_set_cdn_overage_mode","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CdnOverageModeIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CdnOverageModeOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/usage/all":{"get":{"tags":["organizations"],"summary":"Get Usage All","description":"One call for the Billing → Usage tab: CDN/storage + MCP usage (+ limits)\n+ current AI-credit balance.","operationId":"organizations_get_usage_all","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgUsageAllOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/security":{"get":{"tags":["organizations"],"summary":"Get Security Policy","description":"The org's security policy (any member may read it).","operationId":"organizations_get_security_policy","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecurityPolicyOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["organizations"],"summary":"Set Security Policy","description":"Set the org 2FA requirement (admin/owner). Anti-lockout: an admin turning\nit ON must already have 2FA on their OWN account, else they'd lock themselves\nout on the very next request.","operationId":"organizations_set_security_policy","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecurityPolicyIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecurityPolicyOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/members":{"get":{"tags":["memberships"],"summary":"List Members","operationId":"memberships_list_members","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Set to 'project_roles' to attach each member's per-project roles (explicit + inherited). Requires org admin/owner.","title":"Include"},"description":"Set to 'project_roles' to attach each member's per-project roles (explicit + inherited). Requires org admin/owner."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberListOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["memberships"],"summary":"Add Member","operationId":"memberships_add_member","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberAddIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/members/{user_id}":{"patch":{"tags":["memberships"],"summary":"Update Member","operationId":"memberships_update_member","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberPatchIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["memberships"],"summary":"Remove Member","operationId":"memberships_remove_member","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/members/me":{"delete":{"tags":["memberships"],"summary":"Leave Org","description":"Self-leave: any member (including a plain `member`) removes their OWN\nmembership — no admin gate. The last owner cannot leave (would orphan the\norg) → 409 `last_owner`: transfer ownership or delete the org first.\nAlso drops the caller's project_members rows in this org.","operationId":"memberships_leave_org","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["memberships"],"summary":"My Membership","description":"The caller's own membership (org role + status). Any member may read it;\nwith ?include=project_roles it also carries THEIR per-project roles, resolved\nby the exact same rules as the admin list (so a non-admin member opening their\nown /team card sees the same shape). A suspended caller is denied here like\neverywhere else — org_role() resolves suspended to None.","operationId":"memberships_my_membership","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Set to 'project_roles' to attach the caller's OWN per-project roles (explicit rows + inherited owner/admin). No admin gate — self-read.","title":"Include"},"description":"Set to 'project_roles' to attach the caller's OWN per-project roles (explicit rows + inherited owner/admin). No admin gate — self-read."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/members/{user_id}/suspend":{"post":{"tags":["memberships"],"summary":"Suspend Member","description":"Org-scoped suspension (admin+). The member keeps their data but is denied\nall org/project access immediately (rbac.org_role -> None). Owner-only to\nsuspend an admin/owner; cannot suspend yourself or the last active owner.","operationId":"memberships_suspend_member","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/members/{user_id}/reactivate":{"post":{"tags":["memberships"],"summary":"Reactivate Member","description":"Reverse a suspension (admin+; owner-only for an admin/owner target).","operationId":"memberships_reactivate_member","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/members/{user_id}/transfer-ownership":{"post":{"tags":["memberships"],"summary":"Transfer Ownership","description":"Cede ownership to `user_id` (owner-only): the target becomes owner and the\ncaller (current owner) steps down to admin. Atomic-in-order: promote the new\nowner FIRST so the org is never left without one, then demote the caller.","operationId":"memberships_transfer_ownership","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransferOwnershipOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/members/{user_id}/project-roles":{"put":{"tags":["memberships"],"summary":"Set Member Project Roles","description":"DECLARATIVELY set a member's EXPLICIT per-project roles (admin+). The given\nlist becomes the member's explicit project_members rows: listed entries are\nupserted, and any explicit row for one of THIS org's projects that is not in\nthe list is REMOVED. Never touches inherited owner/admin access (not rows).\n`owner` entries require the caller to be an org owner.","operationId":"memberships_set_member_project_roles","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetProjectRolesIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetProjectRolesOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/domains":{"get":{"tags":["org-domains"],"summary":"List Domains","operationId":"org_domains_list_domains","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DomainListOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["org-domains"],"summary":"Add Domain","description":"Register a domain for verification (admin/owner). Refuses public webmail\ndomains. Returns the DNS TXT record the admin must publish to verify.","operationId":"org_domains_add_domain","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DomainCreateIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DomainOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/domains/{domain}/verify":{"post":{"tags":["org-domains"],"summary":"Verify Domain","description":"Check the DNS TXT record and mark the domain verified (admin/owner).","operationId":"org_domains_verify_domain","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}},{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DomainOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/domains/{domain}":{"delete":{"tags":["org-domains"],"summary":"Remove Domain","operationId":"org_domains_remove_domain","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}},{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/audit":{"get":{"tags":["audit"],"summary":"List Org Audit","description":"Audit events for this org, newest first. The (target_type, target_id)\npair acts as the per-resource timeline (history of a key/project/member).","operationId":"audit_list_org_audit","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"project_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"filter to one project","title":"Project Id"},"description":"filter to one project"},{"name":"event","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"exact event name, e.g. key.created","title":"Event"},"description":"exact event name, e.g. key.created"},{"name":"actor_user_uuid","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"filter by actor user uuid","title":"Actor User Uuid"},"description":"filter by actor user uuid"},{"name":"actor_api_key_uuid","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"filter by actor API-key uuid (service accounts)","title":"Actor Api Key Uuid"},"description":"filter by actor API-key uuid (service accounts)"},{"name":"target_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"resource type; with target_id = per-resource timeline","title":"Target Type"},"description":"resource type; with target_id = per-resource timeline"},{"name":"target_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"resource uuid; with target_type = per-resource timeline","title":"Target Id"},"description":"resource uuid; with target_type = per-resource timeline"},{"name":"approval_kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"filter approvals by kind: service | human","title":"Approval Kind"},"description":"filter approvals by kind: service | human"},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"From"}},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"To"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgAuditPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/audit":{"get":{"tags":["audit"],"summary":"List Project Audit","description":"Audit events for ONE project, newest first. ProjectAdmin-gated, so a\nproject admin (not necessarily an org admin) reads their own project's\ntrail — imports (i18next.import) and service approvals included. Hard-scoped\nto the resolved org + project: cross-project reads are impossible.","operationId":"audit_list_project_audit","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"event","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"exact event name, e.g. i18next.import","title":"Event"},"description":"exact event name, e.g. i18next.import"},{"name":"actor_user_uuid","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"filter by actor user uuid","title":"Actor User Uuid"},"description":"filter by actor user uuid"},{"name":"actor_api_key_uuid","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"filter by actor API-key uuid (service accounts)","title":"Actor Api Key Uuid"},"description":"filter by actor API-key uuid (service accounts)"},{"name":"target_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"resource type; with target_id = per-resource timeline","title":"Target Type"},"description":"resource type; with target_id = per-resource timeline"},{"name":"target_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"resource uuid; with target_type = per-resource timeline","title":"Target Id"},"description":"resource uuid; with target_type = per-resource timeline"},{"name":"approval_kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"filter approvals by kind: service | human","title":"Approval Kind"},"description":"filter approvals by kind: service | human"},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"From"}},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"To"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgAuditPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/activity":{"get":{"tags":["activity"],"summary":"Org Activity","description":"Unified org activity feed (OrgAdmin). `kind` = all|audit|translation.","operationId":"activity_org_activity","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"kind","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Kind"}},{"name":"project_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id"}},{"name":"actor_user_uuid","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor User Uuid"}},{"name":"change_source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Change Source"}},{"name":"event","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event"}},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"From"}},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/api-keys/mintable-scopes":{"get":{"tags":["api-keys"],"summary":"Mintable Scopes","description":"The scopes THIS caller may actually mint — read it, do not restate it.\n\nA key-creation form that hard-codes the scope list drifts the moment the\nceiling moves: client-admin's was already offering 7 of the 10 the API\naccepts, an omission indistinguishable from a deliberate display list. Mirror\nthis endpoint instead.","operationId":"api_keys_mintable_scopes","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"project_id","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"description":"Projects the key would act on. Repeat for several. A non-admin's ceiling is the INTERSECTION across them, so pass exactly what the form has selected.","title":"Project Id"},"description":"Projects the key would act on. Repeat for several. A non-admin's ceiling is the INTERSECTION across them, so pass exactly what the form has selected."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MintableScopesOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/api-keys":{"post":{"tags":["api-keys"],"summary":"Create Api Key","description":"Create an API key. Org admins/owners: unchanged. A plain MEMBER may now\nmint their OWN key (task 1851) — strictly self-scoped: never a scope beyond\ntheir access, and never org-wide.","operationId":"api_keys_create_api_key","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreateIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["api-keys"],"summary":"List Api Keys","description":"Admins/owners see every key in the org; a MEMBER sees only their own.\n\nOpening this to members is not a convenience: they can now mint keys, and a\ncredential its holder can neither inspect nor revoke is a security problem.\nThe filter is on `created_by_uuid`, so no member ever sees another's key.","operationId":"api_keys_list_api_keys","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyListOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/api-keys/{key_id}":{"get":{"tags":["api-keys"],"summary":"Get Api Key","description":"Own key for a member, any for an admin.","operationId":"api_keys_get_api_key","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["api-keys"],"summary":"Update Api Key","description":"Admins may edit any key in the org. A MEMBER may rename their OWN key —\nand nothing else.\n\nWHY NAME-ONLY, and why this is not a one-liner: `ApiKeyPatchIn` can change\n`scopes`. Opening PATCH to a key's owner without replaying the mint ceiling\nwould let a member create a legitimate `mcp:*` key and then PATCH it to\n`project:write` — a back-door escalation past a create endpoint that refuses\nexactly that. `name` is the only field with no vector, and it is the real\nmember need: finding your own key again.\n\n`env_type` and the allowlists are refused too, not because renaming is risky\nbut because `dev` keys reach the runtime endpoint under allowlist control —\nunreviewed reach is reach. Changing a key's PROJECTS stays admin-only on its\nown route, which would otherwise bypass `not_a_member_of_project`.","operationId":"api_keys_update_api_key","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyPatchIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["api-keys"],"summary":"Revoke Api Key","operationId":"api_keys_revoke_api_key","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/api-keys/{key_id}/projects":{"post":{"tags":["api-keys"],"summary":"Add Api Key Projects","operationId":"api_keys_add_api_key_projects","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyAddProjectsIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/api-keys/{key_id}/projects/{project_id}":{"delete":{"tags":["api-keys"],"summary":"Remove Api Key Project","operationId":"api_keys_remove_api_key_project","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"allow_org_wide","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Allow Org Wide"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/invitations":{"post":{"tags":["invitations"],"summary":"Create Invitation","operationId":"invitations_create_invitation","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationCreateIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationCreateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["invitations"],"summary":"List Invitations","operationId":"invitations_list_invitations","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationListOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/invitations/batch":{"post":{"tags":["invitations"],"summary":"Create Invitations Batch","description":"Invite up to 100 emails at once with a common org role + common per-project\nroles (task #2089). Best-effort against the seat cap: emails are invited in\norder until the cap is hit, the rest returned `skipped: seat_limit`. Reuses\nthe single-invite logic; results are reported per email. No tokens in the\nresponse — accept links go by email.\n\nFail-fast (whole request): a bad org/project role → 403/422 before anything\nis created. Non-fatal per email: already a member / already invited / a\nduplicate in the payload → skipped.","operationId":"invitations_create_invitations_batch","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchInvitationCreateIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchInvitationOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/invitations/{invitation_id}/resend":{"post":{"tags":["invitations"],"summary":"Resend Invitation","operationId":"invitations_resend_invitation","parameters":[{"name":"invitation_id","in":"path","required":true,"schema":{"type":"string","title":"Invitation Id"}},{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationCreateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/invitations/{invitation_id}":{"delete":{"tags":["invitations"],"summary":"Revoke Invitation","operationId":"invitations_revoke_invitation","parameters":[{"name":"invitation_id","in":"path","required":true,"schema":{"type":"string","title":"Invitation Id"}},{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/invitations/lookup":{"get":{"tags":["invitations"],"summary":"Lookup","operationId":"invitations_lookup","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","minLength":10,"maxLength":200,"title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationLookupOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/invitations/accept":{"post":{"tags":["invitations"],"summary":"Accept","operationId":"invitations_accept","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationAcceptIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationAcceptOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/projects":{"get":{"tags":["projects"],"summary":"List Projects","operationId":"projects_list_projects","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectListOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["projects"],"summary":"Create Project","operationId":"projects_create_project","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectCreateIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/projects/{project_id}":{"get":{"tags":["projects"],"summary":"Get Project","operationId":"projects_get_project","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["projects"],"summary":"Update Project","operationId":"projects_update_project","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectPatchIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["projects"],"summary":"Delete Project","operationId":"projects_delete_project","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/projects/{project_id}/source-language/preview":{"get":{"tags":["projects"],"summary":"Preview Source Language Change","description":"Dry-run a source_language switch to `target`: how many live keys would be\nleft with an EMPTY source (no non-empty value in the target language). The\nUI warns + requires explicit confirm; the switch itself never hard-blocks.","operationId":"projects_preview_source_language_change","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"target","in":"query","required":true,"schema":{"type":"string","description":"Candidate new source language code","title":"Target"},"description":"Candidate new source language code"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceLanguagePreviewOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/projects/{project_id}/distribution":{"get":{"tags":["projects"],"summary":"Get Distribution","description":"Self-describing publication info: CDN base URL + url_template, the\nproduction version, the latest published bundle per (language, namespace)\nwith ready-to-fetch URLs, and a publish summary (incl. unpublished gaps).\nSo an agent never has to guess the CDN host. Read-only (viewer+); accepts\na user JWT OR an API key with project:read.","operationId":"projects_get_distribution","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DistributionOut"},"example":{"project_uuid":"<project-uuid>","cdn":{"configured":true,"base_url":"https://cdn.sonenta.com","url_template":"https://cdn.sonenta.com/p/{project}/{version_slug}/latest/{lang}/{namespace}.json"},"production_version":{"version_uuid":"<version-uuid>","slug":"main"},"bundles":[{"language_code":"fr","namespace_slug":"common","version_hash":"bf7b22d80a9d","status":"ready","published_at":"2026-06-22T00:00:00Z","public_url":"https://cdn.sonenta.com/p/<project>/main/v/bf7b22d80a9d/fr/common.json","latest_url":"https://cdn.sonenta.com/p/<project>/main/latest/fr/common.json"}],"summary":{"total_bundles":1,"last_published_at":"2026-06-22T00:00:00Z","languages":["en","fr"],"namespaces":["common"],"unpublished":[{"language_code":"en","namespace_slug":"common"}]}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/context":{"get":{"tags":["project-context"],"summary":"Get Context","operationId":"project_context_get_context","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContextOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["project-context"],"summary":"Put Context","operationId":"project_context_put_context","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContextIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContextOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/context/history":{"get":{"tags":["project-context"],"summary":"List Context History","description":"Every version of the context document, newest first (Viewer+). Content is\nomitted here — fetch a single version for the full text. `changed_by` is\nresolved (user or agent key), never a bare uuid.","operationId":"project_context_list_context_history","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContextVersionsPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/context/history/{version}":{"get":{"tags":["project-context"],"summary":"Get Context Version","description":"One version with its full content (Viewer+). Unknown version -> 404.","operationId":"project_context_get_context_version","parameters":[{"name":"version","in":"path","required":true,"schema":{"type":"integer","title":"Version"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContextVersionDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/context/diff":{"get":{"tags":["project-context"],"summary":"Diff Context","description":"Diff two versions (Viewer+); omit `to` to diff against the current document.\nReturns both contents plus a server-computed unified diff. Unknown version -> 404.","operationId":"project_context_diff_context","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"from","in":"query","required":true,"schema":{"type":"integer","minimum":1,"title":"From"}},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"title":"To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContextDiffOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/knowledge-status":{"get":{"tags":["project-context"],"summary":"Knowledge Status","operationId":"project_context_knowledge_status","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeStatusOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/context/sections":{"get":{"tags":["project-context"],"summary":"List Sections","description":"The context sections, ordered by position (Viewer+). LIGHT — no bodies, so\nthe list stays cheap in tokens; fetch a single section for its body. Pass\n`language` to get the effective context for a target language in one call.","operationId":"project_context_list_sections","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"language","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Return only sections that APPLY to this target language — the all-languages sections PLUS this code's (the effective context).","title":"Language"},"description":"Return only sections that APPLY to this target language — the all-languages sections PLUS this code's (the effective context)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SectionsListOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["project-context"],"summary":"Create Section","description":"Add a context section (ContextWriter — context:write). Records the section's v1 history and\nrecomputes the derived context_document mirror.","operationId":"project_context_create_section","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SectionIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SectionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/context/sections/search":{"get":{"tags":["project-context"],"summary":"Search Sections","description":"Substring search over title + body (Viewer+); returns light rows + a snippet.","operationId":"project_context_search_sections","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"substring on title + body","title":"Q"},"description":"substring on title + body"},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}},{"name":"language","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"sections applying to this code","title":"Language"},"description":"sections applying to this code"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SectionsSearchOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/context/sections/{section_id}":{"get":{"tags":["project-context"],"summary":"Get Section","operationId":"project_context_get_section","parameters":[{"name":"section_id","in":"path","required":true,"schema":{"type":"string","title":"Section Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SectionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["project-context"],"summary":"Update Section","operationId":"project_context_update_section","parameters":[{"name":"section_id","in":"path","required":true,"schema":{"type":"string","title":"Section Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SectionPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SectionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["project-context"],"summary":"Delete Section","operationId":"project_context_delete_section","parameters":[{"name":"section_id","in":"path","required":true,"schema":{"type":"string","title":"Section Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/context/sections/reorder":{"post":{"tags":["project-context"],"summary":"Reorder Sections","description":"Set the section order (ContextWriter — context:write). Reorder is metadata — it recomputes\nthe assembly/mirror but writes no history row.","operationId":"project_context_reorder_sections","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SectionReorderIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SectionsListOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/context/sections/{section_id}/history":{"get":{"tags":["project-context"],"summary":"Section History","description":"Full history of ONE section (Viewer+), newest first, actor resolved. Works\nafter the section was deleted.","operationId":"project_context_section_history","parameters":[{"name":"section_id","in":"path","required":true,"schema":{"type":"string","title":"Section Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Project Context Section History"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/context/sections/{section_id}/history/{version}":{"get":{"tags":["project-context"],"summary":"Section Version","operationId":"project_context_section_version","parameters":[{"name":"section_id","in":"path","required":true,"schema":{"type":"string","title":"Section Id"}},{"name":"version","in":"path","required":true,"schema":{"type":"integer","title":"Version"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Project Context Section Version"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/context/sections/{section_id}/revert":{"post":{"tags":["project-context"],"summary":"Revert Section","description":"Restore a section to an earlier version (ContextWriter — context:write) — via the normal\nwrite path (a new history row, never destructive). Re-creates it if deleted.\nUnknown version -> 404.","operationId":"project_context_revert_section","parameters":[{"name":"section_id","in":"path","required":true,"schema":{"type":"string","title":"Section Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SectionRevertIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SectionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/members":{"get":{"tags":["project-members"],"summary":"List Members","description":"Combined view: explicit project_members rows + org owners/admins shown as inherited.","operationId":"project_members_list_members","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectMemberListOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["project-members"],"summary":"Add Member","operationId":"project_members_add_member","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectMemberAddIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectMemberOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/members/{user_id}":{"patch":{"tags":["project-members"],"summary":"Update Member","operationId":"project_members_update_member","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectMemberPatchIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectMemberOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["project-members"],"summary":"Remove Member","operationId":"project_members_remove_member","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/members/me":{"get":{"tags":["project-members"],"summary":"My Membership","operationId":"project_members_my_membership","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectMemberOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/versions":{"get":{"tags":["project-versions"],"summary":"List Versions","operationId":"project_versions_list_versions","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionListOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["project-versions"],"summary":"Create Version","operationId":"project_versions_create_version","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionCreateIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/versions/{version_id}":{"get":{"tags":["project-versions"],"summary":"Get Version","description":"Version metadata, resolved by uuid OR slug (task 738).\n\nReturns `is_dev` + `realtime_channel` so an SDK knows whether to open a\nlive subscription (dev) or rely on the static CDN bundle (published).","operationId":"project_versions_get_version","parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"string","title":"Version Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["project-versions"],"summary":"Delete Version","operationId":"project_versions_delete_version","parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"string","title":"Version Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/versions/{version_id}/clone":{"post":{"tags":["project-versions"],"summary":"Clone Version","description":"Convenience alias: clones THIS version into a new one. Equivalent to\n`POST /versions {name, slug, parent_version_uuid: <version_id>}`.","operationId":"project_versions_clone_version","parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"string","title":"Version Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionCloneIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/versions/{version_id}/promote":{"post":{"tags":["project-versions"],"summary":"Promote Version","operationId":"project_versions_promote_version","parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"string","title":"Version Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/versions/{version_id}/diff":{"get":{"tags":["project-versions"],"summary":"Diff Versions","description":"Read-only diff: `{version_id}` (subject) vs `against` (baseline). `added` =\nkeys present in the subject but not the baseline; `removed` = vice-versa;\n`modified` = present in both with >=1 differing translation (value/status/\nplural_forms). For modified keys, `from` is the baseline state, `to` the subject.","operationId":"project_versions_diff_versions","parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"string","title":"Version Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"against","in":"query","required":true,"schema":{"type":"string","description":"The baseline version uuid or slug to compare against.","title":"Against"},"description":"The baseline version uuid or slug to compare against."},{"name":"namespace","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Limit to one namespace slug.","title":"Namespace"},"description":"Limit to one namespace slug."},{"name":"language","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Limit to one language code.","title":"Language"},"description":"Limit to one language code."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiffOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/versions/{version_id}/merge":{"post":{"tags":["project-versions"],"summary":"Merge Version","description":"Merge SOURCE (`{version_id}`) into TARGET (`into`, default = production).\nUPSERTs translations with the chosen `strategy`; never deletes. `dry_run`\nreturns the report without writing (preview).","operationId":"project_versions_merge_version","parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"string","title":"Version Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MergeIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MergeReport"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/languages":{"get":{"tags":["languages"],"summary":"List Language Catalog","operationId":"languages_list_language_catalog","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Case-insensitive substring match on code / english_name / native_name.","title":"Q"},"description":"Case-insensitive substring match on code / english_name / native_name."},{"name":"rtl","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by text direction.","title":"Rtl"},"description":"Filter by text direction."},{"name":"script","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Exact ISO 15924 script, e.g. Arab.","title":"Script"},"description":"Exact ISO 15924 script, e.g. Arab."},{"name":"is_variant","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"True = regional/script variants only; False = base languages.","title":"Is Variant"},"description":"True = regional/script variants only; False = base languages."},{"name":"parent_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Variants of this base language, e.g. parent_code=fr.","title":"Parent Code"},"description":"Variants of this base language, e.g. parent_code=fr."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":1000,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LanguageCatalogOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/languages/plural-categories":{"get":{"tags":["languages"],"summary":"Bulk Plural Categories","description":"CLDR-authoritative (babel) required plural categories for several\nlanguages at once (task 1619). Category order is stable (CLDR:\nzero, one, two, few, many, other).","operationId":"languages_bulk_plural_categories","parameters":[{"name":"codes","in":"query","required":true,"schema":{"type":"string","description":"Comma-separated BCP-47 codes, e.g. ru,ar,fr","title":"Codes"},"description":"Comma-separated BCP-47 codes, e.g. ru,ar,fr"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PluralCategoriesBulkOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/languages/{code}/plural-categories":{"get":{"tags":["languages"],"summary":"Language Plural Categories","description":"CLDR-authoritative (babel) required plural categories for one language —\nwhich forms a translation of a `plurals=true` key must supply (task 1619).","operationId":"languages_language_plural_categories","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PluralCategoriesOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/languages/{code}":{"get":{"tags":["languages"],"summary":"Get Language","description":"Look up a single catalog entry by BCP-47 code. The code is normalised\nfirst, so `fr-ca` resolves the same row as `fr-CA`.","operationId":"languages_get_language","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LanguageCatalogItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/languages":{"get":{"tags":["languages"],"summary":"List Languages","operationId":"languages_list_languages","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Accepted for parity with version-aware list endpoints. Languages are project-scoped, so the param only validates the version exists; it does not narrow the result.","title":"Version Id"},"description":"Accepted for parity with version-aware list endpoints. Languages are project-scoped, so the param only validates the version exists; it does not narrow the result."},{"name":"with_status_breakdown","in":"query","required":false,"schema":{"type":"boolean","description":"When true, each language's `completion.status_breakdown` is populated with per-status counts (translated/reviewed/approved/draft/missing/total) matching the coverage page. Opt-in: it runs the coverage computation, so the default list stays cheap.","default":false,"title":"With Status Breakdown"},"description":"When true, each language's `completion.status_breakdown` is populated with per-status counts (translated/reviewed/approved/draft/missing/total) matching the coverage page. Opt-in: it runs the coverage computation, so the default list stays cheap."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LanguageListOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["languages"],"summary":"Create Language","operationId":"languages_create_language","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LanguageCreateIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LanguageOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/languages/{language_id}":{"patch":{"tags":["languages"],"summary":"Update Language","operationId":"languages_update_language","parameters":[{"name":"language_id","in":"path","required":true,"schema":{"type":"string","title":"Language Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LanguagePatchIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LanguageOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["languages"],"summary":"Delete Language","operationId":"languages_delete_language","parameters":[{"name":"language_id","in":"path","required":true,"schema":{"type":"string","title":"Language Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/namespaces":{"get":{"tags":["namespaces"],"summary":"List Namespaces","operationId":"namespaces_list_namespaces","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Accepted for parity with version-aware list endpoints. Namespaces are project-scoped, so the param only validates the version exists; it does not narrow the result.","title":"Version Id"},"description":"Accepted for parity with version-aware list endpoints. Namespaces are project-scoped, so the param only validates the version exists; it does not narrow the result."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NamespaceListOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["namespaces"],"summary":"Create Namespace","operationId":"namespaces_create_namespace","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes__namespaces__NamespaceCreateIn"},"example":{"slug":"common","name":"Common"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NamespaceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/namespaces/{namespace_id}":{"patch":{"tags":["namespaces"],"summary":"Update Namespace","operationId":"namespaces_update_namespace","parameters":[{"name":"namespace_id","in":"path","required":true,"schema":{"type":"string","title":"Namespace Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NamespacePatchIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NamespaceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["namespaces"],"summary":"Delete Namespace","operationId":"namespaces_delete_namespace","parameters":[{"name":"namespace_id","in":"path","required":true,"schema":{"type":"string","title":"Namespace Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/agent-sessions":{"get":{"tags":["agent-observability"],"summary":"List Agent Sessions","operationId":"agent_observability_list_agent_sessions","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(running|ended)$"},{"type":"null"}],"title":"Status"}},{"name":"agent","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Agent"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionListOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/agent-sessions/{session_id}":{"get":{"tags":["agent-observability"],"summary":"Get Agent Session","operationId":"agent_observability_get_agent_session","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes__agent_observability__SessionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/agent-sessions/{session_id}/events":{"get":{"tags":["agent-observability"],"summary":"List Agent Session Events","operationId":"agent_observability_list_agent_session_events","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"after_seq","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"After Seq"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventListOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/agent-human-needed":{"get":{"tags":["agent-observability"],"summary":"List Agent Human Needed","operationId":"agent_observability_list_agent_human_needed","deprecated":true,"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(open|resolved|dismissed)$"},{"type":"null"}],"default":"open","title":"Status"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HumanNeededListOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/agent-human-needed/{human_needed_id}/resolve":{"post":{"tags":["agent-observability"],"summary":"Resolve Agent Human Needed","operationId":"agent_observability_resolve_agent_human_needed","deprecated":true,"parameters":[{"name":"human_needed_id","in":"path","required":true,"schema":{"type":"string","title":"Human Needed Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/next-actions":{"get":{"tags":["next-actions"],"summary":"Get Next Actions","operationId":"next_actions_get_next_actions","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}},{"name":"language","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"}},{"name":"include_prompts","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Prompts"}},{"name":"min_severity","in":"query","required":false,"schema":{"type":"string","pattern":"^(info|warning|error)$","default":"info","title":"Min Severity"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NextActionsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/prompts/catalogue":{"get":{"tags":["next-actions"],"summary":"Prompt Catalogue","description":"The canonical prompt catalogue the DIWYA panels read: WHICH prompts exist\n+ their i18n_key (localized text is rendered dashboard-side via that key).","operationId":"next_actions_prompt_catalogue","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"section","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Section"}},{"name":"subsection","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subsection"}},{"name":"tier","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"}},{"name":"phase","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phase"}},{"name":"enabled","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogueOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/prompts/resolve":{"get":{"tags":["next-actions"],"summary":"Resolve Diwya Prompt","operationId":"next_actions_resolve_diwya_prompt","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"section","in":"query","required":true,"schema":{"type":"string","title":"Section"}},{"name":"subsection","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subsection"}},{"name":"tier","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"}},{"name":"phase","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phase"}},{"name":"language","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"}},{"name":"namespace","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace"}},{"name":"count","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Count"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiwyaResolveOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/prompts/{category}/resolve":{"get":{"tags":["next-actions"],"summary":"Resolve Prompt","operationId":"next_actions_resolve_prompt","parameters":[{"name":"category","in":"path","required":true,"schema":{"type":"string","title":"Category"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"language","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"}},{"name":"namespace","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace"}},{"name":"count","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Count"}},{"name":"deep_link","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deep Link"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolvePromptOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/prompts":{"get":{"tags":["prompts"],"summary":"Org List","operationId":"prompts_org_list","parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"enabled","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"}},{"name":"section","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Section"}},{"name":"subsection","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subsection"}},{"name":"tier","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"}},{"name":"phase","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phase"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromptListOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["prompts"],"summary":"Org Create","operationId":"prompts_org_create","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromptCreateIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromptDetailOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/prompts/{key}":{"get":{"tags":["prompts"],"summary":"Org Get","operationId":"prompts_org_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromptDetailOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["prompts"],"summary":"Org Update","operationId":"prompts_org_update","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromptPatchIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromptDetailOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["prompts"],"summary":"Org Delete","operationId":"prompts_org_delete","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Prompts Org Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/task-types":{"get":{"tags":["task-types"],"summary":"List Task Types","description":"The task-type catalogue (any authenticated user). Each row carries the\n`i18n_key` the console uses to localize task titles.","operationId":"task_types_list_task_types","parameters":[{"name":"enabled","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskTypeListOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/keys":{"get":{"tags":["keys"],"summary":"List Keys","operationId":"keys_list_keys","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"namespace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by version uuid. Omitted = production version.","title":"Version Id"},"description":"Filter by version uuid. Omitted = production version."},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"enum":["active","archived"],"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"filter by key type(s) (repeatable)","title":"Type"},"description":"filter by key type(s) (repeatable)"},{"name":"analysis","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"task 1827 — drill down into ONE a11y detection compartment: never_analyzed (no scan ever saw it) | analyzed_not_candidate (a scan saw it and it stayed plain text) | classified (a type was decided). Same definition the counts on GET /a11y/detection use.","title":"Analysis"},"description":"task 1827 — drill down into ONE a11y detection compartment: never_analyzed (no scan ever saw it) | analyzed_not_candidate (a scan saw it and it stayed plain text) | classified (a type was decided). Same definition the counts on GET /a11y/detection use."},{"name":"deleted","in":"query","required":false,"schema":{"type":"boolean","description":"true = list the trash (soft-deleted keys) instead of active ones","default":false,"title":"Deleted"},"description":"true = list the trash (soft-deleted keys) instead of active ones"},{"name":"orphan","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Code-occurrences ORPHAN filter. true = ONLY orphan keys (the scan FOUND them and they then DISAPPEARED — a `gone` occurrence and no present one), false = only non-orphans, absent = all. A key never seen by a scan is NOT an orphan. Server-side (injected into the key query) so `total` + cursor stay correct. Meaningful only when `measured` is true.","title":"Orphan"},"description":"Code-occurrences ORPHAN filter. true = ONLY orphan keys (the scan FOUND them and they then DISAPPEARED — a `gone` occurrence and no present one), false = only non-orphans, absent = all. A key never seen by a scan is NOT an orphan. Server-side (injected into the key query) so `total` + cursor stay correct. Meaningful only when `measured` is true."},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["keys"],"summary":"Create Key","operationId":"keys_create_key","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes__keys__KeyCreateIn"},"example":{"namespace_uuid":"<namespace-uuid>","name":"hero.title"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/keys/types":{"get":{"tags":["keys"],"summary":"Key Types","description":"Distinct key types PRESENT in the project (+ count), so the UI offers only\nexisting types — not the full taxonomy. Legacy keys without `type` count as text.","operationId":"keys_key_types","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}},{"name":"namespace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyTypesOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/keys/{key_id}":{"get":{"tags":["keys"],"summary":"Get Key","operationId":"keys_get_key","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["keys"],"summary":"Update Key","operationId":"keys_update_key","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyPatchIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["keys"],"summary":"Delete Key","description":"Soft-delete (move to trash). Restorable via POST /{key_id}/restore.\nHard removal is the separate, ProjectAdmin-only POST /bulk/purge.","operationId":"keys_delete_key","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/keys/{key_id}/a11y-signals":{"get":{"tags":["keys"],"summary":"Key A11Y Signals","description":"PER-KEY a11y signals for the detail panel: the agent's recommended treatments\n+ any source-language suggestion it produced (to pre-fill alt/aria/screen_reader/\nplain_language) + the cognitive score. Reuses already-computed data (the variant\noverride store + key.cognitive_*); no on-the-fly recompute. Falls back to type\ngating (recommended_treatments) when the agent produced nothing.","operationId":"keys_key_a11y_signals","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyA11ySignalsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/keys/bulk":{"post":{"tags":["keys"],"summary":"Create Keys Bulk","description":"Batch key create — idempotent, best-effort per item.\n\nItems referencing an unknown namespace (not in this project) or a\n(namespace, name) pair that repeats within the batch error per item;\nvalid items still commit. An item whose key already exists returns\n`created=false` (counted as `unchanged`). The plan key-cap is a\nwhole-batch gate: if the NEW keys would exceed the org cap the entire\ncall is rejected (403) before any write.","operationId":"keys_create_keys_bulk","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyBulkCreateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyBulkCreateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/keys/bulk/delete":{"post":{"tags":["keys"],"summary":"Delete Keys Bulk","description":"Batch SOFT-delete (move to trash) by key uuid — best-effort, idempotent.\nA key already in the trash returns `unchanged`. Unknown uuids (not in this\nproject) and intra-batch repeats error per item.","operationId":"keys_delete_keys_bulk","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyBulkIdsIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyBulkActionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/keys/bulk/restore":{"post":{"tags":["keys"],"summary":"Restore Keys Bulk","description":"Batch restore trashed keys — best-effort. A name conflict (an active key\nwith the same address now exists) is reported per item (status=error,\ncode=name_conflict) and skipped; it does NOT abort the batch.","operationId":"keys_restore_keys_bulk","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyBulkIdsIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyBulkActionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/keys/bulk/purge":{"post":{"tags":["keys"],"summary":"Purge Keys Bulk","description":"Batch HARD-delete (irreversible) — ProjectAdmin only. Purges ONLY keys\nthat are ALREADY in the trash (deleted_at set); an active key is refused\nper item (code=not_trashed) — you must trash before you purge. Cascades to\ntranslations + history.","operationId":"keys_purge_keys_bulk","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyBulkIdsIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyBulkActionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/keys/bulk/status":{"post":{"tags":["keys"],"summary":"Set Keys Status Bulk","description":"Batch archive / un-archive by key uuid (status = active|archived) —\nbest-effort, idempotent per item. An item already at the target status\nreturns `unchanged`. Unknown uuids and intra-batch repeats error per\nitem.","operationId":"keys_set_keys_status_bulk","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyBulkStatusIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyBulkActionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/keys/{key_id}/restore":{"post":{"tags":["keys"],"summary":"Restore Key","description":"Restore a trashed key. 409 if an active key with the same (namespace,\nname, version) was created while it was in the trash.","operationId":"keys_restore_key","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/keys/{key_id}/occurrences":{"get":{"tags":["keys"],"summary":"List Key Occurrences","description":"Every file that references THIS key, joined by stable key_uuid (Viewer+).\n\nThe per-key panel of the 'par fichier' translation view. 404 if the key does\nnot exist, so an empty list always means 'no known usage sites', never 'no\nsuch key'. `measured=false` means no scan has completed — 'never scanned', not\n'referenced nowhere'.","operationId":"keys_list_key_occurrences","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyOccurrencesOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/glossary":{"get":{"tags":["glossary"],"summary":"List Entries","operationId":"glossary_list_entries","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"enum":["term","dnt","forbidden"],"type":"string"},{"type":"null"}],"title":"Type"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"substring match on term","title":"Q"},"description":"substring match on term"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlossaryListOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["glossary"],"summary":"Create Entry","operationId":"glossary_create_entry","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlossaryEntryIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlossaryEntryOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/glossary/{entry_id}":{"get":{"tags":["glossary"],"summary":"Get Entry","operationId":"glossary_get_entry","parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","title":"Entry Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlossaryEntryOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["glossary"],"summary":"Update Entry","operationId":"glossary_update_entry","parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","title":"Entry Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlossaryEntryPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlossaryEntryOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["glossary"],"summary":"Delete Entry","operationId":"glossary_delete_entry","parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","title":"Entry Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/glossary/{entry_id}/history":{"get":{"tags":["glossary"],"summary":"List Entry History","description":"Full history of ONE term (Viewer+), newest first, each with a resolved\n`changed_by`. Works even after the term was deleted (the last state stays\nlisted/revertable).","operationId":"glossary_list_entry_history","parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","title":"Entry Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlossaryVersionsPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/glossary/{entry_id}/history/{version}":{"get":{"tags":["glossary"],"summary":"Get Entry Version","description":"One version snapshot of a term (Viewer+). Unknown version -> 404.","operationId":"glossary_get_entry_version","parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","title":"Entry Id"}},{"name":"version","in":"path","required":true,"schema":{"type":"integer","title":"Version"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlossaryVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/glossary/{entry_id}/revert":{"post":{"tags":["glossary"],"summary":"Revert Entry","description":"Restore a term to an earlier version (Developer+), INDEPENDENTLY of other\nterms — via the normal write path (a new history row, never destructive).\nRe-creates the term if it was deleted. Unknown version -> 404; a clash with a\ndifferent live term on (type, term) -> 409.","operationId":"glossary_revert_entry","parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","title":"Entry Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlossaryRevertIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlossaryEntryOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/glossary/validate":{"post":{"tags":["glossary"],"summary":"Validate Translation","description":"Stateless check of a translation against the project glossary + ICU\nplaceholder parity + length. Returns structured violations (empty = valid).\nRead-only; designed for inline editor calls.","operationId":"glossary_validate_translation","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlossaryValidateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlossaryValidateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/presence/heartbeat":{"post":{"tags":["presence"],"summary":"Heartbeat","description":"Announce/refresh that the caller is editing a key (soft-lock + event).\nRe-call within ttl_seconds to keep the lock alive.","operationId":"presence_heartbeat","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EditingIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HeartbeatOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/presence/release":{"post":{"tags":["presence"],"summary":"Release","description":"Explicitly release the caller's soft-lock on a key (on editor close).","operationId":"presence_release","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EditingIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PresenceAck"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/presence":{"get":{"tags":["presence"],"summary":"Snapshot","description":"Who is currently editing what in this project (non-expired soft-locks).","operationId":"presence_snapshot","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PresenceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/translations/estimate":{"post":{"tags":["translation"],"summary":"Estimate Translation","operationId":"translation_estimate_translation","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes__translate__EstimateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EstimateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/translations/generate":{"post":{"tags":["translation"],"summary":"Generate Translation","operationId":"translation_generate_translation","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranslationJobOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/translations/jobs/{job_uuid}":{"get":{"tags":["translation"],"summary":"Get Translation Job","description":"Poll a translation job — same object as /generate. Clients poll this until\n`terminal` is true (batch jobs, PR-2); sync jobs are already terminal.","operationId":"translation_get_translation_job","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"job_uuid","in":"path","required":true,"schema":{"type":"string","title":"Job Uuid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranslationJobOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/auto-translate/reactivate":{"get":{"tags":["auto-translate"],"summary":"Reactivate","operationId":"auto_translate_reactivate","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"token","in":"query","required":true,"schema":{"type":"string","minLength":1,"title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["auto-translate"],"summary":"Manual Reactivate","description":"In-app reactivate (session-auth). Idempotent — a project that is\nalready unpaused returns 200 with no audit row written.","operationId":"auto_translate_manual_reactivate","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoTranslateSettingsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/settings/auto-translate":{"get":{"tags":["auto-translate"],"summary":"Get Settings ","operationId":"auto_translate_get_settings_","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoTranslateSettingsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["auto-translate"],"summary":"Put Settings","operationId":"auto_translate_put_settings","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoTranslateSettingsPutIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoTranslateSettingsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/translations/review/queue":{"get":{"tags":["translations"],"summary":"Review Queue","description":"Pending AI proposals (status=translated, AI-authored) awaiting human\nreview — newest first, each with a diff against the previous value.\n`counts_by_origin` breaks the queue down by source (ignoring `origin`).","operationId":"translations_review_queue","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"language_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"filter by language uuid","title":"Language Id"},"description":"filter by language uuid"},{"name":"namespace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"filter by namespace uuid","title":"Namespace Id"},"description":"filter by namespace uuid"},{"name":"origin","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"filter by proposal_origin (auto_translate | generate | mcp_propose | review_run | human). Use 'legacy' for rows with no origin.","title":"Origin"},"description":"filter by proposal_origin (auto_translate | generate | mcp_propose | review_run | human). Use 'legacy' for rows with no origin."},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewQueueOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/translations/review/approve":{"post":{"tags":["translations"],"summary":"Review Approve","description":"Bulk-approve proposals (-> status approved). Reviewer+ only; per-item\noptimistic lock + result. Clears any prior review comment.","operationId":"translations_review_approve","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewApproveIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewActionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/translations/review/reject":{"post":{"tags":["translations"],"summary":"Review Reject","description":"Bulk-reject proposals with a reason (-> status draft, reason persisted\nas review_comment, surfaced on the translation). Reviewer+ only.","operationId":"translations_review_reject","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewRejectIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewActionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/translations/review-findings/stats":{"get":{"tags":["translations"],"summary":"Review Findings Stats","description":"Overview aggregate (one $group): open findings, open by category, all by status.","operationId":"translations_review_findings_stats","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewFindingsStatsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/translations/review-findings":{"get":{"tags":["translations"],"summary":"List Review Findings","operationId":"translations_list_review_findings","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"language_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Id"}},{"name":"namespace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace Id"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewFindingsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/translations/review-findings/{finding_id}":{"get":{"tags":["translations"],"summary":"Get Review Finding","operationId":"translations_get_review_finding","parameters":[{"name":"finding_id","in":"path","required":true,"schema":{"type":"string","title":"Finding Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewFindingOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/translations/review-findings/{finding_id}/accept":{"post":{"tags":["translations"],"summary":"Accept Review Finding","description":"Write `suggested_value` as the reviewer's own edit (the acceptance IS the\nhuman review) with `proposal_origin=review_run`, status `translated` — never\nreviewed/approved — then mark the finding accepted. Refuses a finding that is not open, has no\nsuggested value, or is stale (the row's `version` moved since the snapshot).","operationId":"translations_accept_review_finding","parameters":[{"name":"finding_id","in":"path","required":true,"schema":{"type":"string","title":"Finding Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewFindingAcceptOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/translations/review-findings/{finding_id}/reject":{"post":{"tags":["translations"],"summary":"Reject Review Finding","operationId":"translations_reject_review_finding","parameters":[{"name":"finding_id","in":"path","required":true,"schema":{"type":"string","title":"Finding Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewFindingRejectIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewFindingOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/translations":{"get":{"tags":["translations"],"summary":"List Translations","operationId":"translations_list_translations","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"language_id","in":"query","required":true,"schema":{"type":"string","description":"language uuid (required)","title":"Language Id"},"description":"language uuid (required)"},{"name":"namespace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by version uuid. Omitted = production version.","title":"Version Id"},"description":"Filter by version uuid. Omitted = production version."},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"enum":["missing","draft","translated","reviewed","approved","rejected"],"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"author","in":"query","required":false,"schema":{"anyOf":[{"enum":["ai","human"],"type":"string"},{"type":"null"}],"description":"Filter by last-writer kind. Orthogonal to `status`; only matches rows that have a translation.","title":"Author"},"description":"Filter by last-writer kind. Orthogonal to `status`; only matches rows that have a translation."},{"name":"pending_review","in":"query","required":false,"schema":{"type":"boolean","description":"Shortcut for status=translated AND author=ai (AI translations awaiting human review).","default":false,"title":"Pending Review"},"description":"Shortcut for status=translated AND author=ai (AI translations awaiting human review)."},{"name":"confidence","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(high|medium|low)$"},{"type":"null"}],"description":"Filter by the AGENT's stated confidence on the value (high|medium|low). Only matches rows carrying one (agent-proposed, not yet human-edited).","title":"Confidence"},"description":"Filter by the AGENT's stated confidence on the value (high|medium|low). Only matches rows carrying one (agent-proposed, not yet human-edited)."},{"name":"task","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Restrict to the exact keys a task points at (its `payload.key_uuids`), addressed by the task's uuid or #number. Scopes the editor to that task's work.","title":"Task"},"description":"Restrict to the exact keys a task points at (its `payload.key_uuids`), addressed by the task's uuid or #number. Scopes the editor to that task's work."},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"substring match on key name","title":"Q"},"description":"substring match on key name"},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"filter by key type(s) (repeatable)","title":"Type"},"description":"filter by key type(s) (repeatable)"},{"name":"surface","in":"query","required":false,"schema":{"type":"string","description":"Which overlay to list (task 1482). 'base' (default) = the normal translation value (unchanged behaviour). An a11y surface (aria_label|alt_text|screen_reader|plain_language) lists that surface's VALUE per target language for keys where the surface is type-relevant AND a source value exists; status=missing => target untranslated, otherwise the override status. a11y MODERATION stays in the a11y review queue.","default":"base","title":"Surface"},"description":"Which overlay to list (task 1482). 'base' (default) = the normal translation value (unchanged behaviour). An a11y surface (aria_label|alt_text|screen_reader|plain_language) lists that surface's VALUE per target language for keys where the surface is type-relevant AND a source value exists; status=missing => target untranslated, otherwise the override status. a11y MODERATION stays in the a11y review queue."},{"name":"overrides_only","in":"query","required":false,"schema":{"type":"boolean","description":"Overlay locales only: keep only keys whose OWN value differs from the resolved parent (parity with coverage override_count). Ignored for base languages (no fallback).","default":false,"title":"Overrides Only"},"description":"Overlay locales only: keep only keys whose OWN value differs from the resolved parent (parity with coverage override_count). Ignored for base languages (no fallback)."},{"name":"include_source","in":"query","required":false,"schema":{"type":"boolean","description":"Attach `source_value` (the source-language value, joined by key_uuid) to each item — aligned to the filtered set in one call.","default":false,"title":"Include Source"},"description":"Attach `source_value` (the source-language value, joined by key_uuid) to each item — aligned to the filtered set in one call."},{"name":"has_source","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by SOURCE-language value presence (orthogonal to `status`, which is the TARGET status). has_source=false keeps only source-missing keys (empty/absent source value); true keeps only keys with a present source. Applied server-side so `total` + cursor stay correct across pages.","title":"Has Source"},"description":"Filter by SOURCE-language value presence (orthogonal to `status`, which is the TARGET status). has_source=false keeps only source-missing keys (empty/absent source value); true keeps only keys with a present source. Applied server-side so `total` + cursor stay correct across pages."},{"name":"orphan","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Code-occurrences ORPHAN filter. true = ONLY orphan keys (the scan FOUND them and they then DISAPPEARED from the code — a `gone` occurrence and NO present one), false = only non-orphans, absent = all. A key never seen by a scan (manual add) is NOT an orphan. Server-side (injected into the key query) so `total` + cursor stay correct. Meaningful only when the response's `measured` is true (else nothing is an orphan).","title":"Orphan"},"description":"Code-occurrences ORPHAN filter. true = ONLY orphan keys (the scan FOUND them and they then DISAPPEARED from the code — a `gone` occurrence and NO present one), false = only non-orphans, absent = all. A key never seen by a scan (manual add) is NOT an orphan. Server-side (injected into the key query) so `total` + cursor stay correct. Meaningful only when the response's `measured` is true (else nothing is an orphan)."},{"name":"include_ratings","in":"query","required":false,"schema":{"type":"boolean","description":"Attach the end-user 5-star aggregate (avg_rating + rating_count) per key+language. Requires the feedback module to be active (else 403).","default":false,"title":"Include Ratings"},"description":"Attach the end-user 5-star aggregate (avg_rating + rating_count) per key+language. Requires the feedback module to be active (else 403)."},{"name":"min_avg_stars","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":5,"minimum":1},{"type":"null"}],"description":"Keep only items whose avg_rating >= this (implies include_ratings).","title":"Min Avg Stars"},"description":"Keep only items whose avg_rating >= this (implies include_ratings)."},{"name":"max_avg_stars","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":5,"minimum":1},{"type":"null"}],"description":"Keep only items whose avg_rating <= this (implies include_ratings).","title":"Max Avg Stars"},"description":"Keep only items whose avg_rating <= this (implies include_ratings)."},{"name":"include_deleted","in":"query","required":false,"schema":{"type":"boolean","description":"Include keys in the recycle bin (soft-deleted, task 781). Default FALSE excludes trashed keys — aligned with GET /keys + coverage, so the editor never lists a trashed key (which would 404 on /variants). The founder override-matrix 404 bug (client-admin propose).","default":false,"title":"Include Deleted"},"description":"Include keys in the recycle bin (soft-deleted, task 781). Default FALSE excludes trashed keys — aligned with GET /keys + coverage, so the editor never lists a trashed key (which would 404 on /variants). The founder override-matrix 404 bug (client-admin propose)."},{"name":"include_overlays","in":"query","required":false,"schema":{"type":"boolean","description":"Attach `overlays` (device surfaces + a11y treatments present) per key, joined by key_uuid in ONE aggregation (no per-key N+1). Lets the 2-line row render overlay icons without calling /variants + /a11y-signals per key. Scope via `overlays_scope`.","default":false,"title":"Include Overlays"},"description":"Attach `overlays` (device surfaces + a11y treatments present) per key, joined by key_uuid in ONE aggregation (no per-key N+1). Lets the 2-line row render overlay icons without calling /variants + /a11y-signals per key. Scope via `overlays_scope`."},{"name":"overlays_scope","in":"query","required":false,"schema":{"enum":["all","language"],"type":"string","description":"Scope of `overlays` presence (only when include_overlays). 'all' (default, founder/master UX) = the key carries the overlay in ANY language; 'language' = only overlays in the requested `language_id`. Both are one indexed aggregation.","default":"all","title":"Overlays Scope"},"description":"Scope of `overlays` presence (only when include_overlays). 'all' (default, founder/master UX) = the key carries the overlay in ANY language; 'language' = only overlays in the requested `language_id`. Both are one indexed aggregation."},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranslationPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/translations/activity":{"get":{"tags":["translations"],"summary":"Translation Activity","description":"GitHub-style daily translation activity, one series per language (Viewer+).\n\nA day's value is the number of translation VALUES written/updated in that language\nthat day, counted from `translation_history` over the last `days` days. Source\nlanguage excluded unless `include_source=true`. Languages are ordered by total.","operationId":"translations_translation_activity","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":730,"minimum":7,"default":365,"title":"Days"}},{"name":"include_source","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Source"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranslationActivityOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/translations/{key_id}/{language_id}":{"put":{"tags":["translations"],"summary":"Upsert Translation","operationId":"translations_upsert_translation","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"language_id","in":"path","required":true,"schema":{"type":"string","title":"Language Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranslationUpsertIn"},"example":{"value":"Bonjour","status":"translated"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranslationCore"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["translations"],"summary":"Get Translation","operationId":"translations_get_translation","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"language_id","in":"path","required":true,"schema":{"type":"string","title":"Language Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranslationCore"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["translations"],"summary":"Delete Translation","description":"Drop a translation row. Keeps history. Developer+ only.","operationId":"translations_delete_translation","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"language_id","in":"path","required":true,"schema":{"type":"string","title":"Language Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/translations/{key_id}/{language_id}/history":{"get":{"tags":["translations"],"summary":"History","operationId":"translations_history","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"language_id","in":"path","required":true,"schema":{"type":"string","title":"Language Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistoryOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/translations/{key_id}/{language_id}/history/diff":{"get":{"tags":["translations"],"summary":"Diff Versions","description":"Structured diff between two versions (task 1697).","operationId":"translations_diff_versions","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"language_id","in":"path","required":true,"schema":{"type":"string","title":"Language Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"from","in":"query","required":true,"schema":{"type":"integer","title":"From"}},{"name":"to","in":"query","required":true,"schema":{"type":"integer","title":"To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionDiff"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/translations/{key_id}/{language_id}/history/{version}":{"get":{"tags":["translations"],"summary":"Get Version","description":"A single historical version snapshot (task 1697).","operationId":"translations_get_version","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"language_id","in":"path","required":true,"schema":{"type":"string","title":"Language Id"}},{"name":"version","in":"path","required":true,"schema":{"type":"integer","title":"Version"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistoryEntry"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/translations/{key_id}/{language_id}/revert":{"post":{"tags":["translations"],"summary":"Revert","description":"Non-destructive revert (task 1697): restore a prior version's value /\nplural_forms / status as a NEW version. reviewed/approved are NOT re-elevated\nfrom an old snapshot (human-only).","operationId":"translations_revert","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"language_id","in":"path","required":true,"schema":{"type":"string","title":"Language Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevertIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranslationCore"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/translations/bulk/status":{"post":{"tags":["translations"],"summary":"Set Translations Status Bulk","description":"Batch translation status change — best-effort, idempotent per item.\n\nPer item, in order: intra-batch duplicates, unknown language, language\noutside the caller's assigned scope, a status the caller's role cannot\nset (`_can_set_status`), and a non-existent translation row each error\nthat item while siblings still commit. An item already at the target\nstatus returns `unchanged`.","operationId":"translations_set_translations_status_bulk","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranslationBulkStatusIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranslationBulkStatusOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/keys/{key_id}/history":{"get":{"tags":["key-history"],"summary":"Key History","description":"Aggregate version history for a key ACROSS all languages (task 1697),\ncomputed on translation_history (no separate store). Newest first.\n\n`code_scan` (additive, lifecycle panel) is the scan provenance of the key —\nthe finding treated INTO it — or null; `items` is unchanged.","operationId":"key_history_key_history","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":1,"default":500,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyHistoryOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/history/activity":{"get":{"tags":["history-activity"],"summary":"History Activity","description":"Histogram of translation_history changes over time, split by change_source\nAND by surface (task 1697 Inc B + zoom + variant-history). The `period` preset\nis a ZOOM level; custom from/to auto-buckets; source + surface are filterable.","operationId":"history_activity_history_activity","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"period","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"zoom preset: 24h→day/30 bars, 7d→week/16 bars, 1m→month/12 bars, 15d→day/15 bars (or use from/to). Also day|week|month aliases.","title":"Period"},"description":"zoom preset: 24h→day/30 bars, 7d→week/16 bars, 1m→month/12 bars, 15d→day/15 bars (or use from/to). Also day|week|month aliases."},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"From"}},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"To"}},{"name":"bucket","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"hour|day|week|month override","title":"Bucket"},"description":"hour|day|week|month override"},{"name":"languages","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Languages"}},{"name":"namespaces","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespaces"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}},{"name":"surface","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"csv surface filter (default|desktop|mobile|tablet|aria_label|alt_text|screen_reader|plain_language); 'default' = base","title":"Surface"},"description":"csv surface filter (default|desktop|mobile|tablet|aria_label|alt_text|screen_reader|plain_language); 'default' = base"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/history/changes":{"get":{"tags":["history-activity"],"summary":"History Changes","description":"Time-ranged, paginated drill-down of individual changes across keys/langs\n(task 1697 Inc B + variant-history). value/status carry old→new; change_source\nis the read-derived origin; change_type a computed discriminant; surface tags\nbase (null) vs a11y/device variants — all filterable.","operationId":"history_activity_history_changes","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"period","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period"}},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"From"}},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"To"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"opaque changed_at cursor (ISO)","title":"Cursor"},"description":"opaque changed_at cursor (ISO)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"languages","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Languages"}},{"name":"namespaces","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespaces"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"csv of DERIVED origin: human|agent|ai|import|revert|unknown","title":"Source"},"description":"csv of DERIVED origin: human|agent|ai|import|revert|unknown"},{"name":"change_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"csv of change_type: create|value|status|both|revert|import|noop","title":"Change Type"},"description":"csv of change_type: create|value|status|both|revert|import|noop"},{"name":"surface","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"csv of surface slugs (default|desktop|mobile|tablet|aria_label|alt_text|screen_reader|plain_language); 'default' = base","title":"Surface"},"description":"csv of surface slugs (default|desktop|mobile|tablet|aria_label|alt_text|screen_reader|plain_language); 'default' = base"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangesOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/translations/runtime":{"get":{"tags":["translations"],"summary":"Get Runtime Bundle","description":"Build a translation bundle ON DEMAND for the dev SDK.\n\nAuth: ApiKey only (CurrentUser falls through to 401), viewer-equivalent\nscope required (project:read / write / cdn:write / *) — a read of project\ncontent, gated like the REST reads. For env_type='dev' keys, IP/origin\nallowlist enforced. Response shape mirrors the CDN bundle (nested JSON tree)\nso the SDK parses base and overlays identically.\n\n`surface` (task 1716): the dev SDK reads BASE bundles from this authed\nendpoint, not the CDN, and the endpoint had no overlay shape — so a11y\noverlays never loaded in dev and the SDK short-circuited them to {}. This\nserves the SAME sparse overlay build_payload emits for the CDN. Crucially an\nEMPTY overlay is 200 {}, not a 404: empty != missing, which is why the dev\nSDK can ask every boot without a false alarm.","operationId":"translations_get_runtime_bundle","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"language","in":"query","required":true,"schema":{"type":"string","description":"BCP-47 language code","title":"Language"},"description":"BCP-47 language code"},{"name":"namespace","in":"query","required":true,"schema":{"type":"string","description":"Namespace slug","title":"Namespace"},"description":"Namespace slug"},{"name":"version_slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Project-version slug. Defaults to the production version.","title":"Version Slug"},"description":"Project-version slug. Defaults to the production version."},{"name":"surface","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"a11y surface overlay: aria_label | alt_text | screen_reader | plain_language. Omit for the BASE bundle. Returns a SPARSE overlay (only keys with an override for that surface); a surface with no overrides returns 200 with an empty body, NOT a 404.","title":"Surface"},"description":"a11y surface overlay: aria_label | alt_text | screen_reader | plain_language. Omit for the BASE bundle. Returns a SPARSE overlay (only keys with an override for that surface); a surface with no overrides returns 200 with an empty body, NOT a 404."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Translations Get Runtime Bundle"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/keys/{key_id}/variants/{language_id}/{surface}":{"put":{"tags":["variants"],"summary":"Upsert Variant","description":"Create/replace the surface override for (key, language, surface).\n\nThe `default` sentinel is NOT a device/a11y surface — it is the BASE cell\n(documented in api/variants.ts, used by the editor detail panel to save the\nbase value + plurals). It writes the base `translations` row (what the matrix\n+ CDN base bundle read), and is valid for EVERY key type (regression fix: the\noffered-surfaces list wrongly rejected it, breaking base-translation save).","operationId":"variants_upsert_variant","parameters":[{"name":"language_id","in":"path","required":true,"schema":{"type":"string","title":"Language Id"}},{"name":"surface","in":"path","required":true,"schema":{"type":"string","title":"Surface"}},{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"return","in":"query","required":false,"schema":{"type":"string","description":"'cell' (default) -> the written cell; 'matrix' -> the full rebuilt VariantMatrix (saves the client a refetch).","default":"cell","title":"Return"},"description":"'cell' (default) -> the written cell; 'matrix' -> the full rebuilt VariantMatrix (saves the client a refetch)."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VariantOverrideIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["variants"],"summary":"Delete Variant","description":"Clear the surface override — the cell re-inherits per the resolution chain.\nDELETE is not gated by the key's type so an override orphaned by a type change\n(e.g. an old aria override after the key became text) can still be cleaned up.","operationId":"variants_delete_variant","parameters":[{"name":"language_id","in":"path","required":true,"schema":{"type":"string","title":"Language Id"}},{"name":"surface","in":"path","required":true,"schema":{"type":"string","title":"Surface"}},{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/keys/{key_id}/variants":{"get":{"tags":["variants"],"summary":"Get Variant Matrix","description":"Full override matrix for ONE key across every project language x surface,\nwith the resolved value + inheritance info (what each empty cell falls back\nto) + drift flags. Powers the client-admin variant modal.","operationId":"variants_get_variant_matrix","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VariantMatrixOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/surfaces":{"get":{"tags":["surfaces"],"summary":"List Surfaces","description":"The project's surface catalog (builtins + custom; active flags). Back-compat:\na project that never customized returns the builtin default (all active).","operationId":"surfaces_list_surfaces","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SurfaceListOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["surfaces"],"summary":"Create Surface","description":"Add a CUSTOM device surface (a11y is a fixed set — no custom).","operationId":"surfaces_create_surface","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SurfaceCreateIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SurfaceListOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/surfaces/{slug}":{"put":{"tags":["surfaces"],"summary":"Update Surface","description":"Rename (label) and/or toggle (active) a surface. Deactivation is SOFT —\nexisting variants are retained and hidden; affected_variants warns how many.","operationId":"surfaces_update_surface","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SurfaceUpdateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SurfaceUpdateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["surfaces"],"summary":"Delete Surface","description":"Delete a CUSTOM device surface. Builtins cannot be deleted — deactivate\nthem (SOFT) instead.","operationId":"surfaces_delete_surface","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/cognitive/candidates":{"get":{"tags":["cognitive"],"summary":"Cognitive Candidates","description":"Plain-language candidates (text-relevant keys, light pre-filter) + state.","operationId":"cognitive_cognitive_candidates","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"only_unanalyzed","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Only Unanalyzed"}},{"name":"namespace_uuid","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace Uuid"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cognitive Cognitive Candidates"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/cognitive/queue":{"get":{"tags":["cognitive"],"summary":"Cognitive Queue","description":"HIGH cognitive-score keys (>= threshold) with a suggestion — review queue.","operationId":"cognitive_cognitive_queue","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cognitive Cognitive Queue"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/cognitive/estimate":{"post":{"tags":["cognitive"],"summary":"Cognitive Estimate","operationId":"cognitive_cognitive_estimate","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CognitiveEstimateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cognitive Cognitive Estimate"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/cognitive/analyze":{"post":{"tags":["cognitive"],"summary":"Cognitive Analyze","description":"SERVER AI: score + suggest plain-language for unanalyzed candidates. Billed.","operationId":"cognitive_cognitive_analyze","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CognitiveAnalyzeIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cognitive Cognitive Analyze"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/cognitive/score-local":{"post":{"tags":["cognitive"],"summary":"Cognitive Score Local","description":"LOCAL-FIRST, 0 credit: score candidates from the VALIDATED readability metric\n(Flesch en / LIX otherwise) — the same metric WCAG SC 3.1.5 uses. No AI.","operationId":"cognitive_cognitive_score_local","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CognitiveScoreLocalIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cognitive Cognitive Score Local"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/keys/{key_id}/cognitive-score":{"put":{"tags":["cognitive"],"summary":"Set Cognitive Score","description":"LOCAL-FIRST: write a cognitive score (+ optional suggestion) — 0 credit.","operationId":"cognitive_set_cognitive_score","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CognitiveScoreIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cognitive Set Cognitive Score"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/keys/{key_id}/cognitive/apply":{"post":{"tags":["cognitive"],"summary":"Apply Cognitive","description":"Apply a suggestion: (A) mode=default -> replaces the key's base value\n(re-translate locales after); (B) mode=surface -> easy-reading variant.","operationId":"cognitive_apply_cognitive","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CognitiveApplyIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cognitive Apply Cognitive"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me":{"get":{"tags":["me"],"summary":"Me","operationId":"me_me","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeOut"}}}}}}},"/v1/notifications/catalogue":{"get":{"tags":["notifications"],"summary":"Catalogue","operationId":"notifications_catalogue","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/CatalogueEntryOut"},"type":"array","title":"Response Notifications Catalogue"}}}}}}},"/v1/notifications":{"get":{"tags":["notifications"],"summary":"List Notifications","description":"The caller's own notification feed (user-global; newest first). Each row\ncarries org_uuid/project_uuid for filtering. `unread_count` is the total\nacross the account regardless of the current filter.","operationId":"notifications_list_notifications","parameters":[{"name":"unread_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Unread Only"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"filter to one org's rows","title":"Org Id"},"description":"filter to one org's rows"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":30,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationListOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/notifications/unread-count":{"get":{"tags":["notifications"],"summary":"Notifications Unread Count","operationId":"notifications_notifications_unread_count","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnreadCountOut"}}}}}}},"/v1/notifications/{notification_id}/read":{"post":{"tags":["notifications"],"summary":"Mark Notification Read","description":"Mark ONE of the caller's notifications read (idempotent). 404 if it isn't\nthe caller's (a user only ever sees/mutates their own rows).","operationId":"notifications_mark_notification_read","parameters":[{"name":"notification_id","in":"path","required":true,"schema":{"type":"string","title":"Notification Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/notifications/read-all":{"post":{"tags":["notifications"],"summary":"Mark All Notifications Read","description":"Mark all of the caller's unread notifications read (optionally scoped to\none org). Returns how many flipped + the remaining unread count.","operationId":"notifications_mark_all_notifications_read","parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReadAllOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/notification-preferences":{"get":{"tags":["notifications"],"summary":"Get Account Prefs","operationId":"notifications_get_account_prefs","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrefsOut"}}}}}},"put":{"tags":["notifications"],"summary":"Put Account Prefs","operationId":"notifications_put_account_prefs","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrefsPutIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrefsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/notification-preferences/{type_id}":{"delete":{"tags":["notifications"],"summary":"Reset Account Pref","description":"Clear the account override for `type_id` — reverts to the catalogue default.","operationId":"notifications_reset_account_pref","parameters":[{"name":"type_id","in":"path","required":true,"schema":{"type":"string","title":"Type Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrefsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/notification-preferences":{"get":{"tags":["notifications"],"summary":"Get Project Prefs","operationId":"notifications_get_project_prefs","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrefsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["notifications"],"summary":"Put Project Prefs","operationId":"notifications_put_project_prefs","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrefsPutIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrefsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/notification-preferences/{type_id}":{"delete":{"tags":["notifications"],"summary":"Reset Project Pref","description":"Clear this user's project override for `type_id` — reverts to the\naccount-level (then catalogue default) value. The \"reset to account\" action.","operationId":"notifications_reset_project_pref","parameters":[{"name":"type_id","in":"path","required":true,"schema":{"type":"string","title":"Type Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrefsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/integrations/slack":{"get":{"tags":["integrations"],"summary":"Slack Status","operationId":"integrations_slack_status","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlackStatusOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["integrations"],"summary":"Slack Connect","operationId":"integrations_slack_connect","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlackConnectIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlackStatusOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["integrations"],"summary":"Slack Disconnect","operationId":"integrations_slack_disconnect","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlackStatusOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/integrations/slack/test":{"post":{"tags":["integrations"],"summary":"Slack Test","operationId":"integrations_slack_test","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlackTestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/integrations/slack/enabled-types":{"put":{"tags":["integrations"],"summary":"Slack Enabled Types","operationId":"integrations_slack_enabled_types","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlackEnabledTypesIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlackStatusOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/github/webhook":{"post":{"tags":["github"],"summary":"Github Webhook","description":"Verify X-Hub-Signature-256, then dispatch. Fast 202 ack; PR analysis runs\nin the background.","operationId":"github_github_webhook","responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/orgs/{org_id}/integrations/github":{"get":{"tags":["github"],"summary":"Get Github Integration","description":"Installations bound to this org + their repo→project links (dashboard).","operationId":"github_get_github_integration","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GithubStatusOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["github"],"summary":"Put Github Integration","description":"FULL-REPLACE the org's repo→project links with the provided set (Slack-style\ndeclarative PUT). Binds each named installation to this org; links absent from\nthe payload are removed. Returns the fresh status.","operationId":"github_put_github_integration","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RepoLinksReplaceIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GithubStatusOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/a11y/estimate":{"post":{"tags":["a11y"],"summary":"A11Y Estimate","operationId":"a11y_a11y_estimate","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/A11yEstimateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/A11yEstimateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/a11y/generate":{"post":{"tags":["a11y"],"summary":"A11Y Generate","operationId":"a11y_a11y_generate","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/A11yGenerateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/A11yJobOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/a11y/translate":{"post":{"tags":["a11y"],"summary":"A11Y Translate","operationId":"a11y_a11y_translate","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/A11yTranslateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/A11yJobOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/a11y/review/queue":{"get":{"tags":["a11y"],"summary":"A11Y Review Queue","description":"Unified a11y moderation view (overrides + gaps) per key x surface x locale.\nWith group_by_key=true: one entry per key in `key_groups` (cells nested) and\nKEY-level rollups (task 1338/PL2); flat `items` is empty in that mode. By default\na11y_untranslated cells are segregated into untranslated_count (task 1345/AC1).","operationId":"a11y_a11y_review_queue","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}},{"name":"surface","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Surface"}},{"name":"locale","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locale"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"gap","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gap"}},{"name":"namespace_uuid","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace Uuid"}},{"name":"key_uuid","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"scope to a single key (detail panel)","title":"Key Uuid"},"description":"scope to a single key (detail panel)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"reading_level_max_words","in":"query","required":false,"schema":{"type":"integer","maximum":60,"minimum":5,"default":15,"title":"Reading Level Max Words"}},{"name":"include_ignored","in":"query","required":false,"schema":{"type":"boolean","description":"include cells suppressed by an approved remediation plan","default":false,"title":"Include Ignored"},"description":"include cells suppressed by an approved remediation plan"},{"name":"group_by_key","in":"query","required":false,"schema":{"type":"boolean","description":"aggregate by key: one entry per key (key_groups), languages nested, per-key counters; pagination applies to KEYS","default":false,"title":"Group By Key"},"description":"aggregate by key: one entry per key (key_groups), languages nested, per-key counters; pagination applies to KEYS"},{"name":"include_untranslated","in":"query","required":false,"schema":{"type":"boolean","description":"include a11y_untranslated (translation-coverage) cells; default excludes them (segregated into untranslated_count)","default":false,"title":"Include Untranslated"},"description":"include a11y_untranslated (translation-coverage) cells; default excludes them (segregated into untranslated_count)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/A11yQueueOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/a11y/review/approve":{"post":{"tags":["a11y"],"summary":"A11Y Review Approve","description":"Approve a11y variant drafts -> reviewed/approved (Reviewer+).","operationId":"a11y_a11y_review_approve","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/A11yApproveIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/A11yModerateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/a11y/review/reject":{"post":{"tags":["a11y"],"summary":"A11Y Review Reject","description":"Reject a11y variant drafts -> PERSISTENT `rejected` + reason (Reviewer+).\nThe value is retained (not deleted) so the agent can regenerate (task 1337).","operationId":"a11y_a11y_review_reject","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/A11yRejectIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/A11yModerateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/a11y/remediation-plan":{"put":{"tags":["a11y"],"summary":"Put Remediation Plan","description":"Create/replace the a11y remediation plan (status=draft). PLANS ONLY — writes\nnothing to overrides; the sonenta-a11y agent executes on approval.","operationId":"a11y_put_remediation_plan","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemediationPlanIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemediationPlanOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["a11y"],"summary":"Get Remediation Plan","description":"Read the saved remediation plan (or null if none).","operationId":"a11y_get_remediation_plan","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/RemediationPlanOut"},{"type":"null"}],"title":"Response A11Y Get Remediation Plan"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/a11y/remediation-plan/approve":{"post":{"tags":["a11y"],"summary":"Approve Remediation Plan","description":"Flip the plan to approved (Reviewer+). This flag is what the agent watches;\nthe backend mutates no overrides.","operationId":"a11y_approve_remediation_plan","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemediationApproveIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemediationPlanOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/a11y/detection":{"get":{"tags":["a11y"],"summary":"A11Y Detection","description":"Detection coverage — has the client's CODE been analyzed? (spec §4.1)\n\nA code measure, not a content one, so there is NO per-language axis.\n\nTHREE COMPARTMENTS summing exactly to `keys_total` (task 1827):\n  - `classified` — `type_source` in (detected, manual): a type someone or\n    something DECIDED;\n  - `analyzed_not_candidate` — a scan SAW the key and it stayed plain text.\n    An answer, not a to-do: nothing to remediate on it;\n  - `never_analyzed` — nobody ever looked, so the type is UNKNOWN (not\n    \"text\"). Read it as \"not seen by the last scan of THIS repository\", never\n    as \"dead key\": one scan reads one repository.\n`unclassified` (never_analyzed + analyzed_not_candidate) and `pct` are\nunchanged for existing callers. `last_scan` is the recap posted by the last\nmechanical run, `scan_id` included (null if the project was never scanned).","operationId":"a11y_a11y_detection","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/A11yDetectionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/a11y/scan":{"post":{"tags":["a11y"],"summary":"A11Y Record Scan","description":"Record ONE mechanical a11y code scan: recap + the keys it SAW (Developer+).\n\nThe scan itself runs client-side (`sonenta a11y scan` CLI or the sonenta-a11y\nagent): it parses usage sites, infers each key's type and persists it through\nthe normal key-update paths with `type_source='detected'`. But a retype that\nmerely CONFIRMS `text` writes nothing, so the server could not tell a key the\nscan had looked at from one it had never opened. `seen_key_uuids` carries that\nfact: every uuid in it is stamped `type_analyzed_at` + `type_analyzed_scan_id`\n(task 1827), whatever the type outcome was — including a `refused_manual`,\nwhich IS a key the scan saw.\n\nBATCHING: omit `scan_id` to open a run (the response carries the minted id),\nthen echo it on each follow-up batch so one run stamps one id; a `scan_id`\nthat is not the project's current run is a 422. Recap counters are SET, not\nsummed — send the run's full totals on every batch. Idempotent: re-posting a\nbatch stamps the same keys with the same id.\n\nWrites NO translations and no overrides; on keys it writes only the two\nanalysis-marker fields — no `updated_at` bump, no audit row, so a 16k-key scan\ndoes not flood the activity feed. `last_run_at` is stamped server-side.","operationId":"a11y_a11y_record_scan","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/A11yScanIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/A11yScanOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/a11y/aria-names":{"get":{"tags":["a11y"],"summary":"A11Y Aria Names","description":"Accessible-name coverage per language (spec §4.2 + §1.3).\n\nMERGES TWO DISJOINT POPULATIONS, each reported separately in `populations`:\n  - `aria_label_surface` — button, link, menu_item, input_placeholder,\n    input_label. Present = non-empty `aria_label` OVERRIDE.\n  - `icon_base` — an `icon` key offers no treatment; its accessible name IS\n    its BASE value. Present = non-empty `translations` value.\nDisjoint by construction (an icon key can never be in the surface\npopulation), so the merged per-language `present` is exactly the sum of the\ntwo.\n\nCAN vs MUST (task 1831). `missing_accessible_name` is THE primary number: real\nWCAG 4.1.2 defects — surface controls with an EMPTY source base value AND no\n`aria_label` override (no name at all), plus icons with no base value. For the\nSURFACE types `base_role` is `visible_text`, so a button reading \"Save\" is\nalready named and an `aria_label` override would be an ALTERNATIVE name: those\nkeys are NOT defects, and `eligible`/`suggestions_count` on that population are\na POTENTIAL, not a queue. `suggestions_count` stays exact for `icon_base`,\nwhere a missing base value IS the defect.","operationId":"a11y_a11y_aria_names","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/A11yAriaNamesOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/a11y/alt-text":{"get":{"tags":["a11y"],"summary":"A11Y Alt Text","description":"Image alt-text coverage per language (spec §4.3 + §1.3).\n\nEligible = keys of type `image` (`base_role = alt_text`). This endpoint reads\nthe BASE value in `translations`, NOT `translation_overrides` — the alt of an\nimage IS its translated base value. That is the structural difference with\nscreen-reader and plain-language, hence `surface: null`.\n`missing_source_alt` = images with no alt in the SOURCE language.","operationId":"a11y_a11y_alt_text","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/A11yAltTextOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/a11y/screen-reader":{"get":{"tags":["a11y"],"summary":"A11Y Screen Reader","description":"Screen-reader (sr-only) coverage per language (spec §4.4).\n\nEligible = keys whose type offers the `screen_reader` treatment (text,\nheading, label, caption, button, link, menu_item, tooltip, badge,\nerror_message, toast). Present = non-empty `screen_reader` override.\n\nOPTIONAL ENRICHMENT, NOT A BACKLOG (task 1831). Nothing in WCAG requires an\nsr-only text per key: for all eleven eligible types the accessible content is\nthe visible text itself, and an override only ADDS verbosity where a human\ndecided it helps. So `applied` (sr-only text actually written, source language)\nis the honest number and belongs on the DONE side; `pct`/`present_cells`/\n`by_language` are CONTEXT over the pool that CAN carry one; and\n`suggestions_count` is DEPRECATED — \"eligible without an override\" is a\npotential, not work. **No work queue is computable here**: there is no defect\nsignal for a missing sr-only override, and WCAG 2.4.4 ambiguous-text detection\nis a separate product decision that is deliberately NOT approximated.","operationId":"a11y_a11y_screen_reader","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/A11yScreenReaderOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/a11y/plain-language":{"get":{"tags":["a11y"],"summary":"A11Y Plain Language","description":"Plain-language coverage + cognitive load (spec §4.5).\n\nTWO AXES, deliberately not fused into one \"remaining\" number:\n  - COVERAGE: the `plain_language` override per language over the keys whose\n    type offers the treatment (text, heading, label, caption).\n  - COGNITIVE: `cognitive_score` (0-100, higher = harder) against the project\n    `threshold`; `above_threshold` = eligible keys scored at or over it;\n    `pending_rewrites` = those that HAVE a suggestion and no source-language\n    `plain_language` override yet (the rewrite exists, nobody applied it).\n`reading_level_flagged` is a heuristic CANDIDATE count on the source value\n(`reading_level_max_words`), not a formal WCAG reading-level test.\n\nCAN vs MUST (task 1830). `eligible` = the key TYPES that CAN carry a rewrite;\nonly HARD-TO-READ keys NEED one, so eligible is never a backlog denominator.\nThree compartments, mutually exclusive, summing EXACTLY to `eligible_keys`:\n  - `candidates` (scored >= threshold) — THE primary number, what remains;\n  - `scored_readable` — read and judged readable: DONE, nothing to rewrite;\n  - `not_scored` — UNKNOWN. Nothing measured these keys yet; never show it as\n    work (`unscored_reading_level_flagged` is its \"score these first\" queue).\n`pct_candidates` (= candidates_rewritten / candidates) is the coverage number\nto display — NOT `pct`, which spans the whole eligible pool and reads as a\nbacklog it is not. `measured_candidates=False` means nothing was identified as\nhard to read; that is NOT 100% and must not be painted green.\n`suggestions_count` is DEPRECATED: it counts keys that merely COULD carry a\nrewrite (a potential), not a queue — use `candidates_remaining`.","operationId":"a11y_a11y_plain_language","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}},{"name":"reading_level_max_words","in":"query","required":false,"schema":{"type":"integer","maximum":60,"minimum":5,"default":15,"title":"Reading Level Max Words"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/A11yPlainLanguageOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/code-scan":{"post":{"tags":["code-scan"],"summary":"Ingest Code Scan","description":"Ingest ONE code-scan run and reconcile the project's findings (Developer+).\n\nTHE SUBMITTED SET IS AUTHORITATIVE. Every finding already known to this\nproject that is absent from this body is flipped to `gone`. Post the full\nresult of one scan, never a partial page — a truncated body retires findings\nthat are still hardcoded in the source.\n\nIdentity is `file + string` (+ an occurrence ordinal), **not** the line\nnumber: a finding keeps its identity, and its `treated` mark, when code moves\naround it. `line`/`column` are refreshed each run as position metadata.\n\nA run that would retire most of the project's live findings is **refused\n(422)** unless `confirm_mass_gone` is set — the usual cause is a scan over a\npartial checkout, which would hide findings that are still in the code.\nEvery run is written to the audit log.","operationId":"code_scan_ingest_code_scan","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeScanIngestIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeScanRunOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/code-scan/findings":{"get":{"tags":["code-scan"],"summary":"List Code Scan Findings","description":"Paginated findings for the dashboard and the CLI.\n\nFilter by `status` and/or `file` (exact repo-relative path). `file` powers\nthe detail pane of the file-tree view — one file's findings without paging\nthe whole project. `excluded` applies the persistent exclusion list.","operationId":"code_scan_list_code_scan_findings","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(new|treated|gone)$"},{"type":"null"}],"description":"new = outstanding · treated = turned into a key · gone = no longer in the source","title":"Status"},"description":"new = outstanding · treated = turned into a key · gone = no longer in the source"},{"name":"file","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"description":"Exact repo-relative path — the file-tree detail pane. Combine with `status`.","title":"File"},"description":"Exact repo-relative path — the file-tree detail pane. Combine with `status`."},{"name":"excluded","in":"query","required":false,"schema":{"type":"string","pattern":"^(exclude|only|include)$","description":"Exclusion-rule filter (default `exclude`): `exclude` hides findings matched by a rule · `only` shows ONLY matched findings (the rule-management view) · `include` ignores rules (raw). DEFAULT CHANGES OUTPUT — matched findings vanish; no rules ⇒ unchanged.","default":"exclude","title":"Excluded"},"description":"Exclusion-rule filter (default `exclude`): `exclude` hides findings matched by a rule · `only` shows ONLY matched findings (the rule-management view) · `include` ignores rules (raw). DEFAULT CHANGES OUTPUT — matched findings vanish; no rules ⇒ unchanged."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeScanFindingsPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/code-scan/files":{"get":{"tags":["code-scan"],"summary":"List Code Scan Files","description":"Per-FILE status roll-up for the file-tree view (Viewer+).\n\nOne row per file: `counts{new, treated, gone, new_this_scan}` + `total`,\nsorted by path ascending. Read-only aggregation. Page with `limit`/`offset`;\n`total` is the distinct file count so the client knows the tree size.\n`excluded` applies the persistent exclusion list to both the rows and `total`.","operationId":"code_scan_list_code_scan_files","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"excluded","in":"query","required":false,"schema":{"type":"string","pattern":"^(exclude|only|include)$","description":"Exclusion-rule filter (default `exclude`): `exclude` drops findings matched by a rule (a fully-masked file leaves the tree) · `only` shows ONLY matched findings · `include` ignores rules. DEFAULT CHANGES OUTPUT; no rules ⇒ unchanged.","default":"exclude","title":"Excluded"},"description":"Exclusion-rule filter (default `exclude`): `exclude` drops findings matched by a rule (a fully-masked file leaves the tree) · `only` shows ONLY matched findings · `include` ignores rules. DEFAULT CHANGES OUTPUT; no rules ⇒ unchanged."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":1,"default":500,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeScanFilesPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/code-scan/findings/{finding_id}/treated":{"post":{"tags":["code-scan"],"summary":"Mark Code Scan Finding Treated","description":"Record that this hardcoded string became a key (Developer+).\n\nIDEMPOTENT: re-marking an already-treated finding with the SAME (namespace,\nkey) returns the existing row untouched — `treated_at` does not move, so a\nclient retry cannot rewrite when the decision was taken. An unknown\n`finding_id` is a 404, never a silent create. When `namespace` is given and\nthe key does not exist there, the request is refused **422** — `treated` may\nnot point at a key that does not exist.","operationId":"code_scan_mark_code_scan_finding_treated","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"finding_id","in":"path","required":true,"schema":{"type":"string","title":"Finding Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeScanTreatedIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeScanFindingOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/code-scan/runs":{"get":{"tags":["code-scan"],"summary":"List Code Scan Runs","description":"Scan-run HISTORY, newest first — one item per ingest (Viewer+).\n\nThe read side of the per-scan recap `summary` only shows for the LAST run.\nEvery ingest has always appended its bilan (`counts{new, persisting,\ntreated, gone}`, `submitted`, `via`, `meta`, actor) to this history; this\nendpoint paginates it, `created_at DESC`, over the `project_recent` index.\n\nCursor pagination: read `cursor_next` and pass it back as `cursor` until it\nis null. The cursor is a COMPOUND (created_at, uuid) token — it names every\nfield the sort orders on, so no run is skipped even when two share a\nmillisecond. An EMPTY history means no scan has ever run here — an unmeasured\nproject, not a clean one.","operationId":"code_scan_list_code_scan_runs","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque page token: pass back the `cursor_next` from the previous page. Omit for the first page. It carries the last row's (created_at, uuid) — do not parse it; a malformed value is a 400.","title":"Cursor"},"description":"Opaque page token: pass back the `cursor_next` from the previous page. Omit for the first page. It carries the last row's (created_at, uuid) — do not parse it; a malformed value is a 400."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeScanRunsPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/code-scan/summary":{"get":{"tags":["code-scan"],"summary":"Code Scan Summary","description":"Current counts per status + the last run.\n\n`measured=False` means NO scan has ever reported a finding here — it does NOT\nmean the code is clean. Zero findings from a scanner that never ran is not an\nabsence of hardcoded strings.\n\n`excluded` reshapes the per-status counts; the top-level `excluded` integer is\nthe always-on 'Exclusions (N)' badge (findings masked by >=1 rule).","operationId":"code_scan_code_scan_summary","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"excluded","in":"query","required":false,"schema":{"type":"string","pattern":"^(exclude|only|include)$","description":"Exclusion-rule filter for the per-status counts (default `exclude`): `exclude` hides matched findings · `only` counts ONLY matched · `include` ignores rules. The top-level `excluded` badge total is param-independent.","default":"exclude","title":"Excluded"},"description":"Exclusion-rule filter for the per-status counts (default `exclude`): `exclude` hides matched findings · `only` counts ONLY matched · `include` ignores rules. The top-level `excluded` badge total is param-independent."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeScanSummaryOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/code-scan/exclusions":{"get":{"tags":["code-scan"],"summary":"List Code Scan Exclusions","description":"Every exclusion rule on the project, oldest first (Viewer+).\n\nEach rule carries its live `matched_count` (findings it masks now, all\nstatuses) and a resolved `created_by`. This is the management view's source;\nto see the findings a rule hides, call `/findings?excluded=only`.","operationId":"code_scan_list_code_scan_exclusions","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CodeScanExclusionOut"},"title":"Response Code Scan List Code Scan Exclusions"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["code-scan"],"summary":"Create Code Scan Exclusion","description":"Add an exclusion rule (Developer+, same gate as code-scan ingest).\n\nIDEMPOTENT: a re-POST of the same `(type, value)` returns the EXISTING rule\nwith a 200 — never a duplicate, never a 409. Persistent: the rule survives\nre-scans because it matches by value/path, not by fingerprint.","operationId":"code_scan_create_code_scan_exclusion","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeScanExclusionIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeScanExclusionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/code-scan/exclusions/{rule_id}":{"delete":{"tags":["code-scan"],"summary":"Delete Code Scan Exclusion","description":"Remove an exclusion rule (Developer+); its masked findings reappear at the\nnext read. An unknown or foreign `rule_id` is a 404, never a silent success.","operationId":"code_scan_delete_code_scan_exclusion","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"rule_id","in":"path","required":true,"schema":{"type":"string","title":"Rule Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeScanExclusionDeleted"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/code-scan/inventory":{"get":{"tags":["code-scan"],"summary":"List Code Scan Inventory","description":"Discovered (component, prop) pairs carrying a string literal (Viewer+).\n\nRead-only source of the translatable-props discovery screen. Written by\nPIGGYBACK on the ingest (`component_prop_inventory`), one row per pair, sorted\nby (component, prop). Empty = the last scan sent an empty inventory (or none\never did).","operationId":"code_scan_list_code_scan_inventory","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":1,"default":500,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeScanInventoryPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/code-scan/translatable-props":{"get":{"tags":["code-scan"],"summary":"List Code Scan Picks","description":"The dev's translatable-prop picks (Viewer+), each flagged `in_inventory`.\n\nThe CLI reads this before scanning to flag those props — they then come back\nas ordinary findings. `in_inventory=false` is an orphan pick (the pair left\nthe code).","operationId":"code_scan_list_code_scan_picks","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":1,"default":1000,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeScanPicksPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["code-scan"],"summary":"Create Code Scan Pick","description":"Mark a (component, prop) translatable (Developer+).\n\nIDEMPOTENT: a re-POST of the same pair returns the EXISTING pick with a 200 —\nnever a duplicate, never a 409. Persistent: the pick survives re-scans; the\nCLI reads it to flag the prop so its literal comes back as a finding.","operationId":"code_scan_create_code_scan_pick","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeScanPickIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeScanPickOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/code-scan/translatable-props/{pick_id}":{"delete":{"tags":["code-scan"],"summary":"Delete Code Scan Pick","description":"Un-mark a translatable-prop pick (Developer+). At the next scan the CLI no\nlonger flags that prop. An unknown or foreign `pick_id` is a 404.","operationId":"code_scan_delete_code_scan_pick","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"pick_id","in":"path","required":true,"schema":{"type":"string","title":"Pick Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeScanPickDeleted"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/code-scan/prop-suggestions":{"get":{"tags":["code-scan"],"summary":"List Code Scan Prop Suggestions","description":"AI-proposed translatable (component, prop) pairs, for the console (Viewer+).\n\nDismissed suggestions are EXCLUDED (they are the dev's \"no\"). Each carries\n`confirmed` (a pick already exists — derived), `in_inventory` (still\ndiscovered), and `created_by` (which agent). Confirming one is the ordinary\n`POST /translatable-props`; dismissing is `DELETE` below.","operationId":"code_scan_list_code_scan_prop_suggestions","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":1,"default":1000,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeScanSuggestionsPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/code-scan/prop-suggestions/{suggestion_id}":{"delete":{"tags":["code-scan"],"summary":"Dismiss Code Scan Prop Suggestion","description":"Dismiss an AI suggestion (Developer+) — a SOFT tombstone. The pair stops\nshowing in the list and the agent's next re-proposal no-ops, so the human \"no\"\nis not re-litigated every scan. Unknown or foreign id is a 404. Idempotent.","operationId":"code_scan_dismiss_code_scan_prop_suggestion","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"suggestion_id","in":"path","required":true,"schema":{"type":"string","title":"Suggestion Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeScanSuggestionDismissed"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/code-scan/prop-ignores":{"get":{"tags":["code-scan"],"summary":"List Code Scan Prop Ignores","description":"Prop-ignore rules for the translatable-props inventory (Viewer+).\n\nA pure DISPLAY filter: the console hides an ignored component (`prop=null`) or\n(component, prop) from the discovery screen. Never touches findings, picks, or\nthe stored inventory. Written by the dev (POST below) or the agent (MCP twin).","operationId":"code_scan_list_code_scan_prop_ignores","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":1,"default":1000,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeScanIgnoresPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["code-scan"],"summary":"Create Code Scan Prop Ignore","description":"Ignore a whole component (`prop` omitted) or one (component, prop) (Developer+).\n\nIDEMPOTENT: a re-POST of the same triple returns the EXISTING rule with a 200 —\nnever a duplicate, never a 409. A null-prop rule and a string-prop rule coexist\non the same component (distinct triples).","operationId":"code_scan_create_code_scan_prop_ignore","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeScanIgnoreIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeScanIgnoreOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/code-scan/prop-ignores/{ignore_id}":{"delete":{"tags":["code-scan"],"summary":"Delete Code Scan Prop Ignore","description":"Remove a prop-ignore rule (Developer+); the component/pair reappears in the\ninventory view. An unknown or foreign `ignore_id` is a 404, never a silent\nsuccess.","operationId":"code_scan_delete_code_scan_prop_ignore","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"ignore_id","in":"path","required":true,"schema":{"type":"string","title":"Ignore Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeScanIgnoreDeleted"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/code-occurrences":{"post":{"tags":["code-occurrences"],"summary":"Ingest Code Occurrences","description":"Ingest ONE batch of a key-usage run (Developer+).\n\nLifecycle: omit `scan_id` to OPEN a run (the response mints + echoes the id),\necho it on follow-up batches, send `final=true` on the last one to CLOSE the\nrun — only the close reconciles `gone` and runs the mass-gone guard. A\n`scan_id` that is not the project's current open run is a 422.\n\nEach `ref` is resolved server-side to the BASE-version key_uuid; refs matching\nno live base key are counted `unresolved` and echoed (the missing-key signal),\nnever stored. Re-posting a batch is idempotent. The response ALWAYS carries\n`scan_id` when supported — the CLI treats its absence as a pre-contract backend\nand must not drop occurrences silently.","operationId":"code_occurrences_ingest_code_occurrences","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeOccurrencesIngestIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeOccurrencesRunOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/code-occurrences/files":{"get":{"tags":["code-occurrences"],"summary":"List Code Occurrences Files","description":"Per-FILE rollup of key usages — the 'par fichier' view (Viewer+).\n\nOne row per file with the keys referenced in it: `{key_uuid, name, namespace,\noccurrence_count}`. `measured=false` means no run has completed here — an empty\ntree is 'never scanned', not 'no usages'.","operationId":"code_occurrences_list_code_occurrences_files","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","pattern":"^(present|gone)$","description":"present = current coverage (default) · gone = files a key left.","default":"present","title":"Status"},"description":"present = current coverage (default) · gone = files a key left."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":1,"default":500,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeOccurrencesFilesPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/code-profile":{"post":{"tags":["onboarding"],"summary":"Set Code Profile","description":"Record which frameworks this project's codebase uses (Developer+).\n\nUPSERT: this REPLACES the stored profile. A repository can carry several\nframeworks at once, so `frameworks` is a list — `detected_at` is stamped by\nthe server, one timestamp per write.\n\nAn unknown framework name is a **422**, never a silently stored string: the\ndashboard renders these, so an unrenderable value would show up as a blank\nchip instead of an error.","operationId":"onboarding_set_code_profile","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeProfileIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeProfileOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["onboarding"],"summary":"Get Code Profile","description":"The stored profile, or `null` when none was ever posted.\n\n`null` means NOT DETECTED YET — it does not mean \"no framework\".","operationId":"onboarding_get_code_profile","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/CodeProfileOut"},{"type":"null"}],"title":"Response Onboarding Get Code Profile"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/onboarding":{"get":{"tags":["onboarding"],"summary":"Get Onboarding","description":"Consolidated onboarding state for a dashboard stepper.\n\nEvery step is an EXISTENCE probe, never a percentage over a possibly-empty\ndenominator — see `formula.why_existence`. This endpoint exists because an\nempty project reported \"100% done\"; a step that is true because there is no\ndata is the worst default a progress indicator can have.","operationId":"onboarding_get_onboarding","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/progress/by-member":{"get":{"tags":["progress"],"summary":"Progress By Member","description":"Per-member advancement for this project (all org members). Two aggregations\n(translations by updater x status, open tasks by assignee) joined in memory —\nconstant round-trips, no N+1. Bots and non-member actors are excluded.","operationId":"progress_progress_by_member","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"language_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberProgressOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/progress/assign":{"post":{"tags":["progress"],"summary":"Assign Work","description":"Create + assign a `translation.translate` task (a language and/or a key\nsubset) to a member in one call, firing the P2 task_assigned notification.\nThe assignee must be an active member of the org (a suspended member resolves\nto no role and is refused).","operationId":"progress_assign_work","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/tasks":{"get":{"tags":["project-tasks"],"summary":"List Project Tasks","description":"The project's unified todo list (Viewer+). Open/in-progress first.\n\n`category` filters by group (translation, validation, analysis, missing_keys,\nonboarding, glossary, publishing). `agent_requested=true` returns only the\ntasks a human flagged for the workflow agent.","operationId":"project_tasks_list_project_tasks","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(open|in_progress|done|dismissed)$"},{"type":"null"}],"title":"Status"}},{"name":"assignee","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assignee"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"agent_requested","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Agent Requested"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":1,"default":500,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskListOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["project-tasks"],"summary":"Create Project Task","description":"File a task by hand (Developer+). Agents use the MCP twin instead.","operationId":"project_tasks_create_project_task","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskCreateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/tasks/{task_id}":{"get":{"tags":["project-tasks"],"summary":"Get Project Task","description":"One task, for the fiche opened at its own URL (Viewer+). 404 if unknown or\nhidden by the team-role visibility filter (translator/qa see only their own).","operationId":"project_tasks_get_project_task","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["project-tasks"],"summary":"Update Project Task","description":"Change a task's status and/or assignment (Developer+). A status change is\nrecorded in the task's audit history.","operationId":"project_tasks_update_project_task","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskUpdateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/tasks/reconcile":{"post":{"tags":["project-tasks"],"summary":"Reconcile Project Tasks","description":"Seed/settle the system tasks from the live project state (Viewer+): the\nonboarding-equivalent AND the signal reconcilers (untranslated/pending keys,\nundecided component props, runtime missing keys). Idempotent — the Overview\ncalls it on load; kept an explicit POST so no GET writes what it reads.","operationId":"project_tasks_reconcile_project_tasks","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReconcileOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/tasks/{task_id}/comments":{"get":{"tags":["project-tasks"],"summary":"List Task Comments","description":"The task's discussion thread — comments + decision requests (Viewer+).\n404 if the task is hidden from the caller (translator/qa see only their own).","operationId":"project_tasks_list_task_comments","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentListOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["project-tasks"],"summary":"Add Task Comment","description":"Post a comment (any project member). With `options` it is a decision request.\n404 if the task is hidden from the caller (translator/qa see only their own).","operationId":"project_tasks_add_task_comment","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentCreateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/tasks/{task_id}/comments/{comment_id}/answer":{"post":{"tags":["project-tasks"],"summary":"Answer Task Decision","description":"Answer a decision from the DASHBOARD — authoritative, overrides a terminal\nanswer (Viewer+). 404 if the task is hidden from the caller (translator/qa\nsee only their own).","operationId":"project_tasks_answer_task_decision","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}},{"name":"comment_id","in":"path","required":true,"schema":{"type":"string","title":"Comment Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentAnswerIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/i18next/export":{"get":{"tags":["i18next"],"summary":"Export I18Next","operationId":"i18next_export_i18next","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"language","in":"query","required":true,"schema":{"type":"string","description":"BCP-47 language code (e.g. fr, en-US)","title":"Language"},"description":"BCP-47 language code (e.g. fr, en-US)"},{"name":"namespace","in":"query","required":true,"schema":{"type":"string","description":"namespace slug","title":"Namespace"},"description":"namespace slug"},{"name":"version","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version slug; defaults to the project's production version.","title":"Version"},"description":"Version slug; defaults to the project's production version."},{"name":"flat","in":"query","required":false,"schema":{"type":"boolean","description":"Return a dot-keyed flat object instead of the nested tree.","default":false,"title":"Flat"},"description":"Return a dot-keyed flat object instead of the nested tree."},{"name":"include_statuses","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated list of translation statuses to include. Default: translated,reviewed,approved (matches CDN policy). Pass e.g. `draft,translated,reviewed,approved` to include drafts.","title":"Include Statuses"},"description":"Comma-separated list of translation statuses to include. Default: translated,reviewed,approved (matches CDN policy). Pass e.g. `draft,translated,reviewed,approved` to include drafts."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportReport"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/i18next/import":{"post":{"tags":["i18next"],"summary":"Import I18Next","description":"Import an i18next bundle. Two shapes:\n\n- SINGLE (legacy): {namespace, language, payload} -> ImportReport.\n- ONE-SHOT (task 750): {namespaces:[{namespace, translations:{lang: tree}}]}\n  -> ImportBundleReport (N namespaces x N languages in a single call).\n\nCreates missing keys + upserts translations (idempotent), enforces the\nglossary (#758), resolves matching missing-key events. Shared core with the\nMCP surface (app.services.i18next_import.import_bundle).","operationId":"i18next_import_i18next","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportIn"},"example":{"namespaces":[{"namespace":"common","translations":{"fr":{"hero":{"title":"Bonjour"}},"en":{"hero":{"title":"Hello"}}}}]}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ImportReport"},{"$ref":"#/components/schemas/ImportBundleReport"}],"title":"Response I18Next Import I18Next"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/xliff/export":{"get":{"tags":["xliff"],"summary":"Export Xliff","operationId":"xliff_export_xliff","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"target_language","in":"query","required":true,"schema":{"type":"string","description":"BCP-47 target language code","title":"Target Language"},"description":"BCP-47 target language code"},{"name":"namespace","in":"query","required":true,"schema":{"type":"string","description":"namespace slug","title":"Namespace"},"description":"namespace slug"},{"name":"source_language","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Source language code; defaults to the project's source_language.","title":"Source Language"},"description":"Source language code; defaults to the project's source_language."},{"name":"version","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Version slug; defaults to the project's production version.","title":"Version"},"description":"Version slug; defaults to the project's production version."},{"name":"include_statuses","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated translation statuses to include. Default: translated,reviewed,approved (matches CDN policy).","title":"Include Statuses"},"description":"Comma-separated translation statuses to include. Default: translated,reviewed,approved (matches CDN policy)."},{"name":"xliff_version","in":"query","required":false,"schema":{"type":"string","description":"XLIFF spec version to emit. One of ('1.2', '2.0', '2.1').","default":"2.1","title":"Xliff Version"},"description":"XLIFF spec version to emit. One of ('1.2', '2.0', '2.1')."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/XliffExportReport"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/xliff/import":{"post":{"tags":["xliff"],"summary":"Import Xliff","operationId":"xliff_import_xliff","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/XliffImportIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/XliffImportReport"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/csv/export":{"get":{"tags":["csv"],"summary":"Export Csv","description":"One global CSV of translations. Columns carry namespace + language, so all\nnamespaces/languages live in one file (filterable). Plural keys emit one row\nper CLDR category.","operationId":"csv_export_csv","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"languages","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated target language codes; default all non-source.","title":"Languages"},"description":"Comma-separated target language codes; default all non-source."},{"name":"namespaces","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated namespace slugs; default all.","title":"Namespaces"},"description":"Comma-separated namespace slugs; default all."},{"name":"source_language","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Language"}},{"name":"delimiter","in":"query","required":false,"schema":{"type":"string","default":",","title":"Delimiter"}},{"name":"include_statuses","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Include Statuses"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CsvExportReport"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/csv/import":{"post":{"tags":["csv"],"summary":"Import Csv","description":"Import a translation CSV. Rows grouped by (namespace, key, language); a\nplural key = its plural_category rows. Unknown key/namespace/language and\nplaceholder mismatches are REPORTED (not silently applied). strict=true\nrejects the whole import if any error.","operationId":"csv_import_csv","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CsvImportIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CsvImportReport"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/lokalise/import":{"post":{"tags":["lokalise"],"summary":"Import Lokalise","operationId":"lokalise_import_lokalise","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LokaliseImportIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LokaliseImportReport"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/search":{"get":{"tags":["search"],"summary":"Search","operationId":"search_search","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":200,"title":"Q"}},{"name":"namespace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace Id"}},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated scope of which fields q must match, restricting the search PORTÉE. Recognized: name, description, value, namespace. namespace matches keys whose namespace NAME or SLUG contains q (distinct from namespace_id, which filters to one namespace). Absent, empty, or containing no recognized field ⇒ default scope name+description+value (unchanged legacy behavior). Unrecognized values are ignored (no 422).","title":"Fields"},"description":"Comma-separated scope of which fields q must match, restricting the search PORTÉE. Recognized: name, description, value, namespace. namespace matches keys whose namespace NAME or SLUG contains q (distinct from namespace_id, which filters to one namespace). Absent, empty, or containing no recognized field ⇒ default scope name+description+value (unchanged legacy behavior). Unrecognized values are ignored (no 422)."},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"filter by key type(s) (repeatable)","title":"Type"},"description":"filter by key type(s) (repeatable)"},{"name":"languages","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"comma-separated language uuids. Both narrows the translations[] match query AND scopes keys[i].translations to these languages.","title":"Languages"},"description":"comma-separated language uuids. Both narrows the translations[] match query AND scopes keys[i].translations to these languages."},{"name":"surface","in":"query","required":false,"schema":{"type":"string","description":"Which overlay to search VALUES in (task 1482). 'base' (default) searches the normal translation values. An a11y surface (aria_label|alt_text|screen_reader|plain_language) searches that surface's override values instead (key-name hits are unaffected).","default":"base","title":"Surface"},"description":"Which overlay to search VALUES in (task 1482). 'base' (default) searches the normal translation values. An a11y surface (aria_label|alt_text|screen_reader|plain_language) searches that surface's override values instead (key-name hits are unaffected)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"include_deleted","in":"query","required":false,"schema":{"type":"boolean","description":"Include recycle-bin keys (soft-deleted). Default FALSE excludes trashed keys from both key hits and value hits — aligned with /keys, /translations and coverage (task 1351).","default":false,"title":"Include Deleted"},"description":"Include recycle-bin keys (soft-deleted). Default FALSE excludes trashed keys from both key hits and value hits — aligned with /keys, /translations and coverage (task 1351)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/missing":{"post":{"tags":["missing"],"summary":"Ingest","operationId":"missing_ingest","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MissingBatchIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MissingBatchOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/missing-keys":{"get":{"tags":["missing"],"summary":"List Project Missing Keys","description":"Cursor-paginated missing-key events for the editor UI. ProjectViewer auth.","operationId":"missing_list_project_missing_keys","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"namespace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace Id"}},{"name":"language_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Code"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"enum":["open","acknowledged","resolved"],"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MissingEventPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/missing-keys/{event_uuid}":{"patch":{"tags":["missing"],"summary":"Patch Missing Event","description":"Flip a missing event's status (open ↔ acknowledged ↔ resolved). Audit-emitted.","operationId":"missing_patch_missing_event","parameters":[{"name":"event_uuid","in":"path","required":true,"schema":{"type":"string","title":"Event Uuid"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MissingEventPatchIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MissingEventOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/missing-keys/cleanup-orphans":{"post":{"tags":["missing"],"summary":"Cleanup Orphan Missing Events","description":"Resolve every open missing-event whose key already exists.\n\nDesigned as a one-shot purge for projects that accumulated phantom\nevents before the auto-resolve-on-create cascade was wired into every\ncreation path. Idempotent — running it again just returns 0 orphans.","operationId":"missing_cleanup_orphan_missing_events","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CleanupOrphansOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/missing-keys/{event_uuid}/plan":{"post":{"tags":["missing"],"summary":"Plan Missing Key Resolution","description":"PREVIEW AI translations of a missing event's source into target languages\n(Developer+). Credit-metered — credit_cost(tier) per delivered target language\n(standard=1, premium=4); undelivered languages are refunded. Writes NOTHING:\nthe caller creates the key + applies the approved values client-side. Idempotent\n+ cached on idempotency_key (a re-call returns the same preview for free).\n\n422 no_source_value when the SDK reported no default text — the UI must collect\na source string before offering AI translation.","operationId":"missing_plan_missing_key_resolution","parameters":[{"name":"event_uuid","in":"path","required":true,"schema":{"type":"string","title":"Event Uuid"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MissingPlanIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MissingPlanOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/feedback/tos":{"post":{"tags":["feedback"],"summary":"Accept Tos","operationId":"feedback_accept_tos","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TosAcceptIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes__feedback__TokenOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/feedback/token/refresh":{"post":{"tags":["feedback"],"summary":"Refresh Token","description":"Rotate an end-user token pair, under the `feedback` usage gate.\n\nORDERING IS LOAD-BEARING. `feedback.refresh()` rotates the stored\n`refresh_token_hash`, which KILLS the caller's current refresh token. A\ngate placed after that call would answer 429 to a client that no longer\nholds a usable token and has not received its replacement — a permanent\nwidget lockout, not a temporary limit. So the org is resolved and the\ngate runs HERE, before the rotation.\n\nThe org is not otherwise reachable from this handler: it lives on the\nstored end-user row, which only `feedback.refresh()` reads. Hence the\nextra projected lookup below. It is indexed (`feedback_end_users`\ncarries a unique sparse index on `refresh_token_hash`, app/db.py) and a\ntoken rotation is not a hot path.\n\nAn unknown or already-rotated token yields no row, so NO GATE RUNS and\n`feedback.refresh()` owns the 401 exactly as before — this handler does\nnot duplicate that decision. The cost is that invalid-token refreshes\nare neither counted nor capped; see the PR for that open hole.","operationId":"feedback_refresh_token","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes__feedback__RefreshIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes__feedback__TokenOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/feedback/strings":{"get":{"tags":["feedback"],"summary":"List Strings","operationId":"feedback_list_strings","parameters":[{"name":"language","in":"query","required":true,"schema":{"type":"string","minLength":2,"maxLength":12,"title":"Language"}},{"name":"keys","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Keys"}},{"name":"namespace","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StringsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/feedback/ratings":{"post":{"tags":["feedback"],"summary":"Post Ratings","operationId":"feedback_post_ratings","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RatingsBatchIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/feedback/suggestions":{"post":{"tags":["feedback"],"summary":"Post Suggestions","operationId":"feedback_post_suggestions","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuggestionsBatchIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/feedback/suggestions/{suggestion_id}":{"patch":{"tags":["feedback"],"summary":"Edit Suggestion","description":"End-user edits their own pending suggestion (task 847).\n\nOwnership: the feedback JWT's anonymized `end_user_id` (subject claim)\nmust match the suggestion's stored `end_user_id` — else 403.\n\nLifecycle: only `pending` suggestions can be edited. Moderated\nstatuses (`approved`/`rejected`/`applied`) → 409 — the suggestion has\nalready been acted on by a project moderator; further edits would\nsilently drift from what they decided on.\n\nIdempotent: PATCH with the same text returns 200 with the current\nshape, no DB write, no audit row.\n\nGated FIRST, before the ownership lookup and before the idempotent\nshort-circuit. A no-op edit still costs the read below, so that is what\nan abuser actually consumes; gating after the short-circuit would leave\nan unlimited free path to anyone replaying the same text. Same position\nas the three routes already gated.","operationId":"feedback_edit_suggestion","parameters":[{"name":"suggestion_id","in":"path","required":true,"schema":{"type":"string","title":"Suggestion Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuggestionEditIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuggestionEditOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/feedback/addon-skus":{"get":{"tags":["feedback"],"summary":"Addon Skus","description":"End-User Eval add-on catalog (task 602, human-confirmed pricing).\n\nData-only — client-admin owns the checkout UI and consumes this to\ndrive Stripe checkout. `stripe_price_id` is null until the env price\nID is configured. Flat monthly per-org; Pro/Team/Enterprise only.","operationId":"feedback_addon_skus","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes__feedback__AddonSkusOut"}}}}}}},"/v1/feedback/my-ratings":{"get":{"tags":["feedback"],"summary":"List My Ratings","description":"The end-user's OWN ratings (task 983 #2), each with the source text so\nthe widget can show the actual string, not the key.","operationId":"feedback_list_my_ratings","parameters":[{"name":"language","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"filter to one target locale","title":"Language"},"description":"filter to one target locale"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MyRatingsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/feedback/my-suggestions":{"get":{"tags":["feedback"],"summary":"List My Suggestions","description":"The end-user's OWN suggestions, each with the source text (task 983 #1)\nand their rating for that string (task 983 #3).","operationId":"feedback_list_my_suggestions","parameters":[{"name":"language","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"filter to one target locale","title":"Language"},"description":"filter to one target locale"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"status filter: widget `accepted` (=approved+applied) OR raw pending|approved|applied|rejected","title":"Status"},"description":"status filter: widget `accepted` (=approved+applied) OR raw pending|approved|applied|rejected"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MySuggestionsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/feedback/summary":{"get":{"tags":["feedback"],"summary":"Feedback Summary","operationId":"feedback_feedback_summary","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"language","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"}},{"name":"namespace","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace"}},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From"}},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SummaryOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/feedback/suggestions":{"get":{"tags":["feedback"],"summary":"Feedback Suggestions","operationId":"feedback_feedback_suggestions","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"language","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"}},{"name":"namespace","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuggestionsPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/feedback/suggestions/{sid}":{"patch":{"tags":["feedback"],"summary":"Moderate Suggestion","operationId":"feedback_moderate_suggestion","parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"string","title":"Sid"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModerateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuggestionView"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/feedback/suggestions/{sid}/apply":{"post":{"tags":["feedback"],"summary":"Apply Suggestion","operationId":"feedback_apply_suggestion","parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"string","title":"Sid"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/feedback/inbox":{"get":{"tags":["feedback"],"summary":"Feedback Inbox","description":"Session-grouped feedback inbox: suggestions (first) + ratings, grouped by\nend-user session, open-suggestion sessions surfaced first. Use the existing\nPATCH /suggestions/{sid} (approve/reject) + POST /suggestions/{sid}/apply\nfor actions.","operationId":"feedback_feedback_inbox","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"language","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"target locale filter","title":"Language"},"description":"target locale filter"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"suggestion status filter (ratings excluded when set)","title":"Status"},"description":"suggestion status filter (ratings excluded when set)"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboxOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/feedback/review-state":{"get":{"tags":["feedback"],"summary":"Feedback Review State","description":"Menu-badge counter: new suggestions/ratings since the last review.","operationId":"feedback_feedback_review_state","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewStateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/feedback/mark-reviewed":{"post":{"tags":["feedback"],"summary":"Feedback Mark Reviewed","description":"Stamp the project reviewed-now (resets the badge + disarms the digest).","operationId":"feedback_feedback_mark_reviewed","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewStateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/feedback-addon/state":{"get":{"tags":["feedback"],"summary":"Get Addon State","description":"Resolve the per-project End-User Eval add-on state.\n\nRBAC (dual-auth — task 840):\n  - Bearer USER JWT: any org member of the project's parent org can\n    read. Plain org members without an explicit `project_members`\n    row are intentionally allowed (the response carries no PII —\n    just feature flags), matching the task 836 spec.\n  - Bearer PROJECT API KEY: must be scoped to this org AND this\n    project, and must hold `project:read` (or wider — `project:write`,\n    `*`) scope. Lets the `@sonenta/feedback` SDK fetch state at\n    widget setup time, BEFORE the end-user accepts the feedback ToS\n    (master decision 2026-05-29 — option (a) on the sprint follow-up).","operationId":"feedback_get_addon_state","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackAddonStateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/feedback-addon/languages":{"put":{"tags":["feedback"],"summary":"Put Addon Languages","description":"Replace the project's per-locale feedback-addon allowlist (task 837).\n\nValidation:\n  (a) the parent org's `feedback_addon.active` must be True — else 403.\n  (b) every code must already exist in the project's `languages`\n      collection — else 422 with the offending codes.\n  (c) Starter SKU caps the list at 3 — else 422. Unlimited is unbounded.\n\nRBAC: ProjectAdmin gate. Org-admin/owner auto-promote to project-admin\nvia rbac.project_role inheritance, so both pass.\n\nIdempotent: a request whose normalized list equals the stored list\nreturns 200 with the current state and writes no audit row.","operationId":"feedback_put_addon_languages","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackAddonLanguagesIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackAddonStateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/in-context/tos":{"post":{"tags":["in-context"],"summary":"Accept Tos","description":"End user accepts the in-context ToS → mint an access + refresh bundle.\n\nGated on the parent org holding the active in-context add-on (the billing\nentitlement) — a project whose org never bought the add-on 403s here.","operationId":"in_context_accept_tos","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TosAcceptIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes__in_context__TokenOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/in-context/token/refresh":{"post":{"tags":["in-context"],"summary":"Refresh Token","operationId":"in_context_refresh_token","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes__in_context__RefreshIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes__in_context__TokenOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/in-context/addon-skus":{"get":{"tags":["in-context"],"summary":"Addon Skus","description":"In-context editing add-on catalog (single flat tier, task 903).\n\nData-only — client-admin owns the checkout UI and consumes this to drive\nStripe checkout. `stripe_price_id` is null until the env price ID is\nconfigured. Flat $49/mo per-org (uniform with the feedback add-on tiers).","operationId":"in_context_addon_skus","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes__in_context__AddonSkusOut"}}}}}}},"/v1/projects/{project_id}/in-context-addon/state":{"get":{"tags":["in-context"],"summary":"Get Addon State","description":"Resolve the per-project in-context add-on state.\n\nRBAC (dual-auth, mirrors the feedback add-on state endpoint):\n  - Bearer USER JWT: any org member of the project's parent org can read\n    (the response carries no PII — just feature flags).\n  - Bearer PROJECT API KEY: must be scoped to this org AND this project,\n    and hold `project:read` (or wider). Lets the SDK fetch state at widget\n    setup time, BEFORE the end-user accepts the in-context ToS.","operationId":"in_context_get_addon_state","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InContextAddonStateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/in-context-addon/enabled":{"put":{"tags":["in-context"],"summary":"Put Addon Enabled","description":"Flip the project's in-context add-on opt-in toggle.\n\nValidation: enabling requires the parent org's `in_context_addon.active`\nto be True — else 403 (buy the add-on first). Disabling is always allowed\n(so a project can opt out even after the org's subscription lapsed).\n\nRBAC: ProjectAdmin gate (org-admin/owner auto-promote via rbac inheritance).\n\nIdempotent: a request whose value equals the stored flag returns 200 with\nthe current state and writes no audit row.","operationId":"in_context_put_addon_enabled","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InContextEnabledIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InContextAddonStateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/in-context/sessions":{"post":{"tags":["in-context"],"summary":"Create Session","description":"Open an in-context editing session for a project (dashboard, dual-auth).\n\nRequires the org's add-on active (billing entitlement) + the project's\nper-project opt-in + translator-level project access. Returns the session\nplus a QR payload {pairingToken, channel, rtUrl} — valid only while the\nsession is active.","operationId":"in_context_create_session","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionCreateIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionCreateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/in-context/pair":{"post":{"tags":["in-context"],"summary":"Pair","description":"App claims a pairing token OR short code → scoped, expiring Centrifugo\nsub-token.\n\nAccepts EITHER the long QR token or the short human-typable code (task 929)\nin the same `pairingToken` field — matched case-insensitively with the\nhyphen/whitespace ignored. Single-use + bound: the claim is an atomic\nconditional update on the unused session, so a replay (or a race) cannot\npair twice. Rejects unknown credentials, inactive sessions, and expired\nsessions. Brute-force protected: failed (unknown) attempts per client IP are\nrate-limited with a lockout, which is what makes the short code safe.","operationId":"in_context_pair","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PairIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PairOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/in-context/sessions/{session_id}/edit":{"post":{"tags":["in-context"],"summary":"Push Edit","description":"Dashboard pushes a string edit: persist the target value AND publish it on\nthe session channel so the paired app applies the override instantly.","operationId":"in_context_push_edit","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EditIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EditOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/in-context/sessions/{session_id}/keys":{"post":{"tags":["in-context"],"summary":"Report Keys","description":"Paired app reports the i18n keys currently on screen. Persisted as the\nsession's last-seen snapshot (surfaced by GET) and fanned out to the\ndashboard over the channel. Clients never publish directly — this keeps the\nchannel backend-mediated (subscribe-only sub-tokens).","operationId":"in_context_report_keys","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeysReportIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response In Context Report Keys"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/in-context/sessions/{session_id}/end":{"post":{"tags":["in-context"],"summary":"End Session","description":"Close the session: invalidate the pairing token, close the channel\n(session_ended event), and optionally run the existing CDN publish flow.","operationId":"in_context_end_session","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/in-context/sessions/{session_id}":{"get":{"tags":["in-context"],"summary":"Get Session","description":"Live session state: paired? on-screen keys last seen, edit count, expiry.","operationId":"in_context_get_session","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes__in_context__SessionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects":{"get":{"tags":["mcp"],"summary":"List Projects","operationId":"mcp_list_projects","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectsList"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}":{"get":{"tags":["mcp"],"summary":"Project Info","operationId":"mcp_project_info","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectInfo"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/distribution":{"get":{"tags":["mcp"],"summary":"Distribution Info","description":"Self-describing publication info (CDN base URL + url_template, production\nversion, latest bundle per language/namespace with URLs, publish summary +\ngaps) so an agent never guesses the host. Read-only.","operationId":"mcp_distribution_info","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DistributionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/guide":{"get":{"tags":["mcp"],"summary":"Sonenta Guide","description":"One-call onboarding playbook: how to connect (MCP-first, REST fallback),\nthe main actions + endpoints, and links to the OpenAPI + llms.txt. Any valid\nAPI key. Fills the project/org IDs when the key is scoped to one project.","operationId":"mcp_sonenta_guide","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuideOut"}}}}}}},"/v1/mcp/projects/{project_id}/keys":{"get":{"tags":["mcp"],"summary":"List Keys With Translations","description":"LLM-friendly bulk view: keys + source value + per-language translations.\n\nThe `tools.list_keys` MCP tool wraps this. One round-trip lets Claude\ndecide which keys still need translations and what the source text is.","operationId":"mcp_list_keys_with_translations","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"namespace","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by namespace slug","title":"Namespace"},"description":"Filter by namespace slug"},{"name":"name_prefix","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to keys whose name starts with this prefix (case-sensitive, namespace-agnostic). Lets an agent pull just the keys under a dotted path (e.g. 'checkout.') instead of the whole namespace.","title":"Name Prefix"},"description":"Filter to keys whose name starts with this prefix (case-sensitive, namespace-agnostic). Lets an agent pull just the keys under a dotted path (e.g. 'checkout.') instead of the whole namespace."},{"name":"key_uuids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Fetch specific keys by UUID (repeat the param, or pass a comma-separated list). Bypasses namespace/prefix scoping for a targeted per-key context check. Combinable with cursor for paging.","title":"Key Uuids"},"description":"Fetch specific keys by UUID (repeat the param, or pass a comma-separated list). Bypasses namespace/prefix scoping for a targeted per-key context check. Combinable with cursor for paging."},{"name":"language_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Restrict the per-key translations[] to a single BCP-47 language code. Omit to include all project languages.","title":"Language Code"},"description":"Restrict the per-key translations[] to a single BCP-47 language code. Omit to include all project languages."},{"name":"status_filter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Include only keys that have at least one translation with this status (missing|draft|translated|reviewed|approved). When language_code is also set, the filter applies to that language only.","title":"Status Filter"},"description":"Include only keys that have at least one translation with this status (missing|draft|translated|reviewed|approved). When language_code is also set, the filter applies to that language only."},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"include_glossary_hints","in":"query","required":false,"schema":{"type":"boolean","description":"Attach per-key glossary_hints[] (target_translation uses language_code when set).","default":false,"title":"Include Glossary Hints"},"description":"Attach per-key glossary_hints[] (target_translation uses language_code when set)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeysWithTranslationsPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["mcp"],"summary":"Create Key","description":"LLM-friendly key creation: name-based addressing, idempotent.\n\nClaude calls this with `namespace` slug + `name`; if the key already\nexists we return it untouched (created=false). When `source_value` is\nprovided AND the project has a source language, we ALSO upsert that\nvalue as a source-language translation in the same call.","operationId":"mcp_create_key","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes__mcp__KeyCreateIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyCreateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["mcp"],"summary":"Update Key","description":"Edit-in-place the SOURCE value of an existing key (task 862).\n\nPatches the source-language value while PRESERVING the key + its history\n(no delete+recreate). When the value actually changes, the key's existing\nreviewed/approved target translations are demoted to `translated`\n(needs-review / à revoir) and that count is surfaced. A real change bills\none unit; a no-op (submitted value == current) writes nothing and is not\nbilled.","operationId":"mcp_update_key","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyUpdateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyUpdateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/untranslated-keys":{"get":{"tags":["mcp"],"summary":"List Untranslated Keys","description":"Return keys that DON'T yet have a valid translation in `language_code`.\n\nA key is considered \"untranslated\" in the target language when ANY of:\n  - no translation row exists for (key, language) at all\n  - row exists but `value` is empty\n  - row exists but `status == \"missing\"`\n\nKeys whose SOURCE-language value is empty/absent are EXCLUDED by default\n(reported separately as `source_missing`) — they are a source-data gap, not\nan untranslated target. Pass include_source_missing=true to include them.\n\nThe response is intentionally compact (no `translations[]` array) so\nClaude can scan a long list and propose translations for each entry\nusing `source_value` as the input.","operationId":"mcp_list_untranslated_keys","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"language_code","in":"query","required":true,"schema":{"type":"string","description":"Required: BCP-47 target language code (e.g. fr).","title":"Language Code"},"description":"Required: BCP-47 target language code (e.g. fr)."},{"name":"namespace","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by namespace slug","title":"Namespace"},"description":"Filter by namespace slug"},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"include_glossary_hints","in":"query","required":false,"schema":{"type":"boolean","description":"Attach per-key glossary_hints[]: glossary rules matched in the source string.","default":false,"title":"Include Glossary Hints"},"description":"Attach per-key glossary_hints[]: glossary rules matched in the source string."},{"name":"include_source_missing","in":"query","required":false,"schema":{"type":"boolean","description":"By default keys whose SOURCE value is empty/absent are EXCLUDED (untranslated requires a source to translate). Set true to include them; their count is always reported as `source_missing`.","default":false,"title":"Include Source Missing"},"description":"By default keys whose SOURCE value is empty/absent are EXCLUDED (untranslated requires a source to translate). Set true to include them; their count is always reported as `source_missing`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UntranslatedKeysPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/search-keys":{"get":{"tags":["mcp"],"summary":"Search Keys","description":"Find where a term lives, across a project's source + translation values, in ONE call.\n\nSearches base translation VALUES (source language + every translation,\nincluding ICU/CLDR plural sub-forms) and — when include_key_name=true — the\nkey name and description. Results are grouped BY KEY: each item carries a\n`matched_in[]` of {language_code, is_source, field, value, offsets}, so the\ncaller sees the term is in e.g. the fr source AND the en translation without\na second query.\n\nSCOPE LIMIT (not exhaustive): a11y surface overrides (aria_label, alt_text,\nscreen_reader, plain_language) are NOT included — only base values. Raw regex\nis not supported in V1 (the query is matched literally); case_sensitive and\nwhole_word refine the match. Read-only, 0 credits.","operationId":"mcp_search_keys","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"query","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":200,"description":"The term to find. Literal substring (regex-escaped); NOT a regex in V1.","title":"Query"},"description":"The term to find. Literal substring (regex-escaped); NOT a regex in V1."},{"name":"namespace","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Restrict to one namespace slug.","title":"Namespace"},"description":"Restrict to one namespace slug."},{"name":"languages","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"CSV of BCP-47 codes (e.g. 'fr,en-CA'). Default = ALL (source + every translation language).","title":"Languages"},"description":"CSV of BCP-47 codes (e.g. 'fr,en-CA'). Default = ALL (source + every translation language)."},{"name":"case_sensitive","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Case Sensitive"}},{"name":"whole_word","in":"query","required":false,"schema":{"type":"boolean","description":"Match on word boundaries.","default":false,"title":"Whole Word"},"description":"Match on word boundaries."},{"name":"include_key_name","in":"query","required":false,"schema":{"type":"boolean","description":"Also search the key NAME and DESCRIPTION (reported with language_code=null).","default":false,"title":"Include Key Name"},"description":"Also search the key NAME and DESCRIPTION (reported with language_code=null)."},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Page size, in KEYS.","default":25,"title":"Limit"},"description":"Page size, in KEYS."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchKeysPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/missing-keys":{"get":{"tags":["mcp"],"summary":"List Missing Keys","operationId":"mcp_list_missing_keys","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"namespace","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace"}},{"name":"language_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Code"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MissingKeysPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/missing-keys/stats":{"get":{"tags":["mcp"],"summary":"Missing Keys Stats","description":"Count-only summary of outstanding missing-key events.\n\nFilters mirror `list_missing_keys` so an LLM paginating that endpoint\ncan read `total` here and know exactly how many pages remain. One\n`$facet` aggregation, no row payloads.","operationId":"mcp_missing_keys_stats","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"namespace","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace"}},{"name":"language_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Code"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Defaults to `open` — what the LLM cares about. Pass an explicit status to override; pass `all` to count every status.","default":"open","title":"Status"},"description":"Defaults to `open` — what the LLM cares about. Pass an explicit status to override; pass `all` to count every status."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MissingKeysStats"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/missing-keys/acknowledge":{"post":{"tags":["mcp"],"summary":"Acknowledge Missing Keys","description":"Mark a batch of missing-event rows as resolved.\n\nCleanup hook for the LLM: after Claude proposes translations or decides\na missing-event is noise (typo, dead code, locale-mismatch), it calls\nthis to clear the rows from the dashboard. Audits one event per\nresolution. Events outside this project, or already resolved, are\ncounted separately rather than raising.","operationId":"mcp_acknowledge_missing_keys","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcknowledgeMissingIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcknowledgeMissingOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/missing-keys/promote":{"post":{"tags":["mcp"],"summary":"Promote Missing Key","description":"Promote missing-events that carry a REAL default value into project keys (task 745).\n\nFor each event with `has_default_value`, create the project key (in the\nproduction version) with the captured default as its source-language value —\nwhich auto-resolves the open event (via `_ensure_key` → resolve_open_missing).\nEvents without a real default error per item (no source to seed); unknown /\ncross-project uuids and vanished namespaces also error per item. Idempotent:\nan already-existing key returns created=false (and still resolves the event).\nThe plan key-cap is a whole-batch gate (mirrors create_keys_bulk).","operationId":"mcp_promote_missing_key","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoteMissingIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoteMissingOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/missing-keys/resolve-orphans":{"post":{"tags":["mcp"],"summary":"Resolve Missing Orphans","description":"Drain orphan missing-events (key already exists → resolved) over the MCP\nsurface (task 745A).\n\nMakes the missing flow self-sufficient: the same cleanup previously required\nproject:write (`/cleanup-orphans`), unreachable by an `mcp:*` key. Idempotent\n— re-running just resolves 0. (list/stats also self-heal on access; this is\nthe explicit full drain.)","operationId":"mcp_resolve_missing_orphans","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveOrphansOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/i18next/import":{"post":{"tags":["mcp"],"summary":"Mcp I18Next Import","description":"One-shot i18next import over the MCP surface (task 750): N namespaces x N\nlanguages in a single call — creates missing keys + upserts translations,\nidempotent, glossary-enforced. The automation/CLI path (#751). Shares the\ncore with the dashboard JWT endpoint.","operationId":"mcp_mcp_i18next_import","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpImportIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpImportOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/source-health":{"get":{"tags":["mcp"],"summary":"Mcp Source Health","description":"Source-health report (task 752): key==value, empty source, keys with no\ntranslations, placeholder-parity mismatches, duplicate source values.\nDuplicate groups carry a status (task 1114) — see /source-duplicates.","operationId":"mcp_mcp_source_health","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}},{"name":"include_allowed","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Allowed"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceHealthOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/placeholder-mismatches":{"get":{"tags":["mcp"],"summary":"Mcp List Placeholder Mismatches","description":"Structured placeholder mismatches per (key, language) for the\nsonenta-source-health agent's auto-repair loop (task 1314): source/target values\n+ variable sets + missing/extra. The agent rewrites the translation (placing the\nvariables correctly) and writes it via propose_translation / variant CRUD, then\nre-calls this tool — total==0 confirms the fix (mcp:*).","operationId":"mcp_mcp_list_placeholder_mismatches","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}},{"name":"key_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"scope to one key","title":"Key Id"},"description":"scope to one key"},{"name":"language_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"scope to one language","title":"Language Code"},"description":"scope to one language"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaceholderMismatchesOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/source-duplicates":{"get":{"tags":["mcp"],"summary":"Mcp List Source Duplicates","description":"List duplicate source-value groups with their persisted status (task 1114),\npaginated. `status` narrows the result (an agent pulls status=neutral to scope\nthe untriaged backlog, or status=to_fix for human-requested repairs). Groups are\ncomputed then sliced [offset:offset+limit]; `total` is the full filtered count so\nthe agent can page deterministically.","operationId":"mcp_mcp_list_source_duplicates","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"neutral | allowed | to_fix | resolved. `neutral` is the UNTRIAGED default (detected, no decision yet); pass status=neutral to self-scope the untriaged backlog. to_fix = a human requested a fix.","title":"Status"},"description":"neutral | allowed | to_fix | resolved. `neutral` is the UNTRIAGED default (detected, no decision yet); pass status=neutral to self-scope the untriaged backlog. to_fix = a human requested a fix."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Page size. The full unpaginated dump is too large for an agent to hold.","default":50,"title":"Limit"},"description":"Page size. The full unpaginated dump is too large for an agent to hold."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DuplicateGroupsPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/source-duplicates/status":{"put":{"tags":["mcp"],"summary":"Mcp Set Duplicate Status","description":"Mark a duplicate group to_fix|allowed|resolved (task 1114). The repair\nagent sets `resolved` after fixing the dev's code for an immediate clear.","operationId":"mcp_mcp_set_duplicate_status","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DuplicateStatusIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DuplicateStatusOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/source-duplicates/status/bulk":{"put":{"tags":["mcp"],"summary":"Mcp Set Duplicate Status Bulk","description":"Apply one status to many duplicate groups at once (task 1114).","operationId":"mcp_mcp_set_duplicate_status_bulk","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DuplicateStatusBulkIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DuplicateStatusBulkOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/source-duplicates/cluster-applied":{"put":{"tags":["mcp"],"summary":"Mcp Mark Cluster Applied","description":"Flag one merge-plan cluster applied (task 1120). When all clusters are\napplied the group auto-closes: allowed (intentional homonyms) or resolved.","operationId":"mcp_mcp_mark_cluster_applied","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterAppliedIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterAppliedOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/source-duplicates/merge-plan":{"put":{"tags":["mcp"],"summary":"Mcp Set Duplicate Merge Plan","description":"Save (or clear, when merge_plan is null) a duplicate group's merge plan\n(canonical + redundant_key_uuids + survivor_outcome) — task 1362. The mcp:*\ntwin of the dashboard Resolve modal so the sonenta-source-health agent can\nAUTHOR the plan, then apply it (delete_keys_bulk + cluster-applied) and\nset_status(resolved), all via MCP. Saving a plan sets the group to to_fix.","operationId":"mcp_mcp_set_duplicate_merge_plan","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MergePlanIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MergePlanOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/source-duplicates/apply-cluster":{"post":{"tags":["mcp"],"summary":"Mcp Apply New Key Cluster","description":"NK1 (task 1370): apply a NEW-canonical merge atomically — create the key\n(source value + translations copied from the most-complete key of the group)\n+ trash ALL the old keys. The agent then repoints CODE to the new key and\nrecords files_modified via set_merge_plan / set_status.","operationId":"mcp_mcp_apply_new_key_cluster","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyNewKeyClusterIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyNewKeyClusterOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/source-duplicates/propose-plan":{"post":{"tags":["mcp"],"summary":"Mcp Propose Duplicate Merge Plan","description":"'Let AI decide' (task 1385): server-side LLM PROPOSES a merge_plan for a\nduplicate group + a reason. PROPOSE-ONLY — apply via set_merge_plan +\napply-cluster / set_status.","operationId":"mcp_mcp_propose_duplicate_merge_plan","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProposePlanIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProposedPlanOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/coverage":{"get":{"tags":["mcp"],"summary":"Mcp Coverage","description":"Coverage report (task 752): completeness per language x namespace\n(translated/reviewed/approved %% + missing) + rollups.","operationId":"mcp_mcp_coverage","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CoverageOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/surface-coverage":{"get":{"tags":["mcp"],"summary":"Mcp Surface Coverage","description":"Per-active-surface completeness ('surface X = N%% covered') for the\nsonenta-surface agent. a11y surfaces report true completeness (eligible =\ntype-relevant keys); device surfaces report OVERRIDE DENSITY (optional —\nun-overridden cells fall back to base, NOT broken). See meaning per surface.","operationId":"mcp_mcp_surface_coverage","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SurfaceCoverageOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/a11y-report":{"get":{"tags":["mcp"],"summary":"Mcp A11Y Report","description":"A11y quality report (task 991): WCAG-oriented gaps per key/surface/locale.\na11y_untranslated (translation coverage) is segregated into untranslated_count by\ndefault (task 1345/AC1); include_untranslated=true restores the legacy totals.","operationId":"mcp_mcp_a11y_report","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}},{"name":"require_surface","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Require Surface"}},{"name":"reading_level_max_words","in":"query","required":false,"schema":{"type":"integer","maximum":60,"minimum":5,"default":15,"title":"Reading Level Max Words"}},{"name":"include_untranslated","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Untranslated"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/A11yReportOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/recommend-surfaces":{"get":{"tags":["mcp"],"summary":"Mcp Recommend Surfaces","description":"Per-key a11y surface recommendations from the key's semantic type\n(A11Y_TREATMENTS_BY_TYPE) — the turn-key signal for the sonenta-surface agent\nso it never duplicates the type->treatment mapping. Each key lists its relevant\na11y treatments with active + present_in_source flags (active & not present =>\na gap to author). Device surfaces are out of scope (use list_surfaces).","operationId":"mcp_mcp_recommend_surfaces","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}},{"name":"namespace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace Id"}},{"name":"key_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Id"}},{"name":"only_gaps","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Only Gaps"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecommendSurfacesOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/wcag-report":{"get":{"tags":["mcp"],"summary":"Mcp Wcag Report","description":"WCAG 2.2 content-layer MEASUREMENT (task 1288): per-SC pass/fail/not_evaluated\nper locale, each declaring its `method`: `computed` (requirement evaluated) or\n`presence` (content merely exists), plus `measures` (content completeness,\ncomputed-criteria counters, coverage). No conformance level and no conformance\nscore: DOM-dependent SC are out_of_scope and never 'pass', and criteria with no\nkey of the required type are `not_evaluated`, kept in the coverage denominator.\nFor the sonenta-a11y agent + dashboard.","operationId":"mcp_mcp_wcag_report","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WcagReportOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/eaa-statement":{"get":{"tags":["mcp"],"summary":"Mcp Eaa Statement","description":"EAA / EN 301 549 CONTENT-LAYER accessibility report (task 1302), JSON form:\nthe SC it LISTS cross-referenced to their EN 301 549 clause NUMBERS (not a\nconformance mapping; the listed set is the content-layer SC we measure plus\nthe DOM-dependent SC declared out of scope, not the standard), each with its\n`method`, plus content completeness + coverage. Attests no conformance level\n(`attests_conformance_level: false`). For the @sonenta/mcp agent surface\n(html rendering stays on the dashboard) (mcp:*).","operationId":"mcp_mcp_eaa_statement","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Eaa Statement"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/a11y/review/queue":{"get":{"tags":["mcp"],"summary":"Mcp A11Y Queue","description":"Unified a11y moderation view (overrides + gaps) — mcp:* twin of the dashboard\nqueue. ?state=rejected lists rejected cells + reject_reason; group_by_key=true\naggregates by key. a11y_untranslated (coverage) is segregated into untranslated_count\nby default (task 1345/AC1).","operationId":"mcp_mcp_a11y_queue","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}},{"name":"surface","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Surface"}},{"name":"locale","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locale"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"gap","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gap"}},{"name":"namespace_uuid","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace Uuid"}},{"name":"key_uuid","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Uuid"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"group_by_key","in":"query","required":false,"schema":{"type":"boolean","description":"aggregate by key (key_groups + per-key counters)","default":false,"title":"Group By Key"},"description":"aggregate by key (key_groups + per-key counters)"},{"name":"include_untranslated","in":"query","required":false,"schema":{"type":"boolean","description":"include a11y_untranslated (coverage) cells; default segregates into untranslated_count","default":false,"title":"Include Untranslated"},"description":"include a11y_untranslated (coverage) cells; default segregates into untranslated_count"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/A11yQueueOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/keys/{key_id}/a11y-variants/{language_code}/{surface}":{"put":{"tags":["mcp"],"summary":"Mcp Set A11Y Variant","description":"Upsert an a11y variant by locale CODE (mcp:* scope) — re-inject the 991\nreport's (key_uuid, surface, locale-code) directly. Writes a draft override.","operationId":"mcp_mcp_set_a11y_variant","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"language_code","in":"path","required":true,"schema":{"type":"string","title":"Language Code"}},{"name":"surface","in":"path","required":true,"schema":{"type":"string","title":"Surface"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpA11yVariantIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpA11yVariantOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["mcp"],"summary":"Mcp Delete A11Y Variant","description":"Clear an a11y variant by locale CODE (mcp:* scope). The cell re-inherits.","operationId":"mcp_mcp_delete_a11y_variant","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"language_code","in":"path","required":true,"schema":{"type":"string","title":"Language Code"}},{"name":"surface","in":"path","required":true,"schema":{"type":"string","title":"Surface"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/a11y/estimate":{"post":{"tags":["mcp"],"summary":"Mcp A11Y Estimate","description":"Estimate a11y generation/translation units + credits (mcp:* scope).","operationId":"mcp_mcp_a11y_estimate","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/A11yEstimateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/A11yEstimateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/a11y/generate":{"post":{"tags":["mcp"],"summary":"Mcp A11Y Generate","description":"AI-generate source-language a11y variants (mcp:* scope). Billed in credits.","operationId":"mcp_mcp_a11y_generate","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/A11yGenerateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/A11yJobOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/a11y/translate":{"post":{"tags":["mcp"],"summary":"Mcp A11Y Translate","description":"Translate existing source a11y variants to locales (mcp:* scope). Billed in credits.","operationId":"mcp_mcp_a11y_translate","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/A11yTranslateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/A11yJobOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/a11y/remediation-plan":{"get":{"tags":["mcp"],"summary":"Mcp Get Remediation Plan","description":"Read the approved a11y remediation plan the agent must execute (mcp:*).","operationId":"mcp_mcp_get_remediation_plan","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/RemediationPlanOut"},{"type":"null"}],"title":"Response Mcp Mcp Get Remediation Plan"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/a11y/remediation-plan/apply":{"post":{"tags":["mcp"],"summary":"Mcp Apply Remediation Plan","description":"AGENT bulk-execute: apply the APPROVED plan's `apply` items via set_a11y_variant\n(value or current draft), flipping `applied` per item — reversible overlays (mcp:*).","operationId":"mcp_mcp_apply_remediation_plan","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpRemediationApplyIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Apply Remediation Plan"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/a11y/scan":{"post":{"tags":["mcp"],"summary":"Mcp Record A11Y Scan","description":"Record ONE mechanical a11y code scan: recap + the keys it SAW (mcp:*, NOT billed).\n\nMCP twin of the core `POST /v1/projects/{id}/a11y/scan`. It exists because the\nscanner authenticates with an `mcp:*` API key, and `mcp:*` does not satisfy\n`ProjectDeveloper` on the core surface — it 403s there. Widening the scope\nmapping instead would have handed `project:write` to EVERY mcp key across the\nwhole core API, which is a far larger blast radius than one twin route.\n\nCarries the ANALYSIS MARKER (task 1827): `seen_key_uuids` are stamped\n`type_analyzed_at` + `type_analyzed_scan_id`, which is what lets\n/a11y/detection tell a key you looked at and confirmed as text from a key\nnothing ever opened. Retyping alone cannot say that — confirming `text` is a\nno-op write. Stamps nothing else: no `updated_at`, no audit row, no\ntranslations. Batch with `scan_id` (see the field); recap counters are SET, so\nsend the run totals on every batch and re-posting is harmless.\n\n`last_run_at` is stamped server-side. Metered as a read so a local, 0-credit\nscan stays 0-credit (spec §4.1).","operationId":"mcp_mcp_record_a11y_scan","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpA11yScanIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Record A11Y Scan"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/a11y/detection":{"get":{"tags":["mcp"],"summary":"Mcp A11Y Detection","description":"Detection coverage — has the client's CODE been analyzed? (mcp:*, read-only)\n\nMCP twin of the core `GET /v1/projects/{id}/a11y/detection`, for the same\nreason as the scan twin: `mcp:*` does not satisfy even `ProjectViewer` on the\ncore surface (the scope map knows `project:read`/`project:write`/`*`, not\n`mcp:*`), so the core route 403s. This is the scanner's post-scan\nverification loop — it re-reads the SERVER's coverage instead of trusting\nwhat it believes it wrote.\n\nThe four TREATMENT reports (aria-names, alt-text, screen-reader,\nplain-language) deliberately have NO twin: they feed the client-admin\ndashboard over a user JWT. Adding twins nothing calls would grow the MCP tool\nsurface every agent has to carry, for no caller.","operationId":"mcp_mcp_a11y_detection","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/A11yDetectionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/code-scan":{"post":{"tags":["mcp"],"summary":"Mcp Ingest Code Scan","description":"Post ONE code-scan run: the hardcoded, non-i18n strings found in the repo.\n\nMCP twin of `POST /v1/projects/{id}/code-scan`, so the whole scan → agent\nflow runs on ONE `mcp:*` credential (task 1839).\n\nTHE SUBMITTED SET IS AUTHORITATIVE. Every finding already known to this\nproject and ABSENT from this call is flipped to `gone`. Post the FULL result\nof one scan of the WHOLE repository — a partial list does not \"add\" findings,\nit retires the ones you did not walk, and the project then reads clean\nbecause nobody looked.\n\nA run that would retire most of the project's live findings is REFUSED (422)\nunless `confirm_mass_gone` is set. If you hit that, the overwhelmingly likely\ncause is that you scanned a subdirectory or a shallow checkout — check what\nyou walked before overriding it. Every run is written to the audit log with\nthe calling key.","operationId":"mcp_mcp_ingest_code_scan","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpCodeScanIngestIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Ingest Code Scan"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/code-scan/findings":{"get":{"tags":["mcp"],"summary":"Mcp List Code Scan Findings","description":"Hardcoded, non-i18n strings found in the code (mcp:*, read-only, 0 credit).\n\nMCP twin of `GET /v1/projects/{id}/code-scan/findings`. Filter with\n`status`: **new** = still hardcoded and untouched · **treated** = already\nturned into a key (if it is still listed, the raw literal is STILL in the\nsource — the code was never switched over) · **gone** = no longer found.\n\n`excluded` defaults to `exclude`: strings a human put on the project's\nexclusion list are hidden here too, so an agent walking `new` findings does\nnot re-treat something already dismissed.\n\nA `new` count of 0 on a project that was never scanned is NOT \"no hardcoded\nstrings\" — check `code-scan/summary.measured` before reporting cleanliness.","operationId":"mcp_mcp_list_code_scan_findings","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(new|treated|gone)$"},{"type":"null"}],"title":"Status"}},{"name":"file","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"description":"Exact repo-relative path — process one file at a time.","title":"File"},"description":"Exact repo-relative path — process one file at a time."},{"name":"excluded","in":"query","required":false,"schema":{"type":"string","pattern":"^(exclude|only|include)$","description":"Exclusion-rule filter (default `exclude`): findings the project's exclusion list masks are hidden, so you do NOT re-surface or re-treat a string a human excluded. `only` = just the masked ones · `include` = raw (ignore rules).","default":"exclude","title":"Excluded"},"description":"Exclusion-rule filter (default `exclude`): findings the project's exclusion list masks are hidden, so you do NOT re-surface or re-treat a string a human excluded. `only` = just the masked ones · `include` = raw (ignore rules)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp List Code Scan Findings"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/code-scan/findings/treated":{"post":{"tags":["mcp"],"summary":"Mcp Mark Code Scan Finding Treated","description":"Record that a hardcoded string became a key (mcp:*).\n\nMCP twin of `POST /v1/projects/{id}/code-scan/findings/{id}/treated`. The\nfinding id goes in the BODY here rather than the path, so the tool schema\nstays one flat object like the other MCP writes.\n\nIDEMPOTENT: re-marking the same finding with the same key returns the row\nunchanged and does NOT move `treated_at`. An unknown `finding_id` is a 404 —\nit never silently creates a finding, so a typo cannot invent a treated\nrecord that no scan ever reported.","operationId":"mcp_mcp_mark_code_scan_finding_treated","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpCodeScanTreatedIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Mark Code Scan Finding Treated"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/code-occurrences":{"post":{"tags":["mcp"],"summary":"Mcp Ingest Code Occurrences","description":"Post ONE batch of a key-usage run: where each key is referenced in the code.\n\nMCP twin of `POST /v1/projects/{id}/code-occurrences`. Lifecycle: omit\n`scan_id` to OPEN a run (the response mints + echoes it), echo it on follow-up\nbatches, send `final=true` on the last to CLOSE (reconcile `gone` + mass-gone\nguard). Each `ref` is resolved server-side to the BASE-version key_uuid; refs\nmatching no live base key are counted `unresolved` and echoed, never stored.\n\nIMPORTANT: the response ALWAYS carries `scan_id` when supported. Treat its\nABSENCE as a backend that predates this contract and do NOT drop occurrences\nsilently.","operationId":"mcp_mcp_ingest_code_occurrences","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpCodeOccurrencesIngestIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Ingest Code Occurrences"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/code-occurrences/catalogue":{"get":{"tags":["mcp"],"summary":"Mcp Code Occurrences Catalogue","description":"The present-site catalogue the CLI diffs against (mcp:*, read, 0 credit).\n\nEach item is `{ref, file, line, column}`, the union of resolved occurrences and\nruntime-missing sites. Page with `offset`/`limit` until you have `total`. Echo\nthe returned `version` back on `POST .../delta` as `base_version`; a null\n`version` (`measured:false`) means nothing scanned yet, so the first delta sends\neverything as `added`. This is the CHEAP read that makes the local-diff flow\npossible: the CLI computes the delta and the server writes only the change.","operationId":"mcp_mcp_code_occurrences_catalogue","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"default":5000,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Code Occurrences Catalogue"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/code-occurrences/delta":{"post":{"tags":["mcp"],"summary":"Mcp Apply Code Occurrences Delta","description":"Apply a CLI-computed delta in ONE call: insert `added`, retire `removed`.\n\nThe scalable path: the CLI fetches `catalogue`, diffs locally, and sends only\nthe change, so the server resolves + writes O(delta), not O(project). Opens and\nfinalizes one run. `base_version` guards against a concurrent scan — a mismatch\nis a 409, on which you refetch the catalogue and recompute. A `removed` that\nwould retire most live occurrences is a 422 unless `confirm_mass_gone`.","operationId":"mcp_mcp_apply_code_occurrences_delta","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpCodeOccurrencesDeltaIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Apply Code Occurrences Delta"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/code-occurrences/files":{"get":{"tags":["mcp"],"summary":"Mcp List Code Occurrences Files","description":"Per-file rollup of key usages — the 'par fichier' view (mcp:*, read-only).\n\nMCP twin of `GET /v1/projects/{id}/code-occurrences/files`. `measured=false`\nmeans no run has completed — 'never scanned', not 'no usages'.","operationId":"mcp_mcp_list_code_occurrences_files","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","pattern":"^(present|gone)$","default":"present","title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":1,"default":500,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp List Code Occurrences Files"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/keys/{key_id}/occurrences":{"get":{"tags":["mcp"],"summary":"Mcp List Key Occurrences","description":"Every file that references THIS key, joined by stable key_uuid (mcp:*).\n\nMCP twin of `GET /v1/projects/{id}/keys/{id}/occurrences`. 404 if the key does\nnot exist; `measured=false` means no completed run yet.","operationId":"mcp_mcp_list_key_occurrences","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp List Key Occurrences"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/code-scan/runs":{"get":{"tags":["mcp"],"summary":"Mcp List Code Scan Runs","description":"Scan-run HISTORY, newest first — one item per ingest (mcp:*, read-only, 0 credit).\n\nMCP twin of `GET /v1/projects/{id}/code-scan/runs`. Each item is one run's\nrecap: `counts{new, persisting, treated, gone}`, `submitted`, `via`, actor.\nCursor pagination — read `cursor_next`, pass it back as `cursor` until null.\n\nAn EMPTY history means no scan has ever run here — an unmeasured project, not\na clean one. `summary` shows only the LAST run; this shows all of them.","operationId":"mcp_mcp_list_code_scan_runs","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp List Code Scan Runs"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/code-scan/summary":{"get":{"tags":["mcp"],"summary":"Mcp Code Scan Summary","description":"Current code-scan counts + the last run (mcp:*, read-only, 0 credit).\n\n`measured=false` means no scan has ever reported a finding on this project.\nThat is NOT a clean codebase — it is an unmeasured one.\n\nCounts default to `excluded=exclude` (findings on the exclusion list removed);\nthe top-level `excluded` integer is the always-on masked-count badge.","operationId":"mcp_mcp_code_scan_summary","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"excluded","in":"query","required":false,"schema":{"type":"string","pattern":"^(exclude|only|include)$","description":"Exclusion-rule filter for the per-status counts (default `exclude`). The top-level `excluded` badge total is param-independent.","default":"exclude","title":"Excluded"},"description":"Exclusion-rule filter for the per-status counts (default `exclude`). The top-level `excluded` badge total is param-independent."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Code Scan Summary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/code-scan/translatable-props":{"get":{"tags":["mcp"],"summary":"Mcp List Code Scan Picks","description":"The dev's translatable-prop picks (mcp:*, read-only, 0 credit).\n\nRead this BEFORE scanning: for each `{component, prop}`, flag that prop's\nstring literal so it comes back in this run's `findings` (category=keyless,\nsource=\"attribute\", source_name=<prop>). MCP twin of\n`GET /v1/projects/{id}/code-scan/translatable-props`. `in_inventory` reflects\nthe LAST scan and is informational here — act on every pick regardless.","operationId":"mcp_mcp_list_code_scan_picks","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":1,"default":1000,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp List Code Scan Picks"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["mcp"],"summary":"Mcp Create Code Scan Pick","description":"CONFIRM a (component, prop) as translatable directly — the agent's AUTO-ACCEPT\nfor a HIGH-CONFIDENCE pair (mcp:*). Unlike a suggestion (which waits for the human),\na pick is authoritative at once: the next `sonenta scan` flags this prop's literal.\nThe pick carries `created_by` = your api key, so the console labels it \"auto-accepted\nby the agent\" and lets the human undo it. Use PROPOSE (prop-suggestions) for anything\nyou are NOT sure about; use this only when the prop plainly carries user-facing text.\nIdempotent 200 on the same pair — never a duplicate, never a 409.","operationId":"mcp_mcp_create_code_scan_pick","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpPickIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Create Code Scan Pick"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/code-scan/inventory":{"get":{"tags":["mcp"],"summary":"Mcp List Code Scan Inventory","description":"Discovered (component, prop) pairs carrying a literal (mcp:*, read, 0 credit).\n\nMCP twin of `GET /v1/projects/{id}/code-scan/inventory`. The candidate set the\n`sonenta-code-analysis` agent reads to decide which pairs to PROPOSE as\ntranslatable (POST prop-suggestions).","operationId":"mcp_mcp_list_code_scan_inventory","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":1,"default":500,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp List Code Scan Inventory"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/code-scan/prop-suggestions":{"post":{"tags":["mcp"],"summary":"Mcp Create Code Scan Prop Suggestion","description":"PROPOSE a (component, prop) as translatable — for a pair you are NOT certain\nabout (mcp:*). The LOW-CONFIDENCE path: it surfaces in the console for the human to\nconfirm, and nothing is flagged until they do. For a pair that plainly carries\nuser-facing text, AUTO-ACCEPT instead via POST translatable-props. DEDUP by pair:\nlast-rationale-wins on an active suggestion; a NO-OP on a pair the human has\nalready DISMISSED (a re-proposal must not re-litigate that \"no\").","operationId":"mcp_mcp_create_code_scan_prop_suggestion","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpPropSuggestionIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Create Code Scan Prop Suggestion"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/code-scan/prop-ignores":{"get":{"tags":["mcp"],"summary":"Mcp List Code Scan Prop Ignores","description":"Prop-ignore rules (mcp:*, read, 0 credit). MCP twin of\n`GET /v1/projects/{id}/code-scan/prop-ignores`.\n\nRead this to SKIP proposing a component/prop already marked non-translatable\nby the human (or by you): `prop=null` means the WHOLE component is ignored.","operationId":"mcp_mcp_list_code_scan_prop_ignores","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":1,"default":1000,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp List Code Scan Prop Ignores"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["mcp"],"summary":"Mcp Create Code Scan Prop Ignore","description":"IGNORE a component (`prop` omitted) or a (component, prop) as\nnon-translatable (mcp:*). The COMPLEMENT of prop-suggestions: propose the\ntranslatable pairs, ignore the rest to shrink the inventory. DEDUP by triple,\nidempotent 200 — never a duplicate, never a 409.","operationId":"mcp_mcp_create_code_scan_prop_ignore","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpPropIgnoreIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Create Code Scan Prop Ignore"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/code-scan/prop-ignores/{ignore_id}":{"delete":{"tags":["mcp"],"summary":"Mcp Delete Code Scan Prop Ignore","description":"Un-ignore a component/prop (mcp:*) — so the agent can REVISE its own hide-\nlist (unlike suggestions, where write is the agent's only verb). Unknown or\nforeign `ignore_id` is a 404.","operationId":"mcp_mcp_delete_code_scan_prop_ignore","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"ignore_id","in":"path","required":true,"schema":{"type":"string","title":"Ignore Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Delete Code Scan Prop Ignore"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/code-scan/exclusions":{"get":{"tags":["mcp"],"summary":"Mcp List Code Scan Exclusions","description":"Finding-exclusion rules (mcp:*, read, 0 credit). MCP twin of\n`GET /v1/projects/{id}/code-scan/exclusions`, trimmed to `{type, value}` — all a\nscanner needs.\n\nA scan reads these to DROP ignored files/folders/strings from its local report\nand its counts, matching the console, which masks them by default. Each rule is\none of: `string` (exact literal), `file` (exact repo-relative POSIX path), or\n`folder` (every path under `value + '/'`).","operationId":"mcp_mcp_list_code_scan_exclusions","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp List Code Scan Exclusions"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/tasks":{"get":{"tags":["mcp"],"summary":"Mcp List Project Tasks","description":"The project's todo list (mcp:*, read, 0 credit). Read what is already open\nBEFORE filing new tasks, and address a task by its `uuid` to close it.\n\n`status=active` returns open + in_progress only (terminal tasks accumulate);\n`category` filters by group (translation, validation, analysis, missing_keys,\nonboarding…); `agent_requested=true` returns only the tasks a human flagged for\nyou; `lean=true` returns compact items (no description/history) for a list —\nread one in full with `GET .../tasks/{id}`.","operationId":"mcp_mcp_list_project_tasks","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","title":"Status"}},{"name":"type","in":"query","required":false,"schema":{"type":"string","title":"Type"}},{"name":"category","in":"query","required":false,"schema":{"type":"string","title":"Category"}},{"name":"agent_requested","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Agent Requested"}},{"name":"lean","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Lean"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":1,"default":500,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp List Project Tasks"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["mcp"],"summary":"Mcp Create Project Task","description":"File a task on the project's todo list (mcp:*). Attributed to your agent, so\nthe human sees who raised it. Pass a `dedupe_key` (e.g. per language) so a\nre-run updates the same card. Idempotent on an open `dedupe_key`. `link_to`\nrecords a follow-up link back to the task it came from.","operationId":"mcp_mcp_create_project_task","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpTaskIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Create Project Task"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/tasks/{task_id}":{"get":{"tags":["mcp"],"summary":"Mcp Get Project Task","description":"Read ONE task in full — its Markdown `description`, `commands`,\n`agent_prompt`, status and history (mcp:*, read, 0 credit).\n\nThe read half of the loop `list → read → update`: fetch a task to understand\nwhat to do, act, then PATCH its status to `done`/`dismissed`. Unknown `task_id`\nis a 404.","operationId":"mcp_mcp_get_project_task","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Get Project Task"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["mcp"],"summary":"Mcp Update Project Task","description":"Move a task you own along its lifecycle (mcp:*). The change lands in the\ntask's audit history — stamped with who did it (agent name, tool + version,\nand the api key). Unknown `task_id` is a 404.","operationId":"mcp_mcp_update_project_task","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpTaskUpdateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Update Project Task"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/tasks/{task_id}/complete":{"post":{"tags":["mcp"],"summary":"Mcp Complete Task","description":"CLOSE a task with the structured completion QA survey (mcp:*) — the preferred\nway to finish a task, instead of a free-form note. Fill it concisely: a verdict,\na one-line summary, the metrics (numbers → a table), the QA checks you verified,\na short journal, and any follow-ups. The verdict sets the status. Unknown id 404.","operationId":"mcp_mcp_complete_task","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpTaskCompleteIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Complete Task"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/tasks/{task_id}/links":{"post":{"tags":["mcp"],"summary":"Mcp Link Task","description":"Cross-reference two existing tasks so they are navigable both ways (mcp:*).\nFor a follow-up filed in one call, prefer `link_to` on create_project_task.\nUnknown `task_id`/`related_task_id` is a 404.","operationId":"mcp_mcp_link_task","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpTaskLinkIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Link Task"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/tasks/{task_id}/comments":{"get":{"tags":["mcp"],"summary":"Mcp List Task Comments","description":"The task's discussion thread (mcp:*, read, 0 credit) — comments + decision\nrequests with their `answer`. Poll this to see a human's reply (or use\n`sonenta tasks watch`).","operationId":"mcp_mcp_list_task_comments","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp List Task Comments"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["mcp"],"summary":"Mcp Add Task Comment","description":"Post a comment on a task (mcp:*). With `options`, it becomes a DECISION\nrequest awaiting a human answer. Unknown `task_id` is a 404.","operationId":"mcp_mcp_add_task_comment","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpTaskCommentIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Add Task Comment"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/tasks/{task_id}/comments/{comment_id}/answer":{"post":{"tags":["mcp"],"summary":"Mcp Answer Task Decision","description":"Answer a decision from the TERMINAL (mcp:*) — how the human replies without\nthe dashboard. A dashboard answer already recorded is authoritative and is NOT\noverwritten (the call returns it unchanged).","operationId":"mcp_mcp_answer_task_decision","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}},{"name":"comment_id","in":"path","required":true,"schema":{"type":"string","title":"Comment Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpTaskAnswerIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Answer Task Decision"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/code-profile":{"post":{"tags":["mcp"],"summary":"Mcp Set Code Profile","description":"Record which frameworks this codebase uses (mcp:*).\n\nMCP twin of `POST /v1/projects/{id}/code-profile`. UPSERT — it REPLACES the\nprofile rather than merging, so a framework removed from the repo can\nactually be cleared. A repo may legitimately report several at once.\n\nAn unknown framework name is a 422 listing the known set; nothing is written.","operationId":"mcp_mcp_set_code_profile","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpCodeProfileIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Set Code Profile"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["mcp"],"summary":"Mcp Get Code Profile","description":"The stored code profile, or null (mcp:*, 0 credit).\n\n`null` means NOT DETECTED YET — never \"this project has no framework\".","operationId":"mcp_mcp_get_code_profile","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Response Mcp Mcp Get Code Profile"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/onboarding":{"get":{"tags":["mcp"],"summary":"Mcp Onboarding Status","description":"The four onboarding steps (mcp:*, 0 credit).\n\nEvery step is an EXISTENCE probe, never a percentage: an empty project\nreports coverage 100, so a `> 0` test would call it translated with zero\nkeys. See `formula.why_existence`.","operationId":"mcp_mcp_onboarding_status","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Onboarding Status"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/keys/bulk/delete":{"post":{"tags":["mcp"],"summary":"Mcp Delete Keys Bulk","description":"Soft-delete (move to trash) keys by uuid — best-effort, idempotent.\nAlready-trashed = `unchanged`; unknown uuid = `not_found`. Restorable.","operationId":"mcp_mcp_delete_keys_bulk","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpKeyIdsIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyTrashBulkOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/keys/bulk/restore":{"post":{"tags":["mcp"],"summary":"Mcp Restore Keys Bulk","description":"Restore trashed keys by uuid — best-effort. A name clash (an active key\nwith the same address now exists) is reported per item (status=conflict)\nand skipped; it does not abort the batch.","operationId":"mcp_mcp_restore_keys_bulk","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpKeyIdsIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyTrashBulkOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/keys/trashed":{"get":{"tags":["mcp"],"summary":"Mcp List Trashed Keys","description":"List keys currently in the recycle bin (newest first), so an agent can\npick uuids to restore.","operationId":"mcp_mcp_list_trashed_keys","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListTrashedKeysOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/namespaces":{"post":{"tags":["mcp"],"summary":"Create Namespace","description":"Create a namespace from the MCP surface — the tools-only unblocker\n(previously a namespace could only be made via the user dashboard).\n\nValidates the slug against the canonical pattern and returns a\nmachine-readable `slug_invalid` 422 on bad input (NOT the misleading\n`namespace not found` — same rule the lookup path now enforces).\nIdempotent on (project, slug): an existing namespace returns created=false.","operationId":"mcp_create_namespace","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes__mcp__NamespaceCreateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NamespaceCreateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/translations":{"put":{"tags":["mcp"],"summary":"Propose Translation","operationId":"mcp_propose_translation","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranslationProposeIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranslationProposeOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/translations/approve":{"post":{"tags":["mcp"],"summary":"Service Approve Translations","description":"MCP approval twin (task 755 → 1631): an agent flips translated/reviewed ->\napproved over the `mcp:*` scope (metered write, like the a11y-variant tools),\nso the review agent can \"approve the good ones\" in the SAME key it uses to\npropose. The HUMAN dashboard approve (`review_router` in translations.py)\nstays JWT-only.\n\nEvery approval is AUDITED (translation.status_changed, approval_kind=service,\nactor_api_key_uuid) — non-bypassable + distinguishable from human approvals —\nand now emits an enriched observability event via the meter (status_before ->\napproved, per key). Metered write but NOT separately billed (units=0: a\nstatus/governance change; the content was already billed at propose/update).\nAddressed by namespace/key/language_code (AI-native, no uuids). Idempotent:\nalready-approved rows return unchanged; rows without an approvable value\n(missing/draft) error per item.","operationId":"mcp_service_approve_translations","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceApproveIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceApproveOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/keys/bulk":{"post":{"tags":["mcp"],"summary":"Create Keys Bulk","description":"Batch key creation — idempotent, best-effort per-item. Batches the\nwrites only; there is NO server-side translation.\n\nValid items commit even when siblings fail; each item gets an entry in\n`results` (status ok|error) plus a roll-up `summary`. Unknown namespace\nand intra-batch duplicates (same namespace+name twice) error per item.\nThe plan key-cap is a whole-batch gate: if the NEW keys would push the\norg over its cap the entire call is rejected (403) before any write.","operationId":"mcp_create_keys_bulk","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateKeysBulkIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateKeysBulkOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["mcp"],"summary":"Update Keys Bulk","description":"Batch edit-in-place of source values (task 862). Best-effort +\nidempotent per item; each item carries its own result. Billing is weighted\none unit per key ACTUALLY changed — no-ops (`unchanged`) and errors are not\nbilled. Staleness propagates per changed key exactly as the single route.","operationId":"mcp_update_keys_bulk","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateKeysBulkIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateKeysBulkOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/translations/bulk":{"post":{"tags":["mcp"],"summary":"Propose Translations Bulk","description":"Batch translation upserts — idempotent, best-effort per-item, with\nwrite-through key auto-create. Batches the writes only; the values come\nfrom the caller (NO server-side translation).\n\nPer-item `results` (status ok|unchanged|error) + `summary`. An item whose\nvalue AND status already match the stored row returns status `unchanged`\n(no version bump, no history). `reviewed`/`approved` are rejected per item.\nUnknown namespace/language and intra-batch duplicates error per item. No\nplan-cap gate here: the write-through auto-create mirrors the single\npropose path (the cap gap on that path is scoped separately).","operationId":"mcp_propose_translations_bulk","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProposeTranslationsBulkIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProposeTranslationsBulkOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/validate":{"post":{"tags":["mcp"],"summary":"Validate Payload","operationId":"mcp_validate_payload","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateReport"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/cdn/releases":{"post":{"tags":["mcp"],"summary":"Mcp Publish Cdn","description":"Trigger a CDN release from MCP — same orchestration as the user-JWT\n`POST /v1/projects/{id}/cdn/releases`, but addressable via the MCP tool\n`publish_cdn`. Plan-cap soft warns are surfaced via `soft_warn=true`;\nhard caps still raise 403.","operationId":"mcp_mcp_publish_cdn","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpCdnPublishIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpCdnPublishOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/context":{"get":{"tags":["mcp"],"summary":"Mcp Get Context","description":"Read the project's free-form markdown context document via MCP.\n\nReadable by an `mcp:*` key (like the GLOSSARY read) OR a `project:read` key —\nboth are project knowledge a translator-agent needs to do the work, so a plain\nagent key must be able to read it. Writing accepts `mcp:*` or\n`project:settings:write` (see the PUT twin below).","operationId":"mcp_mcp_get_context","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpContextOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["mcp"],"summary":"Mcp Put Context","description":"Upsert the project's context document (`mcp:*` OR `project:settings:write`).\n\nAccepts a plain agent key (`mcp:*`) — like this route's GET twin and the\nglossary writes (`mcp_create_glossary`, McpPrincipal). The context document is\nthe SAME class of translator prompt-knowledge as the glossary (brand voice,\ntone, glossary notes) — already `mcp:*`-READABLE — and its \"propagates to every\ntranslation\" property is shared with the glossary, so it does not justify a\nstricter gate than the glossary has. Gating the very `mcp:*` credential our\ndocs tell the CLI to mint protected nothing (cf. task 1844). An admin-minted\n`project:settings:write` key still works. The HUMAN dashboard PUT\n(`routes/project_context.py`) stays `ProjectAdmin` — unchanged.","operationId":"mcp_mcp_put_context","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpContextIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpContextOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/context/history":{"get":{"tags":["mcp"],"summary":"Mcp List Context History","description":"Context-document versions (mcp:*|project:read, read, 0 credit). MCP twin of\n`GET /v1/projects/{id}/context/history`. Content omitted; `changed_by` resolved.","operationId":"mcp_mcp_list_context_history","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp List Context History"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/context/history/{version}":{"get":{"tags":["mcp"],"summary":"Mcp Get Context Version","description":"One context version with full content (mcp:*|project:read). Unknown -> 404.","operationId":"mcp_mcp_get_context_version","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version","in":"path","required":true,"schema":{"type":"integer","title":"Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Get Context Version"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/context/diff":{"get":{"tags":["mcp"],"summary":"Mcp Context Diff","description":"Diff two context versions, or against the current doc when `to` is omitted\n(mcp:*|project:read). Returns both contents + a unified diff. Unknown -> 404.","operationId":"mcp_mcp_context_diff","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"from","in":"query","required":true,"schema":{"type":"integer","minimum":1,"title":"From"}},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"title":"To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Context Diff"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/context/sections":{"get":{"tags":["mcp"],"summary":"Mcp List Context Sections","description":"Context sections, ordered — LIGHT (title+type+languages, NO body) so a scan\ncosts few tokens. Read one section for its body; search to find one. Pass\n`language` to get the EFFECTIVE context for a target language in one call — the\nall-languages sections PLUS that code's (agnostic + scoped).","operationId":"mcp_mcp_list_context_sections","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"language","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp List Context Sections"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["mcp"],"summary":"Mcp Create Context Section","description":"Add a context section (mcp:*|project:settings:write — like the context PUT).\nRecords v1 history + recomputes the mirror.","operationId":"mcp_mcp_create_context_section","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpSectionIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Create Context Section"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/context/sections/search":{"get":{"tags":["mcp"],"summary":"Mcp Search Context Sections","description":"Substring search on title + body (mcp:*|project:read). Light rows + snippet.","operationId":"mcp_mcp_search_context_sections","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}},{"name":"language","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Search Context Sections"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/context/sections/{section_id}":{"get":{"tags":["mcp"],"summary":"Mcp Get Context Section","description":"One section with its full body (mcp:*|project:read). Unknown -> 404.","operationId":"mcp_mcp_get_context_section","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"section_id","in":"path","required":true,"schema":{"type":"string","title":"Section Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Get Context Section"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["mcp"],"summary":"Mcp Update Context Section","description":"Edit a section (mcp:*|project:settings:write). Unknown -> 404.","operationId":"mcp_mcp_update_context_section","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"section_id","in":"path","required":true,"schema":{"type":"string","title":"Section Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpSectionPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Update Context Section"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["mcp"],"summary":"Mcp Delete Context Section","operationId":"mcp_mcp_delete_context_section","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"section_id","in":"path","required":true,"schema":{"type":"string","title":"Section Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/context/sections/{section_id}/history":{"get":{"tags":["mcp"],"summary":"Mcp List Context Section History","description":"Full history of ONE section (mcp:*|project:read); works after deletion.","operationId":"mcp_mcp_list_context_section_history","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"section_id","in":"path","required":true,"schema":{"type":"string","title":"Section Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp List Context Section History"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/context/sections/{section_id}/revert":{"post":{"tags":["mcp"],"summary":"Mcp Revert Context Section","description":"Restore a section to an earlier version (mcp:*|project:settings:write) — via\nthe normal write path (new history row, never destructive). Unknown -> 404.","operationId":"mcp_mcp_revert_context_section","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"section_id","in":"path","required":true,"schema":{"type":"string","title":"Section Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpSectionRevertIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Revert Context Section"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/usage":{"get":{"tags":["mcp"],"summary":"List Usage","description":"Paged list of MCP usage events for the calling org, with aggregated\nstats over the same filter window.\n\nUses the `(org_uuid, ts DESC)` index for the range scan and one `$facet`\naggregation to return events, totals, and the three breakdown buckets in\na single round-trip. Stats reflect the full filtered set, not just the\nvisible page.","operationId":"mcp_list_usage","parameters":[{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"ISO8601 lower bound (inclusive). Defaults to the start of the current UTC month.","title":"From"},"description":"ISO8601 lower bound (inclusive). Defaults to the start of the current UTC month."},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"ISO8601 upper bound (exclusive). Defaults to now.","title":"To"},"description":"ISO8601 upper bound (exclusive). Defaults to now."},{"name":"cmd","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter rows by command (e.g. `create_key`).","title":"Cmd"},"description":"Filter rows by command (e.g. `create_key`)."},{"name":"user","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by acting user uuid.","title":"User"},"description":"Filter by acting user uuid."},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by api-key uuid.","title":"Api Key"},"description":"Filter by api-key uuid."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageReport"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/usage/quota":{"get":{"tags":["mcp"],"summary":"Usage Quota","description":"Current quota / rate / session state for the calling org.\n\nReturns a snapshot consistent with the `X-MCP-RateLimit-*` and\n`X-MCP-Quota-Remaining` response headers set by the meter dep.","operationId":"mcp_usage_quota","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageQuotaOut"}}}}}}},"/v1/mcp/projects/{project_id}/glossary":{"get":{"tags":["mcp"],"summary":"Mcp List Glossary","operationId":"mcp_mcp_list_glossary","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"rule_type","in":"query","required":false,"schema":{"anyOf":[{"enum":["translation","do_not_translate","forbidden"],"type":"string"},{"type":"null"}],"description":"filter by rule_type","title":"Rule Type"},"description":"filter by rule_type"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"substring match on term","title":"Q"},"description":"substring match on term"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpGlossaryListOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["mcp"],"summary":"Mcp Create Glossary","operationId":"mcp_mcp_create_glossary","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpGlossaryIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpGlossaryEntryOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/glossary/{entry_id}":{"patch":{"tags":["mcp"],"summary":"Mcp Update Glossary","operationId":"mcp_mcp_update_glossary","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","title":"Entry Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpGlossaryPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpGlossaryEntryOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["mcp"],"summary":"Mcp Delete Glossary","operationId":"mcp_mcp_delete_glossary","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","title":"Entry Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/glossary/{entry_id}/history":{"get":{"tags":["mcp"],"summary":"Mcp List Glossary History","description":"Full history of ONE glossary term (mcp:*, read, 0 credit). MCP twin of\n`GET /v1/projects/{id}/glossary/{entry_id}/history`; works after deletion.","operationId":"mcp_mcp_list_glossary_history","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","title":"Entry Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp List Glossary History"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/glossary/{entry_id}/history/{version}":{"get":{"tags":["mcp"],"summary":"Mcp Get Glossary Version","description":"One version snapshot of a term (mcp:*). Unknown version -> 404.","operationId":"mcp_mcp_get_glossary_version","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","title":"Entry Id"}},{"name":"version","in":"path","required":true,"schema":{"type":"integer","title":"Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Get Glossary Version"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/glossary/{entry_id}/revert":{"post":{"tags":["mcp"],"summary":"Mcp Revert Glossary","description":"Restore a term to an earlier version (mcp:*), independently of other terms —\nvia the normal write path (new history row, never destructive). Re-creates the\nterm if it was deleted. Unknown version -> 404; (type, term) clash -> 409.","operationId":"mcp_mcp_revert_glossary","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","title":"Entry Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpGlossaryRevertIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpGlossaryEntryOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/surfaces":{"get":{"tags":["mcp"],"summary":"Mcp List Surfaces","description":"The project's surface catalog (device + a11y, active flags).","operationId":"mcp_mcp_list_surfaces","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SurfaceListOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["mcp"],"summary":"Mcp Create Surface","description":"Add a CUSTOM device surface (a11y is fixed — no custom).","operationId":"mcp_mcp_create_surface","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SurfaceCreateIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SurfaceListOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/surfaces/{slug}":{"put":{"tags":["mcp"],"summary":"Mcp Update Surface","description":"Rename/toggle a surface. Deactivation is SOFT (variants retained+hidden).","operationId":"mcp_mcp_update_surface","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SurfaceUpdateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SurfaceUpdateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["mcp"],"summary":"Mcp Delete Surface","description":"Delete a CUSTOM device surface (builtins: deactivate instead).","operationId":"mcp_mcp_delete_surface","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/keys/{key_id}/variants/{language_code}/{surface}":{"put":{"tags":["mcp"],"summary":"Mcp Set Variant","description":"Upsert a variant for ANY ACTIVE surface (device or a11y) by locale CODE\n(mcp:*). Writes a draft override; never overwrites a reviewed/approved one (409).","operationId":"mcp_mcp_set_variant","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"language_code","in":"path","required":true,"schema":{"type":"string","title":"Language Code"}},{"name":"surface","in":"path","required":true,"schema":{"type":"string","title":"Surface"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpA11yVariantIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpA11yVariantOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["mcp"],"summary":"Mcp Delete Variant","description":"Clear a variant (any surface) by locale CODE (mcp:*). The cell re-inherits.","operationId":"mcp_mcp_delete_variant","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"language_code","in":"path","required":true,"schema":{"type":"string","title":"Language Code"}},{"name":"surface","in":"path","required":true,"schema":{"type":"string","title":"Surface"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/keys/{key_id}/variants":{"get":{"tags":["mcp"],"summary":"Mcp Variant Matrix","description":"Full variant matrix for one key (mcp:*) — active surfaces + surfaceKinds +\nper (language x surface) cells with resolved values + drift.","operationId":"mcp_mcp_variant_matrix","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VariantMatrixOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/cognitive/score-local":{"post":{"tags":["mcp"],"summary":"Mcp Cognitive Score Local","description":"LOCAL-FIRST, 0 credit: score candidates from the VALIDATED readability metric\n(Flesch en / LIX otherwise) — same metric as WCAG SC 3.1.5. No AI, no credits (mcp:*).","operationId":"mcp_mcp_cognitive_score_local","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpCognitiveScoreLocalIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Cognitive Score Local"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/cognitive/candidates":{"get":{"tags":["mcp"],"summary":"Mcp Cognitive Candidates","description":"Plain-language candidates (text-relevant keys) for the agent to score (mcp:*).","operationId":"mcp_mcp_cognitive_candidates","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"only_unanalyzed","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Only Unanalyzed"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Cognitive Candidates"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/keys/{key_id}/cognitive-score":{"put":{"tags":["mcp"],"summary":"Mcp Set Cognitive Score","description":"LOCAL-FIRST: the agent writes a cognitive score + suggestion — 0 credit (mcp:*).","operationId":"mcp_mcp_set_cognitive_score","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpCognitiveScoreIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Set Cognitive Score"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/cognitive/analyze":{"post":{"tags":["mcp"],"summary":"Mcp Cognitive Analyze","description":"SERVER AI score + suggest (mcp:*). Billed in credits.","operationId":"mcp_mcp_cognitive_analyze","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpCognitiveAnalyzeIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Cognitive Analyze"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/agent/sessions":{"post":{"tags":["mcp"],"summary":"Mcp Agent Session Start","description":"Open an observability session. Send `X-MCP-Session-Id: <session_id>` on\nevery subsequent MCP call so backend auto-capture attaches mutations to this\nthread. Idempotent on a running (project, session_ref).","operationId":"mcp_mcp_agent_session_start","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentSessionStartIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentSessionStartOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/agent/sessions/{session_id}/annotate":{"post":{"tags":["mcp"],"summary":"Mcp Agent Annotate","description":"Add a high-level narrative line to the session thread.","operationId":"mcp_mcp_agent_annotate","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentAnnotateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentAnnotateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/agent/sessions/{session_id}/human-needed":{"post":{"tags":["mcp"],"summary":"Mcp Agent Human Needed","description":"DEPRECATED (task 1614): agent questions/blockers should be `annotate`\n(level=\"warning\") in the session thread, not todos. The dashboard \"what\nneeds a human\" view is now the next-actions report (GET .../next-actions).\nKept functional for back-compat; new agents SHOULD NOT call this.","operationId":"mcp_mcp_agent_human_needed","deprecated":true,"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentHumanNeededIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentHumanNeededOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/agent/sessions/{session_id}/end":{"post":{"tags":["mcp"],"summary":"Mcp Agent Session End","description":"End the session: closing line, `session_ended` realtime, end-of-session\nemail. Idempotent.","operationId":"mcp_mcp_agent_session_end","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentSessionEndIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentSessionEndOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/next-actions":{"get":{"tags":["mcp"],"summary":"Mcp Next Actions","description":"Segmented \"what to do now\" report: Quality/Health signals aggregated into\nprioritised human-work lots, each with a deep-link + resolved prompt (1614).","operationId":"mcp_mcp_next_actions","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}},{"name":"language","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"}},{"name":"include_prompts","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Prompts"}},{"name":"min_severity","in":"query","required":false,"schema":{"type":"string","pattern":"^(info|warning|error)$","default":"info","title":"Min Severity"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Next Actions"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/prompts/catalogue":{"get":{"tags":["mcp"],"summary":"Mcp Prompt Catalogue","description":"The canonical prompt catalogue (task 1614 Item 2). Each item carries its\ncanonical `template` (source text) + `i18n_key` (localized rendering is\ndashboard-side).","operationId":"mcp_mcp_prompt_catalogue","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"section","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Section"}},{"name":"subsection","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subsection"}},{"name":"tier","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"}},{"name":"phase","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phase"}},{"name":"enabled","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Prompt Catalogue"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/prompts/resolve":{"get":{"tags":["mcp"],"summary":"Mcp Prompt Resolve","description":"Resolve one DIWYA prompt by address → canonical `template` (source text)\nrendered with context + its reused `i18n_key` (task 1614 Item 2).","operationId":"mcp_mcp_prompt_resolve","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"section","in":"query","required":true,"schema":{"type":"string","title":"Section"}},{"name":"subsection","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subsection"}},{"name":"tier","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"}},{"name":"phase","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phase"}},{"name":"language","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"}},{"name":"namespace","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace"}},{"name":"count","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Count"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Prompt Resolve"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/languages/plural-categories":{"get":{"tags":["mcp"],"summary":"Mcp Plural Categories Bulk","operationId":"mcp_mcp_plural_categories_bulk","parameters":[{"name":"codes","in":"query","required":true,"schema":{"type":"string","description":"Comma-separated BCP-47 codes, e.g. ru,ar,fr","title":"Codes"},"description":"Comma-separated BCP-47 codes, e.g. ru,ar,fr"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Plural Categories Bulk"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/languages/{code}/plural-categories":{"get":{"tags":["mcp"],"summary":"Mcp Plural Categories","operationId":"mcp_mcp_plural_categories","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Plural Categories"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/keys/consolidate-plurals":{"post":{"tags":["mcp"],"summary":"Mcp Consolidate Plural Keys","description":"Merge flat `<base>_<suffix>` keys into one plurals=true key carrying\nplural_forms (task 1619 §7). dry_run (default) returns the plan without\napplying. Reversible: consolidated siblings go to key trash.","operationId":"mcp_mcp_consolidate_plural_keys","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsolidatePluralsIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Consolidate Plural Keys"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/xliff/export":{"post":{"tags":["mcp"],"summary":"Mcp Export Xliff","description":"Batch XLIFF export → one file per (namespace, target language).","operationId":"mcp_mcp_export_xliff","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpXliffExportIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Export Xliff"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/csv/export":{"post":{"tags":["mcp"],"summary":"Mcp Export Csv","description":"Batch CSV export → one global CSV (columns carry namespace + language).","operationId":"mcp_mcp_export_csv","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpCsvExportIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Export Csv"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/xliff/import":{"post":{"tags":["mcp"],"summary":"Mcp Import Xliff","description":"Batch XLIFF import. Per-file breakdown + aggregate totals. strict is\nper-file (a bad file writes nothing; clean files still apply).","operationId":"mcp_mcp_import_xliff","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpXliffImportIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Import Xliff"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/csv/import":{"post":{"tags":["mcp"],"summary":"Mcp Import Csv","description":"CSV import (all-or-nothing on strict). Same unified report as xliff.","operationId":"mcp_mcp_import_csv","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpCsvImportIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Import Csv"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/keys/{key_id}/history":{"get":{"tags":["mcp"],"summary":"Mcp List Key History","description":"Version history for a key (all languages, or one via language_id).","operationId":"mcp_mcp_list_key_history","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"language_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":1,"default":500,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp List Key History"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/translations/{key_id}/{language_id}/history/{version}":{"get":{"tags":["mcp"],"summary":"Mcp Get Translation Version","operationId":"mcp_mcp_get_translation_version","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"language_id","in":"path","required":true,"schema":{"type":"string","title":"Language Id"}},{"name":"version","in":"path","required":true,"schema":{"type":"integer","title":"Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Get Translation Version"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/translations/{key_id}/{language_id}/revert":{"post":{"tags":["mcp"],"summary":"Mcp Revert Translation","description":"Agent-driven non-destructive revert (task 1697). Same shared core as REST.","operationId":"mcp_mcp_revert_translation","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"language_id","in":"path","required":true,"schema":{"type":"string","title":"Language Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpRevertIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Mcp Mcp Revert Translation"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/review-findings":{"post":{"tags":["mcp"],"summary":"Report Translation Review","description":"Report ONE review finding about an existing translation (issue #393).\nDoes not write `translations`. One open finding per (key, language,\ncategory): reporting again refreshes it (`result=updated`). Refuses a\n`suggested_value` identical to the current value.","operationId":"mcp_report_translation_review","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewFindingReportIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewFindingReportOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["mcp"],"summary":"List Translation Reviews","description":"Findings with their status — `status=rejected` carries the human's\nreason, the agent's input for its rectification loop.","operationId":"mcp_list_translation_reviews","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"enum":["open","accepted","rejected","stale"],"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"enum":["identical_to_source","too_long","too_literal","placeholder","terminology","tone","spelling","other"],"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"language_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Code"}},{"name":"namespace","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewFindingsPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp/projects/{project_id}/review-findings/bulk":{"post":{"tags":["mcp"],"summary":"Report Translation Reviews Bulk","description":"Up to 200 findings; per-item results, metered on the ok count.","operationId":"mcp_report_translation_reviews_bulk","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewFindingsBulkIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewFindingsBulkOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_uuid}/mcp/usage":{"get":{"tags":["mcp"],"summary":"Org Mcp Usage","description":"Dashboard-facing twin of GET /v1/mcp/usage.\n\nSame shape, same filters, same defaults — auth is Bearer JWT and the\ncaller must be admin or owner of `org_uuid`.","operationId":"mcp_org_mcp_usage","parameters":[{"name":"org_uuid","in":"path","required":true,"schema":{"type":"string","title":"Org Uuid"}},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"From"}},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"To"}},{"name":"cmd","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cmd"}},{"name":"user","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageReport"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_uuid}/mcp/usage/quota":{"get":{"tags":["mcp"],"summary":"Org Mcp Usage Quota","description":"Dashboard-facing twin of GET /v1/mcp/usage/quota.","operationId":"mcp_org_mcp_usage_quota","parameters":[{"name":"org_uuid","in":"path","required":true,"schema":{"type":"string","title":"Org Uuid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageQuotaOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/cdn/releases":{"post":{"tags":["cdn"],"summary":"Publish Releases","description":"Build releases for one (or all) language+namespace combinations.\n\nIdempotent: existing releases with matching content_hash are reused\nrather than duplicated.","operationId":"cdn_publish_releases","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CdnPublishIn"},"example":{"language_code":"fr","namespace":"common"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CdnPublishOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["cdn"],"summary":"List Releases","operationId":"cdn_list_releases","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"language_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Code"}},{"name":"namespace","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"namespace slug","title":"Namespace"},"description":"namespace slug"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CdnReleaseListOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/cdn/preview":{"get":{"tags":["cdn"],"summary":"Preview Publish","description":"Pre-count what 'Publish now' WOULD ship, WITHOUT publishing (Viewer+).\n\nRead-only: no release is created, nothing is uploaded to Bunny, no purge, no\nCentrifugo, no audit. For each (language, namespace) — both filters optional,\nomit to preview all — it builds the bundle with the same publishable-status\nfilter as publish and diffs it against the last published bundle, returning\nthe count of **new + changed strings** per (lang, ns) plus a total.\n\n`to_publish == 0` means there is nothing to publish (button should say so).\n`warnings` flags a (lang, ns) whose keys are all below `translated` — it would\nship an empty bundle. Targets the production version.","operationId":"cdn_preview_publish","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"language_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Code"}},{"name":"namespace","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"namespace slug","title":"Namespace"},"description":"namespace slug"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CdnPreviewOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/cdn/releases/{release_id}":{"get":{"tags":["cdn"],"summary":"Get Release","operationId":"cdn_get_release","parameters":[{"name":"release_id","in":"path","required":true,"schema":{"type":"string","title":"Release Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CdnRelease"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/cdn/releases/{release_id}/verify":{"get":{"tags":["cdn"],"summary":"Verify Release","description":"Recompute the canonical-JSON hash of the stored payload and compare\nagainst `content_hash`. Always `ok=true` unless the row was tampered\nwith out-of-band (Mongo direct write); useful for ops drift checks.","operationId":"cdn_verify_release","parameters":[{"name":"release_id","in":"path","required":true,"schema":{"type":"string","title":"Release Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrityReport"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/cdn/config":{"get":{"tags":["cdn"],"summary":"Get Cdn Config","description":"Read the project's edge/security config from its dedicated Bunny zone.","operationId":"cdn_get_cdn_config","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CdnConfigOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["cdn"],"summary":"Put Cdn Config","description":"Apply edge/security settings to the project's dedicated Bunny zone\n(Admin+). Only provided fields change. Persists a summary for audit.","operationId":"cdn_put_cdn_config","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CdnConfigIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CdnConfigOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cdn/v1/{project_uuid}/{version_slug}/v/{content_hash}/{language_code}/{namespace_slug}.json":{"options":{"tags":["cdn-public"],"summary":"Cdn Versioned Preflight","operationId":"cdn_public_cdn_versioned_preflight","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"tags":["cdn-public"],"summary":"Cdn Fetch Immutable","operationId":"cdn_public_cdn_fetch_immutable","parameters":[{"name":"project_uuid","in":"path","required":true,"schema":{"type":"string","title":"Project Uuid"}},{"name":"version_slug","in":"path","required":true,"schema":{"type":"string","title":"Version Slug"}},{"name":"content_hash","in":"path","required":true,"schema":{"type":"string","title":"Content Hash"}},{"name":"language_code","in":"path","required":true,"schema":{"type":"string","title":"Language Code"}},{"name":"namespace_slug","in":"path","required":true,"schema":{"type":"string","title":"Namespace Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["cdn-public"],"summary":"Cdn Fetch Immutable","operationId":"cdn_public_cdn_fetch_immutable_2","parameters":[{"name":"project_uuid","in":"path","required":true,"schema":{"type":"string","title":"Project Uuid"}},{"name":"version_slug","in":"path","required":true,"schema":{"type":"string","title":"Version Slug"}},{"name":"content_hash","in":"path","required":true,"schema":{"type":"string","title":"Content Hash"}},{"name":"language_code","in":"path","required":true,"schema":{"type":"string","title":"Language Code"}},{"name":"namespace_slug","in":"path","required":true,"schema":{"type":"string","title":"Namespace Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cdn/v1/{project_uuid}/{version_slug}/latest/{language_code}/{namespace_slug}.json":{"options":{"tags":["cdn-public"],"summary":"Cdn Versioned Preflight","operationId":"cdn_public_cdn_versioned_preflight_2","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"tags":["cdn-public"],"summary":"Cdn Fetch Latest","operationId":"cdn_public_cdn_fetch_latest","parameters":[{"name":"project_uuid","in":"path","required":true,"schema":{"type":"string","title":"Project Uuid"}},{"name":"version_slug","in":"path","required":true,"schema":{"type":"string","title":"Version Slug"}},{"name":"language_code","in":"path","required":true,"schema":{"type":"string","title":"Language Code"}},{"name":"namespace_slug","in":"path","required":true,"schema":{"type":"string","title":"Namespace Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["cdn-public"],"summary":"Cdn Fetch Latest","operationId":"cdn_public_cdn_fetch_latest_2","parameters":[{"name":"project_uuid","in":"path","required":true,"schema":{"type":"string","title":"Project Uuid"}},{"name":"version_slug","in":"path","required":true,"schema":{"type":"string","title":"Version Slug"}},{"name":"language_code","in":"path","required":true,"schema":{"type":"string","title":"Language Code"}},{"name":"namespace_slug","in":"path","required":true,"schema":{"type":"string","title":"Namespace Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cdn/v1/{project_uuid}/{version_slug}/latest/languages.json":{"options":{"tags":["cdn-public"],"summary":"Cdn Languages Preflight","operationId":"cdn_public_cdn_languages_preflight","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"tags":["cdn-public"],"summary":"Cdn Languages Manifest","operationId":"cdn_public_cdn_languages_manifest","parameters":[{"name":"project_uuid","in":"path","required":true,"schema":{"type":"string","title":"Project Uuid"}},{"name":"version_slug","in":"path","required":true,"schema":{"type":"string","title":"Version Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["cdn-public"],"summary":"Cdn Languages Manifest","operationId":"cdn_public_cdn_languages_manifest_2","parameters":[{"name":"project_uuid","in":"path","required":true,"schema":{"type":"string","title":"Project Uuid"}},{"name":"version_slug","in":"path","required":true,"schema":{"type":"string","title":"Version Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/p/{project_uuid}/{version_slug}/latest/languages.json":{"options":{"tags":["cdn-public"],"summary":"P Languages Preflight","operationId":"cdn_public_p_languages_preflight","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"tags":["cdn-public"],"summary":"P Languages Manifest","operationId":"cdn_public_p_languages_manifest","parameters":[{"name":"project_uuid","in":"path","required":true,"schema":{"type":"string","title":"Project Uuid"}},{"name":"version_slug","in":"path","required":true,"schema":{"type":"string","title":"Version Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["cdn-public"],"summary":"P Languages Manifest","operationId":"cdn_public_p_languages_manifest_2","parameters":[{"name":"project_uuid","in":"path","required":true,"schema":{"type":"string","title":"Project Uuid"}},{"name":"version_slug","in":"path","required":true,"schema":{"type":"string","title":"Version Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/webhooks":{"post":{"tags":["webhooks"],"summary":"Create Webhook","operationId":"webhooks_create_webhook","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCreateIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["webhooks"],"summary":"List Webhooks","operationId":"webhooks_list_webhooks","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookListOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/webhooks/deliveries":{"get":{"tags":["webhooks"],"summary":"List Project Deliveries","description":"Delivery log across ALL of the project's webhooks, newest first.","operationId":"webhooks_list_project_deliveries","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"event","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeliveryListOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/webhooks/{webhook_id}/deliveries":{"get":{"tags":["webhooks"],"summary":"List Webhook Deliveries","description":"Delivery log for one webhook, newest first.","operationId":"webhooks_list_webhook_deliveries","parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"event","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeliveryListOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/webhooks/{webhook_id}":{"patch":{"tags":["webhooks"],"summary":"Update Webhook","operationId":"webhooks_update_webhook","parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookPatchIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["webhooks"],"summary":"Delete Webhook","operationId":"webhooks_delete_webhook","parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}},{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/source-health":{"get":{"tags":["reports"],"summary":"Source Health","operationId":"reports_source_health","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}},{"name":"include_allowed","in":"query","required":false,"schema":{"type":"boolean","description":"include allowed duplicates in items","default":true,"title":"Include Allowed"},"description":"include allowed duplicates in items"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceHealthOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/source-health/placeholders/plan-estimate":{"post":{"tags":["reports"],"summary":"Placeholder Plan Estimate","description":"Credits to PROPOSE coherent placeholder fixes (no charge). 1 credit per\nmismatched KEY (covers its source + all its translations); Sonnet.","operationId":"reports_placeholder_plan_estimate","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaceholderPlanIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaceholderEstimateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/source-health/placeholders/plan":{"post":{"tags":["reports"],"summary":"Placeholder Plan","description":"PROPOSE coherent placeholder fixes over SOURCE + TRANSLATIONS (Developer+),\ncredit-metered (1/key, Sonnet): the AI picks ONE coherent placeholder set per\nkey and RETURNS a proposed source (unchanged if fine) + each problematic\ntranslation as before->after diffs. Nothing written; cached (re-read + apply\nfree). Keys the AI can't make coherent are refunded + omitted.","operationId":"reports_placeholder_plan","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaceholderPlanProposeIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaceholderPlanOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/source-health/placeholders/plan-apply":{"post":{"tags":["reports"],"summary":"Placeholder Plan Apply","description":"APPLY the approved (possibly edited) fixes (Developer+). FREE. Writes the\nSOURCE (when provided) + each TRANSLATION (status=draft).","operationId":"reports_placeholder_plan_apply","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaceholderPlanApplyIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaceholderPlanApplyOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/source-health/duplicates":{"get":{"tags":["reports"],"summary":"List Source Duplicates","operationId":"reports_list_source_duplicates","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"neutral | allowed | to_fix | resolved","title":"Status"},"description":"neutral | allowed | to_fix | resolved"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DuplicateGroupOut"},"title":"Response Reports List Source Duplicates"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/source-health/duplicates/status":{"put":{"tags":["reports"],"summary":"Set Source Duplicate Status","operationId":"reports_set_source_duplicate_status","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DuplicateStatusIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DuplicateStatusOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/source-health/duplicates/status/bulk":{"put":{"tags":["reports"],"summary":"Set Source Duplicate Status Bulk","description":"Apply one status to many duplicate groups at once (UI bulk approve/request-fix).","operationId":"reports_set_source_duplicate_status_bulk","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DuplicateStatusBulkIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DuplicateStatusBulkOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/source-health/duplicates/merge-plan":{"put":{"tags":["reports"],"summary":"Set Source Duplicate Merge Plan","description":"Save (or clear, when merge_plan is null) a duplicate group's merge plan —\nthe Resolve modal's clusters + survivor_outcome (task 1120).","operationId":"reports_set_source_duplicate_merge_plan","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MergePlanIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MergePlanOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/source-health/duplicates/propose-plan":{"post":{"tags":["reports"],"summary":"Propose Duplicate Merge Plan","description":"'Let AI decide' (task 1385): a server-side LLM PROPOSES a merge_plan for a\nduplicate group (pick an existing canonical or suggest a new key) + a short\nreason. PROPOSE-ONLY — nothing is persisted; the human applies via the modal\n(set_merge_plan + apply-cluster / set_status).","operationId":"reports_propose_duplicate_merge_plan","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProposePlanIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProposedPlanOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/source-health/duplicates/apply-cluster":{"post":{"tags":["reports"],"summary":"Apply New Canonical Cluster","description":"Apply a NEW-canonical merge (task 1370): atomically create the new key\n(source value + translations copied from the most-complete key of the group)\nand trash ALL the group's old keys. The CODE repoint is the agent's job.","operationId":"reports_apply_new_canonical_cluster","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyNewKeyClusterIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyNewKeyClusterOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/coverage":{"get":{"tags":["reports"],"summary":"Coverage","operationId":"reports_coverage","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CoverageOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/reports/pending-approval":{"get":{"tags":["reports"],"summary":"Pending Approval","description":"Translations at status translated/reviewed but NOT yet approved — exactly\nthe cells the P1 approval gate (settings.require_approval_before_publish)\nwithholds from the CDN until a reviewer/qa approves. Per language: a count +\na small sample of key names. `approval_gate_enabled` tells the UI whether\nthey are being withheld now, or merely what would be withheld if turned on.","operationId":"reports_pending_approval","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PendingApprovalOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/surface-coverage":{"get":{"tags":["reports"],"summary":"Surface Coverage","description":"Per-active-surface completeness ('surface X = N% covered'). a11y surfaces\nreport true completeness (eligible = type-relevant keys); device surfaces\nreport override density (optional — un-overridden cells fall back to base).","operationId":"reports_surface_coverage","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SurfaceCoverageOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/a11y-report":{"get":{"tags":["reports"],"summary":"A11Y Report","description":"WCAG-oriented a11y gap report. By default a11y_untranslated (translation\ncoverage of a source variant) is segregated out of the totals into\nuntranslated_count (task 1345/AC1); set include_untranslated=true for the legacy view.","operationId":"reports_a11y_report","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}},{"name":"require_surface","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"a11y surfaces to flag as ABSENT in the source (e.g. aria_label)","title":"Require Surface"},"description":"a11y surfaces to flag as ABSENT in the source (e.g. aria_label)"},{"name":"reading_level_max_words","in":"query","required":false,"schema":{"type":"integer","maximum":60,"minimum":5,"default":15,"title":"Reading Level Max Words"}},{"name":"include_untranslated","in":"query","required":false,"schema":{"type":"boolean","description":"include a11y_untranslated (translation coverage) in totals/items; default segregates it into untranslated_count","default":false,"title":"Include Untranslated"},"description":"include a11y_untranslated (translation coverage) in totals/items; default segregates it into untranslated_count"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/A11yReportOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/recommend-surfaces":{"get":{"tags":["reports"],"summary":"Recommend Surfaces","description":"Per-key a11y surface recommendations from the key's type (A11Y_TREATMENTS_BY_TYPE),\nflagging which are active + already in the source — the agent's turn-key signal\nso it never duplicates the type->treatment mapping. Device surfaces are out of scope.","operationId":"reports_recommend_surfaces","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}},{"name":"namespace_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace Id"}},{"name":"key_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Id"}},{"name":"only_gaps","in":"query","required":false,"schema":{"type":"boolean","description":"only keys with an active a11y surface absent in source","default":false,"title":"Only Gaps"},"description":"only keys with an active a11y surface absent in source"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecommendSurfacesOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/wcag-report":{"get":{"tags":["reports"],"summary":"Wcag Report","description":"WCAG 2.2 measurement of the CONTENT layer Sonenta governs: per success-criterion\npass/fail/not_evaluated PER LOCALE, each stating its `method`: `computed` (the\nrequirement itself is evaluated) or `presence` (only that the expected content\nexists). Returns `measures`: content completeness (NOT a conformance score),\nthe computed criteria as raw counters, and coverage.\n\nThis report does NOT attest a WCAG conformance level: a level requires SC that\ncan only be judged on the rendered DOM (contrast, keyboard, focus order), which\nare declared out_of_scope and never reported as pass. Criteria with no key of\nthe required type are `not_evaluated` and stay in the coverage denominator, so\ndeclaring fewer key types lowers coverage rather than raising a figure.","operationId":"reports_wcag_report","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WcagReportOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/reports/wcag-report":{"get":{"tags":["reports"],"summary":"Wcag Report Reports Alias","description":"Alias under /reports/*: the a11y report family (wcag-report, eaa-statement,\nwcag-trend) all live under /reports/ for the dashboard. Same payload as\n/wcag-report (content-layer measurement; no conformance level).","operationId":"reports_wcag_report_reports_alias","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WcagReportOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/reports/wcag-trend":{"get":{"tags":["reports"],"summary":"Wcag Trend","description":"Content-layer accessibility measures over time: latest snapshot per release\nversion, chronologically (snapshots taken at each CDN publish).\n\nReturns TWO SEPARATE series: `points` (current method: completeness + coverage)\nand, only with `include_legacy=true`, `legacy_points` (the retired \"AA conformance\nscore\"). `method_change_at` marks the break. The two are never merged into one\ncurve: the old formula counted presence checks as conformance, and the old points\nwere deliberately NOT recomputed (a snapshot does not freeze its source content,\nso a recompute would be today's measure wearing a past date). With `locale`, the\npercentages are that locale's.","operationId":"reports_wcag_trend","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"locale","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locale"}},{"name":"include_legacy","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Legacy"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reports Wcag Trend"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/reports/eaa-statement":{"get":{"tags":["reports"],"summary":"Eaa Statement","description":"Exportable EAA / EN 301 549 CONTENT-LAYER accessibility report, per project ×\nlocale set. `json` = inline; `html` = downloadable document; `pdf` = 501.\n\nCross-references the SC it LISTS to their EN 301 549 clause numbers (a\nnumbering cross-reference, not a conformance mapping; the listed set is the\ncontent-layer SC we measure plus the DOM-dependent SC declared out of scope,\nnot the standard). States each criterion's `method`\n(computed vs presence only), and reports content completeness + coverage. It\ndoes NOT attest a WCAG conformance level (`attests_conformance_level: false`):\na level requires rendered-DOM criteria (contrast, keyboard, focus order) which\nare declared out of scope and never reported as pass.","operationId":"reports_eaa_statement","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}},{"name":"format","in":"query","required":false,"schema":{"type":"string","pattern":"^(json|html|pdf)$","default":"json","title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/usage/cdn/timeseries":{"get":{"tags":["reports"],"summary":"Project Cdn Timeseries","description":"Per-day CDN egress + storage (GB) for THIS project, last `days` days\n(billing-grade from cdn_usage_daily) + the project's last CDN publish.\nPowers the project dashboard 'Diffusion & stockage (30j)' card.\n\nPOINT SEMANTICS — the two fields do NOT aggregate the same way:\n- `bytes_egress` is the traffic OF THAT DAY, not a running total. SUM the\n  points for a window total. This holds on BOTH egress paths below, but the\n  two are established differently, and the distinction matters if you ever\n  re-verify it:\n    * shared-zone path — by CONTRACT: `cdn_metrics.sync_for_date(d)` writes\n      `$set` (never `$inc`) of a value derived from that single day's log,\n      keyed (org, project, date), so a re-sync overwrites instead of adding\n      and accumulation is structurally impossible.\n    * dedicated-zone path — by MEASUREMENT: the values come from Bunny's\n      `BandwidthUsedChart` and are passed through untransformed, so our code\n      cannot guarantee their semantics. Verified 2026-07-28 on four\n      dedicated-zone projects with multi-day traffic: every one of them\n      DECREASES between consecutive days, which a cumulative series cannot\n      do. Re-check on a project with several non-zero days — one with a\n      single day of traffic cannot tell the two readings apart.\n- `storage_bytes` is a LEVEL (current state), snapshotted daily and\n  overwritten each run by `sync_storage_snapshot()`. Take the LAST point;\n  summing it would add N photographs of the same stock.\n\nEGRESS HAS TWO SOURCES BEHIND ONE FIELD NAME — know this before comparing\ntwo projects on this endpoint:\n- shared-zone project: parsed from the Bunny pull-zone LOG (per request).\n- dedicated-zone project (`projects.bunny_zone_id` set): Bunny's per-zone\n  AGGREGATE (`BandwidthUsedChart`), because its traffic never appears in the\n  shared log. That aggregate has no per-request dimension, so anything that\n  filters requests (e.g. excluding our own integrity re-reads) can apply to\n  the shared-log path only.\nStorage has no such split: it always comes from the shared storage walk.\n\nEgress therefore includes the platform's OWN post-publish integrity fetch\n(`cdn_bunny._verify_edge_fresh` re-downloads each bundle through the edge to\nrecompute its sha256). A freshly published project with zero consumers still\nreports egress; it is real traffic, but it is ours, not the customer's.","operationId":"reports_project_cdn_timeseries","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectCdnTimeseriesOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/usage/cdn/hourly":{"get":{"tags":["reports"],"summary":"Project Cdn Hourly","description":"Trailing `hours` (default 24, max 168=7d) of per-HOUR CDN egress + requests\nfor THIS project (task 1584), for the /cdn overview 24h span. Zero-filled UTC\nhours. EGRESS + REQUESTS only (storage stays a daily snapshot). Only ~last 3\ndays are populated (Bunny log retention); today refreshes hourly.","operationId":"reports_project_cdn_hourly","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":168,"minimum":1,"default":24,"title":"Hours"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectCdnHourlyOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/projects/{project_id}/usage/cdn/geo":{"get":{"tags":["reports"],"summary":"Project Cdn Geo","description":"Per-country CDN egress + request density for THIS project (last `days`),\nfrom cdn_geo_daily. Powers the /publish geo heat-map (task 1578). FORWARD-ONLY:\ndata accrues from the GEO1 deploy onward (the access-log country column was\ndiscarded before), so it's empty until the nightly sync ingests new logs.","operationId":"reports_project_cdn_geo","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectCdnGeoOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/billing":{"get":{"tags":["billing"],"summary":"Get Billing State","description":"Current plan + subscription state, for the client-admin billing tab.\n\n`subscription` is null when the org is on free with no Stripe sub.\n`has_payment_method` is true once Stripe has assigned a customer id —\na proxy for \"the user completed checkout at least once.\"","operationId":"billing_get_billing_state","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingStateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/billing/invoices":{"get":{"tags":["billing"],"summary":"List Billing Invoices","description":"List the org's Stripe/MoR invoices, newest first (task 951).\n\nCovers subscription invoices AND one-time credit-pack payments (under\nManaged Payments Stripe issues an invoice for those too). Each carries the\nhosted_invoice_url + invoice_pdf. Empty when the org has no Stripe customer\nyet (never paid). OrgAdmin-gated, same as GET /billing — read-only.","operationId":"billing_list_billing_invoices","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":24,"title":"Limit"}},{"name":"starting_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stripe cursor — last invoice id of the prior page","title":"Starting After"},"description":"Stripe cursor — last invoice id of the prior page"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoicesPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/billing/checkout-session":{"post":{"tags":["billing"],"summary":"Create Checkout Session","operationId":"billing_create_checkout_session","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/billing/portal-session":{"post":{"tags":["billing"],"summary":"Create Portal Session","operationId":"billing_create_portal_session","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortalIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortalOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/billing/feedback-addon/checkout-session":{"post":{"tags":["billing"],"summary":"Create Feedback Addon Checkout","description":"Start Stripe Checkout for the End-User Eval add-on (task 609).\n\nBackend-driven: client sends only the SKU; backend resolves it to the\nenv price id and never trusts a client price id. Entitlement is\ngranted by the signed webhook on completion, not here.","operationId":"billing_create_feedback_addon_checkout","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackAddonCheckoutIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/billing/feedback-addon/change-sku":{"post":{"tags":["billing"],"summary":"Change Feedback Addon Sku","description":"Switch the active add-on subscription's price item to a different SKU.\n\n400 when target_sku == current sku (per task 838 spec) — a no-op\nrequest signals a stale FE that should refresh GET /billing.","operationId":"billing_change_feedback_addon_sku","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackAddonChangeSkuIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackAddonState"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/billing/feedback-addon/cancel":{"post":{"tags":["billing"],"summary":"Cancel Feedback Addon","description":"Schedule the add-on subscription to cancel at the current period end.\n\nIdempotent: an already-scheduled cancel returns the current state with\nno Stripe call and no audit row written.","operationId":"billing_cancel_feedback_addon","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackAddonState"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/billing/feedback-addon/reactivate":{"post":{"tags":["billing"],"summary":"Reactivate Feedback Addon","description":"Clear a scheduled cancel on the add-on subscription.\n\nIdempotent: an already-uncanceled sub returns the current state with no\nStripe call and no audit row.","operationId":"billing_reactivate_feedback_addon","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackAddonState"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/billing/in-context-addon/checkout-session":{"post":{"tags":["billing"],"summary":"Create In Context Addon Checkout","description":"Start Stripe Checkout for the in-context editing add-on (task 903).\n\nBackend-driven: the client sends only the SKU; the backend resolves it to\nthe env price id and never trusts a client price id. Entitlement is granted\nby the signed webhook on completion, not here.","operationId":"billing_create_in_context_addon_checkout","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InContextAddonCheckoutIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/billing/in-context-addon/cancel":{"post":{"tags":["billing"],"summary":"Cancel In Context Addon","description":"Schedule the in-context add-on subscription to cancel at period end.\n\nIdempotent: an already-scheduled cancel returns the current state with no\nStripe call and no audit row written.","operationId":"billing_cancel_in_context_addon","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InContextAddonState"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/billing/in-context-addon/reactivate":{"post":{"tags":["billing"],"summary":"Reactivate In Context Addon","description":"Clear a scheduled cancel on the in-context add-on subscription.\n\nIdempotent: an already-uncanceled sub returns the current state with no\nStripe call and no audit row.","operationId":"billing_reactivate_in_context_addon","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InContextAddonState"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/billing/credits/checkout-session":{"post":{"tags":["billing"],"summary":"Create Credit Pack Checkout","description":"Start Stripe Checkout (one-time payment) for a prepaid credit pack (#815).\n\nBackend-driven: the client sends only the SKU; the amount comes from\nCREDIT_PACKS (source of truth). The ledger is credited by the signed webhook\non completion (idempotent on the checkout session id), never here.","operationId":"billing_create_credit_pack_checkout","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditPackCheckoutIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/billing/credits/on-demand-checkout-session":{"post":{"tags":["billing"],"summary":"Create On Demand Checkout","description":"One-time Checkout for EXACTLY `credits_needed` credits at the on-demand rate\n($0.035/credit, config) — the pay-or-pack out-of-credits path. The signed\nwebhook grants the credits to the balance (kind=credit_pack path, idempotent\non session id); the front re-runs the batch after success. MoR via the same\nManaged-Payments checkout as packs. Below Stripe's $0.50 min -> buy a pack.","operationId":"billing_create_on_demand_checkout","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnDemandCheckoutIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/billing/settings":{"get":{"tags":["billing"],"summary":"Get Billing Settings","description":"Read the org's billing settings (auto-topup, alert thresholds, storage cap).","operationId":"billing_get_billing_settings","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingSettingsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["billing"],"summary":"Put Billing Settings","description":"Update the org's billing settings. Validates the auto-topup pack SKU.","operationId":"billing_put_billing_settings","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingSettingsIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingSettingsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/billing/webhook":{"post":{"tags":["billing"],"summary":"Stripe Webhook","description":"Stripe webhook receiver.\n\nReturns 200 on every successful handle so Stripe doesn't retry. 400 for\nsignature/parse failures (Stripe will retry, which is the right behavior\nwhen the secret was mis-rotated). 5xx for transient downstream errors —\nStripe also retries with backoff, but we log loudly so we notice.","operationId":"billing_stripe_webhook","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Billing Stripe Webhook"}}}}}}},"/v1/orgs/{org_id}/vouchers":{"post":{"tags":["vouchers"],"summary":"Redeem Org Voucher","operationId":"vouchers_redeem_org_voucher","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoucherRedeemIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Vouchers Redeem Org Voucher"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["vouchers"],"summary":"List Org Vouchers","operationId":"vouchers_list_org_vouchers","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Vouchers List Org Vouchers"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/credits":{"get":{"tags":["credits"],"summary":"Get Credit Balance","operationId":"credits_get_credit_balance","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditBalanceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/credits/ledger":{"get":{"tags":["credits"],"summary":"List Credit Ledger","operationId":"credits_list_credit_ledger","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LedgerPageOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/credits/estimate":{"post":{"tags":["credits"],"summary":"Estimate Credits","operationId":"credits_estimate_credits","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routes__credits__EstimateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EstimateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orgs/{org_id}/credits/packs":{"get":{"tags":["credits"],"summary":"List Credit Packs","operationId":"credits_list_credit_packs","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditPacksOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pricing":{"get":{"tags":["pricing"],"summary":"Public Pricing","operationId":"pricing_public_pricing","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PricingPublicOut"}}}}}}},"/v1/public/centrifugo-token":{"post":{"tags":["public"],"summary":"Public Centrifugo Token","description":"Mint a short-lived Centrifugo JWT for the landing-page demo channel.\n\nNo authentication required. Rate-limited 60 req / 5 min per IP.","operationId":"public_public_centrifugo_token","parameters":[{"name":"demo","in":"query","required":false,"schema":{"type":"boolean","description":"V1 only supports demo=true","default":true,"title":"Demo"},"description":"V1 only supports demo=true"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CentrifugoTokenOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/whoami":{"get":{"tags":["meta"],"summary":"Whoami","operationId":"meta_whoami","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WhoamiOut"}}}}}}},"/v1/guide":{"get":{"tags":["guide"],"summary":"Guide","description":"Public onboarding playbook: connect (MCP-first, REST fallback), the main\nactions with their endpoints, and links to the OpenAPI + llms.txt.","operationId":"guide_guide","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuideOut"}}}}}}},"/v1/projects/{project_id}/guide":{"get":{"tags":["guide"],"summary":"Project Guide","description":"Project-scoped playbook with the real project/org IDs filled in.","operationId":"guide_project_guide","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuideOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"A11yAltTextOut":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"version_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Uuid"},"languages":{"items":{"type":"string"},"type":"array","title":"Languages"},"source_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Language"},"eligible_keys":{"type":"integer","title":"Eligible Keys"},"eligible_cells":{"type":"integer","title":"Eligible Cells"},"present_cells":{"type":"integer","title":"Present Cells"},"pct":{"type":"integer","title":"Pct"},"measured":{"type":"boolean","title":"Measured"},"by_language":{"items":{"$ref":"#/components/schemas/A11yLangRow"},"type":"array","title":"By Language"},"formula":{"additionalProperties":{"type":"string"},"type":"object","title":"Formula"},"surface":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Surface"},"key_types":{"items":{"type":"string"},"type":"array","title":"Key Types"},"missing_source_alt":{"type":"integer","title":"Missing Source Alt"}},"type":"object","required":["project_uuid","version_uuid","languages","source_language","eligible_keys","eligible_cells","present_cells","pct","measured","by_language","formula","surface","key_types","missing_source_alt"],"title":"A11yAltTextOut"},"A11yApproveIn":{"properties":{"items":{"items":{"$ref":"#/components/schemas/A11yModerateItem"},"type":"array","minItems":1,"title":"Items"},"target_status":{"type":"string","title":"Target Status","default":"approved"}},"type":"object","required":["items"],"title":"A11yApproveIn"},"A11yAriaNamesOut":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"version_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Uuid"},"languages":{"items":{"type":"string"},"type":"array","title":"Languages"},"source_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Language"},"eligible_keys":{"type":"integer","title":"Eligible Keys"},"eligible_cells":{"type":"integer","title":"Eligible Cells"},"present_cells":{"type":"integer","title":"Present Cells"},"pct":{"type":"integer","title":"Pct"},"measured":{"type":"boolean","title":"Measured"},"by_language":{"items":{"$ref":"#/components/schemas/A11yLangRow"},"type":"array","title":"By Language"},"formula":{"additionalProperties":{"type":"string"},"type":"object","title":"Formula"},"surface":{"type":"string","title":"Surface"},"suggestions_count":{"type":"integer","title":"Suggestions Count"},"missing_accessible_name":{"type":"integer","title":"Missing Accessible Name","default":0},"populations":{"items":{"$ref":"#/components/schemas/A11yPopulation"},"type":"array","title":"Populations"}},"type":"object","required":["project_uuid","version_uuid","languages","source_language","eligible_keys","eligible_cells","present_cells","pct","measured","by_language","formula","surface","suggestions_count","populations"],"title":"A11yAriaNamesOut"},"A11yDetectionOut":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"version_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Uuid"},"last_scan":{"anyOf":[{"$ref":"#/components/schemas/A11yScanRecap"},{"type":"null"}]},"keys_total":{"type":"integer","title":"Keys Total"},"classified":{"type":"integer","title":"Classified"},"unclassified":{"type":"integer","title":"Unclassified"},"pct":{"type":"integer","title":"Pct"},"measured":{"type":"boolean","title":"Measured"},"never_analyzed":{"type":"integer","title":"Never Analyzed","default":0},"analyzed_not_candidate":{"type":"integer","title":"Analyzed Not Candidate","default":0},"analyzed_total":{"type":"integer","title":"Analyzed Total","default":0},"by_type":{"items":{"$ref":"#/components/schemas/A11yTypeCount"},"type":"array","title":"By Type"},"by_type_source":{"items":{"$ref":"#/components/schemas/A11yTypeSourceCount"},"type":"array","title":"By Type Source"},"formula":{"additionalProperties":{"type":"string"},"type":"object","title":"Formula"}},"type":"object","required":["project_uuid","version_uuid","last_scan","keys_total","classified","unclassified","pct","measured","by_type","by_type_source","formula"],"title":"A11yDetectionOut"},"A11yEstimateIn":{"properties":{"mode":{"type":"string","pattern":"^(generate|translate)$","title":"Mode"},"tier":{"type":"string","enum":["standard","premium"],"title":"Tier","default":"standard"},"surfaces":{"items":{"type":"string"},"type":"array","title":"Surfaces","description":"a11y surfaces; empty = all"},"language_codes":{"items":{"type":"string"},"type":"array","title":"Language Codes","description":"targets (translate mode)"},"key_uuids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Key Uuids"},"namespace_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace Uuid"}},"type":"object","required":["mode"],"title":"A11yEstimateIn"},"A11yEstimateOut":{"properties":{"mode":{"type":"string","title":"Mode"},"tier":{"type":"string","title":"Tier"},"units":{"type":"integer","title":"Units"},"credit_cost_per_unit":{"type":"integer","title":"Credit Cost Per Unit"},"credits_required":{"type":"integer","title":"Credits Required"},"balance":{"type":"integer","title":"Balance"},"sufficient":{"type":"boolean","title":"Sufficient"}},"type":"object","required":["mode","tier","units","credit_cost_per_unit","credits_required","balance","sufficient"],"title":"A11yEstimateOut"},"A11yGapItem":{"properties":{"key_uuid":{"type":"string","title":"Key Uuid"},"key_name":{"type":"string","title":"Key Name"},"namespace_slug":{"type":"string","title":"Namespace Slug"},"key_type":{"type":"string","title":"Key Type","default":"text"},"source_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Value"},"surface":{"type":"string","title":"Surface"},"locale":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locale"},"gap":{"type":"string","title":"Gap"},"severity":{"type":"string","title":"Severity"},"detail":{"type":"string","title":"Detail"}},"type":"object","required":["key_uuid","key_name","namespace_slug","surface","gap","severity","detail"],"title":"A11yGapItem"},"A11yGenerateIn":{"properties":{"tier":{"type":"string","enum":["standard","premium"],"title":"Tier","default":"standard"},"surfaces":{"items":{"type":"string"},"type":"array","title":"Surfaces"},"key_uuids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Key Uuids"},"namespace_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace Uuid"},"idempotency_key":{"type":"string","minLength":1,"title":"Idempotency Key"}},"type":"object","required":["idempotency_key"],"title":"A11yGenerateIn"},"A11yJobOut":{"properties":{"mode":{"type":"string","title":"Mode"},"requested":{"type":"integer","title":"Requested"},"credits_charged":{"type":"integer","title":"Credits Charged"},"credits_refunded":{"type":"integer","title":"Credits Refunded"},"generated":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Generated"},"translated":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Translated"}},"type":"object","required":["mode","requested","credits_charged","credits_refunded"],"title":"A11yJobOut"},"A11yKeyGroup":{"properties":{"key_uuid":{"type":"string","title":"Key Uuid"},"key_name":{"type":"string","title":"Key Name"},"namespace_slug":{"type":"string","title":"Namespace Slug"},"key_type":{"type":"string","title":"Key Type","default":"text"},"total":{"type":"integer","title":"Total"},"by_state":{"additionalProperties":{"type":"integer"},"type":"object","title":"By State"},"by_surface":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Surface"},"cells":{"items":{"$ref":"#/components/schemas/A11yQueueItem"},"type":"array","title":"Cells"}},"type":"object","required":["key_uuid","key_name","namespace_slug","total","by_state","by_surface","cells"],"title":"A11yKeyGroup"},"A11yLangRow":{"properties":{"code":{"type":"string","title":"Code"},"eligible":{"type":"integer","title":"Eligible"},"present":{"type":"integer","title":"Present"},"pct":{"type":"integer","title":"Pct"},"is_source":{"type":"boolean","title":"Is Source","default":false}},"type":"object","required":["code","eligible","present","pct"],"title":"A11yLangRow"},"A11yModerateItem":{"properties":{"key_uuid":{"type":"string","title":"Key Uuid"},"language_code":{"type":"string","title":"Language Code"},"surface":{"type":"string","title":"Surface"}},"type":"object","required":["key_uuid","language_code","surface"],"title":"A11yModerateItem"},"A11yModerateOut":{"properties":{"results":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Results"},"summary":{"additionalProperties":{"type":"integer"},"type":"object","title":"Summary"}},"type":"object","required":["results","summary"],"title":"A11yModerateOut"},"A11yPlainLanguageOut":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"version_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Uuid"},"languages":{"items":{"type":"string"},"type":"array","title":"Languages"},"source_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Language"},"eligible_keys":{"type":"integer","title":"Eligible Keys"},"eligible_cells":{"type":"integer","title":"Eligible Cells"},"present_cells":{"type":"integer","title":"Present Cells"},"pct":{"type":"integer","title":"Pct"},"measured":{"type":"boolean","title":"Measured"},"by_language":{"items":{"$ref":"#/components/schemas/A11yLangRow"},"type":"array","title":"By Language"},"formula":{"additionalProperties":{"type":"string"},"type":"object","title":"Formula"},"surface":{"type":"string","title":"Surface"},"key_types":{"items":{"type":"string"},"type":"array","title":"Key Types"},"suggestions_count":{"type":"integer","title":"Suggestions Count"},"threshold":{"type":"number","title":"Threshold"},"above_threshold":{"type":"integer","title":"Above Threshold"},"pending_rewrites":{"type":"integer","title":"Pending Rewrites"},"analyzed":{"type":"integer","title":"Analyzed"},"unanalyzed":{"type":"integer","title":"Unanalyzed"},"reading_level_max_words":{"type":"integer","title":"Reading Level Max Words"},"reading_level_flagged":{"type":"integer","title":"Reading Level Flagged"},"not_scored":{"type":"integer","title":"Not Scored","default":0},"scored_readable":{"type":"integer","title":"Scored Readable","default":0},"candidates":{"type":"integer","title":"Candidates","default":0},"candidates_rewritten":{"type":"integer","title":"Candidates Rewritten","default":0},"candidates_remaining":{"type":"integer","title":"Candidates Remaining","default":0},"candidates_with_suggestion":{"type":"integer","title":"Candidates With Suggestion","default":0},"pct_candidates":{"type":"integer","title":"Pct Candidates","default":0},"measured_candidates":{"type":"boolean","title":"Measured Candidates","default":false},"candidates_by_language":{"items":{"$ref":"#/components/schemas/A11yLangRow"},"type":"array","title":"Candidates By Language"},"unscored_reading_level_flagged":{"type":"integer","title":"Unscored Reading Level Flagged","default":0}},"type":"object","required":["project_uuid","version_uuid","languages","source_language","eligible_keys","eligible_cells","present_cells","pct","measured","by_language","formula","surface","key_types","suggestions_count","threshold","above_threshold","pending_rewrites","analyzed","unanalyzed","reading_level_max_words","reading_level_flagged"],"title":"A11yPlainLanguageOut"},"A11yPopulation":{"properties":{"population":{"type":"string","title":"Population"},"key_types":{"items":{"type":"string"},"type":"array","title":"Key Types"},"read_from":{"type":"string","title":"Read From"},"eligible_keys":{"type":"integer","title":"Eligible Keys"},"suggestions_count":{"type":"integer","title":"Suggestions Count"},"missing_accessible_name":{"type":"integer","title":"Missing Accessible Name","default":0},"by_language":{"items":{"$ref":"#/components/schemas/A11yLangRow"},"type":"array","title":"By Language"}},"type":"object","required":["population","key_types","read_from","eligible_keys","suggestions_count","by_language"],"title":"A11yPopulation"},"A11yQueueItem":{"properties":{"key_uuid":{"type":"string","title":"Key Uuid"},"key_name":{"type":"string","title":"Key Name"},"namespace_slug":{"type":"string","title":"Namespace Slug"},"key_type":{"type":"string","title":"Key Type","default":"text"},"surface":{"type":"string","title":"Surface"},"surface_kind":{"type":"string","title":"Surface Kind"},"locale":{"type":"string","title":"Locale"},"state":{"type":"string","title":"State"},"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value"},"is_bot":{"type":"boolean","title":"Is Bot","default":false},"gap":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gap"},"base_value":{"type":"string","title":"Base Value","default":""},"screenshots":{"items":{"type":"string"},"type":"array","title":"Screenshots"},"drift":{"type":"boolean","title":"Drift","default":false},"ignored":{"type":"boolean","title":"Ignored","default":false},"ignore_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ignore Reason"},"reject_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reject Reason"}},"type":"object","required":["key_uuid","key_name","namespace_slug","surface","surface_kind","locale","state"],"title":"A11yQueueItem"},"A11yQueueOut":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"version_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Uuid"},"total":{"type":"integer","title":"Total"},"by_state":{"additionalProperties":{"type":"integer"},"type":"object","title":"By State"},"by_surface":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Surface"},"items":{"items":{"$ref":"#/components/schemas/A11yQueueItem"},"type":"array","title":"Items"},"key_groups":{"anyOf":[{"items":{"$ref":"#/components/schemas/A11yKeyGroup"},"type":"array"},{"type":"null"}],"title":"Key Groups"},"untranslated_count":{"type":"integer","title":"Untranslated Count","default":0},"actionable_key_count":{"type":"integer","title":"Actionable Key Count","default":0}},"type":"object","required":["project_uuid","version_uuid","total","by_state","by_surface","items"],"title":"A11yQueueOut"},"A11yRejectIn":{"properties":{"items":{"items":{"$ref":"#/components/schemas/A11yModerateItem"},"type":"array","minItems":1,"title":"Items"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["items"],"title":"A11yRejectIn"},"A11yReportOut":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"version_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Uuid"},"keys_scanned":{"type":"integer","title":"Keys Scanned"},"total_gaps":{"type":"integer","title":"Total Gaps"},"by_gap":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Gap"},"by_severity":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Severity"},"by_surface":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Surface"},"items":{"items":{"$ref":"#/components/schemas/A11yGapItem"},"type":"array","title":"Items"},"untranslated_count":{"type":"integer","title":"Untranslated Count","default":0},"actionable_key_count":{"type":"integer","title":"Actionable Key Count","default":0}},"type":"object","required":["project_uuid","version_uuid","keys_scanned","total_gaps","by_gap","by_severity","by_surface","items"],"title":"A11yReportOut"},"A11yScanIn":{"properties":{"keys_scanned":{"type":"integer","minimum":0.0,"title":"Keys Scanned"},"keys_classified":{"type":"integer","minimum":0.0,"title":"Keys Classified"},"tool":{"type":"string","pattern":"^(cli|agent)$","title":"Tool"},"tool_version":{"type":"string","maxLength":64,"minLength":1,"title":"Tool Version"},"scan_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scan Id"},"seen_key_uuids":{"items":{"type":"string"},"type":"array","maxItems":5000,"title":"Seen Key Uuids"}},"type":"object","required":["keys_scanned","keys_classified","tool","tool_version"],"title":"A11yScanIn"},"A11yScanOut":{"properties":{"last_run_at":{"type":"string","format":"date-time","title":"Last Run At"},"keys_scanned":{"type":"integer","title":"Keys Scanned"},"keys_classified":{"type":"integer","title":"Keys Classified"},"tool":{"type":"string","title":"Tool"},"tool_version":{"type":"string","title":"Tool Version"},"scan_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scan Id"},"recorded_by_user_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recorded By User Uuid"},"recorded_by_api_key_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recorded By Api Key Uuid"},"seen_submitted":{"type":"integer","title":"Seen Submitted","default":0},"seen_stamped":{"type":"integer","title":"Seen Stamped","default":0},"seen_unresolved":{"type":"integer","title":"Seen Unresolved","default":0},"seen_total_for_scan":{"type":"integer","title":"Seen Total For Scan","default":0}},"type":"object","required":["last_run_at","keys_scanned","keys_classified","tool","tool_version"],"title":"A11yScanOut","description":"The recap PLUS what this call stamped (task 1827). `seen_unresolved` is\nreported, never silently dropped: a uuid that matches no live key of the\nproject is a client-side bug worth seeing."},"A11yScanRecap":{"properties":{"last_run_at":{"type":"string","format":"date-time","title":"Last Run At"},"keys_scanned":{"type":"integer","title":"Keys Scanned"},"keys_classified":{"type":"integer","title":"Keys Classified"},"tool":{"type":"string","title":"Tool"},"tool_version":{"type":"string","title":"Tool Version"},"scan_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scan Id"},"recorded_by_user_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recorded By User Uuid"},"recorded_by_api_key_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recorded By Api Key Uuid"}},"type":"object","required":["last_run_at","keys_scanned","keys_classified","tool","tool_version"],"title":"A11yScanRecap"},"A11yScreenReaderOut":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"version_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Uuid"},"languages":{"items":{"type":"string"},"type":"array","title":"Languages"},"source_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Language"},"eligible_keys":{"type":"integer","title":"Eligible Keys"},"eligible_cells":{"type":"integer","title":"Eligible Cells"},"present_cells":{"type":"integer","title":"Present Cells"},"pct":{"type":"integer","title":"Pct"},"measured":{"type":"boolean","title":"Measured"},"by_language":{"items":{"$ref":"#/components/schemas/A11yLangRow"},"type":"array","title":"By Language"},"formula":{"additionalProperties":{"type":"string"},"type":"object","title":"Formula"},"surface":{"type":"string","title":"Surface"},"key_types":{"items":{"type":"string"},"type":"array","title":"Key Types"},"suggestions_count":{"type":"integer","title":"Suggestions Count"},"applied":{"type":"integer","title":"Applied","default":0}},"type":"object","required":["project_uuid","version_uuid","languages","source_language","eligible_keys","eligible_cells","present_cells","pct","measured","by_language","formula","surface","key_types","suggestions_count"],"title":"A11yScreenReaderOut"},"A11yTranslateIn":{"properties":{"tier":{"type":"string","enum":["standard","premium"],"title":"Tier","default":"standard"},"surfaces":{"items":{"type":"string"},"type":"array","title":"Surfaces"},"key_uuids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Key Uuids"},"namespace_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace Uuid"},"idempotency_key":{"type":"string","minLength":1,"title":"Idempotency Key"},"language_codes":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Language Codes"}},"type":"object","required":["idempotency_key","language_codes"],"title":"A11yTranslateIn"},"A11yTreatmentSignal":{"properties":{"treatment":{"type":"string","title":"Treatment"},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"},"suggested_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggested Value"},"is_bot":{"type":"boolean","title":"Is Bot","default":false}},"type":"object","required":["treatment"],"title":"A11yTreatmentSignal"},"A11yTypeCount":{"properties":{"type":{"type":"string","title":"Type"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["type","count"],"title":"A11yTypeCount"},"A11yTypeSourceCount":{"properties":{"source":{"type":"string","title":"Source"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["source","count"],"title":"A11yTypeSourceCount"},"AcknowledgeMissingIn":{"properties":{"uuids":{"items":{"type":"string"},"type":"array","maxItems":500,"minItems":1,"title":"Uuids"}},"type":"object","required":["uuids"],"title":"AcknowledgeMissingIn"},"AcknowledgeMissingOut":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"resolved":{"type":"integer","title":"Resolved"},"not_found":{"type":"integer","title":"Not Found"},"already_resolved":{"type":"integer","title":"Already Resolved"}},"type":"object","required":["project_uuid","resolved","not_found","already_resolved"],"title":"AcknowledgeMissingOut"},"ActivityBucket":{"properties":{"start":{"type":"string","format":"date-time","title":"Start"},"count":{"type":"integer","title":"Count"},"by_source":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Source"},"by_surface":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Surface"}},"type":"object","required":["start","count","by_source","by_surface"],"title":"ActivityBucket"},"ActivityEvent":{"properties":{"id":{"type":"string","title":"Id"},"ts":{"type":"string","format":"date-time","title":"Ts"},"kind":{"type":"string","title":"Kind"},"actor_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor Id"},"actor_type":{"type":"string","title":"Actor Type","default":"user"},"actor_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor Email"},"actor_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor Label"},"action":{"type":"string","title":"Action"},"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id"},"entity_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Type"},"entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Id"},"before":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Before"},"after":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"After"},"key_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Uuid"},"language_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Uuid"},"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"change_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Change Source"}},"type":"object","required":["id","ts","kind","action"],"title":"ActivityEvent"},"ActivityLangOut":{"properties":{"code":{"type":"string","title":"Code"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"is_source":{"type":"boolean","title":"Is Source","default":false},"total":{"type":"integer","title":"Total","default":0},"days":{"additionalProperties":{"type":"integer"},"type":"object","title":"Days"}},"type":"object","required":["code"],"title":"ActivityLangOut"},"ActivityOut":{"properties":{"bucket_unit":{"type":"string","title":"Bucket Unit"},"total":{"type":"integer","title":"Total"},"buckets":{"items":{"$ref":"#/components/schemas/ActivityBucket"},"type":"array","title":"Buckets"}},"type":"object","required":["bucket_unit","total","buckets"],"title":"ActivityOut"},"ActivityPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ActivityEvent"},"type":"array","title":"Items"},"cursor_next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor Next"}},"type":"object","required":["items"],"title":"ActivityPage"},"ActorInfo":{"properties":{"kind":{"type":"string","title":"Kind"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"api_key_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key Uuid"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"agent_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Type"},"agent_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Version"}},"type":"object","required":["kind"],"title":"ActorInfo"},"AgentAnnotateIn":{"properties":{"summary":{"type":"string","maxLength":1000,"minLength":1,"title":"Summary","description":"Readable thread line"},"level":{"type":"string","enum":["info","warning"],"title":"Level","default":"info"},"payload":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Payload"}},"type":"object","required":["summary"],"title":"AgentAnnotateIn"},"AgentAnnotateOut":{"properties":{"v":{"type":"integer","title":"V","default":1},"event_id":{"type":"string","title":"Event Id"},"seq":{"type":"integer","title":"Seq"},"ts":{"type":"string","format":"date-time","title":"Ts"}},"type":"object","required":["event_id","seq","ts"],"title":"AgentAnnotateOut"},"AgentCreateIn":{"properties":{"id":{"type":"string","maxLength":64,"minLength":2,"pattern":"^[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])?$","title":"Id"},"agent_type":{"type":"string","maxLength":64,"minLength":1,"title":"Agent Type"},"label":{"type":"string","maxLength":200,"minLength":1,"title":"Label"},"description":{"type":"string","maxLength":4000,"minLength":1,"title":"Description"},"content":{"type":"string","minLength":1,"title":"Content"}},"additionalProperties":false,"type":"object","required":["id","agent_type","label","description","content"],"title":"AgentCreateIn","description":"A NEW catalogue agent. Every field is required — there is nothing to be\nleft unchanged on a document that does not exist yet.\n\n`name` is not accepted: it is `id`, and `install_path` derives from it (§5).\nAccepting a second identifier would create the \"renamed = new agent\" trap\nthe contract closes by making `id` immutable. `content_version` is not\naccepted either: it is DERIVED from the frontmatter `version:` line so the\ntwo can never disagree (`entitlement.version_from_content`)."},"AgentHumanNeededIn":{"properties":{"question":{"type":"string","maxLength":1000,"minLength":1,"title":"Question"},"detail":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Detail"},"deep_link":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Deep Link","description":"Relative dashboard path to the thing needing attention"},"options":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Options"}},"type":"object","required":["question"],"title":"AgentHumanNeededIn"},"AgentHumanNeededOut":{"properties":{"v":{"type":"integer","title":"V","default":1},"human_needed_id":{"type":"string","title":"Human Needed Id"},"status":{"type":"string","title":"Status"},"ts":{"type":"string","format":"date-time","title":"Ts"}},"type":"object","required":["human_needed_id","status","ts"],"title":"AgentHumanNeededOut"},"AgentPatchIn":{"properties":{"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"}},"additionalProperties":false,"type":"object","title":"AgentPatchIn","description":"PARTIAL update. An omitted field is UNCHANGED, never cleared — the editor\ndoes not need to send the whole object back (that is PUT semantics).\n\n`extra=\"forbid\"` rejects unknown fields with 422 instead of ignoring them: a\nsilently dropped field is how an editor believes it saved something it did\nnot."},"AgentSessionEndIn":{"properties":{"summary":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Summary"},"status":{"type":"string","enum":["ended","aborted"],"title":"Status","default":"ended"}},"type":"object","title":"AgentSessionEndIn"},"AgentSessionEndOut":{"properties":{"v":{"type":"integer","title":"V","default":1},"session_id":{"type":"string","title":"Session Id"},"status":{"type":"string","title":"Status"},"ended_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ended At"},"counts":{"additionalProperties":true,"type":"object","title":"Counts"}},"type":"object","required":["session_id","status","ended_at","counts"],"title":"AgentSessionEndOut"},"AgentSessionStartIn":{"properties":{"agent":{"type":"string","maxLength":120,"minLength":1,"title":"Agent","description":"Stable agent label shown in the dashboard"},"title":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Title"},"session_ref":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Session Ref","description":"Client idempotency key; defaults to the X-MCP-Session-Id header"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"},"agent_type":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Agent Type"},"agent_version":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Agent Version"}},"type":"object","required":["agent"],"title":"AgentSessionStartIn"},"AgentSessionStartOut":{"properties":{"v":{"type":"integer","title":"V","default":1},"session_id":{"type":"string","title":"Session Id"},"status":{"type":"string","title":"Status"},"started_at":{"type":"string","format":"date-time","title":"Started At"},"session_header":{"type":"string","title":"Session Header","default":"X-MCP-Session-Id"},"channel":{"type":"string","title":"Channel"}},"type":"object","required":["session_id","status","started_at","channel"],"title":"AgentSessionStartOut"},"AlertThresholdsIn":{"properties":{"cdn":{"type":"number","maximum":0.99,"minimum":0.5,"title":"Cdn","default":0.8},"storage":{"type":"number","maximum":0.99,"minimum":0.5,"title":"Storage","default":0.8},"mcp":{"type":"number","maximum":0.99,"minimum":0.5,"title":"Mcp","default":0.8},"credits":{"type":"number","maximum":0.99,"minimum":0.5,"title":"Credits","default":0.8}},"type":"object","title":"AlertThresholdsIn"},"ApiKeyAddProjectsIn":{"properties":{"project_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Uuid"},"projects":{"items":{"type":"string"},"type":"array","title":"Projects"}},"type":"object","title":"ApiKeyAddProjectsIn","description":"Add one or many projects to an existing key. `project_uuid` and\n`projects` are merged; at least one entry is required."},"ApiKeyCreateIn":{"properties":{"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"projects":{"items":{"type":"string"},"type":"array","title":"Projects","description":"Project UUIDs this key may act on. Empty (default) = ORG-WIDE (every project in the org)."},"version_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Uuid","description":"Optional: scope the key to a single project version. `null` (default) means all-versions. Requires exactly one entry in `projects`."},"env_type":{"type":"string","enum":["prod","dev"],"title":"Env Type","description":"`prod` keys are not IP/origin gated (CDN-served reads only). `dev` keys can hit the runtime translation endpoint and MUST carry at least one `*` or specific entry in ip_allowlist OR origin_allowlist; empty + dev = key is unusable by design.","default":"prod"},"ip_allowlist":{"items":{"type":"string"},"type":"array","title":"Ip Allowlist","description":"CIDR or exact IPs (e.g. `1.2.3.4`, `10.0.0.0/8`, `*`). Enforced ONLY for env_type='dev' on the runtime endpoint."},"origin_allowlist":{"items":{"type":"string"},"type":"array","title":"Origin Allowlist","description":"Exact origin URLs (e.g. `http://localhost:5173`, `https://app.sonenta.com`, `*`). Enforced for env_type='dev' on the runtime endpoint."},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"}},"type":"object","required":["name"],"title":"ApiKeyCreateIn"},"ApiKeyCreateOut":{"properties":{"uuid":{"type":"string","title":"Uuid"},"prefix":{"type":"string","title":"Prefix"},"last4":{"type":"string","title":"Last4"},"name":{"type":"string","title":"Name"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"projects":{"items":{"type":"string"},"type":"array","title":"Projects"},"org_wide":{"type":"boolean","title":"Org Wide","default":true},"version_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Uuid"},"env_type":{"type":"string","enum":["prod","dev"],"title":"Env Type","default":"prod"},"ip_allowlist":{"items":{"type":"string"},"type":"array","title":"Ip Allowlist"},"origin_allowlist":{"items":{"type":"string"},"type":"array","title":"Origin Allowlist"},"created_by_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By Uuid"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"secret":{"type":"string","title":"Secret"},"token":{"type":"string","title":"Token"}},"type":"object","required":["uuid","prefix","last4","name","scopes","created_by_uuid","created_at","expires_at","revoked_at","last_used_at","secret","token"],"title":"ApiKeyCreateOut","description":"Returned ONCE on create / rotate — includes the full token."},"ApiKeyListOut":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ApiKeyOut"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"ApiKeyListOut"},"ApiKeyOut":{"properties":{"uuid":{"type":"string","title":"Uuid"},"prefix":{"type":"string","title":"Prefix"},"last4":{"type":"string","title":"Last4"},"name":{"type":"string","title":"Name"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"projects":{"items":{"type":"string"},"type":"array","title":"Projects"},"org_wide":{"type":"boolean","title":"Org Wide","default":true},"version_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Uuid"},"env_type":{"type":"string","enum":["prod","dev"],"title":"Env Type","default":"prod"},"ip_allowlist":{"items":{"type":"string"},"type":"array","title":"Ip Allowlist"},"origin_allowlist":{"items":{"type":"string"},"type":"array","title":"Origin Allowlist"},"created_by_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By Uuid"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"}},"type":"object","required":["uuid","prefix","last4","name","scopes","created_by_uuid","created_at","expires_at","revoked_at","last_used_at"],"title":"ApiKeyOut","description":"Listing shape — no secret."},"ApiKeyPatchIn":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":120,"minLength":1},{"type":"null"}],"title":"Name"},"scopes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Scopes"},"env_type":{"anyOf":[{"type":"string","enum":["prod","dev"]},{"type":"null"}],"title":"Env Type"},"ip_allowlist":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Ip Allowlist"},"origin_allowlist":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Origin Allowlist"}},"type":"object","title":"ApiKeyPatchIn"},"ApplyIn":{"properties":{"expected_version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Version"}},"type":"object","title":"ApplyIn"},"ApplyNewKeyClusterIn":{"properties":{"source_value":{"type":"string","title":"Source Value"},"new_key":{"$ref":"#/components/schemas/NewCanonicalKey"},"files_modified":{"anyOf":[{"items":{"$ref":"#/components/schemas/FileModified"},"type":"array"},{"type":"null"}],"title":"Files Modified"}},"type":"object","required":["source_value","new_key"],"title":"ApplyNewKeyClusterIn"},"ApplyNewKeyClusterOut":{"properties":{"new_key_uuid":{"type":"string","title":"New Key Uuid"},"name":{"type":"string","title":"Name"},"namespace":{"type":"string","title":"Namespace"},"copied_from_key_uuid":{"type":"string","title":"Copied From Key Uuid"},"copied_languages":{"type":"integer","title":"Copied Languages"},"trashed_key_uuids":{"items":{"type":"string"},"type":"array","title":"Trashed Key Uuids"}},"type":"object","required":["new_key_uuid","name","namespace","copied_from_key_uuid","copied_languages","trashed_key_uuids"],"title":"ApplyNewKeyClusterOut"},"ApplyOut":{"properties":{"suggestion_id":{"type":"string","title":"Suggestion Id"},"status":{"type":"string","title":"Status"},"applied_revision":{"type":"integer","title":"Applied Revision"},"translation":{"additionalProperties":true,"type":"object","title":"Translation"}},"type":"object","required":["suggestion_id","status","applied_revision","translation"],"title":"ApplyOut"},"AssignIn":{"properties":{"assignee":{"type":"string","title":"Assignee"},"language_code":{"type":"string","title":"Language Code"},"key_uuids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Key Uuids"},"namespace_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace Uuid"}},"type":"object","required":["assignee","language_code"],"title":"AssignIn"},"AssignOut":{"properties":{"task_uuid":{"type":"string","title":"Task Uuid"},"assignee_user_uuid":{"type":"string","title":"Assignee User Uuid"},"type":{"type":"string","title":"Type"},"language_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Code"},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count"}},"type":"object","required":["task_uuid","assignee_user_uuid","type"],"title":"AssignOut"},"AutoTopupIn":{"properties":{"enabled":{"type":"boolean","title":"Enabled","default":false},"threshold_credits":{"type":"integer","minimum":0.0,"title":"Threshold Credits","description":"auto-buy when balance drops below this","default":0},"pack":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pack","description":"credit pack SKU to purchase"}},"type":"object","title":"AutoTopupIn"},"AutoTranslateSettingsOut":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"active":{"type":"boolean","title":"Active"},"paused_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Paused Until"},"paused_reason":{"anyOf":[{"type":"string","enum":["burst","credits_exhausted"]},{"type":"null"}],"title":"Paused Reason"},"last_burst_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Burst At"},"last_burst_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Burst Count"},"last_burst_keys":{"items":{"type":"string"},"type":"array","title":"Last Burst Keys"},"last_run_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Run At"},"last_run_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Run Count"}},"type":"object","required":["enabled","active"],"title":"AutoTranslateSettingsOut","description":"Response shape for both GET and PUT settings + POST reactivate."},"AutoTranslateSettingsPutIn":{"properties":{"enabled":{"type":"boolean","title":"Enabled"}},"type":"object","required":["enabled"],"title":"AutoTranslateSettingsPutIn"},"BatchInvitationCreateIn":{"properties":{"emails":{"items":{"type":"string","pattern":"^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$"},"type":"array","maxItems":100,"minItems":1,"title":"Emails"},"role":{"type":"string","enum":["owner","admin","member"],"title":"Role","default":"member"},"message":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Message"},"projects":{"items":{"$ref":"#/components/schemas/InvitationProjectRoleIn"},"type":"array","title":"Projects"}},"type":"object","required":["emails"],"title":"BatchInvitationCreateIn","description":"Invite many emails at once with ONE common org role + ONE common set of\nper-project roles (task #2089). At most `BATCH_INVITATION_MAX` emails."},"BatchInvitationOut":{"properties":{"results":{"items":{"$ref":"#/components/schemas/BatchInvitationResult"},"type":"array","title":"Results"},"invited":{"type":"integer","title":"Invited"},"skipped":{"type":"integer","title":"Skipped"},"failed":{"type":"integer","title":"Failed"}},"type":"object","required":["results","invited","skipped","failed"],"title":"BatchInvitationOut"},"BatchInvitationResult":{"properties":{"email":{"type":"string","title":"Email"},"status":{"type":"string","enum":["invited","skipped","failed"],"title":"Status"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"invitation_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invitation Uuid"}},"type":"object","required":["email","status"],"title":"BatchInvitationResult","description":"Per-email outcome. `invited` = a new invitation row was created + emailed;\n`skipped` = intentionally not invited (see reason); `failed` = an unexpected\nerror while creating the row (the rest of the batch still proceeds)."},"BatchOut":{"properties":{"accepted":{"type":"integer","title":"Accepted"},"rejected":{"type":"integer","title":"Rejected"},"items":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Items"}},"type":"object","required":["accepted","rejected","items"],"title":"BatchOut"},"BillingSettingsIn":{"properties":{"auto_topup":{"$ref":"#/components/schemas/AutoTopupIn","default":{"enabled":false,"threshold_credits":0}},"alert_thresholds":{"$ref":"#/components/schemas/AlertThresholdsIn","default":{"cdn":0.8,"storage":0.8,"mcp":0.8,"credits":0.8}},"storage_hard_cap":{"type":"boolean","title":"Storage Hard Cap","default":false}},"type":"object","title":"BillingSettingsIn"},"BillingSettingsOut":{"properties":{"auto_topup":{"$ref":"#/components/schemas/AutoTopupIn","default":{"enabled":false,"threshold_credits":0}},"alert_thresholds":{"$ref":"#/components/schemas/AlertThresholdsIn","default":{"cdn":0.8,"storage":0.8,"mcp":0.8,"credits":0.8}},"storage_hard_cap":{"type":"boolean","title":"Storage Hard Cap","default":false}},"type":"object","title":"BillingSettingsOut"},"BillingStateOut":{"properties":{"plan":{"type":"string","enum":["free","hobby","pro","team","enterprise"],"title":"Plan"},"has_payment_method":{"type":"boolean","title":"Has Payment Method"},"subscription":{"anyOf":[{"$ref":"#/components/schemas/SubscriptionOut"},{"type":"null"}]},"enterprise_pricing":{"anyOf":[{"$ref":"#/components/schemas/app__routes__billing__EnterprisePricingOut"},{"type":"null"}]},"feedback_addon":{"$ref":"#/components/schemas/FeedbackAddonState"},"in_context_addon":{"$ref":"#/components/schemas/InContextAddonState"},"tax_handled_by_stripe":{"type":"boolean","title":"Tax Handled By Stripe"},"seat_usage":{"$ref":"#/components/schemas/SeatUsageOut"}},"type":"object","required":["plan","has_payment_method","subscription","enterprise_pricing","feedback_addon","in_context_addon","tax_handled_by_stripe","seat_usage"],"title":"BillingStateOut"},"BulkItemError":{"properties":{"code":{"type":"string","title":"Code"},"message":{"type":"string","title":"Message"}},"type":"object","required":["code","message"],"title":"BulkItemError"},"BulkSummary":{"properties":{"total":{"type":"integer","title":"Total"},"ok":{"type":"integer","title":"Ok"},"errors":{"type":"integer","title":"Errors"},"created":{"type":"integer","title":"Created","default":0},"updated":{"type":"integer","title":"Updated","default":0},"unchanged":{"type":"integer","title":"Unchanged","default":0}},"type":"object","required":["total","ok","errors"],"title":"BulkSummary"},"Capability":{"properties":{"action":{"type":"string","title":"Action"},"allowed":{"type":"boolean","title":"Allowed"},"requires":{"type":"string","title":"Requires"},"endpoints":{"items":{"type":"string"},"type":"array","title":"Endpoints"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["action","allowed","requires","endpoints"],"title":"Capability"},"CatalogueEntryOut":{"properties":{"id":{"type":"string","title":"Id"},"label":{"type":"string","title":"Label"},"description":{"type":"string","title":"Description"},"category":{"type":"string","title":"Category"},"scope":{"type":"string","title":"Scope"},"forced":{"type":"boolean","title":"Forced"},"channels":{"items":{"type":"string"},"type":"array","title":"Channels"},"default":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Default"}},"type":"object","required":["id","label","description","category","scope","forced","channels","default"],"title":"CatalogueEntryOut"},"CatalogueItem":{"properties":{"key":{"type":"string","title":"Key"},"i18n_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"I18N Key"},"section":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Section"},"subsection":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subsection"},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"},"phase":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phase"},"agent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"title":{"type":"string","title":"Title"},"template":{"type":"string","title":"Template"},"enabled":{"type":"boolean","title":"Enabled"}},"type":"object","required":["key","i18n_key","section","subsection","tier","phase","agent","category","title","template","enabled"],"title":"CatalogueItem"},"CatalogueOut":{"properties":{"v":{"type":"integer","title":"V","default":1},"items":{"items":{"$ref":"#/components/schemas/CatalogueItem"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","total"],"title":"CatalogueOut"},"CdnConfigIn":{"properties":{"signed_urls_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Signed Urls Enabled"},"allowed_referrers":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Referrers"},"block_none_referrer":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Block None Referrer"},"blocked_countries":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Blocked Countries"},"request_limit":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Request Limit"},"burst_size":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Burst Size"},"connection_limit_per_ip":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Connection Limit Per Ip"},"custom_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Domain"}},"type":"object","title":"CdnConfigIn","description":"Partial update — only the provided fields are changed."},"CdnConfigOut":{"properties":{"dedicated_zone":{"type":"boolean","title":"Dedicated Zone"},"zone_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zone Id"},"cdn_hostname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cdn Hostname"},"hostnames":{"items":{"type":"string"},"type":"array","title":"Hostnames"},"signed_urls_enabled":{"type":"boolean","title":"Signed Urls Enabled","default":false},"zone_security_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zone Security Key"},"allowed_referrers":{"items":{"type":"string"},"type":"array","title":"Allowed Referrers"},"block_none_referrer":{"type":"boolean","title":"Block None Referrer","default":false},"blocked_countries":{"items":{"type":"string"},"type":"array","title":"Blocked Countries"},"request_limit":{"type":"integer","title":"Request Limit","default":0},"burst_size":{"type":"integer","title":"Burst Size","default":0},"connection_limit_per_ip":{"type":"integer","title":"Connection Limit Per Ip","default":0}},"type":"object","required":["dedicated_zone"],"title":"CdnConfigOut"},"CdnEmptyBundleWarning":{"properties":{"language_code":{"type":"string","title":"Language Code"},"namespace":{"type":"string","title":"Namespace"},"key_count":{"type":"integer","title":"Key Count"},"included_count":{"type":"integer","title":"Included Count"},"excluded_count":{"type":"integer","title":"Excluded Count"},"skipped":{"type":"boolean","title":"Skipped"},"reason":{"type":"string","title":"Reason"}},"type":"object","required":["language_code","namespace","key_count","included_count","excluded_count","skipped","reason"],"title":"CdnEmptyBundleWarning"},"CdnOverageModeIn":{"properties":{"mode":{"type":"string","enum":["pay_as_you_go","hard_cap"],"title":"Mode"}},"type":"object","required":["mode"],"title":"CdnOverageModeIn"},"CdnOverageModeOut":{"properties":{"org_uuid":{"type":"string","title":"Org Uuid"},"mode":{"type":"string","enum":["pay_as_you_go","hard_cap"],"title":"Mode"},"available":{"items":{"type":"string"},"type":"array","title":"Available","default":["pay_as_you_go","hard_cap"]}},"type":"object","required":["org_uuid","mode"],"title":"CdnOverageModeOut"},"CdnPreviewItem":{"properties":{"language_code":{"type":"string","title":"Language Code"},"namespace":{"type":"string","title":"Namespace"},"new_strings":{"type":"integer","title":"New Strings","description":"Entries not in the last published bundle."},"changed_strings":{"type":"integer","title":"Changed Strings","description":"Entries whose value differs from the last bundle."},"to_publish":{"type":"integer","title":"To Publish","description":"new_strings + changed_strings for this (lang, ns)."},"key_count":{"type":"integer","title":"Key Count","description":"Total keys in the namespace."},"included_count":{"type":"integer","title":"Included Count","description":"Publishable keys (status ≥ translated)."}},"type":"object","required":["language_code","namespace","new_strings","changed_strings","to_publish","key_count","included_count"],"title":"CdnPreviewItem"},"CdnPreviewOut":{"properties":{"items":{"items":{"$ref":"#/components/schemas/CdnPreviewItem"},"type":"array","title":"Items"},"new_strings":{"type":"integer","title":"New Strings"},"changed_strings":{"type":"integer","title":"Changed Strings"},"to_publish":{"type":"integer","title":"To Publish","description":"Total strings 'Publish now' would ship. 0 = nothing to publish."},"warnings":{"items":{"$ref":"#/components/schemas/CdnEmptyBundleWarning"},"type":"array","title":"Warnings"},"formula":{"additionalProperties":{"type":"string"},"type":"object","title":"Formula"}},"type":"object","required":["items","new_strings","changed_strings","to_publish","formula"],"title":"CdnPreviewOut"},"CdnPublishIn":{"properties":{"language_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Code"},"namespace":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace"},"version_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Slug","description":"Project-version slug to publish. Defaults to the production version when omitted."},"allow_empty":{"type":"boolean","title":"Allow Empty","description":"By default a BASE bundle whose namespace has keys but ZERO publishable ones (all below 'translated', e.g. draft) is REFUSED (it would serve an empty bundle) and reported in `warnings`. Set true to force-publish the empty bundle anyway.","default":false}},"type":"object","title":"CdnPublishIn"},"CdnPublishOut":{"properties":{"items":{"items":{"$ref":"#/components/schemas/CdnReleaseSummary"},"type":"array","title":"Items"},"new_count":{"type":"integer","title":"New Count"},"reused_count":{"type":"integer","title":"Reused Count"},"warnings":{"items":{"$ref":"#/components/schemas/CdnEmptyBundleWarning"},"type":"array","title":"Warnings"}},"type":"object","required":["items","new_count","reused_count"],"title":"CdnPublishOut"},"CdnRelease":{"properties":{"uuid":{"type":"string","title":"Uuid"},"language_code":{"type":"string","title":"Language Code"},"namespace_slug":{"type":"string","title":"Namespace Slug"},"namespace_uuid":{"type":"string","title":"Namespace Uuid"},"version_hash":{"type":"string","title":"Version Hash"},"content_hash":{"type":"string","title":"Content Hash"},"size_bytes":{"type":"integer","title":"Size Bytes"},"key_count":{"type":"integer","title":"Key Count"},"included_count":{"type":"integer","title":"Included Count"},"status":{"type":"string","title":"Status"},"published_at":{"type":"string","format":"date-time","title":"Published At"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url"},"latest_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest Url"},"payload":{"additionalProperties":true,"type":"object","title":"Payload"}},"type":"object","required":["uuid","language_code","namespace_slug","namespace_uuid","version_hash","content_hash","size_bytes","key_count","included_count","status","published_at","payload"],"title":"CdnRelease"},"CdnReleaseListOut":{"properties":{"items":{"items":{"$ref":"#/components/schemas/CdnReleaseSummary"},"type":"array","title":"Items"},"cursor_next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor Next"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","cursor_next","total"],"title":"CdnReleaseListOut"},"CdnReleaseSummary":{"properties":{"uuid":{"type":"string","title":"Uuid"},"language_code":{"type":"string","title":"Language Code"},"namespace_slug":{"type":"string","title":"Namespace Slug"},"namespace_uuid":{"type":"string","title":"Namespace Uuid"},"version_hash":{"type":"string","title":"Version Hash"},"content_hash":{"type":"string","title":"Content Hash"},"size_bytes":{"type":"integer","title":"Size Bytes"},"key_count":{"type":"integer","title":"Key Count"},"included_count":{"type":"integer","title":"Included Count"},"status":{"type":"string","title":"Status"},"published_at":{"type":"string","format":"date-time","title":"Published At"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url"},"latest_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest Url"}},"type":"object","required":["uuid","language_code","namespace_slug","namespace_uuid","version_hash","content_hash","size_bytes","key_count","included_count","status","published_at"],"title":"CdnReleaseSummary"},"CellOut":{"properties":{"override":{"type":"boolean","title":"Override"},"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value"},"pluralForms":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Pluralforms"},"assetRef":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Assetref"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"resolvedValue":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolvedvalue"},"resolvedPluralForms":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Resolvedpluralforms"},"resolvedFrom":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolvedfrom"},"drift":{"type":"boolean","title":"Drift","default":false}},"type":"object","required":["override"],"title":"CellOut"},"CentrifugoTokenIn":{"properties":{"project_uuid":{"type":"string","minLength":1,"title":"Project Uuid"},"kind":{"type":"string","enum":["translations","missing","feedback","translation_jobs","agent"],"title":"Kind","default":"translations"},"version_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Uuid"}},"type":"object","required":["project_uuid"],"title":"CentrifugoTokenIn"},"CentrifugoTokenOut":{"properties":{"token":{"type":"string","title":"Token"},"channel":{"type":"string","title":"Channel"},"expires_at":{"type":"integer","title":"Expires At"},"ttl_seconds":{"type":"integer","title":"Ttl Seconds"}},"type":"object","required":["token","channel","expires_at","ttl_seconds"],"title":"CentrifugoTokenOut"},"ChangeItem":{"properties":{"version":{"type":"integer","title":"Version"},"changed_at":{"type":"string","format":"date-time","title":"Changed At"},"change_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Change Source"},"key_uuid":{"type":"string","title":"Key Uuid"},"key_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Name"},"namespace_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace Slug"},"language_uuid":{"type":"string","title":"Language Uuid"},"language_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Code"},"value":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"object","title":"Value"},"status":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"object","title":"Status"},"surface":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Surface"},"surface_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Surface Kind"},"change_type":{"type":"string","title":"Change Type"},"plural_changed":{"type":"boolean","title":"Plural Changed","default":false},"changed_by_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Changed By Uuid"},"actor":{"$ref":"#/components/schemas/ActorInfo"}},"type":"object","required":["version","changed_at","change_source","key_uuid","key_name","namespace_slug","language_uuid","language_code","value","status","change_type","changed_by_uuid","actor"],"title":"ChangeItem"},"ChangesOut":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ChangeItem"},"type":"array","title":"Items"},"cursor_next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor Next"}},"type":"object","required":["items"],"title":"ChangesOut"},"CheckoutIn":{"properties":{"plan":{"type":"string","enum":["free","hobby","pro","team","enterprise"],"title":"Plan","description":"Target plan to subscribe to (free is not allowed)"},"cadence":{"type":"string","enum":["monthly","yearly"],"title":"Cadence","default":"monthly"},"success_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Success Url"},"cancel_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Cancel Url"}},"type":"object","required":["plan","success_url","cancel_url"],"title":"CheckoutIn"},"CheckoutOut":{"properties":{"url":{"type":"string","title":"Url"},"session_id":{"type":"string","title":"Session Id"}},"type":"object","required":["url","session_id"],"title":"CheckoutOut"},"CleanupOrphansOut":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"scanned":{"type":"integer","title":"Scanned"},"resolved_orphans":{"type":"integer","title":"Resolved Orphans"},"still_open":{"type":"integer","title":"Still Open"}},"type":"object","required":["project_uuid","scanned","resolved_orphans","still_open"],"title":"CleanupOrphansOut"},"ClusterAppliedIn":{"properties":{"source_value":{"type":"string","title":"Source Value"},"canonical_key_uuid":{"type":"string","title":"Canonical Key Uuid"},"applied":{"type":"boolean","title":"Applied","default":true},"files_modified":{"anyOf":[{"items":{"$ref":"#/components/schemas/FileModified"},"type":"array"},{"type":"null"}],"title":"Files Modified"}},"type":"object","required":["source_value","canonical_key_uuid"],"title":"ClusterAppliedIn"},"ClusterAppliedOut":{"properties":{"source_value":{"type":"string","title":"Source Value"},"status":{"type":"string","title":"Status"},"merge_plan":{"anyOf":[{"$ref":"#/components/schemas/MergePlan"},{"type":"null"}]},"all_applied":{"type":"boolean","title":"All Applied"}},"type":"object","required":["source_value","status","all_applied"],"title":"ClusterAppliedOut"},"CodeOccurrenceIn":{"properties":{"ref":{"type":"string","maxLength":512,"minLength":1,"title":"Ref","description":"Raw usage reference as written in the code, e.g. `common:actions.save` or a NUDE `quality.agent.copied`. The backend resolves it to a base-version key_uuid; send NO uuid. A nude ref (no `:`) binds to the project's DEFAULT namespace, exactly as i18next does at runtime — that is the common case (apps call useTranslation() without a namespace)."},"file":{"type":"string","maxLength":1024,"minLength":1,"title":"File","description":"Repo-relative path of the usage site."},"line":{"type":"integer","minimum":0.0,"title":"Line","description":"1-indexed line; 0 when the scanner cannot place it."},"column":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Column"}},"type":"object","required":["ref","file","line"],"title":"CodeOccurrenceIn"},"CodeOccurrencesFileRow":{"properties":{"file":{"type":"string","title":"File"},"key_count":{"type":"integer","title":"Key Count"},"keys":{"items":{"$ref":"#/components/schemas/CodeOccurrencesKeyRef"},"type":"array","title":"Keys"}},"type":"object","required":["file","key_count","keys"],"title":"CodeOccurrencesFileRow"},"CodeOccurrencesFilesPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/CodeOccurrencesFileRow"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total","description":"Distinct file count (for paging the tree)."},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"status":{"type":"string","title":"Status"},"latest_scan_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest Scan Id","description":"scan_id of the most recent completed run; null if none."},"measured":{"type":"boolean","title":"Measured","description":"False = no completed run yet — NOT 'no usages'."},"formula":{"additionalProperties":{"type":"string"},"type":"object","title":"Formula"}},"type":"object","required":["items","total","limit","offset","status","measured","formula"],"title":"CodeOccurrencesFilesPage"},"CodeOccurrencesIngestIn":{"properties":{"occurrences":{"items":{"$ref":"#/components/schemas/CodeOccurrenceIn"},"type":"array","maxItems":10000,"title":"Occurrences","description":"One BATCH of key-usage sites. All occurrences of a given (key, file) MUST be in the same batch (chunk by file). The run is authoritative only at `final`."},"scan_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scan Id","description":"Omit on the FIRST batch to open a run — the response mints and echoes the id. Echo that id on every follow-up batch of the same run."},"final":{"type":"boolean","title":"Final","description":"Set true on the LAST batch (or the only batch of a single-shot run) to close the run: reconcile `gone` and run the mass-gone guard. Non-final batches only upsert.","default":false},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"Free-form run context (tool, version, sha)."},"confirm_mass_gone":{"type":"boolean","title":"Confirm Mass Gone","description":"Set true ONLY when a final that retires most of the project's live occurrences is intended. Without it such a close is refused (422) — the usual cause is a partial checkout.","default":false}},"type":"object","title":"CodeOccurrencesIngestIn"},"CodeOccurrencesKeyRef":{"properties":{"key_uuid":{"type":"string","title":"Key Uuid","description":"Stable join key — pair with listTranslations, never the name."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"namespace":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace","description":"Namespace slug."},"occurrence_count":{"type":"integer","title":"Occurrence Count"}},"type":"object","required":["key_uuid","occurrence_count"],"title":"CodeOccurrencesKeyRef"},"CodeOccurrencesRunOut":{"properties":{"scan_id":{"type":"string","title":"Scan Id","description":"ALWAYS present when supported. Absence = pre-contract backend."},"status":{"type":"string","title":"Status","description":"`open` (more batches expected) or `final` (run closed)."},"submitted":{"type":"integer","title":"Submitted"},"resolved":{"type":"integer","title":"Resolved"},"unresolved":{"type":"integer","title":"Unresolved"},"unresolved_refs":{"items":{"$ref":"#/components/schemas/CodeOccurrencesUnresolved"},"type":"array","title":"Unresolved Refs"},"new":{"type":"integer","title":"New"},"persisting":{"type":"integer","title":"Persisting"},"gone":{"type":"integer","title":"Gone"},"seen_total_for_scan":{"type":"integer","title":"Seen Total For Scan"},"base_version_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Version Uuid"},"formula":{"additionalProperties":{"type":"string"},"type":"object","title":"Formula"}},"type":"object","required":["scan_id","status","submitted","resolved","unresolved","unresolved_refs","new","persisting","gone","seen_total_for_scan","formula"],"title":"CodeOccurrencesRunOut"},"CodeOccurrencesUnresolved":{"properties":{"ref":{"type":"string","title":"Ref"},"file":{"type":"string","title":"File"},"reason":{"type":"string","title":"Reason","description":"unknown_namespace | unknown_key | no_default_namespace (a nude ref on a project with several namespaces and no `common` — no derivable default)"}},"type":"object","required":["ref","file","reason"],"title":"CodeOccurrencesUnresolved"},"CodeProfileIn":{"properties":{"frameworks":{"items":{"$ref":"#/components/schemas/FrameworkIn"},"type":"array","maxItems":20,"title":"Frameworks","description":"EVERY framework detected. A repo can carry several (an Astro site with a Next/React SPA inside), so this is a list. Posting REPLACES the profile — it does not merge, otherwise a framework removed from the repo could never be cleared."},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language","description":"ts | js (optional)."},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"Free-form run context. Stored verbatim; NO key is validated or guaranteed."}},"type":"object","title":"CodeProfileIn"},"CodeProfileOut":{"properties":{"frameworks":{"items":{"$ref":"#/components/schemas/FrameworkOut"},"type":"array","title":"Frameworks"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"meta":{"additionalProperties":true,"type":"object","title":"Meta"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"updated_by_user_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated By User Uuid"},"updated_by_api_key_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated By Api Key Uuid"},"via":{"type":"string","title":"Via"},"deduplicated":{"items":{"type":"string"},"type":"array","title":"Deduplicated"},"formula":{"additionalProperties":{"type":"string"},"type":"object","title":"Formula"}},"type":"object","required":["updated_at","via"],"title":"CodeProfileOut"},"CodeScanByCategory":{"properties":{"keyless":{"$ref":"#/components/schemas/CodeScanStatusCounts"},"key_default":{"$ref":"#/components/schemas/CodeScanStatusCounts"},"unknown":{"$ref":"#/components/schemas/CodeScanStatusCounts"}},"type":"object","required":["keyless","key_default","unknown"],"title":"CodeScanByCategory","description":"Category x status. `keyless` = raw literal with no key · `key_default` = a\nkey's defaultValue · `unknown` = everything the scanner did not label as one\nof those (incl. findings from before the field existed). `keyless.new` is the\nUI headline: hardcoded strings with no key, still to treat."},"CodeScanExclusionDeleted":{"properties":{"deleted":{"type":"boolean","title":"Deleted"},"uuid":{"type":"string","title":"Uuid"}},"type":"object","required":["deleted","uuid"],"title":"CodeScanExclusionDeleted"},"CodeScanExclusionIn":{"properties":{"type":{"type":"string","enum":["string","file","folder"],"title":"Type","description":"Granularity: `string` matches `finding.string == value` · `file` matches `finding.file == value` · `folder` matches `finding.file` under `value + '/'`."},"value":{"type":"string","maxLength":8192,"minLength":1,"title":"Value","description":"Exact value/path (repo-relative POSIX). A `folder` prefix is normalised WITHOUT a trailing slash, so `src/ui` and `src/ui/` are the same rule."},"note":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Note","description":"Optional free-text reason shown in the management view."}},"type":"object","required":["type","value"],"title":"CodeScanExclusionIn"},"CodeScanExclusionOut":{"properties":{"uuid":{"type":"string","title":"Uuid"},"type":{"type":"string","title":"Type"},"value":{"type":"string","title":"Value"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"created_by":{"anyOf":[{"$ref":"#/components/schemas/CodeScanRunActor"},{"type":"null"}],"description":"Who created the rule, display-ready ({type, uuid, label?}); null if none. Same shape/resolution as a run's `actor` — the UI shows the label, never the uuid."},"matched_count":{"type":"integer","title":"Matched Count","description":"Findings this ONE rule masks right now, ALL statuses. Rules can overlap, so the sum across rules is not the project total — that is `summary.excluded`."}},"type":"object","required":["uuid","type","value","created_at","matched_count"],"title":"CodeScanExclusionOut"},"CodeScanFileCounts":{"properties":{"new":{"type":"integer","title":"New","description":"Outstanding (à traiter)."},"treated":{"type":"integer","title":"Treated","description":"Turned into a key."},"gone":{"type":"integer","title":"Gone","description":"No longer in the source."},"new_this_scan":{"type":"integer","title":"New This Scan","description":"Subset of `new` that FIRST appeared in the most recent scan."}},"type":"object","required":["new","treated","gone","new_this_scan"],"title":"CodeScanFileCounts"},"CodeScanFileRow":{"properties":{"file":{"type":"string","title":"File","description":"Repo-relative path."},"counts":{"$ref":"#/components/schemas/CodeScanFileCounts"},"by_category":{"$ref":"#/components/schemas/CodeScanByCategory"},"total":{"type":"integer","title":"Total","description":"new + treated + gone in this file."}},"type":"object","required":["file","counts","by_category","total"],"title":"CodeScanFileRow"},"CodeScanFilesPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/CodeScanFileRow"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total","description":"Distinct file count (for paging the tree)."},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"latest_scan_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest Scan Id","description":"The run `new_this_scan` is measured against; null if none."},"formula":{"additionalProperties":{"type":"string"},"type":"object","title":"Formula"}},"type":"object","required":["items","total","limit","offset","formula"],"title":"CodeScanFilesPage"},"CodeScanFindingIn":{"properties":{"file":{"type":"string","maxLength":1024,"minLength":1,"title":"File","description":"Repo-relative path."},"line":{"type":"integer","minimum":0.0,"title":"Line","description":"1-indexed line; 0 when the scanner cannot place it."},"column":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Column"},"string":{"type":"string","maxLength":8192,"minLength":1,"title":"String","description":"The raw literal found."},"suggested_namespace":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Suggested Namespace"},"category":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Category","description":"How the scanner classified this literal: `keyless` (raw string, no key) · `key_default` (a key's defaultValue) · `unknown`. TOLERANT — omit or send any value; absent/empty is stored as `unknown`, and the roll-up folds anything that is not `keyless`/`key_default` into `unknown`. NOT part of the finding's identity."},"source":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Source","description":"WHERE the text lives, for display: `attribute` (a placeholder/alt/title/aria-label/… value) or `element` (the parent tag/component text). TOLERANT — omit for null; any value outside {attribute, element} is stored as null, never a 422 (a client ahead of the backend must not break ingest). NOT part of identity; refreshed every run (absent → null, last-writer-wins)."},"source_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Source Name","description":"The attribute name (placeholder/alt/title/aria-label/label) or the tag/component name as written (button/label/h1/p/a/Button/Th/Foo.Bar/svg:text). Free text, TOLERANT — omit for null. NOT part of identity; refreshed every run."}},"type":"object","required":["file","line","string"],"title":"CodeScanFindingIn"},"CodeScanFindingOut":{"properties":{"uuid":{"type":"string","title":"Uuid"},"fingerprint":{"type":"string","title":"Fingerprint"},"file":{"type":"string","title":"File"},"line":{"type":"integer","title":"Line"},"column":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Column"},"string":{"type":"string","title":"String"},"status":{"type":"string","title":"Status"},"category":{"type":"string","title":"Category","description":"Scanner classification: keyless / key_default / unknown. `unknown` for findings recorded before the field existed.","default":"unknown"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Where the text lives: `attribute` | `element` | null. Display only. null for findings recorded before the field existed, or when the scan omitted it."},"source_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Name","description":"Attribute name or tag/component name (e.g. `placeholder`, `button`, `Foo.Bar`); null when unknown. Display only."},"suggested_namespace":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggested Namespace"},"treated_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Treated Key"},"treated_namespace":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Treated Namespace","description":"Namespace of the treated key, when it was validated at treat time."},"treated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Treated At"},"first_seen_scan_id":{"type":"string","title":"First Seen Scan Id"},"last_seen_scan_id":{"type":"string","title":"Last Seen Scan Id"},"first_seen_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Seen At"},"last_seen_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Seen At"}},"type":"object","required":["uuid","fingerprint","file","line","string","status","first_seen_scan_id","last_seen_scan_id"],"title":"CodeScanFindingOut"},"CodeScanFindingsPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/CodeScanFindingOut"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["items","total","limit","offset"],"title":"CodeScanFindingsPage"},"CodeScanIgnoreDeleted":{"properties":{"deleted":{"type":"boolean","title":"Deleted"},"uuid":{"type":"string","title":"Uuid"}},"type":"object","required":["deleted","uuid"],"title":"CodeScanIgnoreDeleted"},"CodeScanIgnoreIn":{"properties":{"component":{"type":"string","maxLength":200,"minLength":1,"title":"Component","description":"Component/tag name, as it appears in the inventory."},"prop":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Prop","description":"Prop to ignore. OMIT (null) to ignore the WHOLE component (every prop); a string ignores just that (component, prop)."}},"type":"object","required":["component"],"title":"CodeScanIgnoreIn"},"CodeScanIgnoreOut":{"properties":{"uuid":{"type":"string","title":"Uuid"},"component":{"type":"string","title":"Component"},"prop":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prop","description":"null = the whole component is ignored; a string = that single prop."},"created_at":{"type":"string","format":"date-time","title":"Created At"},"created_by":{"anyOf":[{"$ref":"#/components/schemas/CodeScanRunActor"},{"type":"null"}],"description":"Who added the rule (dev or agent), display-ready ({type, uuid, label?}); resolved like a run's `actor`. The console shows the label, never the uuid."}},"type":"object","required":["uuid","component","created_at"],"title":"CodeScanIgnoreOut"},"CodeScanIgnoresPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/CodeScanIgnoreOut"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total","description":"Prop-ignore rules on this project."},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["items","total","limit","offset"],"title":"CodeScanIgnoresPage"},"CodeScanIngestIn":{"properties":{"findings":{"items":{"$ref":"#/components/schemas/CodeScanFindingIn"},"type":"array","maxItems":20000,"title":"Findings","description":"EVERY hardcoded string this run found. The set is authoritative: anything known to the project and ABSENT here is marked `gone`, so a partial list silently retires findings that are still in the code."},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"Free-form run context (tool, version, sha)."},"confirm_mass_gone":{"type":"boolean","title":"Confirm Mass Gone","description":"Set true ONLY when a run that retires most of the project's live findings is intended. Without it, such a run is refused (422) — the usual cause is a scan over a PARTIAL checkout, which would hide findings that are still in the code.","default":false},"component_prop_inventory":{"anyOf":[{"items":{"$ref":"#/components/schemas/CodeScanInventoryItemIn"},"type":"array"},{"type":"null"}],"title":"Component Prop Inventory","description":"Translatable-props inventory, PIGGYBACKED on the ingest. PRESENCE is the contract: OMITTED (null) leaves the existing inventory UNTOUCHED (an old CLI that does not know the field must not purge it); a PRESENT list — even EMPTY — is authoritative and REPLACES the project's inventory (a pair the scan did not see leaves it, an empty list clears it). Does not affect findings."}},"type":"object","title":"CodeScanIngestIn"},"CodeScanInventoryItemIn":{"properties":{"component":{"type":"string","maxLength":200,"minLength":1,"title":"Component","description":"Component/tag name as written (Button, Foo.Bar, svg:text)."},"prop":{"type":"string","maxLength":200,"minLength":1,"title":"Prop","description":"Prop/attribute name."},"is_component":{"type":"boolean","title":"Is Component","description":"True when `component` is a component (PascalCase/dotted), false for a DOM tag.","default":false},"count":{"type":"integer","minimum":0.0,"title":"Count","description":"How many literal-bearing occurrences were seen.","default":0},"samples":{"items":{"type":"string"},"type":"array","maxItems":5,"title":"Samples","description":"Up to 5 sample literal values, for the discovery preview."},"first_file":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"First File"},"first_line":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"First Line"},"import_source":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Import Source","description":"The module the component is imported from (e.g. `@mui/material`); null when unknown. Tolerant, absent → null. Display only."},"defined_at":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Defined At","description":"Project file path where the component is defined, when it is LOCAL; null for an external/import-sourced component. Tolerant, absent → null. Display only."}},"type":"object","required":["component","prop"],"title":"CodeScanInventoryItemIn","description":"One discovered (component, prop) carrying a string literal — the raw\nmaterial of the translatable-props discovery screen."},"CodeScanInventoryPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/CodeScanInventoryRow"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total","description":"Distinct (component, prop) pairs discovered on this project."},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["items","total","limit","offset"],"title":"CodeScanInventoryPage"},"CodeScanInventoryRow":{"properties":{"component":{"type":"string","title":"Component"},"prop":{"type":"string","title":"Prop"},"is_component":{"type":"boolean","title":"Is Component","default":false},"count":{"type":"integer","title":"Count","default":0},"samples":{"items":{"type":"string"},"type":"array","title":"Samples"},"first_file":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First File"},"first_line":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"First Line"},"import_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Import Source","description":"Module the component is imported from; null when unknown."},"defined_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Defined At","description":"Project file where the component is defined (local); null if external."}},"type":"object","required":["component","prop"],"title":"CodeScanInventoryRow"},"CodeScanLastRun":{"properties":{"scan_id":{"type":"string","title":"Scan Id"},"uuid":{"type":"string","title":"Uuid","description":"Legacy alias of `scan_id` — prefer `scan_id`."},"org_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Uuid"},"project_uuid":{"type":"string","title":"Project Uuid"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"submitted":{"type":"integer","title":"Submitted","description":"How many findings this run posted."},"counts":{"$ref":"#/components/schemas/CodeScanRunCounts"},"meta":{"additionalProperties":true,"type":"object","title":"Meta","description":"Verbatim passthrough of whatever the scanner sent. The backend validates and guarantees NO key here — treat every field, and the object itself, as optional."},"via":{"type":"string","title":"Via","description":"Which surface ingested it: `core` or `mcp`."},"confirm_mass_gone":{"type":"boolean","title":"Confirm Mass Gone","default":false},"recorded_by_user_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recorded By User Uuid"},"recorded_by_api_key_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recorded By Api Key Uuid"}},"type":"object","required":["scan_id","uuid","project_uuid","created_at","submitted","counts","via"],"title":"CodeScanLastRun","description":"The last ingest, TYPED — previously `dict | None`, which left the OpenAPI\nsilent and forced the dashboard to ask me what the field contains (a contract\nthat obliges the consumer to ask is not a contract).\n\n`scan_id` mirrors `uuid`: the ingest response calls this same identifier\n`scan_id`, and one entity under two names across two endpoints is how a\nclient bug gets written. `uuid` is kept so existing readers do not break.\n\nNOTE for future edits: this model now FILTERS the stored run document. A new\nfield added to `code_scan_runs` is dropped from the response unless it is\ndeclared here too."},"CodeScanPickDeleted":{"properties":{"deleted":{"type":"boolean","title":"Deleted"},"uuid":{"type":"string","title":"Uuid"}},"type":"object","required":["deleted","uuid"],"title":"CodeScanPickDeleted"},"CodeScanPickIn":{"properties":{"component":{"type":"string","maxLength":200,"minLength":1,"title":"Component","description":"Component/tag name, as it appears in the inventory."},"prop":{"type":"string","maxLength":200,"minLength":1,"title":"Prop","description":"Prop/attribute name."},"note":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Note"}},"type":"object","required":["component","prop"],"title":"CodeScanPickIn"},"CodeScanPickOut":{"properties":{"uuid":{"type":"string","title":"Uuid"},"component":{"type":"string","title":"Component"},"prop":{"type":"string","title":"Prop"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"created_by":{"anyOf":[{"$ref":"#/components/schemas/CodeScanRunActor"},{"type":"null"}],"description":"Who confirmed it, display-ready ({type, uuid, label?}): a `user` = a human confirmation, an `api_key` = an agent auto-accept the console can label and let the human undo. Resolved like a run's `actor`; the uuid is never shown."},"in_inventory":{"type":"boolean","title":"In Inventory","description":"Does this (component, prop) still exist in the latest scan's inventory? false = ORPHAN — the pair left the code; the console flags it."}},"type":"object","required":["uuid","component","prop","created_at","in_inventory"],"title":"CodeScanPickOut"},"CodeScanPicksPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/CodeScanPickOut"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["items","total","limit","offset"],"title":"CodeScanPicksPage"},"CodeScanRunActor":{"properties":{"type":{"type":"string","title":"Type","description":"`user` or `api_key`."},"uuid":{"type":"string","title":"Uuid"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"}},"type":"object","required":["type","uuid"],"title":"CodeScanRunActor","description":"Display-ready attribution — the dashboard renders the `label`, never the\nraw `uuid` (which stays for an audit join).\n\n`label` is a human name resolved at BOUNDED per-page cost (a user's\nname/email, or a key's `name · prefix…last4`). A uuid that no longer resolves\nkeeps its `type`/`uuid` and gets an explicit label (`unknown user` /\n`revoked or deleted key`) rather than vanishing — the attribution stays true,\nonly the human name is gone."},"CodeScanRunCounts":{"properties":{"new":{"type":"integer","title":"New"},"persisting":{"type":"integer","title":"Persisting"},"treated":{"type":"integer","title":"Treated"},"gone":{"type":"integer","title":"Gone"}},"type":"object","required":["new","persisting","treated","gone"],"title":"CodeScanRunCounts","description":"Per-RUN figures. `persisting` lives here and NOWHERE else: it is not a\nstored status (those are new/treated/gone), it is what one run observed —\n\"known, still present, not treated\". A finding that persists stays `new`,\nwhich is why the summary's top-level counts have no `persisting` column."},"CodeScanRunHistoryItem":{"properties":{"scan_id":{"type":"string","title":"Scan Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"submitted":{"type":"integer","title":"Submitted","description":"How many findings this run posted."},"counts":{"$ref":"#/components/schemas/CodeScanRunCounts"},"via":{"type":"string","title":"Via","description":"Which surface ingested it: `core` or `mcp`."},"confirm_mass_gone":{"type":"boolean","title":"Confirm Mass Gone","description":"True when this run retired most of the project's live findings and a human explicitly confirmed the wipe (the innocent cause being a partial checkout).","default":false},"meta":{"additionalProperties":true,"type":"object","title":"Meta","description":"Verbatim scanner context (e.g. tool / version / sha) — a passthrough the backend guarantees NO key in. Treat every field, and the object itself, as optional; the dashboard renders it as a discreet secondary line."},"actor":{"anyOf":[{"$ref":"#/components/schemas/CodeScanRunActor"},{"type":"null"}],"description":"Who recorded the run, display-ready ({type, uuid, label?}); null if the run carries no actor. The dashboard shows the label, never the uuid."}},"type":"object","required":["scan_id","created_at","submitted","counts","via"],"title":"CodeScanRunHistoryItem","description":"One past scan run, as it was recorded at ingest. `scan_id` is the run's\nown uuid — the SAME identifier the ingest response and `summary.last_scan`\nexpose, so a client joins the history to a finding's `first_seen_scan_id` /\n`last_seen_scan_id` without a name translation."},"CodeScanRunOut":{"properties":{"scan_id":{"type":"string","title":"Scan Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"submitted":{"type":"integer","title":"Submitted"},"new":{"type":"integer","title":"New"},"persisting":{"type":"integer","title":"Persisting"},"treated":{"type":"integer","title":"Treated"},"gone":{"type":"integer","title":"Gone"},"formula":{"additionalProperties":{"type":"string"},"type":"object","title":"Formula"}},"type":"object","required":["scan_id","created_at","submitted","new","persisting","treated","gone","formula"],"title":"CodeScanRunOut"},"CodeScanRunsPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/CodeScanRunHistoryItem"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total","description":"Total runs on this project, across all pages."},"cursor_next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor Next","description":"Opaque token for the next page — pass it back as `cursor`. Null on the last page."},"formula":{"additionalProperties":{"type":"string"},"type":"object","title":"Formula"}},"type":"object","required":["items","total","formula"],"title":"CodeScanRunsPage"},"CodeScanStatusCounts":{"properties":{"new":{"type":"integer","title":"New"},"treated":{"type":"integer","title":"Treated"},"gone":{"type":"integer","title":"Gone"}},"type":"object","required":["new","treated","gone"],"title":"CodeScanStatusCounts"},"CodeScanSuggestionDismissed":{"properties":{"dismissed":{"type":"boolean","title":"Dismissed"},"uuid":{"type":"string","title":"Uuid"}},"type":"object","required":["dismissed","uuid"],"title":"CodeScanSuggestionDismissed"},"CodeScanSuggestionOut":{"properties":{"uuid":{"type":"string","title":"Uuid"},"component":{"type":"string","title":"Component"},"prop":{"type":"string","title":"Prop"},"rationale":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rationale","description":"The agent's short justification."},"created_at":{"type":"string","format":"date-time","title":"Created At"},"created_by":{"anyOf":[{"$ref":"#/components/schemas/CodeScanRunActor"},{"type":"null"}],"description":"Which agent proposed it, display-ready ({type, uuid, label?}); resolved like a run's `actor`. The console shows the label, never the uuid."},"in_inventory":{"type":"boolean","title":"In Inventory","description":"Is this (component, prop) still in the latest scan's inventory? false = the pair left the code."},"confirmed":{"type":"boolean","title":"Confirmed","description":"DERIVED: a translatable-prop pick already exists for this pair (the human confirmed it). Never stored — always the live join vs the picks set."}},"type":"object","required":["uuid","component","prop","created_at","in_inventory","confirmed"],"title":"CodeScanSuggestionOut"},"CodeScanSuggestionsPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/CodeScanSuggestionOut"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total","description":"Active (non-dismissed) suggestions on this project."},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["items","total","limit","offset"],"title":"CodeScanSuggestionsPage"},"CodeScanSummaryOut":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"total":{"type":"integer","title":"Total"},"new":{"type":"integer","title":"New"},"treated":{"type":"integer","title":"Treated"},"gone":{"type":"integer","title":"Gone"},"excluded":{"type":"integer","title":"Excluded","description":"Findings masked by >=1 exclusion rule (all statuses) — the 'Exclusions (N)' badge. Always the positive union, independent of the `excluded` query param; equals total(include) - total(exclude)."},"by_category":{"$ref":"#/components/schemas/CodeScanByCategory"},"last_scan":{"anyOf":[{"$ref":"#/components/schemas/CodeScanLastRun"},{"type":"null"}]},"measured":{"type":"boolean","title":"Measured"},"formula":{"additionalProperties":{"type":"string"},"type":"object","title":"Formula"}},"type":"object","required":["project_uuid","total","new","treated","gone","excluded","by_category","last_scan","measured","formula"],"title":"CodeScanSummaryOut"},"CodeScanTreatedIn":{"properties":{"key":{"type":"string","maxLength":400,"minLength":1,"title":"Key","description":"The key name this string became."},"namespace":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Namespace","description":"Namespace slug of the key. When given, the key MUST exist as an active key of that namespace on this project (else 422) — so `treated` points at a real key. Omit for the legacy behaviour (records the key string with no check)."}},"type":"object","required":["key"],"title":"CodeScanTreatedIn"},"CognitiveAnalyzeIn":{"properties":{"tier":{"type":"string","enum":["standard","premium"],"title":"Tier","default":"standard"},"key_uuids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Key Uuids"},"namespace_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace Uuid"},"idempotency_key":{"type":"string","minLength":1,"title":"Idempotency Key"}},"type":"object","required":["idempotency_key"],"title":"CognitiveAnalyzeIn"},"CognitiveApplyIn":{"properties":{"mode":{"type":"string","pattern":"^(default|surface)$","title":"Mode"},"surface":{"type":"string","title":"Surface","default":"plain_language"},"language_codes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Language Codes"}},"type":"object","required":["mode"],"title":"CognitiveApplyIn"},"CognitiveEstimateIn":{"properties":{"tier":{"type":"string","enum":["standard","premium"],"title":"Tier","default":"standard"},"key_uuids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Key Uuids"},"namespace_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace Uuid"}},"type":"object","title":"CognitiveEstimateIn"},"CognitiveScoreIn":{"properties":{"score":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Score"},"suggestion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggestion"}},"type":"object","required":["score"],"title":"CognitiveScoreIn"},"CognitiveScoreLocalIn":{"properties":{"key_uuids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Key Uuids"},"namespace_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace Uuid"},"overwrite":{"type":"boolean","title":"Overwrite","default":false}},"type":"object","title":"CognitiveScoreLocalIn"},"CommentAnswerIn":{"properties":{"choice_id":{"type":"string","maxLength":60,"minLength":1,"title":"Choice Id"}},"type":"object","required":["choice_id"],"title":"CommentAnswerIn"},"CommentCreateIn":{"properties":{"body":{"type":"string","maxLength":20000,"title":"Body","description":"Markdown comment body.","default":""},"options":{"anyOf":[{"items":{"$ref":"#/components/schemas/CommentOptionIn"},"type":"array","maxItems":12},{"type":"null"}],"title":"Options","description":"Provide choices to make this a DECISION request awaiting an answer."}},"type":"object","title":"CommentCreateIn"},"CommentListOut":{"properties":{"v":{"type":"integer","title":"V","default":1},"items":{"items":{"$ref":"#/components/schemas/CommentOut"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"CommentListOut"},"CommentOptionIn":{"properties":{"id":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Id","description":"Stable choice id; defaults to its 1-based position."},"label":{"type":"string","maxLength":300,"minLength":1,"title":"Label"}},"type":"object","required":["label"],"title":"CommentOptionIn"},"CommentOut":{"properties":{"uuid":{"type":"string","title":"Uuid"},"task_uuid":{"type":"string","title":"Task Uuid"},"author":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Author"},"body":{"type":"string","title":"Body","default":""},"kind":{"type":"string","title":"Kind","default":"comment"},"options":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Options"},"answer":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Answer"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["uuid","task_uuid","created_at"],"title":"CommentOut"},"ConfirmEmailIn":{"properties":{"code":{"type":"string","maxLength":6,"minLength":6,"title":"Code"}},"type":"object","required":["code"],"title":"ConfirmEmailIn"},"ConfirmEmailOut":{"properties":{"mfa_enabled":{"type":"boolean","title":"Mfa Enabled"},"mfa_methods":{"items":{"type":"string"},"type":"array","title":"Mfa Methods"},"recovery_codes":{"items":{"type":"string"},"type":"array","title":"Recovery Codes"}},"type":"object","required":["mfa_enabled","mfa_methods"],"title":"ConfirmEmailOut"},"ConfirmLinkIn":{"properties":{"ticket":{"type":"string","title":"Ticket"}},"type":"object","required":["ticket"],"title":"ConfirmLinkIn"},"ConfirmTotpIn":{"properties":{"code":{"type":"string","maxLength":6,"minLength":6,"title":"Code"}},"type":"object","required":["code"],"title":"ConfirmTotpIn"},"ConsolidatePluralsIn":{"properties":{"namespace":{"type":"string","minLength":1,"title":"Namespace"},"dry_run":{"type":"boolean","title":"Dry Run","default":true},"base_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Name","description":"Restrict to one base key (e.g. agents.list.needs). Omit = whole namespace."}},"type":"object","required":["namespace"],"title":"ConsolidatePluralsIn"},"ContextDiffOut":{"properties":{"from_version":{"type":"integer","title":"From Version"},"to_version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"To Version","description":"null = diffed against current"},"from_content":{"type":"string","title":"From Content"},"to_content":{"type":"string","title":"To Content"},"unified_diff":{"type":"string","title":"Unified Diff"}},"type":"object","required":["from_version","from_content","to_content","unified_diff"],"title":"ContextDiffOut"},"ContextIn":{"properties":{"content":{"type":"string","title":"Content","description":"UTF-8 markdown; size limit 100 KiB"}},"type":"object","required":["content"],"title":"ContextIn"},"ContextOut":{"properties":{"content":{"type":"string","title":"Content"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"updated_by_user":{"anyOf":[{"$ref":"#/components/schemas/UpdatedByUser"},{"type":"null"}]},"size_bytes":{"type":"integer","title":"Size Bytes"}},"type":"object","required":["content","updated_at","updated_by_user","size_bytes"],"title":"ContextOut"},"ContextVersionDetail":{"properties":{"version":{"type":"integer","title":"Version"},"size_bytes":{"type":"integer","title":"Size Bytes"},"change_source":{"type":"string","title":"Change Source"},"changed_at":{"type":"string","format":"date-time","title":"Changed At"},"changed_by":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Changed By"},"reverted_from_version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reverted From Version"},"content":{"type":"string","title":"Content"}},"type":"object","required":["version","size_bytes","change_source","changed_at","content"],"title":"ContextVersionDetail"},"ContextVersionOut":{"properties":{"version":{"type":"integer","title":"Version"},"size_bytes":{"type":"integer","title":"Size Bytes"},"change_source":{"type":"string","title":"Change Source"},"changed_at":{"type":"string","format":"date-time","title":"Changed At"},"changed_by":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Changed By"},"reverted_from_version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reverted From Version"}},"type":"object","required":["version","size_bytes","change_source","changed_at"],"title":"ContextVersionOut"},"ContextVersionsPage":{"properties":{"v":{"type":"integer","title":"V","default":1},"items":{"items":{"$ref":"#/components/schemas/ContextVersionOut"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["items","total","limit","offset"],"title":"ContextVersionsPage"},"CountBucket":{"properties":{"label":{"type":"string","title":"Label"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["label","count"],"title":"CountBucket","description":"Generic (label, count) row used by the missing-keys stats facets."},"CoverageLanguage":{"properties":{"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"total_keys":{"type":"integer","title":"Total Keys"},"translated":{"type":"integer","title":"Translated"},"reviewed":{"type":"integer","title":"Reviewed"},"approved":{"type":"integer","title":"Approved"},"missing":{"type":"integer","title":"Missing"},"pct_translated":{"type":"integer","title":"Pct Translated"},"is_overlay":{"type":"boolean","title":"Is Overlay","default":false},"parent_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Code"},"effective_translated":{"type":"integer","title":"Effective Translated","default":0},"effective_pct":{"type":"integer","title":"Effective Pct","default":0},"override_count":{"type":"integer","title":"Override Count","default":0},"drift_count":{"type":"integer","title":"Drift Count","default":0},"source_missing":{"type":"integer","title":"Source Missing","default":0},"untranslated":{"type":"integer","title":"Untranslated","default":0},"draft":{"type":"integer","title":"Draft","default":0},"filled":{"type":"integer","title":"Filled","default":0},"pct_filled":{"type":"integer","title":"Pct Filled","default":100},"namespaces":{"items":{"$ref":"#/components/schemas/CoverageNamespace"},"type":"array","title":"Namespaces"}},"type":"object","required":["code","name","total_keys","translated","reviewed","approved","missing","pct_translated","namespaces"],"title":"CoverageLanguage"},"CoverageNamespace":{"properties":{"namespace":{"type":"string","title":"Namespace"},"total_keys":{"type":"integer","title":"Total Keys"},"translated":{"type":"integer","title":"Translated"},"reviewed":{"type":"integer","title":"Reviewed"},"approved":{"type":"integer","title":"Approved"},"missing":{"type":"integer","title":"Missing"},"pct_translated":{"type":"integer","title":"Pct Translated"},"untranslated":{"type":"integer","title":"Untranslated","default":0},"draft":{"type":"integer","title":"Draft","default":0},"source_missing":{"type":"integer","title":"Source Missing","default":0},"filled":{"type":"integer","title":"Filled","default":0},"pct_filled":{"type":"integer","title":"Pct Filled","default":100}},"type":"object","required":["namespace","total_keys","translated","reviewed","approved","missing","pct_translated"],"title":"CoverageNamespace"},"CoverageOut":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"version_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Uuid"},"keys_total":{"type":"integer","title":"Keys Total"},"source_missing":{"type":"integer","title":"Source Missing","default":0},"draft":{"type":"integer","title":"Draft","default":0},"completeness_global":{"type":"integer","title":"Completeness Global"},"review_pending":{"$ref":"#/components/schemas/ReviewPending","default":{"keys":0,"languages":[],"per_language":{}}},"languages":{"items":{"$ref":"#/components/schemas/CoverageLanguage"},"type":"array","title":"Languages"}},"type":"object","required":["project_uuid","version_uuid","keys_total","completeness_global","languages"],"title":"CoverageOut"},"CreateKeysBulkIn":{"properties":{"items":{"items":{"$ref":"#/components/schemas/KeyBulkItem"},"type":"array","maxItems":500,"minItems":1,"title":"Items"}},"type":"object","required":["items"],"title":"CreateKeysBulkIn"},"CreateKeysBulkOut":{"properties":{"results":{"items":{"$ref":"#/components/schemas/KeyBulkResult"},"type":"array","title":"Results"},"summary":{"$ref":"#/components/schemas/BulkSummary"}},"type":"object","required":["results","summary"],"title":"CreateKeysBulkOut"},"CreditBalanceOut":{"properties":{"balance":{"type":"integer","title":"Balance"},"lifetime_purchased":{"type":"integer","title":"Lifetime Purchased"},"lifetime_granted":{"type":"integer","title":"Lifetime Granted"},"lifetime_consumed":{"type":"integer","title":"Lifetime Consumed"},"lifetime_refunded":{"type":"integer","title":"Lifetime Refunded"}},"type":"object","required":["balance","lifetime_purchased","lifetime_granted","lifetime_consumed","lifetime_refunded"],"title":"CreditBalanceOut"},"CreditPackCheckoutIn":{"properties":{"sku":{"type":"string","enum":["micro","starter","growth","scale","bulk"],"title":"Sku"},"success_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Success Url"},"cancel_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Cancel Url"}},"type":"object","required":["sku","success_url","cancel_url"],"title":"CreditPackCheckoutIn"},"CreditPackOut":{"properties":{"sku":{"type":"string","title":"Sku"},"label":{"type":"string","title":"Label"},"credits":{"type":"integer","title":"Credits"},"price_cents":{"type":"integer","title":"Price Cents"}},"type":"object","required":["sku","label","credits","price_cents"],"title":"CreditPackOut"},"CreditPacksOut":{"properties":{"packs":{"items":{"$ref":"#/components/schemas/CreditPackOut"},"type":"array","title":"Packs"}},"type":"object","required":["packs"],"title":"CreditPacksOut"},"CsvExportReport":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"row_count":{"type":"integer","title":"Row Count"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings"},"csv":{"type":"string","title":"Csv"}},"type":"object","required":["project_uuid","row_count","warnings","csv"],"title":"CsvExportReport"},"CsvImportIn":{"properties":{"csv":{"type":"string","minLength":1,"title":"Csv"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"delimiter":{"type":"string","title":"Delimiter","default":","},"strict":{"type":"boolean","title":"Strict","default":false},"create_missing":{"type":"boolean","title":"Create Missing","default":false}},"type":"object","required":["csv"],"title":"CsvImportIn"},"CsvImportReport":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"applied":{"type":"integer","title":"Applied","default":0},"created":{"type":"integer","title":"Created","default":0},"updated":{"type":"integer","title":"Updated","default":0},"unchanged":{"type":"integer","title":"Unchanged","default":0},"skipped":{"type":"integer","title":"Skipped","default":0},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings","default":[]},"errors":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Errors","default":[]}},"type":"object","required":["project_uuid"],"title":"CsvImportReport"},"DeliveryListOut":{"properties":{"items":{"items":{"$ref":"#/components/schemas/DeliveryOut"},"type":"array","title":"Items"},"cursor_next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor Next"}},"type":"object","required":["items"],"title":"DeliveryListOut"},"DeliveryOut":{"properties":{"id":{"type":"string","title":"Id"},"webhook_id":{"type":"string","title":"Webhook Id"},"event":{"type":"string","title":"Event"},"url":{"type":"string","title":"Url"},"status":{"type":"string","title":"Status"},"http_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Http Code"},"attempts":{"type":"integer","title":"Attempts","default":0},"last_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Error"},"response_snippet":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Response Snippet"},"request_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Request Bytes"},"next_retry_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Retry At"},"duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Ms"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"delivered_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Delivered At"}},"type":"object","required":["id","webhook_id","event","url","status","created_at","updated_at"],"title":"DeliveryOut"},"DeviceApproveIn":{"properties":{"user_code":{"type":"string","minLength":1,"title":"User Code"},"org_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Uuid"}},"type":"object","required":["user_code"],"title":"DeviceApproveIn"},"DeviceApproveOut":{"properties":{"status":{"type":"string","title":"Status","default":"approved"},"user_code":{"type":"string","title":"User Code"}},"type":"object","required":["user_code"],"title":"DeviceApproveOut"},"DevicePendingOut":{"properties":{"user_code":{"type":"string","title":"User Code"},"status":{"type":"string","title":"Status"},"requested_at":{"type":"string","format":"date-time","title":"Requested At"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ip"},"user_agent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Agent"}},"type":"object","required":["user_code","status","requested_at","expires_at"],"title":"DevicePendingOut","description":"Consent-screen detail (dashboard /activate). Lets the page show WHAT is\nbeing authorized before the user approves."},"DeviceStartOut":{"properties":{"device_code":{"type":"string","title":"Device Code"},"user_code":{"type":"string","title":"User Code"},"verification_uri":{"type":"string","title":"Verification Uri"},"verification_uri_complete":{"type":"string","title":"Verification Uri Complete"},"expires_in":{"type":"integer","title":"Expires In"},"interval":{"type":"integer","title":"Interval"}},"type":"object","required":["device_code","user_code","verification_uri","verification_uri_complete","expires_in","interval"],"title":"DeviceStartOut"},"DeviceTokenIn":{"properties":{"device_code":{"type":"string","minLength":1,"title":"Device Code"}},"type":"object","required":["device_code"],"title":"DeviceTokenIn"},"DiffOut":{"properties":{"from":{"$ref":"#/components/schemas/VersionRef"},"against":{"$ref":"#/components/schemas/VersionRef"},"summary":{"$ref":"#/components/schemas/DiffSummary"},"added":{"items":{"$ref":"#/components/schemas/KeyRef"},"type":"array","title":"Added"},"removed":{"items":{"$ref":"#/components/schemas/KeyRef"},"type":"array","title":"Removed"},"modified":{"items":{"$ref":"#/components/schemas/ModifiedKey"},"type":"array","title":"Modified"}},"type":"object","required":["from","against","summary","added","removed","modified"],"title":"DiffOut"},"DiffSummary":{"properties":{"keys_added":{"type":"integer","title":"Keys Added"},"keys_removed":{"type":"integer","title":"Keys Removed"},"keys_modified":{"type":"integer","title":"Keys Modified"},"keys_unchanged":{"type":"integer","title":"Keys Unchanged"}},"type":"object","required":["keys_added","keys_removed","keys_modified","keys_unchanged"],"title":"DiffSummary"},"DisableIn":{"properties":{"current_password":{"type":"string","title":"Current Password"},"method":{"anyOf":[{"type":"string","enum":["totp","email"]},{"type":"null"}],"title":"Method"}},"type":"object","required":["current_password"],"title":"DisableIn"},"DisableOut":{"properties":{"mfa_enabled":{"type":"boolean","title":"Mfa Enabled"},"mfa_methods":{"items":{"type":"string"},"type":"array","title":"Mfa Methods"}},"type":"object","required":["mfa_enabled","mfa_methods"],"title":"DisableOut"},"DistributionBundle":{"properties":{"language_code":{"type":"string","title":"Language Code"},"namespace_slug":{"type":"string","title":"Namespace Slug"},"version_slug":{"type":"string","title":"Version Slug"},"version_hash":{"type":"string","title":"Version Hash"},"status":{"type":"string","title":"Status"},"published_at":{"type":"string","format":"date-time","title":"Published At"},"public_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Url"},"latest_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest Url"}},"type":"object","required":["language_code","namespace_slug","version_slug","version_hash","status","published_at"],"title":"DistributionBundle"},"DistributionCdn":{"properties":{"configured":{"type":"boolean","title":"Configured"},"base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Url"},"url_template":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url Template"}},"type":"object","required":["configured"],"title":"DistributionCdn"},"DistributionGap":{"properties":{"language_code":{"type":"string","title":"Language Code"},"namespace_slug":{"type":"string","title":"Namespace Slug"}},"type":"object","required":["language_code","namespace_slug"],"title":"DistributionGap"},"DistributionOut":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"source_language":{"type":"string","title":"Source Language"},"cdn":{"$ref":"#/components/schemas/DistributionCdn"},"production_version":{"$ref":"#/components/schemas/DistributionProductionVersion"},"bundles":{"items":{"$ref":"#/components/schemas/DistributionBundle"},"type":"array","title":"Bundles"},"summary":{"$ref":"#/components/schemas/DistributionSummary"}},"type":"object","required":["project_uuid","slug","name","source_language","cdn","production_version","summary"],"title":"DistributionOut"},"DistributionProductionVersion":{"properties":{"version_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Uuid"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"}},"type":"object","title":"DistributionProductionVersion"},"DistributionSummary":{"properties":{"total_bundles":{"type":"integer","title":"Total Bundles"},"last_published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Published At"},"languages":{"items":{"type":"string"},"type":"array","title":"Languages"},"namespaces":{"items":{"type":"string"},"type":"array","title":"Namespaces"},"unpublished":{"items":{"$ref":"#/components/schemas/DistributionGap"},"type":"array","title":"Unpublished"}},"type":"object","required":["total_bundles"],"title":"DistributionSummary"},"DiwyaResolveOut":{"properties":{"v":{"type":"integer","title":"V","default":1},"prompt":{"$ref":"#/components/schemas/DiwyaResolved"}},"type":"object","required":["prompt"],"title":"DiwyaResolveOut"},"DiwyaResolved":{"properties":{"key":{"type":"string","title":"Key"},"i18n_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"I18N Key"},"template":{"type":"string","title":"Template"},"resolved":{"type":"string","title":"Resolved"},"variables_used":{"additionalProperties":true,"type":"object","title":"Variables Used"}},"type":"object","required":["key","i18n_key","template","resolved","variables_used"],"title":"DiwyaResolved"},"DomainCreateIn":{"properties":{"domain":{"type":"string","maxLength":253,"minLength":3,"title":"Domain"}},"type":"object","required":["domain"],"title":"DomainCreateIn"},"DomainListOut":{"properties":{"items":{"items":{"$ref":"#/components/schemas/DomainOut"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"DomainListOut"},"DomainOut":{"properties":{"domain":{"type":"string","title":"Domain"},"verified":{"type":"boolean","title":"Verified"},"txt_record_name":{"type":"string","title":"Txt Record Name"},"txt_record_value":{"type":"string","title":"Txt Record Value"},"verified_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Verified At"}},"type":"object","required":["domain","verified","txt_record_name","txt_record_value"],"title":"DomainOut"},"DuplicateGroupOut":{"properties":{"source_value":{"type":"string","title":"Source Value"},"namespace_slug":{"type":"string","title":"Namespace Slug","default":""},"key_count":{"type":"integer","title":"Key Count"},"key_names":{"items":{"type":"string"},"type":"array","title":"Key Names"},"key_uuids":{"items":{"type":"string"},"type":"array","title":"Key Uuids"},"status":{"type":"string","title":"Status"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"merge_plan":{"anyOf":[{"$ref":"#/components/schemas/MergePlan"},{"type":"null"}]},"ai_diagnosis":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ai Diagnosis"},"ai_proposed_plan":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Ai Proposed Plan"},"ai_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ai Model"},"ai_diagnosed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ai Diagnosed At"},"ai_diagnosis_cached":{"type":"boolean","title":"Ai Diagnosis Cached","default":false}},"type":"object","required":["source_value","key_count","key_names","key_uuids","status"],"title":"DuplicateGroupOut"},"DuplicateGroupsPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/DuplicateGroupOut"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"offset":{"type":"integer","title":"Offset"},"limit":{"type":"integer","title":"Limit"},"has_more":{"type":"boolean","title":"Has More"}},"type":"object","required":["items","total","offset","limit","has_more"],"title":"DuplicateGroupsPage"},"DuplicateStatusBulkIn":{"properties":{"source_values":{"items":{"type":"string"},"type":"array","title":"Source Values"},"status":{"type":"string","title":"Status"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["source_values","status"],"title":"DuplicateStatusBulkIn"},"DuplicateStatusBulkOut":{"properties":{"updated":{"type":"integer","title":"Updated"},"status":{"type":"string","title":"Status"}},"type":"object","required":["updated","status"],"title":"DuplicateStatusBulkOut"},"DuplicateStatusIn":{"properties":{"source_value":{"type":"string","title":"Source Value"},"status":{"type":"string","title":"Status"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"files_modified":{"anyOf":[{"items":{"$ref":"#/components/schemas/FileModified"},"type":"array"},{"type":"null"}],"title":"Files Modified"}},"type":"object","required":["source_value","status"],"title":"DuplicateStatusIn"},"DuplicateStatusOut":{"properties":{"source_value":{"type":"string","title":"Source Value"},"status":{"type":"string","title":"Status"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["source_value","status"],"title":"DuplicateStatusOut"},"EditIn":{"properties":{"namespace":{"type":"string","maxLength":200,"title":"Namespace","default":"common"},"key":{"type":"string","maxLength":400,"minLength":1,"title":"Key"},"language_code":{"type":"string","maxLength":12,"minLength":2,"title":"Language Code"},"value":{"type":"string","maxLength":10000,"title":"Value"}},"type":"object","required":["key","language_code","value"],"title":"EditIn"},"EditOut":{"properties":{"ok":{"type":"boolean","title":"Ok"},"key":{"type":"string","title":"Key"},"languageCode":{"type":"string","title":"Languagecode"},"value":{"type":"string","title":"Value"},"version":{"type":"integer","title":"Version"},"published":{"type":"boolean","title":"Published"}},"type":"object","required":["ok","key","languageCode","value","version","published"],"title":"EditOut"},"EditingIn":{"properties":{"key_uuid":{"type":"string","title":"Key Uuid"},"language_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Uuid"}},"type":"object","required":["key_uuid"],"title":"EditingIn"},"EndIn":{"properties":{"publish_cdn":{"type":"boolean","title":"Publish Cdn","default":false}},"type":"object","title":"EndIn"},"EndOut":{"properties":{"session":{"$ref":"#/components/schemas/app__routes__in_context__SessionOut"},"cdnPublished":{"type":"boolean","title":"Cdnpublished"},"cdnNewCount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cdnnewcount"}},"type":"object","required":["session","cdnPublished"],"title":"EndOut"},"EnrollEmailOut":{"properties":{"sent_to":{"type":"string","title":"Sent To"},"retry_in_s":{"type":"integer","title":"Retry In S","default":0}},"type":"object","required":["sent_to"],"title":"EnrollEmailOut"},"EnrollTotpIn":{"properties":{"current_password":{"type":"string","title":"Current Password"}},"type":"object","required":["current_password"],"title":"EnrollTotpIn"},"EnrollTotpOut":{"properties":{"secret":{"type":"string","title":"Secret"},"otpauth_url":{"type":"string","title":"Otpauth Url"}},"type":"object","required":["secret","otpauth_url"],"title":"EnrollTotpOut"},"EstimateOut":{"properties":{"tier":{"type":"string","enum":["standard","premium"],"title":"Tier"},"units":{"type":"integer","title":"Units"},"credit_cost_per_unit":{"type":"integer","title":"Credit Cost Per Unit"},"credits_required":{"type":"integer","title":"Credits Required"},"balance":{"type":"integer","title":"Balance"},"sufficient":{"type":"boolean","title":"Sufficient"},"on_demand_credit_price_cents":{"type":"number","title":"On Demand Credit Price Cents","default":0.0}},"type":"object","required":["tier","units","credit_cost_per_unit","credits_required","balance","sufficient"],"title":"EstimateOut"},"EventListOut":{"properties":{"v":{"type":"integer","title":"V","default":1},"items":{"items":{"$ref":"#/components/schemas/EventOut"},"type":"array","title":"Items"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"}},"type":"object","required":["items"],"title":"EventListOut"},"EventOut":{"properties":{"seq":{"type":"integer","title":"Seq"},"ts":{"type":"string","format":"date-time","title":"Ts"},"type":{"type":"string","title":"Type"},"source":{"type":"string","title":"Source"},"tool":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool"},"summary":{"type":"string","title":"Summary"},"level":{"type":"string","title":"Level"},"payload":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Payload"}},"type":"object","required":["seq","ts","type","source","tool","summary","level","payload"],"title":"EventOut"},"ExportReport":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"language_code":{"type":"string","title":"Language Code"},"namespace_slug":{"type":"string","title":"Namespace Slug"},"version_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Slug"},"flat":{"type":"boolean","title":"Flat"},"included_count":{"type":"integer","title":"Included Count"},"payload":{"additionalProperties":true,"type":"object","title":"Payload"}},"type":"object","required":["project_uuid","language_code","namespace_slug","version_slug","flat","included_count","payload"],"title":"ExportReport"},"FeedbackAddonChangeSkuIn":{"properties":{"target_sku":{"type":"string","enum":["feedback_starter","feedback_unlimited"],"title":"Target Sku"}},"type":"object","required":["target_sku"],"title":"FeedbackAddonChangeSkuIn"},"FeedbackAddonCheckoutIn":{"properties":{"sku":{"type":"string","enum":["feedback_starter","feedback_unlimited"],"title":"Sku"},"success_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Success Url"},"cancel_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Cancel Url"}},"type":"object","required":["sku","success_url","cancel_url"],"title":"FeedbackAddonCheckoutIn"},"FeedbackAddonLanguagesIn":{"properties":{"language_codes":{"items":{"type":"string"},"type":"array","maxItems":200,"title":"Language Codes"}},"type":"object","title":"FeedbackAddonLanguagesIn"},"FeedbackAddonState":{"properties":{"active":{"type":"boolean","title":"Active"},"sku":{"anyOf":[{"type":"string","enum":["feedback_starter","feedback_unlimited"]},{"type":"null"}],"title":"Sku"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"feedback_languages_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Feedback Languages Limit"},"ever_activated":{"type":"boolean","title":"Ever Activated"},"cancel_at_period_end":{"type":"boolean","title":"Cancel At Period End","default":false},"cancel_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Cancel At"}},"type":"object","required":["active","sku","status","feedback_languages_limit","ever_activated"],"title":"FeedbackAddonState"},"FeedbackAddonStateOut":{"properties":{"isActive":{"type":"boolean","title":"Isactive"},"sku":{"anyOf":[{"type":"string","enum":["feedback_starter","feedback_unlimited"]},{"type":"null"}],"title":"Sku"},"enabledLanguages":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string","const":"all"}],"title":"Enabledlanguages"},"languagesLimit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Languageslimit"}},"type":"object","required":["isActive","sku","enabledLanguages","languagesLimit"],"title":"FeedbackAddonStateOut","description":"Resolved state of the End-User Eval add-on for ONE project.\n\nComposed of (a) the parent org's entitlement (`isActive`, `sku`) and\n(b) the project's per-locale allowlist (`enabledLanguages`,\n`languagesLimit`). `enabledLanguages` is the literal string `\"all\"`\nwhen the org has the Unlimited SKU — keeps the FE branch shallow."},"FileModified":{"properties":{"path":{"type":"string","title":"Path"},"line":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Line"},"found_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Found Key"},"replacement_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Replacement Key"},"occurrences":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Occurrences"},"key_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Name"}},"type":"object","required":["path"],"title":"FileModified"},"FrameworkIn":{"properties":{"name":{"type":"string","title":"Name","description":"One of: react, vue, svelte, next, astro, react-native, capacitor. An unknown name is refused (422), never stored."},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Where it was detected: package.json | config | imports. `imports` is the weakest evidence, `package.json` the strongest."}},"type":"object","required":["name"],"title":"FrameworkIn"},"FrameworkOut":{"properties":{"name":{"type":"string","title":"Name"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"detected_at":{"type":"string","format":"date-time","title":"Detected At"}},"type":"object","required":["name","detected_at"],"title":"FrameworkOut"},"GenerateIn":{"properties":{"tier":{"type":"string","enum":["standard","premium"],"title":"Tier"},"language_codes":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Language Codes","description":"Target BCP-47 codes"},"namespace_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace Uuid"},"key_uuids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Key Uuids","description":"Restrict to these keys"},"idempotency_key":{"type":"string","minLength":1,"title":"Idempotency Key"}},"type":"object","required":["tier","language_codes","idempotency_key"],"title":"GenerateIn"},"GenericOk":{"properties":{"ok":{"type":"boolean","title":"Ok","default":true}},"type":"object","title":"GenericOk"},"GithubStatusOut":{"properties":{"connected":{"type":"boolean","title":"Connected"},"install_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Install Url"},"installations":{"items":{"$ref":"#/components/schemas/InstallationOut"},"type":"array","title":"Installations"},"repo_links":{"items":{"$ref":"#/components/schemas/RepoLinkWire"},"type":"array","title":"Repo Links"}},"type":"object","required":["connected","installations","repo_links"],"title":"GithubStatusOut"},"GlossaryEntryIn":{"properties":{"type":{"type":"string","enum":["term","dnt","forbidden"],"title":"Type","default":"term"},"term":{"type":"string","maxLength":200,"minLength":1,"title":"Term"},"translations":{"additionalProperties":{"type":"string"},"type":"object","title":"Translations"},"case_sensitive":{"type":"boolean","title":"Case Sensitive","default":false},"note":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Note"}},"type":"object","required":["term"],"title":"GlossaryEntryIn"},"GlossaryEntryOut":{"properties":{"uuid":{"type":"string","title":"Uuid"},"project_uuid":{"type":"string","title":"Project Uuid"},"type":{"type":"string","enum":["term","dnt","forbidden"],"title":"Type"},"term":{"type":"string","title":"Term"},"translations":{"additionalProperties":{"type":"string"},"type":"object","title":"Translations"},"case_sensitive":{"type":"boolean","title":"Case Sensitive"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["uuid","project_uuid","type","term","translations","case_sensitive","note","created_at","updated_at"],"title":"GlossaryEntryOut"},"GlossaryEntryPatch":{"properties":{"term":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Term"},"translations":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Translations"},"case_sensitive":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Case Sensitive"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","title":"GlossaryEntryPatch"},"GlossaryHint":{"properties":{"term":{"type":"string","title":"Term"},"rule_type":{"type":"string","enum":["translation","do_not_translate","forbidden"],"title":"Rule Type"},"target_translation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Translation"},"matched_text":{"type":"string","title":"Matched Text"}},"type":"object","required":["term","rule_type","matched_text"],"title":"GlossaryHint","description":"A glossary rule matched against a key's source string (task #736).\nSingle public vocabulary: rule_type ∈ translation|do_not_translate|forbidden."},"GlossaryListOut":{"properties":{"items":{"items":{"$ref":"#/components/schemas/GlossaryEntryOut"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","total"],"title":"GlossaryListOut"},"GlossaryRevertIn":{"properties":{"version":{"type":"integer","minimum":1.0,"title":"Version","description":"the term version to restore"}},"type":"object","required":["version"],"title":"GlossaryRevertIn"},"GlossaryValidateIn":{"properties":{"language_code":{"type":"string","title":"Language Code","description":"target language of the translation being checked"},"source_value":{"type":"string","title":"Source Value","default":""},"target_value":{"type":"string","title":"Target Value","default":""},"max_length":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Length","description":"optional length cap (e.g. the key's max_length)"}},"type":"object","required":["language_code"],"title":"GlossaryValidateIn"},"GlossaryValidateOut":{"properties":{"valid":{"type":"boolean","title":"Valid"},"violations":{"items":{"$ref":"#/components/schemas/app__routes__glossary__GlossaryViolation"},"type":"array","title":"Violations"}},"type":"object","required":["valid","violations"],"title":"GlossaryValidateOut"},"GlossaryVersionOut":{"properties":{"version":{"type":"integer","title":"Version"},"op":{"type":"string","title":"Op"},"type":{"type":"string","enum":["term","dnt","forbidden"],"title":"Type"},"term":{"type":"string","title":"Term"},"translations":{"additionalProperties":{"type":"string"},"type":"object","title":"Translations"},"case_sensitive":{"type":"boolean","title":"Case Sensitive"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"change_source":{"type":"string","title":"Change Source"},"changed_at":{"type":"string","format":"date-time","title":"Changed At"},"changed_by":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Changed By"},"reverted_from_version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reverted From Version"}},"type":"object","required":["version","op","type","term","translations","case_sensitive","change_source","changed_at"],"title":"GlossaryVersionOut"},"GlossaryVersionsPage":{"properties":{"v":{"type":"integer","title":"V","default":1},"items":{"items":{"$ref":"#/components/schemas/GlossaryVersionOut"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["items","total","limit","offset"],"title":"GlossaryVersionsPage"},"GuideConnect":{"properties":{"mcp":{"$ref":"#/components/schemas/GuideConnectMCP"},"rest":{"$ref":"#/components/schemas/GuideConnectREST"}},"type":"object","title":"GuideConnect"},"GuideConnectMCP":{"properties":{"recommended":{"type":"boolean","title":"Recommended","default":true},"package":{"type":"string","title":"Package","default":"@sonenta/mcp"},"install":{"type":"string","title":"Install","default":"npx -y @sonenta/mcp"},"auth":{"type":"string","title":"Auth","default":"API key with mcp:* scope (env SONENTA_API_KEY)"},"discovery_tools":{"items":{"type":"string"},"type":"array","title":"Discovery Tools"}},"type":"object","title":"GuideConnectMCP"},"GuideConnectREST":{"properties":{"base_url":{"type":"string","title":"Base Url","default":"https://api.sonenta.dev"},"auth":{"type":"string","title":"Auth","default":"Authorization: ApiKey <token>  (or Bearer <jwt> for a user session)"},"capabilities":{"type":"string","title":"Capabilities","default":"GET /v1/me — exactly what your credential can do"},"openapi":{"type":"string","title":"Openapi","default":"https://api.sonenta.dev/openapi.json"},"docs":{"type":"string","title":"Docs","default":"https://api.sonenta.dev/docs"}},"type":"object","title":"GuideConnectREST"},"GuideLoop":{"properties":{"name":{"type":"string","title":"Name"},"what":{"type":"string","title":"What"},"cli":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cli"},"mcp":{"items":{"type":"string"},"type":"array","title":"Mcp"},"agent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent"},"caution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caution"}},"type":"object","required":["name","what"],"title":"GuideLoop","description":"A repeatable workflow an agent runs AFTER onboarding.\n\n`actions` above is the one-way setup path (namespace → keys → values →\npublish). A loop is different in kind: it is re-run against a codebase that\nkeeps changing, so it has a scanner that reports, a queue to work through,\nand a way to record what was handled — which is why each one names its\n`report`, `work` and `record` tools separately."},"GuideOut":{"properties":{"product":{"type":"string","title":"Product","default":"Sonenta"},"summary":{"type":"string","title":"Summary","default":"Agent-native content layer: your coding agent manages your UI content (i18n and accessibility) over MCP and publishes it live to a CDN your app fetches at runtime — no redeploy. Translation is the entry point."},"project_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Uuid"},"org_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Uuid"},"connect":{"$ref":"#/components/schemas/GuideConnect"},"actions":{"items":{"$ref":"#/components/schemas/GuideStep"},"type":"array","title":"Actions"},"loops":{"items":{"$ref":"#/components/schemas/GuideLoop"},"type":"array","title":"Loops"},"links":{"additionalProperties":{"type":"string"},"type":"object","title":"Links"},"notes":{"items":{"type":"string"},"type":"array","title":"Notes"}},"type":"object","title":"GuideOut"},"GuideStep":{"properties":{"step":{"type":"integer","title":"Step"},"action":{"type":"string","title":"Action"},"rest":{"type":"string","title":"Rest"},"mcp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mcp"}},"type":"object","required":["step","action","rest"],"title":"GuideStep"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HealthItem":{"properties":{"key_uuid":{"type":"string","title":"Key Uuid"},"key_name":{"type":"string","title":"Key Name"},"namespace_slug":{"type":"string","title":"Namespace Slug"},"issue":{"type":"string","title":"Issue"},"severity":{"type":"string","title":"Severity"},"detail":{"type":"string","title":"Detail"},"source_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Value"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"placeholder_mismatch":{"anyOf":[{"$ref":"#/components/schemas/PlaceholderMismatch"},{"type":"null"}]},"ai_diagnosis":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ai Diagnosis"},"ai_proposed_plan":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Ai Proposed Plan"},"ai_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ai Model"},"ai_diagnosed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ai Diagnosed At"},"ai_diagnosis_cached":{"type":"boolean","title":"Ai Diagnosis Cached","default":false}},"type":"object","required":["key_uuid","key_name","namespace_slug","issue","severity","detail"],"title":"HealthItem"},"HeartbeatOut":{"properties":{"ok":{"type":"boolean","title":"Ok","default":true},"ttl_seconds":{"type":"integer","title":"Ttl Seconds"}},"type":"object","required":["ttl_seconds"],"title":"HeartbeatOut"},"HistoryEntry":{"properties":{"version":{"type":"integer","title":"Version"},"value":{"type":"string","title":"Value"},"status":{"type":"string","enum":["missing","draft","translated","reviewed","approved","rejected"],"title":"Status"},"changed_by_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Changed By Uuid"},"changed_by_api_key_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Changed By Api Key Uuid"},"change_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Change Source"},"change_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Change Reason"},"changed_at":{"type":"string","format":"date-time","title":"Changed At"},"plural_forms":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Plural Forms"},"surface":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Surface"},"surface_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Surface Kind"}},"type":"object","required":["version","value","status","changed_by_uuid","changed_at"],"title":"HistoryEntry"},"HistoryModification":{"properties":{"kind":{"type":"string","title":"Kind"},"status":{"type":"string","enum":["missing","draft","translated","reviewed","approved","rejected"],"title":"Status"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"is_bot":{"type":"boolean","title":"Is Bot","default":false},"by_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"By Uuid"},"at":{"type":"string","format":"date-time","title":"At"},"row_version":{"type":"integer","title":"Row Version"}},"type":"object","required":["kind","status","at","row_version"],"title":"HistoryModification","description":"One event WITHIN a value-group: the value's origin, or a later state/edit\nmove that did NOT change the text. Chronological within its group."},"HistoryOut":{"properties":{"items":{"items":{"$ref":"#/components/schemas/HistoryEntry"},"type":"array","title":"Items"},"versions":{"items":{"$ref":"#/components/schemas/HistoryVersionGroup"},"type":"array","title":"Versions"},"distinct_value_count":{"type":"integer","title":"Distinct Value Count","default":0}},"type":"object","required":["items"],"title":"HistoryOut"},"HistoryVersionGroup":{"properties":{"display_version":{"type":"integer","title":"Display Version"},"ref_version":{"type":"integer","title":"Ref Version"},"value":{"type":"string","title":"Value"},"plural_forms":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Plural Forms"},"status":{"type":"string","enum":["missing","draft","translated","reviewed","approved","rejected"],"title":"Status"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"is_bot":{"type":"boolean","title":"Is Bot","default":false},"is_current":{"type":"boolean","title":"Is Current","default":false},"surface":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Surface"},"surface_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Surface Kind"},"modifications":{"items":{"$ref":"#/components/schemas/HistoryModification"},"type":"array","title":"Modifications"}},"type":"object","required":["display_version","ref_version","value","status","modifications"],"title":"HistoryVersionGroup","description":"A distinct VALUE in the key's timeline. A pure state change (same text,\nonly status moved) is a `modifications[]` entry here, NOT a new group."},"HumanNeededListOut":{"properties":{"v":{"type":"integer","title":"V","default":1},"items":{"items":{"$ref":"#/components/schemas/HumanNeededOut"},"type":"array","title":"Items"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"}},"type":"object","required":["items"],"title":"HumanNeededListOut"},"HumanNeededOut":{"properties":{"human_needed_id":{"type":"string","title":"Human Needed Id"},"session_id":{"type":"string","title":"Session Id"},"question":{"type":"string","title":"Question"},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail"},"deep_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deep Link"},"options":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Options"},"status":{"type":"string","title":"Status"},"resolution":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Resolution"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["human_needed_id","session_id","question","detail","deep_link","options","status","resolution","created_at","updated_at"],"title":"HumanNeededOut"},"ImportBundleReport":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"version_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Slug"},"keys_created":{"type":"integer","title":"Keys Created"},"keys_reused":{"type":"integer","title":"Keys Reused"},"translations_created":{"type":"integer","title":"Translations Created"},"translations_updated":{"type":"integer","title":"Translations Updated"},"translations_unchanged":{"type":"integer","title":"Translations Unchanged"},"plural_keys_marked":{"type":"integer","title":"Plural Keys Marked"},"units":{"items":{"$ref":"#/components/schemas/ImportUnitReport"},"type":"array","title":"Units"},"errors":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Errors"},"glossary_violation_count":{"type":"integer","title":"Glossary Violation Count","default":0},"glossary_violations":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Glossary Violations"}},"type":"object","required":["project_uuid","version_slug","keys_created","keys_reused","translations_created","translations_updated","translations_unchanged","plural_keys_marked","units"],"title":"ImportBundleReport","description":"One-shot multi-namespace/multi-language import report (task 750)."},"ImportIn":{"properties":{"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language","description":"BCP-47 language code (single import)"},"namespace":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace","description":"namespace slug (single import)"},"payload":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Payload","description":"Nested or flat i18next JSON tree (single import)"},"namespaces":{"anyOf":[{"items":{"$ref":"#/components/schemas/NamespaceImport"},"type":"array"},{"type":"null"}],"title":"Namespaces","description":"Multi-namespace one-shot import; mutually exclusive with the single fields"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version","description":"Version slug; defaults to the production version"},"status":{"type":"string","enum":["draft","translated"],"title":"Status","description":"Status applied to each translation row touched by this import","default":"translated"}},"type":"object","title":"ImportIn"},"ImportReport":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"language_code":{"type":"string","title":"Language Code"},"namespace_slug":{"type":"string","title":"Namespace Slug"},"keys_created":{"type":"integer","title":"Keys Created"},"keys_reused":{"type":"integer","title":"Keys Reused"},"translations_created":{"type":"integer","title":"Translations Created"},"translations_updated":{"type":"integer","title":"Translations Updated"},"translations_unchanged":{"type":"integer","title":"Translations Unchanged"},"plural_keys_marked":{"type":"integer","title":"Plural Keys Marked"},"glossary_violation_count":{"type":"integer","title":"Glossary Violation Count","default":0},"glossary_violations":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Glossary Violations"}},"type":"object","required":["project_uuid","language_code","namespace_slug","keys_created","keys_reused","translations_created","translations_updated","translations_unchanged","plural_keys_marked"],"title":"ImportReport","description":"Legacy single-(namespace, language) import report (back-compat)."},"ImportUnitReport":{"properties":{"namespace":{"type":"string","title":"Namespace"},"language_code":{"type":"string","title":"Language Code"},"keys_created":{"type":"integer","title":"Keys Created"},"keys_reused":{"type":"integer","title":"Keys Reused"},"translations_created":{"type":"integer","title":"Translations Created"},"translations_updated":{"type":"integer","title":"Translations Updated"},"translations_unchanged":{"type":"integer","title":"Translations Unchanged"},"plural_keys_marked":{"type":"integer","title":"Plural Keys Marked"}},"type":"object","required":["namespace","language_code","keys_created","keys_reused","translations_created","translations_updated","translations_unchanged","plural_keys_marked"],"title":"ImportUnitReport"},"InContextAddonCheckoutIn":{"properties":{"sku":{"type":"string","const":"in_context","title":"Sku","default":"in_context"},"success_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Success Url"},"cancel_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Cancel Url"}},"type":"object","required":["success_url","cancel_url"],"title":"InContextAddonCheckoutIn"},"InContextAddonState":{"properties":{"isActive":{"type":"boolean","title":"Isactive"},"sku":{"anyOf":[{"type":"string","const":"in_context"},{"type":"null"}],"title":"Sku"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"tosVersion":{"type":"string","title":"Tosversion"},"everActivated":{"type":"boolean","title":"Everactivated"},"cancelAtPeriodEnd":{"type":"boolean","title":"Cancelatperiodend","default":false},"cancelAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Cancelat"}},"type":"object","required":["isActive","sku","status","tosVersion","everActivated"],"title":"InContextAddonState","description":"In-context editing add-on billing state (task 903).\n\ncamelCase contract throughout (avoids the snake_case `is_active` gotcha\nfrom the feedback add-on's billing model). `tosVersion` is the current\nin-context ToS version the SDK should present."},"InContextAddonStateOut":{"properties":{"isActive":{"type":"boolean","title":"Isactive"},"sku":{"anyOf":[{"type":"string","const":"in_context"},{"type":"null"}],"title":"Sku"},"enabled":{"type":"boolean","title":"Enabled"},"tosVersion":{"type":"string","title":"Tosversion"}},"type":"object","required":["isActive","sku","enabled","tosVersion"],"title":"InContextAddonStateOut","description":"Resolved in-context add-on state for ONE project.\n\nComposed of (a) the parent org's entitlement (`isActive`, `sku`), (b) the\nproject's per-project opt-in (`enabled`), and (c) the current ToS version\n(`tosVersion`) the SDK should present. camelCase contract throughout\n(avoids the snake_case `is_active` gotcha from the feedback add-on)."},"InContextEnabledIn":{"properties":{"enabled":{"type":"boolean","title":"Enabled"}},"type":"object","required":["enabled"],"title":"InContextEnabledIn"},"InboxOut":{"properties":{"sessions":{"items":{"$ref":"#/components/schemas/InboxSessionOut"},"type":"array","title":"Sessions"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"},"total_sessions":{"type":"integer","title":"Total Sessions"},"capped":{"type":"boolean","title":"Capped"}},"type":"object","required":["sessions","page","page_size","total_sessions","capped"],"title":"InboxOut"},"InboxSessionOut":{"properties":{"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"user":{"additionalProperties":true,"type":"object","title":"User"},"items":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Items"},"counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Counts"},"has_open_suggestions":{"type":"boolean","title":"Has Open Suggestions"},"latest_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Latest At"}},"type":"object","required":["session_id","user","items","counts","has_open_suggestions","latest_at"],"title":"InboxSessionOut"},"InstallationOut":{"properties":{"installation_id":{"type":"integer","title":"Installation Id"},"account_login":{"type":"string","title":"Account Login"},"account_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Type"},"suspended":{"type":"boolean","title":"Suspended"},"repositories":{"items":{"type":"string"},"type":"array","title":"Repositories"}},"type":"object","required":["installation_id","account_login","suspended"],"title":"InstallationOut"},"IntegrityReport":{"properties":{"ok":{"type":"boolean","title":"Ok"},"release_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Release Uuid"},"stored_content_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stored Content Hash"},"recomputed_content_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recomputed Content Hash"},"drift_detected":{"type":"boolean","title":"Drift Detected","default":false},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["ok"],"title":"IntegrityReport"},"InvitationAcceptIn":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"InvitationAcceptIn"},"InvitationAcceptOut":{"properties":{"uuid":{"type":"string","title":"Uuid"},"org_uuid":{"type":"string","title":"Org Uuid"},"email":{"type":"string","title":"Email"},"role":{"type":"string","enum":["owner","admin","member"],"title":"Role"},"invited_by_uuid":{"type":"string","title":"Invited By Uuid"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"accepted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Accepted At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"projects":{"items":{"$ref":"#/components/schemas/InvitationProjectRole"},"type":"array","title":"Projects"},"applied_project_roles":{"items":{"$ref":"#/components/schemas/InvitationProjectRole"},"type":"array","title":"Applied Project Roles"},"skipped_project_roles":{"items":{"$ref":"#/components/schemas/SkippedProjectRole"},"type":"array","title":"Skipped Project Roles"}},"type":"object","required":["uuid","org_uuid","email","role","invited_by_uuid","expires_at","accepted_at","revoked_at","created_at"],"title":"InvitationAcceptOut","description":"Accept result: which per-project roles were applied vs skipped (a project\ndeleted since the invite, or a language scope no longer valid)."},"InvitationCreateIn":{"properties":{"email":{"type":"string","pattern":"^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$","title":"Email"},"role":{"type":"string","enum":["owner","admin","member"],"title":"Role","default":"member"},"message":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Message"},"projects":{"items":{"$ref":"#/components/schemas/InvitationProjectRoleIn"},"type":"array","title":"Projects"}},"type":"object","required":["email"],"title":"InvitationCreateIn"},"InvitationCreateOut":{"properties":{"uuid":{"type":"string","title":"Uuid"},"org_uuid":{"type":"string","title":"Org Uuid"},"email":{"type":"string","title":"Email"},"role":{"type":"string","enum":["owner","admin","member"],"title":"Role"},"invited_by_uuid":{"type":"string","title":"Invited By Uuid"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"accepted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Accepted At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"projects":{"items":{"$ref":"#/components/schemas/InvitationProjectRole"},"type":"array","title":"Projects"},"token":{"type":"string","title":"Token"},"accept_url":{"type":"string","title":"Accept Url"}},"type":"object","required":["uuid","org_uuid","email","role","invited_by_uuid","expires_at","accepted_at","revoked_at","created_at","token","accept_url"],"title":"InvitationCreateOut","description":"Includes the raw token + accept URL — returned ONCE on create/resend."},"InvitationListOut":{"properties":{"items":{"items":{"$ref":"#/components/schemas/InvitationOut"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"InvitationListOut"},"InvitationLookupOut":{"properties":{"org_uuid":{"type":"string","title":"Org Uuid"},"org_name":{"type":"string","title":"Org Name"},"org_slug":{"type":"string","title":"Org Slug"},"email":{"type":"string","title":"Email"},"role":{"type":"string","enum":["owner","admin","member"],"title":"Role"},"inviter_email":{"type":"string","title":"Inviter Email"},"inviter_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Inviter Name"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"user_exists":{"type":"boolean","title":"User Exists"}},"type":"object","required":["org_uuid","org_name","org_slug","email","role","inviter_email","inviter_name","expires_at","user_exists"],"title":"InvitationLookupOut"},"InvitationOut":{"properties":{"uuid":{"type":"string","title":"Uuid"},"org_uuid":{"type":"string","title":"Org Uuid"},"email":{"type":"string","title":"Email"},"role":{"type":"string","enum":["owner","admin","member"],"title":"Role"},"invited_by_uuid":{"type":"string","title":"Invited By Uuid"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"accepted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Accepted At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"projects":{"items":{"$ref":"#/components/schemas/InvitationProjectRole"},"type":"array","title":"Projects"}},"type":"object","required":["uuid","org_uuid","email","role","invited_by_uuid","expires_at","accepted_at","revoked_at","created_at"],"title":"InvitationOut"},"InvitationProjectRole":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"project_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Name"},"role":{"type":"string","enum":["owner","admin","developer","translator","qa","reviewer","viewer"],"title":"Role"},"languages_scope":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Languages Scope"}},"type":"object","required":["project_uuid","role"],"title":"InvitationProjectRole","description":"A per-project role as stored on the invitation / echoed / applied."},"InvitationProjectRoleIn":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"role":{"type":"string","enum":["owner","admin","developer","translator","qa","reviewer","viewer"],"title":"Role"},"languages_scope":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Languages Scope"}},"type":"object","required":["project_uuid","role"],"title":"InvitationProjectRoleIn"},"InvoiceOut":{"properties":{"id":{"type":"string","title":"Id"},"number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Number"},"created":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"amount_paid":{"type":"integer","title":"Amount Paid"},"amount_due":{"type":"integer","title":"Amount Due"},"currency":{"type":"string","title":"Currency"},"hosted_invoice_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hosted Invoice Url"},"invoice_pdf":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invoice Pdf"},"billing_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Reason"},"period_start":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Period Start"},"period_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Period End"}},"type":"object","required":["id","number","created","status","amount_paid","amount_due","currency","hosted_invoice_url","invoice_pdf","billing_reason","period_start","period_end"],"title":"InvoiceOut","description":"One Stripe/MoR invoice for the org's billing history (task 951)."},"InvoicesPage":{"properties":{"invoices":{"items":{"$ref":"#/components/schemas/InvoiceOut"},"type":"array","title":"Invoices"},"has_more":{"type":"boolean","title":"Has More"},"next_starting_after":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Starting After"}},"type":"object","required":["invoices","has_more","next_starting_after"],"title":"InvoicesPage"},"KeyA11ySignalsOut":{"properties":{"key_uuid":{"type":"string","title":"Key Uuid"},"key_type":{"type":"string","title":"Key Type"},"base_role":{"type":"string","title":"Base Role"},"recommended_treatments":{"items":{"type":"string"},"type":"array","title":"Recommended Treatments"},"treatments":{"items":{"$ref":"#/components/schemas/A11yTreatmentSignal"},"type":"array","title":"Treatments"},"cognitive_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cognitive Score"},"cognitive_suggestion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cognitive Suggestion"},"cognitive_analyzed":{"type":"boolean","title":"Cognitive Analyzed","default":false}},"type":"object","required":["key_uuid","key_type","base_role","recommended_treatments","treatments"],"title":"KeyA11ySignalsOut"},"KeyBulkActionOut":{"properties":{"results":{"items":{"$ref":"#/components/schemas/KeyBulkActionResult"},"type":"array","title":"Results"},"summary":{"$ref":"#/components/schemas/BulkSummary"}},"type":"object","required":["results","summary"],"title":"KeyBulkActionOut"},"KeyBulkActionResult":{"properties":{"index":{"type":"integer","title":"Index"},"key_uuid":{"type":"string","title":"Key Uuid"},"status":{"type":"string","title":"Status"},"error":{"anyOf":[{"$ref":"#/components/schemas/BulkItemError"},{"type":"null"}]}},"type":"object","required":["index","key_uuid","status"],"title":"KeyBulkActionResult"},"KeyBulkCreateIn":{"properties":{"items":{"items":{"$ref":"#/components/schemas/KeyBulkCreateItem"},"type":"array","maxItems":500,"minItems":1,"title":"Items"}},"type":"object","required":["items"],"title":"KeyBulkCreateIn"},"KeyBulkCreateItem":{"properties":{"namespace_uuid":{"type":"string","title":"Namespace Uuid"},"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Context"},"plurals":{"type":"boolean","title":"Plurals","default":false},"max_length":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Length"},"screenshots":{"items":{"type":"string"},"type":"array","title":"Screenshots"},"type":{"type":"string","enum":["text","heading","label","caption","badge","tooltip","error_message","toast","button","link","menu_item","input_placeholder","input_label","image","icon","meta_title","meta_description"],"title":"Type","default":"text"},"type_source":{"anyOf":[{"type":"string","enum":["default","detected","manual"]},{"type":"null"}],"title":"Type Source"}},"type":"object","required":["namespace_uuid","name"],"title":"KeyBulkCreateItem"},"KeyBulkCreateOut":{"properties":{"results":{"items":{"$ref":"#/components/schemas/KeyBulkCreateResult"},"type":"array","title":"Results"},"summary":{"$ref":"#/components/schemas/BulkSummary"}},"type":"object","required":["results","summary"],"title":"KeyBulkCreateOut"},"KeyBulkCreateResult":{"properties":{"index":{"type":"integer","title":"Index"},"status":{"type":"string","title":"Status"},"created":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Created"},"key_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Uuid"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"namespace_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace Uuid"},"error":{"anyOf":[{"$ref":"#/components/schemas/BulkItemError"},{"type":"null"}]}},"type":"object","required":["index","status"],"title":"KeyBulkCreateResult"},"KeyBulkIdsIn":{"properties":{"key_uuids":{"items":{"type":"string"},"type":"array","maxItems":500,"minItems":1,"title":"Key Uuids"}},"type":"object","required":["key_uuids"],"title":"KeyBulkIdsIn"},"KeyBulkItem":{"properties":{"namespace":{"type":"string","minLength":1,"title":"Namespace","description":"Namespace slug"},"name":{"type":"string","maxLength":300,"minLength":1,"title":"Name"},"type":{"type":"string","title":"Type","default":"text"},"source_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Value"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"plurals":{"type":"boolean","title":"Plurals","default":false},"max_length":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Length"},"update_source":{"type":"boolean","title":"Update Source","default":false}},"type":"object","required":["namespace","name"],"title":"KeyBulkItem"},"KeyBulkResult":{"properties":{"index":{"type":"integer","title":"Index"},"status":{"type":"string","title":"Status"},"created":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Created"},"key_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Uuid"},"key_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Name"},"namespace_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace Uuid"},"error":{"anyOf":[{"$ref":"#/components/schemas/BulkItemError"},{"type":"null"}]}},"type":"object","required":["index","status"],"title":"KeyBulkResult"},"KeyBulkStatusIn":{"properties":{"key_uuids":{"items":{"type":"string"},"type":"array","maxItems":500,"minItems":1,"title":"Key Uuids"},"status":{"type":"string","enum":["active","archived"],"title":"Status"}},"type":"object","required":["key_uuids","status"],"title":"KeyBulkStatusIn"},"KeyCreateOut":{"properties":{"key_uuid":{"type":"string","title":"Key Uuid"},"key_name":{"type":"string","title":"Key Name"},"namespace_slug":{"type":"string","title":"Namespace Slug"},"namespace_uuid":{"type":"string","title":"Namespace Uuid"},"source_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Value"},"plurals":{"type":"boolean","title":"Plurals"},"max_length":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Length"},"created":{"type":"boolean","title":"Created"}},"type":"object","required":["key_uuid","key_name","namespace_slug","namespace_uuid","source_value","plurals","max_length","created"],"title":"KeyCreateOut"},"KeyEmbed":{"properties":{"uuid":{"type":"string","title":"Uuid"},"name":{"type":"string","title":"Name"},"namespace_uuid":{"type":"string","title":"Namespace Uuid"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Context"},"plurals":{"type":"boolean","title":"Plurals","default":false},"max_length":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Length"},"type":{"type":"string","title":"Type","default":"text"}},"type":"object","required":["uuid","name","namespace_uuid"],"title":"KeyEmbed"},"KeyHistoryCodeScan":{"properties":{"finding_uuid":{"type":"string","title":"Finding Uuid"},"file":{"type":"string","title":"File"},"line":{"type":"integer","title":"Line"},"first_seen_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Seen At","description":"When the scan FIRST found the string — its discovery."},"first_seen_scan_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Seen Scan Id"},"treated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Treated At"},"last_seen_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Seen At"},"last_seen_scan_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Seen Scan Id"},"status":{"type":"string","title":"Status","description":"new | treated | gone (gone = the string left the source)."},"in_latest_scan":{"type":"boolean","title":"In Latest Scan","description":"True if the string was still present in the project's most recent scan."}},"type":"object","required":["finding_uuid","file","line","status","in_latest_scan"],"title":"KeyHistoryCodeScan","description":"Where this key came from in the SOURCE, when it originated as a hardcoded\nstring a code scan found. Present only when a finding was marked treated INTO\nthis (namespace, key)."},"KeyHistoryEntry":{"properties":{"version":{"type":"integer","title":"Version"},"value":{"type":"string","title":"Value"},"status":{"type":"string","enum":["missing","draft","translated","reviewed","approved","rejected"],"title":"Status"},"changed_by_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Changed By Uuid"},"changed_by_api_key_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Changed By Api Key Uuid"},"change_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Change Source"},"change_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Change Reason"},"changed_at":{"type":"string","format":"date-time","title":"Changed At"},"plural_forms":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Plural Forms"},"surface":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Surface"},"surface_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Surface Kind"},"language_uuid":{"type":"string","title":"Language Uuid"}},"type":"object","required":["version","value","status","changed_by_uuid","changed_at","language_uuid"],"title":"KeyHistoryEntry"},"KeyHistoryOut":{"properties":{"key_uuid":{"type":"string","title":"Key Uuid"},"items":{"items":{"$ref":"#/components/schemas/KeyHistoryEntry"},"type":"array","title":"Items"},"code_scan":{"anyOf":[{"$ref":"#/components/schemas/KeyHistoryCodeScan"},{"type":"null"}]}},"type":"object","required":["key_uuid","items"],"title":"KeyHistoryOut"},"KeyHit":{"properties":{"uuid":{"type":"string","title":"Uuid"},"name":{"type":"string","title":"Name"},"namespace_uuid":{"type":"string","title":"Namespace Uuid"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"matched_in":{"type":"string","title":"Matched In"},"plurals":{"type":"boolean","title":"Plurals","default":false},"source_plural_forms":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Source Plural Forms"},"translations":{"items":{"$ref":"#/components/schemas/KeyHitTranslation"},"type":"array","title":"Translations","default":[]}},"type":"object","required":["uuid","name","namespace_uuid","matched_in"],"title":"KeyHit"},"KeyHitTranslation":{"properties":{"language_uuid":{"type":"string","title":"Language Uuid"},"language_code":{"type":"string","title":"Language Code"},"value":{"type":"string","title":"Value"},"status":{"type":"string","title":"Status"},"plural_forms":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Plural Forms"}},"type":"object","required":["language_uuid","language_code","value","status"],"title":"KeyHitTranslation","description":"A translation row attached to a KeyHit so the editor row UI can\nrender source + target without a follow-up fetch."},"KeyOccurrenceRow":{"properties":{"file":{"type":"string","title":"File","description":"Repo-relative path of a usage site."},"line":{"type":"integer","title":"Line","default":0},"column":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Column"},"ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ref","description":"Raw usage reference as scanned, e.g. `common:actions.save`."},"status":{"type":"string","title":"Status","description":"present = in the last completed run · gone = referenced before, absent from it."},"first_seen_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Seen At"},"last_seen_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Seen At"},"in_latest_scan":{"type":"boolean","title":"In Latest Scan","description":"last_seen_scan_id == latest completed run."}},"type":"object","required":["file","status","in_latest_scan"],"title":"KeyOccurrenceRow"},"KeyOccurrencesOut":{"properties":{"key_uuid":{"type":"string","title":"Key Uuid"},"items":{"items":{"$ref":"#/components/schemas/KeyOccurrenceRow"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"latest_scan_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest Scan Id","description":"scan_id of the most recent completed run; null if none."},"measured":{"type":"boolean","title":"Measured","description":"False = no completed run yet — NOT 'referenced nowhere'."},"formula":{"additionalProperties":{"type":"string"},"type":"object","title":"Formula"}},"type":"object","required":["key_uuid","items","total","measured","formula"],"title":"KeyOccurrencesOut"},"KeyOut":{"properties":{"uuid":{"type":"string","title":"Uuid"},"project_uuid":{"type":"string","title":"Project Uuid"},"namespace_uuid":{"type":"string","title":"Namespace Uuid"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Context"},"plurals":{"type":"boolean","title":"Plurals"},"max_length":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Length"},"screenshots":{"items":{"type":"string"},"type":"array","title":"Screenshots"},"type":{"type":"string","enum":["text","heading","label","caption","badge","tooltip","error_message","toast","button","link","menu_item","input_placeholder","input_label","image","icon","meta_title","meta_description"],"title":"Type","default":"text"},"type_source":{"type":"string","enum":["default","detected","manual"],"title":"Type Source","default":"default"},"type_detected_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Type Detected At"},"type_analyzed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Type Analyzed At"},"type_analyzed_scan_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type Analyzed Scan Id"},"status":{"type":"string","enum":["active","archived"],"title":"Status"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"deleted_by_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deleted By Uuid"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"referenced":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Referenced"},"orphan":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Orphan"}},"type":"object","required":["uuid","project_uuid","namespace_uuid","name","description","context","plurals","max_length","screenshots","status","created_at","updated_at"],"title":"KeyOut"},"KeyPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/KeyOut"},"type":"array","title":"Items"},"cursor_next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor Next"},"total":{"type":"integer","title":"Total"},"measured":{"type":"boolean","title":"Measured","default":false}},"type":"object","required":["items","cursor_next","total"],"title":"KeyPage"},"KeyPatchIn":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Context"},"plurals":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Plurals"},"max_length":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Length"},"screenshots":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Screenshots"},"status":{"anyOf":[{"type":"string","enum":["active","archived"]},{"type":"null"}],"title":"Status"},"type":{"anyOf":[{"type":"string","enum":["text","heading","label","caption","badge","tooltip","error_message","toast","button","link","menu_item","input_placeholder","input_label","image","icon","meta_title","meta_description"]},{"type":"null"}],"title":"Type"},"type_source":{"anyOf":[{"type":"string","enum":["default","detected","manual"]},{"type":"null"}],"title":"Type Source"}},"type":"object","title":"KeyPatchIn"},"KeyRef":{"properties":{"namespace":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace"},"name":{"type":"string","title":"Name"}},"type":"object","required":["name"],"title":"KeyRef"},"KeyTrashBulkOut":{"properties":{"results":{"items":{"$ref":"#/components/schemas/KeyTrashResult"},"type":"array","title":"Results"},"summary":{"$ref":"#/components/schemas/BulkSummary"}},"type":"object","required":["results","summary"],"title":"KeyTrashBulkOut"},"KeyTrashResult":{"properties":{"key_uuid":{"type":"string","title":"Key Uuid"},"status":{"type":"string","title":"Status"}},"type":"object","required":["key_uuid","status"],"title":"KeyTrashResult"},"KeyTypeFacet":{"properties":{"type":{"type":"string","title":"Type"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["type","count"],"title":"KeyTypeFacet"},"KeyTypesOut":{"properties":{"types":{"items":{"$ref":"#/components/schemas/KeyTypeFacet"},"type":"array","title":"Types"}},"type":"object","required":["types"],"title":"KeyTypesOut"},"KeyUpdateBulkItem":{"properties":{"source_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Value"},"key_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Uuid"},"namespace":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"type":{"anyOf":[{"type":"string","enum":["text","heading","label","caption","badge","tooltip","error_message","toast","button","link","menu_item","input_placeholder","input_label","image","icon","meta_title","meta_description"]},{"type":"null"}],"title":"Type"},"type_source":{"anyOf":[{"type":"string","enum":["default","detected","manual"]},{"type":"null"}],"title":"Type Source"}},"type":"object","title":"KeyUpdateBulkItem"},"KeyUpdateBulkResult":{"properties":{"index":{"type":"integer","title":"Index"},"status":{"type":"string","title":"Status"},"key_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Uuid"},"key_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Name"},"source_changed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Source Changed"},"type_changed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Type Changed"},"type_result":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type Result"},"stale_flagged":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Stale Flagged"},"error":{"anyOf":[{"$ref":"#/components/schemas/BulkItemError"},{"type":"null"}]}},"type":"object","required":["index","status"],"title":"KeyUpdateBulkResult"},"KeyUpdateIn":{"properties":{"source_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Value","description":"New source-language value. OMIT for a retype-only call: the source value and every translation are then left strictly untouched. A type-reclassification tool must never have to send content it does not own."},"key_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Uuid","description":"Target key uuid (preferred)."},"namespace":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace","description":"...or namespace slug (with name)."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"...key name (with namespace)."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Optional: also update the key's description."},"type":{"anyOf":[{"type":"string","enum":["text","heading","label","caption","badge","tooltip","error_message","toast","button","link","menu_item","input_placeholder","input_label","image","icon","meta_title","meta_description"]},{"type":"null"}],"title":"Type","description":"Optional: also retype the key (e.g. button, heading). A type-only change (same source_value) persists the new type WITHOUT touching the source value or translations, and is NOT billed (task 1421)."},"type_source":{"anyOf":[{"type":"string","enum":["default","detected","manual"]},{"type":"null"}],"title":"Type Source","description":"Provenance of the retype: 'detected' when a mechanical code scan inferred it, 'manual' (the default) when it is a deliberate call. Drives the a11y detection coverage — see GET /a11y/detection."},"plurals":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Plurals","description":"Optional: toggle whether this key is PLURAL. true makes it a plural key (its value carries CLDR forms one/few/…/other); false makes it a single value. Touches only the flag — not the source value or translations — and is not billed."}},"type":"object","title":"KeyUpdateIn","description":"Edit-in-place the source value of an EXISTING key. Address it by uuid\n(preferred) OR namespace slug + name."},"KeyUpdateOut":{"properties":{"key_uuid":{"type":"string","title":"Key Uuid"},"key_name":{"type":"string","title":"Key Name"},"namespace_uuid":{"type":"string","title":"Namespace Uuid"},"source_value":{"type":"string","title":"Source Value"},"result":{"type":"string","title":"Result"},"source_changed":{"type":"boolean","title":"Source Changed"},"type_changed":{"type":"boolean","title":"Type Changed","default":false},"type_result":{"type":"string","title":"Type Result","default":"unchanged"},"plurals_changed":{"type":"boolean","title":"Plurals Changed","default":false},"stale_flagged":{"type":"integer","title":"Stale Flagged"},"billable":{"type":"boolean","title":"Billable"}},"type":"object","required":["key_uuid","key_name","namespace_uuid","source_value","result","source_changed","stale_flagged","billable"],"title":"KeyUpdateOut"},"KeyWithTranslations":{"properties":{"key_uuid":{"type":"string","title":"Key Uuid"},"key_name":{"type":"string","title":"Key Name"},"namespace_slug":{"type":"string","title":"Namespace Slug"},"namespace_uuid":{"type":"string","title":"Namespace Uuid"},"source_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Value"},"source_plural_forms":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Source Plural Forms"},"plurals":{"type":"boolean","title":"Plurals"},"max_length":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Length"},"type":{"type":"string","title":"Type","default":"text"},"type_source":{"type":"string","title":"Type Source","default":"default"},"type_detected_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Type Detected At"},"type_analyzed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Type Analyzed At"},"translations":{"items":{"$ref":"#/components/schemas/TranslationOnKey"},"type":"array","title":"Translations"},"glossary_hints":{"anyOf":[{"items":{"$ref":"#/components/schemas/GlossaryHint"},"type":"array"},{"type":"null"}],"title":"Glossary Hints"}},"type":"object","required":["key_uuid","key_name","namespace_slug","namespace_uuid","source_value","plurals","max_length","translations"],"title":"KeyWithTranslations"},"KeysReportIn":{"properties":{"locale":{"anyOf":[{"type":"string","maxLength":12},{"type":"null"}],"title":"Locale"},"namespace":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Namespace"},"keys":{"items":{"additionalProperties":true,"type":"object"},"type":"array","maxItems":500,"title":"Keys"}},"type":"object","title":"KeysReportIn"},"KeysWithTranslationsPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/KeyWithTranslations"},"type":"array","title":"Items"},"cursor_next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor Next"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","cursor_next","total"],"title":"KeysWithTranslationsPage"},"KnowledgeStatusOut":{"properties":{"glossary_count":{"type":"integer","title":"Glossary Count"},"has_context":{"type":"boolean","title":"Has Context"}},"type":"object","required":["glossary_count","has_context"],"title":"KnowledgeStatusOut","description":"Cheap emptiness signal for the app-wide onboarding nudge / nav badge —\na glossary count + a context-present boolean, NO payloads (so it can be\nfetched on every page without downloading the ~100 KiB context doc)."},"LangChange":{"properties":{"language_code":{"type":"string","title":"Language Code"},"change":{"type":"string","title":"Change"},"from":{"anyOf":[{"$ref":"#/components/schemas/TranslationState"},{"type":"null"}]},"to":{"anyOf":[{"$ref":"#/components/schemas/TranslationState"},{"type":"null"}]}},"type":"object","required":["language_code","change"],"title":"LangChange"},"LanguageCatalogItem":{"properties":{"code":{"type":"string","title":"Code"},"iso639_1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Iso639 1"},"iso639_3":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Iso639 3"},"english_name":{"type":"string","title":"English Name"},"native_name":{"type":"string","title":"Native Name"},"rtl":{"type":"boolean","title":"Rtl","default":false},"script":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Script"},"is_variant":{"type":"boolean","title":"Is Variant","default":false},"parent_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Code"},"plural_categories":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Plural Categories"}},"type":"object","required":["code","english_name","native_name"],"title":"LanguageCatalogItem"},"LanguageCatalogOut":{"properties":{"count":{"type":"integer","title":"Count"},"items":{"items":{"$ref":"#/components/schemas/LanguageCatalogItem"},"type":"array","title":"Items"}},"type":"object","required":["count","items"],"title":"LanguageCatalogOut"},"LanguageCompletion":{"properties":{"translated":{"type":"integer","title":"Translated"},"total":{"type":"integer","title":"Total"},"status_breakdown":{"anyOf":[{"$ref":"#/components/schemas/LanguageStatusBreakdown"},{"type":"null"}]}},"type":"object","required":["translated","total"],"title":"LanguageCompletion"},"LanguageCreateIn":{"properties":{"code":{"type":"string","title":"Code"},"name":{"anyOf":[{"type":"string","maxLength":120,"minLength":1},{"type":"null"}],"title":"Name"},"fallback":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback"},"is_source":{"type":"boolean","title":"Is Source","default":false}},"type":"object","required":["code"],"title":"LanguageCreateIn"},"LanguageListOut":{"properties":{"items":{"items":{"$ref":"#/components/schemas/LanguageOut"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"LanguageListOut"},"LanguageOut":{"properties":{"uuid":{"type":"string","title":"Uuid"},"project_uuid":{"type":"string","title":"Project Uuid"},"code":{"type":"string","title":"Code"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"fallback":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback"},"is_source":{"type":"boolean","title":"Is Source"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"completion":{"anyOf":[{"$ref":"#/components/schemas/LanguageCompletion"},{"type":"null"}]}},"type":"object","required":["uuid","project_uuid","code","name","fallback","is_source","created_at","updated_at"],"title":"LanguageOut"},"LanguagePatchIn":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":120,"minLength":1},{"type":"null"}],"title":"Name"},"fallback":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback"},"is_source":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Source"}},"type":"object","title":"LanguagePatchIn"},"LanguageRowOut":{"properties":{"code":{"type":"string","title":"Code"},"languageUuid":{"type":"string","title":"Languageuuid"},"fallbackChain":{"items":{"type":"string"},"type":"array","title":"Fallbackchain"},"pluralCategories":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Pluralcategories"},"default":{"$ref":"#/components/schemas/CellOut"},"surfaces":{"additionalProperties":{"$ref":"#/components/schemas/CellOut"},"type":"object","title":"Surfaces"}},"type":"object","required":["code","languageUuid","fallbackChain","default","surfaces"],"title":"LanguageRowOut"},"LanguageStatusBreakdown":{"properties":{"translated":{"type":"integer","title":"Translated"},"reviewed":{"type":"integer","title":"Reviewed"},"approved":{"type":"integer","title":"Approved"},"draft":{"type":"integer","title":"Draft"},"missing":{"type":"integer","title":"Missing"},"total":{"type":"integer","title":"Total"},"pct_translated":{"type":"integer","title":"Pct Translated"}},"type":"object","required":["translated","reviewed","approved","draft","missing","total","pct_translated"],"title":"LanguageStatusBreakdown","description":"Per-status counts over the production version's active keys — SAME shape +\ncomputation as the coverage endpoint's CoverageLanguage, so client-admin can\nrender the identical stacked CoverageBar here. Buckets translated/reviewed/\napproved are the live, mutually-exclusive states; `draft` = has a value but\nnot live; `missing` = total - (translated+reviewed+approved) (i.e. everything\nnot live, draft included)."},"LanguageSummary":{"properties":{"uuid":{"type":"string","title":"Uuid"},"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"is_source":{"type":"boolean","title":"Is Source"},"fallback":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback"}},"type":"object","required":["uuid","code","name","is_source","fallback"],"title":"LanguageSummary"},"LastScanSummary":{"properties":{"scan_id":{"type":"string","title":"Scan Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"submitted":{"type":"integer","title":"Submitted"},"counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Counts"}},"type":"object","required":["scan_id","created_at","submitted"],"title":"LastScanSummary"},"LedgerEntryOut":{"properties":{"uuid":{"type":"string","title":"Uuid"},"entry_type":{"type":"string","title":"Entry Type"},"credits":{"type":"integer","title":"Credits"},"balance_after":{"type":"integer","title":"Balance After"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"job_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Uuid"},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["uuid","entry_type","credits","balance_after","created_at"],"title":"LedgerEntryOut"},"LedgerPageOut":{"properties":{"items":{"items":{"$ref":"#/components/schemas/LedgerEntryOut"},"type":"array","title":"Items"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"}},"type":"object","required":["items"],"title":"LedgerPageOut"},"ListTrashedKeysOut":{"properties":{"items":{"items":{"$ref":"#/components/schemas/TrashedKeyItem"},"type":"array","title":"Items"},"cursor_next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor Next"}},"type":"object","required":["items"],"title":"ListTrashedKeysOut"},"LoginIn":{"properties":{"email":{"type":"string","pattern":"^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"LoginIn"},"LokaliseImportIn":{"properties":{"lokalise_api_token":{"type":"string","minLength":1,"title":"Lokalise Api Token","description":"The caller's Lokalise API token. Used once; never stored, never logged."},"lokalise_project_id":{"type":"string","minLength":1,"title":"Lokalise Project Id","description":"Lokalise project id to pull from"},"namespace_slug":{"type":"string","title":"Namespace Slug","description":"Sonenta namespace all imported keys land in (V1: single bucket)","default":"common"},"language_map":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Language Map","description":"Optional override mapping `{lokalise_iso: sonenta_code}`. Lokalise languages not in the map default to exact-code match against the Sonenta project; unmatched languages are skipped with a warning."},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version","description":"Sonenta version slug to write into (default: production)"},"status":{"type":"string","enum":["draft","translated"],"title":"Status","description":"Status applied to imported translation rows","default":"translated"},"dry_run":{"type":"boolean","title":"Dry Run","description":"Fetch + plan but don't write — useful to preview the mapping","default":false}},"type":"object","required":["lokalise_api_token","lokalise_project_id"],"title":"LokaliseImportIn"},"LokaliseImportReport":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"lokalise_project":{"additionalProperties":true,"type":"object","title":"Lokalise Project"},"namespace_slug":{"type":"string","title":"Namespace Slug"},"version_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Slug"},"languages_seen":{"items":{"type":"string"},"type":"array","title":"Languages Seen"},"languages_imported":{"items":{"type":"string"},"type":"array","title":"Languages Imported"},"languages_skipped":{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array","title":"Languages Skipped"},"keys_created":{"type":"integer","title":"Keys Created"},"keys_reused":{"type":"integer","title":"Keys Reused"},"keys_skipped":{"type":"integer","title":"Keys Skipped"},"translations_created":{"type":"integer","title":"Translations Created"},"translations_updated":{"type":"integer","title":"Translations Updated"},"translations_unchanged":{"type":"integer","title":"Translations Unchanged"},"plural_keys_marked":{"type":"integer","title":"Plural Keys Marked"},"per_language":{"items":{"$ref":"#/components/schemas/LokaliseLanguageReport"},"type":"array","title":"Per Language"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings"},"dry_run":{"type":"boolean","title":"Dry Run"}},"type":"object","required":["project_uuid","lokalise_project","namespace_slug","version_slug","languages_seen","languages_imported","languages_skipped","keys_created","keys_reused","keys_skipped","translations_created","translations_updated","translations_unchanged","plural_keys_marked","per_language","warnings","dry_run"],"title":"LokaliseImportReport"},"LokaliseLanguageReport":{"properties":{"lokalise_iso":{"type":"string","title":"Lokalise Iso"},"sonenta_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sonenta Code"},"keys":{"type":"integer","title":"Keys"},"translations_created":{"type":"integer","title":"Translations Created"},"translations_updated":{"type":"integer","title":"Translations Updated"},"translations_unchanged":{"type":"integer","title":"Translations Unchanged"}},"type":"object","required":["lokalise_iso","sonenta_code","keys","translations_created","translations_updated","translations_unchanged"],"title":"LokaliseLanguageReport"},"McpA11yScanIn":{"properties":{"keys_scanned":{"type":"integer","minimum":0.0,"title":"Keys Scanned","description":"DISTINCT keys the scan actually SAW at usage sites in the code — not the project total (that is `keys_total` on /a11y/detection). The gap between the two is meaningful: keys that appear nowhere in the code."},"keys_classified":{"type":"integer","minimum":0.0,"title":"Keys Classified","description":"Keys this run actually retyped. Count the items whose `type_result` came back \"changed\" — NOT the ones you attempted: a `refused_manual` is a hand-set type the scan must not claim as its own."},"tool":{"type":"string","pattern":"^(cli|agent)$","title":"Tool"},"tool_version":{"type":"string","maxLength":64,"minLength":1,"title":"Tool Version"},"scan_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scan Id","description":"OMIT on the first call: a run id is minted and returned. Echo it on every follow-up batch of the SAME scan so all chunks stamp one id. An id that is not this project's current run is refused (422) — better than stamping keys with a stale run."},"seen_key_uuids":{"items":{"type":"string"},"type":"array","maxItems":5000,"title":"Seen Key Uuids","description":"Every key this scan SAW at a usage site, whatever the outcome: retyped, CONFIRMED as plain text, or `refused_manual`. Send them all — a confirming retype writes nothing, so this list is the ONLY record that the key was analyzed, and it cannot be reconstructed later. Chunk large projects across several calls sharing one scan_id (this field is capped per call, not per run)."}},"type":"object","required":["keys_scanned","keys_classified","tool","tool_version"],"title":"McpA11yScanIn"},"McpA11yVariantIn":{"properties":{"value":{"type":"string","title":"Value","default":""}},"type":"object","title":"McpA11yVariantIn"},"McpA11yVariantOut":{"properties":{"key_uuid":{"type":"string","title":"Key Uuid"},"surface":{"type":"string","title":"Surface"},"language_code":{"type":"string","title":"Language Code"},"value":{"type":"string","title":"Value"},"status":{"type":"string","title":"Status"}},"type":"object","required":["key_uuid","surface","language_code","value","status"],"title":"McpA11yVariantOut"},"McpCdnEmptyBundleWarning":{"properties":{"language_code":{"type":"string","title":"Language Code"},"namespace":{"type":"string","title":"Namespace"},"key_count":{"type":"integer","title":"Key Count"},"included_count":{"type":"integer","title":"Included Count"},"excluded_count":{"type":"integer","title":"Excluded Count"},"skipped":{"type":"boolean","title":"Skipped"},"reason":{"type":"string","title":"Reason"}},"type":"object","required":["language_code","namespace","key_count","included_count","excluded_count","skipped","reason"],"title":"McpCdnEmptyBundleWarning"},"McpCdnPublishIn":{"properties":{"language_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Code"},"namespace":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace"},"version_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Slug","description":"Project-version slug. Defaults to the production version."},"force":{"type":"boolean","title":"Force","description":"Currently a no-op: orchestrate_publish is already idempotent + content-addressed, so re-running with no changes returns reused releases. Reserved for V2 when we want to bypass dedup.","default":false},"allow_empty":{"type":"boolean","title":"Allow Empty","description":"By default a base bundle whose namespace has keys but ZERO publishable ones (all below 'translated', e.g. draft) is REFUSED (publishing it would serve an EMPTY bundle) and reported in `warnings`. Set true to force-publish the empty bundle anyway.","default":false}},"type":"object","title":"McpCdnPublishIn"},"McpCdnPublishOut":{"properties":{"items":{"items":{"$ref":"#/components/schemas/McpCdnReleaseItem"},"type":"array","title":"Items"},"new_count":{"type":"integer","title":"New Count"},"reused_count":{"type":"integer","title":"Reused Count"},"soft_warn":{"type":"boolean","title":"Soft Warn","default":false},"warnings":{"items":{"$ref":"#/components/schemas/McpCdnEmptyBundleWarning"},"type":"array","title":"Warnings"}},"type":"object","required":["items","new_count","reused_count"],"title":"McpCdnPublishOut"},"McpCdnReleaseItem":{"properties":{"language_code":{"type":"string","title":"Language Code"},"namespace_slug":{"type":"string","title":"Namespace Slug"},"version_hash":{"type":"string","title":"Version Hash"},"content_hash":{"type":"string","title":"Content Hash"},"public_url":{"type":"string","title":"Public Url"},"latest_url":{"type":"string","title":"Latest Url"},"size_bytes":{"type":"integer","title":"Size Bytes"},"key_count":{"type":"integer","title":"Key Count"},"included_count":{"type":"integer","title":"Included Count"}},"type":"object","required":["language_code","namespace_slug","version_hash","content_hash","public_url","latest_url","size_bytes","key_count","included_count"],"title":"McpCdnReleaseItem"},"McpCodeOccurrenceIn":{"properties":{"ref":{"type":"string","title":"Ref","description":"Raw usage reference, e.g. `common:actions.save`. NO uuid."},"file":{"type":"string","title":"File","description":"Repo-relative path of the usage site."},"line":{"type":"integer","minimum":0.0,"title":"Line","default":0},"column":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Column"}},"type":"object","required":["ref","file"],"title":"McpCodeOccurrenceIn"},"McpCodeOccurrencesDeltaIn":{"properties":{"added":{"items":{"$ref":"#/components/schemas/McpCodeOccurrenceIn"},"type":"array","title":"Added","description":"Sites present in the scan but NOT in the catalogue: {ref, file, line, column?}."},"removed":{"items":{"$ref":"#/components/schemas/McpCodeOccurrenceIn"},"type":"array","title":"Removed","description":"Sites present in the catalogue but NOT in the scan (identity is the position {ref, file, line, column}). A moved occurrence is a remove + an add."},"base_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Version","description":"The catalogue `version` this delta was computed against. Must equal the project's latest finalized run, else 409 (refetch + recompute). Null on a project never scanned."},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"Run context (tool, version, sha)."},"confirm_mass_gone":{"type":"boolean","title":"Confirm Mass Gone","description":"Only set when a delta that retires most live occurrences is intended; else 422.","default":false}},"type":"object","title":"McpCodeOccurrencesDeltaIn"},"McpCodeOccurrencesIngestIn":{"properties":{"occurrences":{"items":{"$ref":"#/components/schemas/McpCodeOccurrenceIn"},"type":"array","title":"Occurrences","description":"One BATCH of key-usage sites {ref, file, line, column?}. All occurrences of a given (key, file) MUST be in the same batch (chunk by file)."},"scan_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scan Id","description":"Omit on the FIRST batch to open a run (the response mints + echoes the id); echo it on every follow-up batch."},"final":{"type":"boolean","title":"Final","description":"Set true on the LAST batch to close the run: reconcile `gone` + mass-gone guard.","default":false},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"Run context (tool, version, sha)."},"confirm_mass_gone":{"type":"boolean","title":"Confirm Mass Gone","description":"Only set when a final that retires most live occurrences is intended; else 422.","default":false}},"type":"object","title":"McpCodeOccurrencesIngestIn"},"McpCodeProfileIn":{"properties":{"frameworks":{"items":{"$ref":"#/components/schemas/McpFrameworkIn"},"type":"array","maxItems":20,"title":"Frameworks"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta"}},"type":"object","title":"McpCodeProfileIn"},"McpCodeScanIngestIn":{"properties":{"findings":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Findings","description":"EVERY hardcoded string this run found, as {file, line, column?, string, suggested_namespace?}. The set is AUTHORITATIVE: anything known to the project and absent here is marked `gone`. Post the FULL result of one scan — a partial list retires findings that are still in the code."},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta","description":"Run context (tool, version, sha)."},"confirm_mass_gone":{"type":"boolean","title":"Confirm Mass Gone","description":"Only set this when you INTEND to retire most of the project's live findings. Without it such a run is refused (422). If you hit that refusal, the usual cause is that you scanned part of the repository, not that the strings are gone.","default":false},"component_prop_inventory":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Component Prop Inventory","description":"Translatable-props inventory, as [{component, prop, is_component?, count?, samples?, first_file?, first_line?}]. PRESENCE is the contract: OMIT the field to leave the inventory untouched; send the list (even empty) to REPLACE it authoritatively. Does not affect findings — a picked prop still comes back as a normal finding when you flag it in this run's `findings`."}},"type":"object","title":"McpCodeScanIngestIn"},"McpCodeScanTreatedIn":{"properties":{"finding_id":{"type":"string","title":"Finding Id","description":"uuid of the finding (from list_code_scan_findings)."},"key":{"type":"string","maxLength":400,"minLength":1,"title":"Key","description":"The key NAME this hardcoded string became."},"namespace":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Namespace","description":"Namespace slug of the key. Send it (with the key you just created) so the backend verifies the key EXISTS before marking treated — a treated finding then points at a real key. Omitting it keeps the legacy unchecked behaviour."}},"type":"object","required":["finding_id","key"],"title":"McpCodeScanTreatedIn"},"McpCognitiveAnalyzeIn":{"properties":{"tier":{"type":"string","title":"Tier","default":"standard"},"key_uuids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Key Uuids"},"namespace_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace Uuid"},"idempotency_key":{"type":"string","minLength":1,"title":"Idempotency Key"}},"type":"object","required":["idempotency_key"],"title":"McpCognitiveAnalyzeIn"},"McpCognitiveScoreIn":{"properties":{"score":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Score"},"suggestion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggestion"}},"type":"object","required":["score"],"title":"McpCognitiveScoreIn"},"McpCognitiveScoreLocalIn":{"properties":{"key_uuids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Key Uuids"},"namespace_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace Uuid"},"overwrite":{"type":"boolean","title":"Overwrite","default":false}},"type":"object","title":"McpCognitiveScoreLocalIn"},"McpCommentOptionIn":{"properties":{"id":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Id"},"label":{"type":"string","maxLength":300,"minLength":1,"title":"Label"}},"type":"object","required":["label"],"title":"McpCommentOptionIn"},"McpContextIn":{"properties":{"content":{"type":"string","title":"Content","description":"UTF-8 markdown; size limit 100 KiB"}},"type":"object","required":["content"],"title":"McpContextIn"},"McpContextOut":{"properties":{"content":{"type":"string","title":"Content"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"updated_by_user_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated By User Uuid"},"size_bytes":{"type":"integer","title":"Size Bytes"}},"type":"object","required":["content","updated_at","updated_by_user_uuid","size_bytes"],"title":"McpContextOut","description":"MCP-side view of the project context document.\n\n`updated_by_user_uuid` is null when an API key (not a user) wrote the\ndocument — the audit log holds the precise actor (user_uuid OR\napi_key_uuid) for every write. `updated_at=null` AND the previous field\nbeing null means the document was never written, content is the default."},"McpCsvExportIn":{"properties":{"languages":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Languages"},"namespaces":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Namespaces"},"source_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Language"},"delimiter":{"type":"string","title":"Delimiter","default":","},"include_statuses":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Include Statuses"}},"type":"object","title":"McpCsvExportIn"},"McpCsvImportIn":{"properties":{"content":{"type":"string","minLength":1,"title":"Content"},"delimiter":{"type":"string","title":"Delimiter","default":","},"strict":{"type":"boolean","title":"Strict","default":false},"create_missing":{"type":"boolean","title":"Create Missing","default":false},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"}},"type":"object","required":["content"],"title":"McpCsvImportIn"},"McpFrameworkIn":{"properties":{"name":{"type":"string","title":"Name","description":"One of: react, vue, svelte, next, astro, react-native, capacitor"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"package.json | config | imports"}},"type":"object","required":["name"],"title":"McpFrameworkIn"},"McpGlossaryEntryOut":{"properties":{"uuid":{"type":"string","title":"Uuid"},"rule_type":{"type":"string","enum":["translation","do_not_translate","forbidden"],"title":"Rule Type"},"term":{"type":"string","title":"Term"},"translations":{"additionalProperties":{"type":"string"},"type":"object","title":"Translations"},"case_sensitive":{"type":"boolean","title":"Case Sensitive"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["uuid","rule_type","term","translations","case_sensitive","note","created_at","updated_at"],"title":"McpGlossaryEntryOut"},"McpGlossaryIn":{"properties":{"rule_type":{"type":"string","enum":["translation","do_not_translate","forbidden"],"title":"Rule Type","default":"translation"},"term":{"type":"string","maxLength":200,"minLength":1,"title":"Term"},"translations":{"additionalProperties":{"type":"string"},"type":"object","title":"Translations"},"case_sensitive":{"type":"boolean","title":"Case Sensitive","default":false},"note":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Note"}},"type":"object","required":["term"],"title":"McpGlossaryIn"},"McpGlossaryListOut":{"properties":{"items":{"items":{"$ref":"#/components/schemas/McpGlossaryEntryOut"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","total"],"title":"McpGlossaryListOut"},"McpGlossaryPatch":{"properties":{"term":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Term"},"translations":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Translations"},"case_sensitive":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Case Sensitive"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","title":"McpGlossaryPatch"},"McpGlossaryRevertIn":{"properties":{"version":{"type":"integer","minimum":1.0,"title":"Version","description":"the term version to restore"}},"type":"object","required":["version"],"title":"McpGlossaryRevertIn"},"McpImportIn":{"properties":{"namespaces":{"items":{"$ref":"#/components/schemas/McpImportNamespace"},"type":"array","minItems":1,"title":"Namespaces"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"status":{"type":"string","enum":["draft","translated"],"title":"Status","default":"translated"}},"type":"object","required":["namespaces"],"title":"McpImportIn"},"McpImportNamespace":{"properties":{"namespace":{"type":"string","minLength":1,"title":"Namespace"},"translations":{"additionalProperties":{"additionalProperties":true,"type":"object"},"type":"object","title":"Translations","description":"language_code -> nested|flat i18next tree for this namespace"}},"type":"object","required":["namespace","translations"],"title":"McpImportNamespace"},"McpImportOut":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"version_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Slug"},"keys_created":{"type":"integer","title":"Keys Created"},"keys_reused":{"type":"integer","title":"Keys Reused"},"translations_created":{"type":"integer","title":"Translations Created"},"translations_updated":{"type":"integer","title":"Translations Updated"},"translations_unchanged":{"type":"integer","title":"Translations Unchanged"},"plural_keys_marked":{"type":"integer","title":"Plural Keys Marked"},"units":{"items":{"$ref":"#/components/schemas/McpImportUnit"},"type":"array","title":"Units"},"errors":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Errors"},"glossary_violation_count":{"type":"integer","title":"Glossary Violation Count"},"glossary_violations":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Glossary Violations"}},"type":"object","required":["project_uuid","version_slug","keys_created","keys_reused","translations_created","translations_updated","translations_unchanged","plural_keys_marked","units","errors","glossary_violation_count","glossary_violations"],"title":"McpImportOut"},"McpImportUnit":{"properties":{"namespace":{"type":"string","title":"Namespace"},"language_code":{"type":"string","title":"Language Code"},"keys_created":{"type":"integer","title":"Keys Created"},"keys_reused":{"type":"integer","title":"Keys Reused"},"translations_created":{"type":"integer","title":"Translations Created"},"translations_updated":{"type":"integer","title":"Translations Updated"},"translations_unchanged":{"type":"integer","title":"Translations Unchanged"},"plural_keys_marked":{"type":"integer","title":"Plural Keys Marked"}},"type":"object","required":["namespace","language_code","keys_created","keys_reused","translations_created","translations_updated","translations_unchanged","plural_keys_marked"],"title":"McpImportUnit"},"McpKeyIdsIn":{"properties":{"key_uuids":{"items":{"type":"string"},"type":"array","maxItems":500,"minItems":1,"title":"Key Uuids"}},"type":"object","required":["key_uuids"],"title":"McpKeyIdsIn"},"McpPickIn":{"properties":{"component":{"type":"string","maxLength":200,"minLength":1,"title":"Component","description":"Component/tag name, as it appears in the inventory."},"prop":{"type":"string","maxLength":200,"minLength":1,"title":"Prop","description":"Prop/attribute name."},"note":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Note","description":"Optional justification, kept on the pick (e.g. why this prop is text)."}},"type":"object","required":["component","prop"],"title":"McpPickIn"},"McpPropIgnoreIn":{"properties":{"component":{"type":"string","maxLength":200,"minLength":1,"title":"Component","description":"Component/tag name, as it appears in the inventory."},"prop":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Prop","description":"Prop to ignore; OMIT to ignore the WHOLE component (every prop)."}},"type":"object","required":["component"],"title":"McpPropIgnoreIn"},"McpPropSuggestionIn":{"properties":{"component":{"type":"string","maxLength":200,"minLength":1,"title":"Component","description":"Component/tag name, as it appears in the inventory."},"prop":{"type":"string","maxLength":200,"minLength":1,"title":"Prop","description":"Prop/attribute name."},"rationale":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Rationale","description":"Short justification for why this prop carries translatable text."}},"type":"object","required":["component","prop"],"title":"McpPropSuggestionIn"},"McpRemediationApplyIn":{"properties":{"version_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}},"type":"object","title":"McpRemediationApplyIn"},"McpReportCheckIn":{"properties":{"name":{"type":"string","maxLength":80,"minLength":1,"title":"Name"},"status":{"type":"string","pattern":"^(pass|fail|na)$","title":"Status"},"note":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Note"}},"type":"object","required":["name","status"],"title":"McpReportCheckIn"},"McpReportFollowUpIn":{"properties":{"note":{"type":"string","maxLength":200,"minLength":1,"title":"Note"},"task_ref":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Task Ref"}},"type":"object","required":["note"],"title":"McpReportFollowUpIn"},"McpReportMetricIn":{"properties":{"label":{"type":"string","maxLength":60,"minLength":1,"title":"Label"},"value":{"title":"Value"},"unit":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Unit"}},"type":"object","required":["label"],"title":"McpReportMetricIn"},"McpRevertIn":{"properties":{"to_version":{"type":"integer","title":"To Version"},"surface":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Surface"}},"type":"object","required":["to_version"],"title":"McpRevertIn"},"McpSectionIn":{"properties":{"title":{"type":"string","maxLength":300,"minLength":1,"title":"Title"},"type":{"type":"string","maxLength":60,"minLength":1,"title":"Type","description":"overview|writing|qa|constraints|terminology|other (open-set).","default":"other"},"languages":{"items":{"type":"string"},"type":"array","title":"Languages","description":"target codes; empty = all"},"body":{"type":"string","maxLength":102400,"title":"Body","default":""},"position":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Position"}},"type":"object","required":["title"],"title":"McpSectionIn"},"McpSectionPatch":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":300,"minLength":1},{"type":"null"}],"title":"Title"},"type":{"anyOf":[{"type":"string","maxLength":60,"minLength":1},{"type":"null"}],"title":"Type"},"languages":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Languages"},"body":{"anyOf":[{"type":"string","maxLength":102400},{"type":"null"}],"title":"Body"},"position":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Position"}},"type":"object","title":"McpSectionPatch"},"McpSectionRevertIn":{"properties":{"version":{"type":"integer","minimum":1.0,"title":"Version"}},"type":"object","required":["version"],"title":"McpSectionRevertIn"},"McpTaskAnswerIn":{"properties":{"choice_id":{"type":"string","maxLength":60,"minLength":1,"title":"Choice Id"}},"type":"object","required":["choice_id"],"title":"McpTaskAnswerIn"},"McpTaskCommentIn":{"properties":{"body":{"type":"string","maxLength":20000,"title":"Body","description":"Markdown comment body.","default":""},"options":{"anyOf":[{"items":{"$ref":"#/components/schemas/McpCommentOptionIn"},"type":"array","maxItems":12},{"type":"null"}],"title":"Options","description":"Provide choices to make this a DECISION request. The human answers it in the dashboard, or in the terminal with `sonenta tasks answer`; poll `GET .../comments` (or `sonenta tasks watch`) until `answer` is set."}},"type":"object","title":"McpTaskCommentIn"},"McpTaskCompleteIn":{"properties":{"verdict":{"type":"string","pattern":"^(resolved|partial|blocked|not_applicable)$","title":"Verdict","description":"The outcome. resolved/partial -> done; not_applicable -> dismissed; blocked -> the task stays in_progress with this report attached."},"summary":{"type":"string","maxLength":300,"minLength":1,"title":"Summary","description":"ONE sentence: what you did. Not an essay."},"confidence":{"anyOf":[{"type":"string","pattern":"^(high|medium|low)$"},{"type":"null"}],"title":"Confidence","description":"Your OVERALL confidence in the work (distinct from per-key confidence)."},"metrics":{"items":{"$ref":"#/components/schemas/McpReportMetricIn"},"type":"array","maxItems":20,"title":"Metrics","description":"The countable results, e.g. [{label:'keys translated', value:1013}]. Renders as a table."},"checks":{"items":{"$ref":"#/components/schemas/McpReportCheckIn"},"type":"array","maxItems":20,"title":"Checks","description":"The QA gates you verified: [{name:'placeholders preserved', status:'pass'}]. status is pass|fail|na."},"journal":{"items":{"type":"string"},"type":"array","maxItems":20,"title":"Journal","description":"Short one-line actions — the precise work trace."},"follow_ups":{"items":{"$ref":"#/components/schemas/McpReportFollowUpIn"},"type":"array","maxItems":20,"title":"Follow Ups","description":"Out-of-scope / left to do, each optionally linked to a task (task_ref = uuid or #number)."}},"type":"object","required":["verdict","summary"],"title":"McpTaskCompleteIn"},"McpTaskIn":{"properties":{"type":{"type":"string","maxLength":200,"minLength":1,"title":"Type","description":"Task type slug, e.g. `translation.validate` or `code_analysis.classify_props`. An unknown type is accepted; a known one supplies the default title, audience and deep-link."},"title":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Title","description":"Human-readable one-liner; defaults from the type catalogue."},"detail":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Detail"},"payload":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Payload","description":"Structured link the task points at, e.g. {\"language_code\": \"ru\", \"key_uuids\": [...]}."},"count":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Count","description":"Size of the work, e.g. 10 for \"10 keys to translate\"."},"deep_link":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Deep Link"},"severity":{"anyOf":[{"type":"string","pattern":"^(info|warning|error)$"},{"type":"null"}],"title":"Severity"},"dedupe_key":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Dedupe Key","description":"Idempotency key for a (type, scope) task — re-filing the same key while it is still open refreshes its count/title instead of stacking a duplicate. E.g. \"translate:ru\"."},"assignee_user_uuid":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Assignee User Uuid","description":"Assign the task to a specific project member. Usually leave null and let the type route it to the right audience (dev/translator/reviewer/…)."},"link_to":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Link To","description":"Link this new task to an existing one (its uuid or #number). Use it for a FOLLOW-UP: when finishing a task surfaces out-of-scope or downstream work, file the new task with link_to set to the current one so both are navigable."},"link_note":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Link Note","description":"Why the two are linked, e.g. \"out of scope for #14, split off here\"."}},"type":"object","required":["type"],"title":"McpTaskIn"},"McpTaskLinkIn":{"properties":{"related_task_id":{"type":"string","maxLength":100,"minLength":1,"title":"Related Task Id","description":"The other task to link — its uuid or #number."},"relation":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Relation","description":"How they relate, from this task's side: `spawned` (this led to it), `spawned_from` (it led to this), `blocks`, `blocked_by`, or `related`. The reverse is stored on the other task automatically.","default":"related"},"note":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Note","description":"Why they are linked (shown on both fiches)."}},"type":"object","required":["related_task_id"],"title":"McpTaskLinkIn"},"McpTaskUpdateIn":{"properties":{"status":{"type":"string","pattern":"^(open|in_progress|done|dismissed)$","title":"Status","description":"New status. `done` when you finished the work; `dismissed` when it no longer applies."},"note":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Note"}},"type":"object","required":["status"],"title":"McpTaskUpdateIn"},"McpXliffExportIn":{"properties":{"xliff_version":{"type":"string","title":"Xliff Version","default":"2.1"},"languages":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Languages"},"namespaces":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Namespaces"},"source_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Language"},"include_statuses":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Include Statuses"}},"type":"object","title":"McpXliffExportIn"},"McpXliffImportIn":{"properties":{"files":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Files"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"strict":{"type":"boolean","title":"Strict","default":false},"create_missing":{"type":"boolean","title":"Create Missing","default":false},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"}},"type":"object","title":"McpXliffImportIn"},"MeOut":{"properties":{"valid":{"type":"boolean","title":"Valid"},"account_active":{"type":"boolean","title":"Account Active"},"org_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Uuid"},"org_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Slug"},"org_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Name"},"plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"auth_type":{"type":"string","title":"Auth Type"},"key_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Name"},"key_scoped_to_projects":{"items":{"type":"string"},"type":"array","title":"Key Scoped To Projects"},"user_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Uuid"},"effective_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Effective Role"},"capabilities":{"items":{"$ref":"#/components/schemas/Capability"},"type":"array","title":"Capabilities"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["valid","account_active","org_uuid","org_slug","org_name","plan","email","scopes","auth_type"],"title":"MeOut"},"MemberAddIn":{"properties":{"email":{"type":"string","pattern":"^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$","title":"Email"},"role":{"type":"string","enum":["owner","admin","member"],"title":"Role","default":"member"}},"type":"object","required":["email"],"title":"MemberAddIn"},"MemberListOut":{"properties":{"items":{"items":{"$ref":"#/components/schemas/MemberOut"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"MemberListOut"},"MemberOut":{"properties":{"uuid":{"type":"string","title":"Uuid"},"user_uuid":{"type":"string","title":"User Uuid"},"email":{"type":"string","title":"Email"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"role":{"type":"string","enum":["owner","admin","member"],"title":"Role"},"status":{"type":"string","enum":["active","suspended"],"title":"Status","default":"active"},"joined_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Joined At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"is_bot":{"type":"boolean","title":"Is Bot","default":false},"mfa_enabled":{"type":"boolean","title":"Mfa Enabled","default":false},"project_roles":{"anyOf":[{"items":{"$ref":"#/components/schemas/ProjectRoleEntry"},"type":"array"},{"type":"null"}],"title":"Project Roles"}},"type":"object","required":["uuid","user_uuid","email","name","role","joined_at","created_at"],"title":"MemberOut"},"MemberPatchIn":{"properties":{"role":{"type":"string","enum":["owner","admin","member"],"title":"Role"}},"type":"object","required":["role"],"title":"MemberPatchIn"},"MemberProgress":{"properties":{"user_uuid":{"type":"string","title":"User Uuid"},"email":{"type":"string","title":"Email"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"translations_written":{"$ref":"#/components/schemas/WrittenBreakdown"},"pending_review":{"type":"integer","title":"Pending Review","default":0},"open_tasks":{"type":"integer","title":"Open Tasks","default":0}},"type":"object","required":["user_uuid","email","translations_written"],"title":"MemberProgress"},"MemberProgressOut":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"language_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Code"},"members":{"items":{"$ref":"#/components/schemas/MemberProgress"},"type":"array","title":"Members"}},"type":"object","required":["project_uuid","members"],"title":"MemberProgressOut"},"MemberProjectRoleIn":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"role":{"type":"string","enum":["owner","admin","developer","translator","qa","reviewer","viewer"],"title":"Role"},"languages_scope":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Languages Scope"}},"type":"object","required":["project_uuid","role"],"title":"MemberProjectRoleIn"},"MergeCluster":{"properties":{"canonical_key_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Canonical Key Uuid"},"new_key":{"anyOf":[{"$ref":"#/components/schemas/NewCanonicalKey"},{"type":"null"}]},"new_key_created":{"type":"boolean","title":"New Key Created","default":false},"redundant_key_uuids":{"items":{"type":"string"},"type":"array","title":"Redundant Key Uuids"},"applied":{"type":"boolean","title":"Applied","default":false}},"type":"object","required":["redundant_key_uuids"],"title":"MergeCluster"},"MergeConflict":{"properties":{"namespace":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace"},"name":{"type":"string","title":"Name"},"language_code":{"type":"string","title":"Language Code"},"source_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Value"},"target_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Value"}},"type":"object","required":["name","language_code"],"title":"MergeConflict"},"MergeIn":{"properties":{"into":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Into","description":"Target version uuid or slug to merge INTO. Defaults to the production version."},"strategy":{"type":"string","title":"Strategy","description":"source-wins (default) | target-wins (additive) | per-key (skip + report conflicts)","default":"source-wins"},"namespaces":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Namespaces","description":"Optional namespace-slug filter (default: all)."},"languages":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Languages","description":"Optional language-code filter (default: all)."},"dry_run":{"type":"boolean","title":"Dry Run","description":"Compute the report without writing — preview the merge.","default":false}},"type":"object","title":"MergeIn"},"MergePlan":{"properties":{"clusters":{"items":{"$ref":"#/components/schemas/MergeCluster"},"type":"array","title":"Clusters"},"survivor_outcome":{"type":"string","title":"Survivor Outcome"}},"type":"object","required":["clusters","survivor_outcome"],"title":"MergePlan"},"MergePlanIn":{"properties":{"source_value":{"type":"string","title":"Source Value"},"merge_plan":{"anyOf":[{"$ref":"#/components/schemas/MergePlan"},{"type":"null"}]},"files_modified":{"anyOf":[{"items":{"$ref":"#/components/schemas/FileModified"},"type":"array"},{"type":"null"}],"title":"Files Modified"}},"type":"object","required":["source_value"],"title":"MergePlanIn"},"MergePlanOut":{"properties":{"source_value":{"type":"string","title":"Source Value"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"merge_plan":{"anyOf":[{"$ref":"#/components/schemas/MergePlan"},{"type":"null"}]}},"type":"object","required":["source_value"],"title":"MergePlanOut"},"MergeReport":{"properties":{"source":{"$ref":"#/components/schemas/VersionRef"},"into":{"$ref":"#/components/schemas/VersionRef"},"strategy":{"type":"string","title":"Strategy"},"dry_run":{"type":"boolean","title":"Dry Run"},"added":{"type":"integer","title":"Added"},"updated":{"type":"integer","title":"Updated"},"skipped":{"type":"integer","title":"Skipped"},"keys_created":{"type":"integer","title":"Keys Created"},"conflicts":{"items":{"$ref":"#/components/schemas/MergeConflict"},"type":"array","title":"Conflicts"}},"type":"object","required":["source","into","strategy","dry_run","added","updated","skipped","keys_created","conflicts"],"title":"MergeReport"},"MfaChallengeOut":{"properties":{"mfa_required":{"type":"boolean","title":"Mfa Required","default":true},"mfa_token":{"type":"string","title":"Mfa Token"},"methods":{"items":{"type":"string"},"type":"array","title":"Methods"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"}},"type":"object","required":["mfa_token","methods","expires_at"],"title":"MfaChallengeOut","description":"Step-1 login response when MFA is enabled. Step 2 is /v1/auth/mfa/verify."},"MfaStatusOut":{"properties":{"mfa_enabled":{"type":"boolean","title":"Mfa Enabled"},"mfa_methods":{"items":{"type":"string"},"type":"array","title":"Mfa Methods"},"recovery_codes_remaining":{"type":"integer","title":"Recovery Codes Remaining"}},"type":"object","required":["mfa_enabled","mfa_methods","recovery_codes_remaining"],"title":"MfaStatusOut"},"MintableScopesOut":{"properties":{"your_org_role":{"type":"string","title":"Your Org Role"},"is_staff":{"type":"boolean","title":"Is Staff"},"mintable":{"items":{"type":"string"},"type":"array","title":"Mintable"},"staff_only_excluded":{"items":{"type":"string"},"type":"array","title":"Staff Only Excluded"},"beyond_your_role_excluded":{"items":{"type":"string"},"type":"array","title":"Beyond Your Role Excluded"},"org_wide_allowed":{"type":"boolean","title":"Org Wide Allowed"},"projects_considered":{"items":{"type":"string"},"type":"array","title":"Projects Considered"},"projects_without_role":{"items":{"type":"string"},"type":"array","title":"Projects Without Role"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"formula":{"additionalProperties":{"type":"string"},"type":"object","title":"Formula"}},"type":"object","required":["your_org_role","is_staff","mintable","org_wide_allowed"],"title":"MintableScopesOut"},"MissingBatchIn":{"properties":{"project_uuid":{"type":"string","minLength":1,"title":"Project Uuid"},"events":{"items":{"$ref":"#/components/schemas/MissingEventIn"},"type":"array","maxItems":500,"minItems":1,"title":"Events"}},"type":"object","required":["project_uuid","events"],"title":"MissingBatchIn"},"MissingBatchOut":{"properties":{"accepted":{"type":"integer","title":"Accepted"},"rejected":{"type":"integer","title":"Rejected"},"items":{"items":{"$ref":"#/components/schemas/MissingEventResult"},"type":"array","title":"Items"}},"type":"object","required":["accepted","rejected","items"],"title":"MissingBatchOut"},"MissingEventIn":{"properties":{"key":{"type":"string","maxLength":300,"minLength":1,"title":"Key"},"namespace":{"type":"string","title":"Namespace","default":"common"},"language_code":{"type":"string","maxLength":12,"minLength":2,"title":"Language Code"},"source_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Value"},"sdk_meta":{"anyOf":[{"$ref":"#/components/schemas/SDKMeta"},{"type":"null"}]}},"type":"object","required":["key","language_code"],"title":"MissingEventIn"},"MissingEventOut":{"properties":{"uuid":{"type":"string","title":"Uuid"},"namespace_uuid":{"type":"string","title":"Namespace Uuid"},"namespace_slug":{"type":"string","title":"Namespace Slug"},"language_code":{"type":"string","title":"Language Code"},"key":{"type":"string","title":"Key"},"source_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Value"},"count":{"type":"integer","title":"Count"},"first_seen":{"type":"string","format":"date-time","title":"First Seen"},"last_seen":{"type":"string","format":"date-time","title":"Last Seen"},"status":{"type":"string","enum":["open","acknowledged","resolved"],"title":"Status"},"usages":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Usages","default":[]}},"type":"object","required":["uuid","namespace_uuid","namespace_slug","language_code","key","source_value","count","first_seen","last_seen","status"],"title":"MissingEventOut"},"MissingEventPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/MissingEventOut"},"type":"array","title":"Items"},"cursor_next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor Next"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","cursor_next","total"],"title":"MissingEventPage"},"MissingEventPatchIn":{"properties":{"status":{"type":"string","enum":["open","acknowledged","resolved"],"title":"Status"}},"type":"object","required":["status"],"title":"MissingEventPatchIn"},"MissingEventResult":{"properties":{"uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uuid"},"key":{"type":"string","title":"Key"},"namespace":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace"},"language_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Code"},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count"},"deduplicated":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Deduplicated"},"published":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Published"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["key"],"title":"MissingEventResult"},"MissingKey":{"properties":{"uuid":{"type":"string","title":"Uuid"},"namespace_slug":{"type":"string","title":"Namespace Slug"},"namespace_uuid":{"type":"string","title":"Namespace Uuid"},"language_code":{"type":"string","title":"Language Code"},"key":{"type":"string","title":"Key"},"source_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Value"},"has_default_value":{"type":"boolean","title":"Has Default Value"},"count":{"type":"integer","title":"Count"},"first_seen":{"type":"string","format":"date-time","title":"First Seen"},"last_seen":{"type":"string","format":"date-time","title":"Last Seen"},"status":{"type":"string","title":"Status"}},"type":"object","required":["uuid","namespace_slug","namespace_uuid","language_code","key","source_value","has_default_value","count","first_seen","last_seen","status"],"title":"MissingKey"},"MissingKeysPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/MissingKey"},"type":"array","title":"Items"},"cursor_next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor Next"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","cursor_next","total"],"title":"MissingKeysPage"},"MissingKeysStats":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"total":{"type":"integer","title":"Total"},"with_default_value":{"type":"integer","title":"With Default Value"},"source_missing":{"type":"integer","title":"Source Missing","default":0},"by_status":{"items":{"$ref":"#/components/schemas/CountBucket"},"type":"array","title":"By Status"},"by_language":{"items":{"$ref":"#/components/schemas/CountBucket"},"type":"array","title":"By Language"},"by_namespace":{"items":{"$ref":"#/components/schemas/CountBucket"},"type":"array","title":"By Namespace"}},"type":"object","required":["project_uuid","total","with_default_value","by_status","by_language","by_namespace"],"title":"MissingKeysStats","description":"Lightweight count-only summary of missing-key events.\n\nReturned by `GET /v1/mcp/projects/{id}/missing-keys/stats` so an LLM\npaginating through `list_missing_keys` can see how many rows remain\noverall (and per language / namespace / status) before deciding when\nto stop. No payload data — counts only."},"MissingPlanIn":{"properties":{"tier":{"type":"string","enum":["standard","premium"],"title":"Tier","default":"standard"},"language_codes":{"items":{"type":"string"},"type":"array","maxItems":100,"minItems":1,"title":"Language Codes"},"idempotency_key":{"type":"string","maxLength":200,"minLength":1,"title":"Idempotency Key"}},"type":"object","required":["language_codes","idempotency_key"],"title":"MissingPlanIn"},"MissingPlanOut":{"properties":{"event_uuid":{"type":"string","title":"Event Uuid"},"key":{"type":"string","title":"Key"},"namespace_slug":{"type":"string","title":"Namespace Slug"},"source":{"type":"string","title":"Source"},"source_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Language"},"translations":{"items":{"$ref":"#/components/schemas/MissingPlanTranslation"},"type":"array","title":"Translations"},"credits_charged":{"type":"integer","title":"Credits Charged"},"credits_refunded":{"type":"integer","title":"Credits Refunded"}},"type":"object","required":["event_uuid","key","namespace_slug","source","source_language","translations","credits_charged","credits_refunded"],"title":"MissingPlanOut"},"MissingPlanTranslation":{"properties":{"language_code":{"type":"string","title":"Language Code"},"value":{"type":"string","title":"Value"}},"type":"object","required":["language_code","value"],"title":"MissingPlanTranslation"},"ModerateIn":{"properties":{"action":{"type":"string","enum":["approve","reject"],"title":"Action"},"note":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Note"}},"type":"object","required":["action"],"title":"ModerateIn"},"ModifiedKey":{"properties":{"namespace":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace"},"name":{"type":"string","title":"Name"},"languages":{"items":{"$ref":"#/components/schemas/LangChange"},"type":"array","title":"Languages"}},"type":"object","required":["name","languages"],"title":"ModifiedKey"},"MyRatingItem":{"properties":{"rating_id":{"type":"string","title":"Rating Id"},"namespace":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace"},"key":{"type":"string","title":"Key"},"language":{"type":"string","title":"Language"},"source_text":{"type":"string","title":"Source Text"},"source_locale":{"type":"string","title":"Source Locale"},"value":{"type":"string","title":"Value"},"stars":{"type":"integer","title":"Stars"},"translation_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Translation Hash"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["rating_id","namespace","key","language","source_text","source_locale","value","stars","translation_hash","created_at"],"title":"MyRatingItem"},"MyRatingsOut":{"properties":{"project_id":{"type":"string","title":"Project Id"},"ratings":{"items":{"$ref":"#/components/schemas/MyRatingItem"},"type":"array","title":"Ratings"}},"type":"object","required":["project_id","ratings"],"title":"MyRatingsOut"},"MySuggestionItem":{"properties":{"suggestion_id":{"type":"string","title":"Suggestion Id"},"namespace":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace"},"key":{"type":"string","title":"Key"},"language":{"type":"string","title":"Language"},"source_text":{"type":"string","title":"Source Text"},"source_locale":{"type":"string","title":"Source Locale"},"current_value":{"type":"string","title":"Current Value"},"suggested_text":{"type":"string","title":"Suggested Text"},"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comment"},"status":{"type":"string","title":"Status"},"my_rating":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"My Rating"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["suggestion_id","namespace","key","language","source_text","source_locale","current_value","suggested_text","comment","status","my_rating","created_at"],"title":"MySuggestionItem"},"MySuggestionView":{"properties":{"id":{"type":"string","title":"Id"},"text":{"type":"string","title":"Text"},"status":{"type":"string","enum":["pending","accepted","rejected"],"title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","text","status","created_at"],"title":"MySuggestionView","description":"User's most recent suggestion for one key+language (task 846).\n\nStatus is mapped from the storage vocabulary\n(`pending`/`approved`/`applied`/`rejected`) to the FE-facing\n`pending`/`accepted`/`rejected` tri-state — `approved` and `applied`\nboth mean the moderator agreed; the FE never needs to distinguish."},"MySuggestionsOut":{"properties":{"project_id":{"type":"string","title":"Project Id"},"suggestions":{"items":{"$ref":"#/components/schemas/MySuggestionItem"},"type":"array","title":"Suggestions"}},"type":"object","required":["project_id","suggestions"],"title":"MySuggestionsOut"},"NamespaceCreateOut":{"properties":{"namespace_uuid":{"type":"string","title":"Namespace Uuid"},"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"created":{"type":"boolean","title":"Created"}},"type":"object","required":["namespace_uuid","slug","name","description","created"],"title":"NamespaceCreateOut"},"NamespaceImport":{"properties":{"namespace":{"type":"string","minLength":1,"title":"Namespace","description":"namespace slug"},"translations":{"additionalProperties":{"additionalProperties":true,"type":"object"},"type":"object","title":"Translations","description":"language_code -> nested|flat i18next tree for this namespace"}},"type":"object","required":["namespace","translations"],"title":"NamespaceImport"},"NamespaceListOut":{"properties":{"items":{"items":{"$ref":"#/components/schemas/NamespaceOut"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"NamespaceListOut"},"NamespaceOut":{"properties":{"uuid":{"type":"string","title":"Uuid"},"project_uuid":{"type":"string","title":"Project Uuid"},"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["uuid","project_uuid","slug","name","description","created_at","updated_at"],"title":"NamespaceOut"},"NamespacePatchIn":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":120,"minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","title":"NamespacePatchIn"},"NamespaceSummary":{"properties":{"uuid":{"type":"string","title":"Uuid"},"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["uuid","slug","name","description"],"title":"NamespaceSummary"},"NewCanonicalKey":{"properties":{"name":{"type":"string","title":"Name"},"namespace":{"type":"string","title":"Namespace"}},"type":"object","required":["name","namespace"],"title":"NewCanonicalKey"},"NextActionLot":{"properties":{"category":{"type":"string","title":"Category"},"title":{"type":"string","title":"Title"},"count":{"type":"integer","title":"Count"},"severity":{"type":"string","title":"Severity"},"signal":{"type":"string","title":"Signal"},"deep_link":{"type":"string","title":"Deep Link"},"languages":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Languages"},"prompt":{"anyOf":[{"$ref":"#/components/schemas/PromptResolved"},{"type":"null"}]}},"type":"object","required":["category","title","count","severity","signal","deep_link"],"title":"NextActionLot"},"NextActionsOut":{"properties":{"v":{"type":"integer","title":"V","default":1},"project_uuid":{"type":"string","title":"Project Uuid"},"version_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Uuid"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"generated_at":{"type":"string","title":"Generated At"},"total_open":{"type":"integer","title":"Total Open"},"lots":{"items":{"$ref":"#/components/schemas/NextActionLot"},"type":"array","title":"Lots"}},"type":"object","required":["project_uuid","version_uuid","language","generated_at","total_open","lots"],"title":"NextActionsOut"},"NotificationListOut":{"properties":{"items":{"items":{"$ref":"#/components/schemas/NotificationOut"},"type":"array","title":"Items"},"unread_count":{"type":"integer","title":"Unread Count"}},"type":"object","required":["items","unread_count"],"title":"NotificationListOut"},"NotificationOut":{"properties":{"uuid":{"type":"string","title":"Uuid"},"type":{"type":"string","title":"Type"},"category":{"type":"string","title":"Category"},"title":{"type":"string","title":"Title"},"body":{"type":"string","title":"Body","default":""},"deep_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deep Link"},"payload":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Payload"},"org_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Uuid"},"project_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Uuid"},"actor_user_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor User Uuid"},"read_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Read At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["uuid","type","category","title","created_at"],"title":"NotificationOut"},"OnDemandCheckoutIn":{"properties":{"credits_needed":{"type":"integer","maximum":1000000.0,"minimum":1.0,"title":"Credits Needed"},"success_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Success Url"},"cancel_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Cancel Url"}},"type":"object","required":["credits_needed","success_url","cancel_url"],"title":"OnDemandCheckoutIn"},"OnboardingOut":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"steps":{"$ref":"#/components/schemas/OnboardingSteps"},"steps_team":{"anyOf":[{"$ref":"#/components/schemas/OnboardingSteps"},{"type":"null"}]},"steps_context":{"additionalProperties":{"$ref":"#/components/schemas/StepContext"},"type":"object","title":"Steps Context"},"code_profile":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Code Profile"},"last_scan_summary":{"anyOf":[{"$ref":"#/components/schemas/LastScanSummary"},{"type":"null"}]},"formula":{"additionalProperties":{"type":"string"},"type":"object","title":"Formula"}},"type":"object","required":["project_uuid","steps"],"title":"OnboardingOut"},"OnboardingSteps":{"properties":{"linked":{"type":"boolean","title":"Linked"},"connected":{"type":"boolean","title":"Connected"},"agents_installed":{"type":"boolean","title":"Agents Installed"},"scanned":{"type":"boolean","title":"Scanned"},"glossary_context":{"type":"boolean","title":"Glossary Context"},"translated":{"type":"boolean","title":"Translated"},"published":{"type":"boolean","title":"Published"}},"type":"object","required":["linked","connected","agents_installed","scanned","glossary_context","translated","published"],"title":"OnboardingSteps"},"OrgAuditEvent":{"properties":{"id":{"type":"string","title":"Id"},"ts":{"type":"string","format":"date-time","title":"Ts"},"actor_id":{"type":"string","title":"Actor Id"},"actor_email":{"type":"string","title":"Actor Email"},"actor_type":{"type":"string","title":"Actor Type","default":"user"},"actor_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor Label"},"action":{"type":"string","title":"Action"},"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id"},"entity_type":{"type":"string","title":"Entity Type"},"entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Id"},"before":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Before"},"after":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"After"}},"type":"object","required":["id","ts","actor_id","actor_email","action","entity_type","entity_id"],"title":"OrgAuditEvent"},"OrgAuditPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/OrgAuditEvent"},"type":"array","title":"Items"},"cursor_next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor Next"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","cursor_next","total"],"title":"OrgAuditPage"},"OrgCdnDailyPoint":{"properties":{"date":{"type":"string","title":"Date"},"bytes_egress":{"type":"integer","title":"Bytes Egress"},"egress_gb":{"type":"number","title":"Egress Gb"},"storage_bytes":{"type":"integer","title":"Storage Bytes"},"storage_gb":{"type":"number","title":"Storage Gb"}},"type":"object","required":["date","bytes_egress","egress_gb","storage_bytes","storage_gb"],"title":"OrgCdnDailyPoint"},"OrgCdnTimeseriesOut":{"properties":{"org_uuid":{"type":"string","title":"Org Uuid"},"days":{"type":"integer","title":"Days"},"points":{"items":{"$ref":"#/components/schemas/OrgCdnDailyPoint"},"type":"array","title":"Points"}},"type":"object","required":["org_uuid","days","points"],"title":"OrgCdnTimeseriesOut"},"OrgCdnUsageOut":{"properties":{"org_uuid":{"type":"string","title":"Org Uuid"},"year_month":{"type":"string","title":"Year Month"},"bytes_egress":{"type":"integer","title":"Bytes Egress"},"cdn_egress_mb":{"type":"number","title":"Cdn Egress Mb"},"storage_bytes":{"type":"integer","title":"Storage Bytes","default":0},"storage_mb":{"type":"number","title":"Storage Mb","default":0.0},"plan":{"type":"string","enum":["free","hobby","pro","team","enterprise"],"title":"Plan"},"cdn_egress_mb_limit":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cdn Egress Mb Limit"},"percent_of_limit":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Percent Of Limit"},"by_project":{"items":{"additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}]},"type":"object"},"type":"array","title":"By Project"}},"type":"object","required":["org_uuid","year_month","bytes_egress","cdn_egress_mb","plan","cdn_egress_mb_limit","percent_of_limit","by_project"],"title":"OrgCdnUsageOut"},"OrgCreateIn":{"properties":{"slug":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,62}[a-z0-9]$","title":"Slug"},"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"}},"type":"object","required":["slug","name"],"title":"OrgCreateIn"},"OrgDetailOut":{"properties":{"uuid":{"type":"string","title":"Uuid"},"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"plan":{"type":"string","enum":["free","hobby","pro","team","enterprise"],"title":"Plan"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"usage":{"$ref":"#/components/schemas/OrgUsageEmbed"}},"type":"object","required":["uuid","slug","name","plan","created_at","usage"],"title":"OrgDetailOut"},"OrgListOut":{"properties":{"items":{"items":{"$ref":"#/components/schemas/OrgOut"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"OrgListOut"},"OrgOut":{"properties":{"uuid":{"type":"string","title":"Uuid"},"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"plan":{"type":"string","enum":["free","hobby","pro","team","enterprise"],"title":"Plan"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["uuid","slug","name","plan","created_at"],"title":"OrgOut"},"OrgQuotaUsageOut":{"properties":{"org_uuid":{"type":"string","title":"Org Uuid"},"plan":{"type":"string","enum":["free","hobby","pro","team","enterprise"],"title":"Plan"},"year_month":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Year Month"},"rate_cents_per_gb":{"type":"integer","title":"Rate Cents Per Gb","default":0},"strings":{"$ref":"#/components/schemas/QuotaStrings"},"storage_gb":{"$ref":"#/components/schemas/QuotaCdnDim"},"bandwidth_gb":{"$ref":"#/components/schemas/QuotaCdnDim"}},"type":"object","required":["org_uuid","plan","year_month","strings","storage_gb","bandwidth_gb"],"title":"OrgQuotaUsageOut"},"OrgUsageAllOut":{"properties":{"cdn":{"$ref":"#/components/schemas/OrgCdnUsageOut"},"mcp":{"$ref":"#/components/schemas/OrgUsageSummaryOut"},"credits_balance":{"type":"integer","title":"Credits Balance"}},"type":"object","required":["cdn","mcp","credits_balance"],"title":"OrgUsageAllOut","description":"Unified Billing → Usage payload in ONE call: CDN egress + storage,\nMCP units, and the AI-credit balance (+ their limits). Saves the front\ncomposing /usage/cdn + /usage/summary + /credits."},"OrgUsageEmbed":{"properties":{"cdn_egress_mb":{"type":"number","title":"Cdn Egress Mb"},"cdn_egress_mb_limit":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cdn Egress Mb Limit"},"storage_mb":{"type":"number","title":"Storage Mb","default":0.0},"year_month":{"type":"string","title":"Year Month"}},"type":"object","required":["cdn_egress_mb","cdn_egress_mb_limit","year_month"],"title":"OrgUsageEmbed"},"OrgUsageEventOut":{"properties":{"uuid":{"type":"string","title":"Uuid"},"ts":{"type":"string","format":"date-time","title":"Ts"},"cmd":{"type":"string","title":"Cmd"},"category":{"type":"string","title":"Category"},"units":{"type":"integer","title":"Units"},"status":{"type":"integer","title":"Status"},"duration_ms":{"type":"integer","title":"Duration Ms"},"args_size_bytes":{"type":"integer","title":"Args Size Bytes"},"token_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token Uuid"},"user_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Uuid"},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code"}},"type":"object","required":["uuid","ts","cmd","category","units","status","duration_ms","args_size_bytes","token_uuid","user_uuid","error_code"],"title":"OrgUsageEventOut"},"OrgUsageEventsOut":{"properties":{"items":{"items":{"$ref":"#/components/schemas/OrgUsageEventOut"},"type":"array","title":"Items"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"}},"type":"object","required":["items","next_cursor"],"title":"OrgUsageEventsOut"},"OrgUsageSummaryOut":{"properties":{"period_start":{"type":"string","format":"date-time","title":"Period Start"},"period_end":{"type":"string","format":"date-time","title":"Period End"},"plan_code":{"type":"string","enum":["free","hobby","pro","team","enterprise"],"title":"Plan Code"},"mcp_units_used":{"type":"integer","title":"Mcp Units Used"},"mcp_units_quota":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Mcp Units Quota"},"mcp_units_remaining":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Mcp Units Remaining"},"mcp_writes_allowed":{"type":"boolean","title":"Mcp Writes Allowed"},"mcp_rate_per_min":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Mcp Rate Per Min"},"mcp_concurrent_sessions":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Mcp Concurrent Sessions"},"sessions_active":{"type":"integer","title":"Sessions Active"},"bundle_fetch_used":{"type":"integer","title":"Bundle Fetch Used"},"bundle_fetch_quota":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bundle Fetch Quota"},"bundle_fetch_remaining":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bundle Fetch Remaining"},"bundle_fetch_per_min":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bundle Fetch Per Min"}},"type":"object","required":["period_start","period_end","plan_code","mcp_units_used","mcp_units_quota","mcp_units_remaining","mcp_writes_allowed","mcp_rate_per_min","mcp_concurrent_sessions","sessions_active","bundle_fetch_used","bundle_fetch_quota","bundle_fetch_remaining","bundle_fetch_per_min"],"title":"OrgUsageSummaryOut"},"OrgUsageTimeseriesOut":{"properties":{"tz":{"type":"string","title":"Tz"},"points":{"items":{"$ref":"#/components/schemas/OrgUsageTimeseriesPoint"},"type":"array","title":"Points"}},"type":"object","required":["tz","points"],"title":"OrgUsageTimeseriesOut"},"OrgUsageTimeseriesPoint":{"properties":{"date":{"type":"string","title":"Date"},"billable_units":{"type":"integer","title":"Billable Units"},"free_calls":{"type":"integer","title":"Free Calls"},"errors":{"type":"integer","title":"Errors"},"p95_latency_ms":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P95 Latency Ms"}},"type":"object","required":["date","billable_units","free_calls","errors","p95_latency_ms"],"title":"OrgUsageTimeseriesPoint"},"OverlayPresence":{"properties":{"surfaces":{"items":{"type":"string"},"type":"array","title":"Surfaces"},"a11y":{"items":{"type":"string"},"type":"array","title":"A11Y"},"has_regional_variants":{"type":"boolean","title":"Has Regional Variants","default":false}},"type":"object","title":"OverlayPresence"},"PairIn":{"properties":{"pairing_token":{"type":"string","minLength":1,"title":"Pairing Token"},"device":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Device"}},"type":"object","required":["pairing_token"],"title":"PairIn"},"PairOut":{"properties":{"token":{"type":"string","title":"Token"},"channel":{"type":"string","title":"Channel"},"rtUrl":{"type":"string","title":"Rturl"},"expiresAt":{"type":"integer","title":"Expiresat"},"sessionId":{"type":"string","title":"Sessionid"}},"type":"object","required":["token","channel","rtUrl","expiresAt","sessionId"],"title":"PairOut"},"PasswordChangeIn":{"properties":{"current_password":{"type":"string","title":"Current Password"},"new_password":{"type":"string","minLength":8,"title":"New Password"}},"type":"object","required":["current_password","new_password"],"title":"PasswordChangeIn"},"PasswordResetConfirmIn":{"properties":{"token":{"type":"string","title":"Token"},"new_password":{"type":"string","minLength":8,"title":"New Password"}},"type":"object","required":["token","new_password"],"title":"PasswordResetConfirmIn"},"PasswordResetRequestIn":{"properties":{"email":{"type":"string","pattern":"^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$","title":"Email"}},"type":"object","required":["email"],"title":"PasswordResetRequestIn"},"PendingApprovalLang":{"properties":{"language_code":{"type":"string","title":"Language Code"},"pending_count":{"type":"integer","title":"Pending Count"},"sample_keys":{"items":{"type":"string"},"type":"array","title":"Sample Keys"}},"type":"object","required":["language_code","pending_count"],"title":"PendingApprovalLang"},"PendingApprovalOut":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"version_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Uuid"},"approval_gate_enabled":{"type":"boolean","title":"Approval Gate Enabled"},"total_pending":{"type":"integer","title":"Total Pending"},"languages":{"items":{"$ref":"#/components/schemas/PendingApprovalLang"},"type":"array","title":"Languages"}},"type":"object","required":["project_uuid","approval_gate_enabled","total_pending","languages"],"title":"PendingApprovalOut"},"PlaceholderEstimateOut":{"properties":{"units":{"type":"integer","title":"Units"},"credit_cost_per_unit":{"type":"integer","title":"Credit Cost Per Unit"},"credits_required":{"type":"integer","title":"Credits Required"},"balance":{"type":"integer","title":"Balance"},"sufficient":{"type":"boolean","title":"Sufficient"}},"type":"object","required":["units","credit_cost_per_unit","credits_required","balance","sufficient"],"title":"PlaceholderEstimateOut"},"PlaceholderLangMismatch":{"properties":{"language_code":{"type":"string","title":"Language Code"},"target_value":{"type":"string","title":"Target Value","default":""},"present":{"items":{"type":"string"},"type":"array","title":"Present","default":[]},"missing":{"items":{"type":"string"},"type":"array","title":"Missing"},"extra":{"items":{"type":"string"},"type":"array","title":"Extra"}},"type":"object","required":["language_code","missing","extra"],"title":"PlaceholderLangMismatch"},"PlaceholderMismatch":{"properties":{"source_value":{"type":"string","title":"Source Value"},"source_placeholders":{"items":{"type":"string"},"type":"array","title":"Source Placeholders"},"languages":{"items":{"$ref":"#/components/schemas/PlaceholderLangMismatch"},"type":"array","title":"Languages"}},"type":"object","required":["source_value","source_placeholders","languages"],"title":"PlaceholderMismatch"},"PlaceholderMismatchItem":{"properties":{"key_uuid":{"type":"string","title":"Key Uuid"},"key":{"type":"string","title":"Key"},"namespace_slug":{"type":"string","title":"Namespace Slug"},"language":{"type":"string","title":"Language"},"source_value":{"type":"string","title":"Source Value"},"source_vars":{"items":{"type":"string"},"type":"array","title":"Source Vars"},"target_value":{"type":"string","title":"Target Value"},"target_vars":{"items":{"type":"string"},"type":"array","title":"Target Vars"},"present":{"items":{"type":"string"},"type":"array","title":"Present","default":[]},"missing":{"items":{"type":"string"},"type":"array","title":"Missing"},"extra":{"items":{"type":"string"},"type":"array","title":"Extra"}},"type":"object","required":["key_uuid","key","namespace_slug","language","source_value","source_vars","target_value","target_vars","missing","extra"],"title":"PlaceholderMismatchItem"},"PlaceholderMismatchesOut":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"version_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Uuid"},"total":{"type":"integer","title":"Total"},"items":{"items":{"$ref":"#/components/schemas/PlaceholderMismatchItem"},"type":"array","title":"Items"}},"type":"object","required":["project_uuid","version_uuid","total","items"],"title":"PlaceholderMismatchesOut"},"PlaceholderPlanApplyIn":{"properties":{"proposal_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Proposal Id"},"items":{"items":{"$ref":"#/components/schemas/PlaceholderPlanApplyItem"},"type":"array","minItems":1,"title":"Items"}},"type":"object","required":["items"],"title":"PlaceholderPlanApplyIn"},"PlaceholderPlanApplyItem":{"properties":{"key_uuid":{"type":"string","title":"Key Uuid"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"translations":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Translations"}},"type":"object","required":["key_uuid"],"title":"PlaceholderPlanApplyItem"},"PlaceholderPlanApplyOut":{"properties":{"applied_keys":{"type":"integer","title":"Applied Keys"},"source_writes":{"type":"integer","title":"Source Writes"},"translation_writes":{"type":"integer","title":"Translation Writes"}},"type":"object","required":["applied_keys","source_writes","translation_writes"],"title":"PlaceholderPlanApplyOut"},"PlaceholderPlanIn":{"properties":{"key_uuids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Key Uuids"},"language_codes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Language Codes"}},"type":"object","title":"PlaceholderPlanIn"},"PlaceholderPlanItem":{"properties":{"key_uuid":{"type":"string","title":"Key Uuid"},"key":{"type":"string","title":"Key"},"namespace_slug":{"type":"string","title":"Namespace Slug"},"source":{"$ref":"#/components/schemas/PlaceholderSourceDiff"},"translations":{"items":{"$ref":"#/components/schemas/PlaceholderTransDiff"},"type":"array","title":"Translations"}},"type":"object","required":["key_uuid","key","namespace_slug","source","translations"],"title":"PlaceholderPlanItem"},"PlaceholderPlanOut":{"properties":{"proposal_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Proposal Id"},"items":{"items":{"$ref":"#/components/schemas/PlaceholderPlanItem"},"type":"array","title":"Items"},"credits_charged":{"type":"integer","title":"Credits Charged"},"credits_refunded":{"type":"integer","title":"Credits Refunded"}},"type":"object","required":["proposal_id","items","credits_charged","credits_refunded"],"title":"PlaceholderPlanOut"},"PlaceholderPlanProposeIn":{"properties":{"key_uuids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Key Uuids"},"language_codes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Language Codes"},"idempotency_key":{"type":"string","minLength":1,"title":"Idempotency Key"}},"type":"object","required":["idempotency_key"],"title":"PlaceholderPlanProposeIn"},"PlaceholderSourceDiff":{"properties":{"before":{"type":"string","title":"Before"},"after":{"type":"string","title":"After"},"changed":{"type":"boolean","title":"Changed"}},"type":"object","required":["before","after","changed"],"title":"PlaceholderSourceDiff"},"PlaceholderTransDiff":{"properties":{"language":{"type":"string","title":"Language"},"before":{"type":"string","title":"Before"},"after":{"type":"string","title":"After"}},"type":"object","required":["language","before","after"],"title":"PlaceholderTransDiff"},"PlanLimits":{"properties":{"projects":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Projects"},"keys":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Keys"},"languages":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Languages"},"members":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Members"},"cdn_gb":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cdn Gb"}},"type":"object","required":["projects","keys","languages","members","cdn_gb"],"title":"PlanLimits"},"PlanPublic":{"properties":{"tier":{"type":"string","enum":["free","hobby","pro","team"],"title":"Tier"},"label":{"type":"string","title":"Label"},"monthly_cents":{"type":"integer","title":"Monthly Cents"},"yearly_cents":{"type":"integer","title":"Yearly Cents"},"currency":{"type":"string","title":"Currency"},"limits":{"$ref":"#/components/schemas/PlanLimits"},"features":{"additionalProperties":{"type":"string","enum":["included","addon","none"]},"type":"object","title":"Features"},"stripe_price_id_monthly":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Price Id Monthly"},"stripe_price_id_yearly":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Price Id Yearly"}},"type":"object","required":["tier","label","monthly_cents","yearly_cents","currency","limits","features","stripe_price_id_monthly","stripe_price_id_yearly"],"title":"PlanPublic"},"PluralCategoriesBulkOut":{"properties":{"v":{"type":"integer","title":"V","default":1},"languages":{"items":{"$ref":"#/components/schemas/PluralCategoriesOut"},"type":"array","title":"Languages"}},"type":"object","required":["languages"],"title":"PluralCategoriesBulkOut"},"PluralCategoriesOut":{"properties":{"v":{"type":"integer","title":"V","default":1},"code":{"type":"string","title":"Code"},"categories":{"items":{"type":"string"},"type":"array","title":"Categories"},"examples":{"additionalProperties":{"type":"integer"},"type":"object","title":"Examples"}},"type":"object","required":["code","categories","examples"],"title":"PluralCategoriesOut"},"PortalIn":{"properties":{"return_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Return Url"}},"type":"object","required":["return_url"],"title":"PortalIn"},"PortalOut":{"properties":{"url":{"type":"string","title":"Url"}},"type":"object","required":["url"],"title":"PortalOut"},"PrefItemOut":{"properties":{"type_id":{"type":"string","title":"Type Id"},"label":{"type":"string","title":"Label"},"description":{"type":"string","title":"Description"},"category":{"type":"string","title":"Category"},"scope":{"type":"string","title":"Scope"},"forced":{"type":"boolean","title":"Forced"},"channels":{"items":{"type":"string"},"type":"array","title":"Channels"},"default":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Default"},"effective":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Effective"},"source":{"type":"string","title":"Source"}},"type":"object","required":["type_id","label","description","category","scope","forced","channels","default","effective","source"],"title":"PrefItemOut"},"PrefsOut":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PrefItemOut"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"PrefsOut"},"PrefsPutIn":{"properties":{"prefs":{"additionalProperties":{"additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"type":"object"},"type":"object","title":"Prefs"}},"type":"object","title":"PrefsPutIn"},"PresenceAck":{"properties":{"ok":{"type":"boolean","title":"Ok","default":true}},"type":"object","title":"PresenceAck"},"PresenceItem":{"properties":{"key_uuid":{"type":"string","title":"Key Uuid"},"language_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Uuid"},"user_uuid":{"type":"string","title":"User Uuid"},"user_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Name"},"expires_in":{"type":"integer","title":"Expires In"}},"type":"object","required":["key_uuid","user_uuid","expires_in"],"title":"PresenceItem"},"PresenceOut":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PresenceItem"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"PresenceOut"},"PricingPublicOut":{"properties":{"plans":{"items":{"$ref":"#/components/schemas/PlanPublic"},"type":"array","title":"Plans"}},"type":"object","required":["plans"],"title":"PricingPublicOut"},"ProjectCdnDailyPoint":{"properties":{"date":{"type":"string","title":"Date"},"bytes_egress":{"type":"integer","title":"Bytes Egress"},"egress_gb":{"type":"number","title":"Egress Gb"},"storage_bytes":{"type":"integer","title":"Storage Bytes"},"storage_gb":{"type":"number","title":"Storage Gb"}},"type":"object","required":["date","bytes_egress","egress_gb","storage_bytes","storage_gb"],"title":"ProjectCdnDailyPoint"},"ProjectCdnGeoOut":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"days":{"type":"integer","title":"Days"},"countries":{"items":{"$ref":"#/components/schemas/ProjectCdnGeoPoint"},"type":"array","title":"Countries"}},"type":"object","required":["project_uuid","days","countries"],"title":"ProjectCdnGeoOut"},"ProjectCdnGeoPoint":{"properties":{"country":{"type":"string","title":"Country"},"requests":{"type":"integer","title":"Requests"},"bytes_egress":{"type":"integer","title":"Bytes Egress"},"egress_gb":{"type":"number","title":"Egress Gb"}},"type":"object","required":["country","requests","bytes_egress","egress_gb"],"title":"ProjectCdnGeoPoint"},"ProjectCdnHourlyOut":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"hours":{"type":"integer","title":"Hours"},"points":{"items":{"$ref":"#/components/schemas/ProjectCdnHourlyPoint"},"type":"array","title":"Points"}},"type":"object","required":["project_uuid","hours","points"],"title":"ProjectCdnHourlyOut"},"ProjectCdnHourlyPoint":{"properties":{"hour":{"type":"string","title":"Hour"},"bytes_egress":{"type":"integer","title":"Bytes Egress"},"egress_gb":{"type":"number","title":"Egress Gb"},"requests":{"type":"integer","title":"Requests"}},"type":"object","required":["hour","bytes_egress","egress_gb","requests"],"title":"ProjectCdnHourlyPoint"},"ProjectCdnTimeseriesOut":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"days":{"type":"integer","title":"Days"},"last_published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Published At"},"points":{"items":{"$ref":"#/components/schemas/ProjectCdnDailyPoint"},"type":"array","title":"Points"},"consumed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Consumed"}},"type":"object","required":["project_uuid","days","points"],"title":"ProjectCdnTimeseriesOut"},"ProjectCreateIn":{"properties":{"slug":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,62}[a-z0-9]$","title":"Slug"},"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"source_language":{"type":"string","title":"Source Language","default":"en"},"settings":{"additionalProperties":true,"type":"object","title":"Settings"},"languages":{"items":{"$ref":"#/components/schemas/ProjectInitialLanguage"},"type":"array","title":"Languages","description":"Languages to provision at creation. The `source_language` is added automatically with `is_source=true` if not present in this list."},"default_namespace":{"anyOf":[{"$ref":"#/components/schemas/ProjectInitialNamespace"},{"type":"null"}],"description":"Default namespace to provision. When omitted, a `common` namespace is created automatically so the editor isn't empty on first load."}},"type":"object","required":["slug","name"],"title":"ProjectCreateIn"},"ProjectInfo":{"properties":{"uuid":{"type":"string","title":"Uuid"},"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"source_language":{"type":"string","title":"Source Language"},"key_count":{"type":"integer","title":"Key Count"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"languages":{"items":{"$ref":"#/components/schemas/LanguageSummary"},"type":"array","title":"Languages"},"namespaces":{"items":{"$ref":"#/components/schemas/NamespaceSummary"},"type":"array","title":"Namespaces"},"ci_structural_blocking":{"type":"boolean","title":"Ci Structural Blocking","default":false}},"type":"object","required":["uuid","slug","name","source_language","key_count","created_at","languages","namespaces"],"title":"ProjectInfo"},"ProjectInitialLanguage":{"properties":{"code":{"type":"string","title":"Code"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"fallback":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback"}},"type":"object","required":["code"],"title":"ProjectInitialLanguage"},"ProjectInitialNamespace":{"properties":{"slug":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,62}[a-z0-9]$","title":"Slug","default":"common"},"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name","default":"Common"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","title":"ProjectInitialNamespace"},"ProjectListOut":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ProjectOut"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"ProjectListOut"},"ProjectMemberAddIn":{"properties":{"email":{"type":"string","pattern":"^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$","title":"Email"},"role":{"type":"string","enum":["owner","admin","developer","translator","qa","reviewer","viewer"],"title":"Role"},"languages_scope":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Languages Scope"}},"type":"object","required":["email","role"],"title":"ProjectMemberAddIn"},"ProjectMemberListOut":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ProjectMemberOut"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"ProjectMemberListOut"},"ProjectMemberOut":{"properties":{"uuid":{"type":"string","title":"Uuid"},"user_uuid":{"type":"string","title":"User Uuid"},"email":{"type":"string","title":"Email"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"role":{"type":"string","enum":["owner","admin","developer","translator","qa","reviewer","viewer"],"title":"Role"},"languages_scope":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Languages Scope"},"inherited_from_org":{"type":"boolean","title":"Inherited From Org","default":false},"is_bot":{"type":"boolean","title":"Is Bot","default":false},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["uuid","user_uuid","email","name","role","languages_scope","created_at"],"title":"ProjectMemberOut"},"ProjectMemberPatchIn":{"properties":{"role":{"anyOf":[{"type":"string","enum":["owner","admin","developer","translator","qa","reviewer","viewer"]},{"type":"null"}],"title":"Role"},"languages_scope":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Languages Scope"},"clear_languages_scope":{"type":"boolean","title":"Clear Languages Scope","default":false}},"type":"object","title":"ProjectMemberPatchIn"},"ProjectOut":{"properties":{"uuid":{"type":"string","title":"Uuid"},"org_uuid":{"type":"string","title":"Org Uuid"},"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"source_language":{"type":"string","title":"Source Language"},"settings":{"additionalProperties":true,"type":"object","title":"Settings"},"cdn_publish_roles_effective":{"items":{"type":"string","enum":["owner","admin","developer","translator","qa","reviewer","viewer"]},"type":"array","title":"Cdn Publish Roles Effective","description":"Roles allowed to publish this project to the CDN, resolved from `settings.cdn_publish_roles` (or the developer+ default when unset). Read-only; edit via `settings.cdn_publish_roles`."},"require_approval_before_publish":{"type":"boolean","title":"Require Approval Before Publish","default":false},"key_count":{"type":"integer","title":"Key Count","description":"Active keys in the production version (computed live, never the denormalised counter).","default":0},"language_count":{"type":"integer","title":"Language Count","description":"Languages configured on the project, SOURCE INCLUDED (no target language = 1)."},"completion_pct":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Completion Pct","description":"0..100 on the production version: pairs (target language x active key with a non-empty source value) at status translated/reviewed/approved, over all such pairs; 0 when there is none. Source language excluded. (`/coverage` is being aligned on this definition in #389.)"},"open_task_count":{"type":"integer","title":"Open Task Count","description":"Project tasks still pending: status `open` or `in_progress` (`done`/`dismissed` are closed)."},"role":{"anyOf":[{"type":"string","enum":["owner","admin","developer","translator","qa","reviewer","viewer"]},{"type":"null"}],"title":"Role"},"auto_translate_missing":{"type":"boolean","title":"Auto Translate Missing","default":false},"auto_translate_paused_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Auto Translate Paused Until"},"auto_translate_last_burst_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Auto Translate Last Burst At"},"auto_translate_last_burst_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Auto Translate Last Burst Count"},"auto_translate_last_burst_keys":{"items":{"type":"string"},"type":"array","title":"Auto Translate Last Burst Keys"},"bunny_zone_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bunny Zone Id"},"cdn_hostname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cdn Hostname"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"source_language_changed":{"type":"boolean","title":"Source Language Changed","default":false},"cdn_republish_recommended":{"type":"boolean","title":"Cdn Republish Recommended","default":false},"old_source_rows_reset":{"type":"integer","title":"Old Source Rows Reset","default":0}},"type":"object","required":["uuid","org_uuid","slug","name","source_language","language_count","completion_pct","open_task_count","created_at","updated_at"],"title":"ProjectOut"},"ProjectPatchIn":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":120,"minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"source_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Language"},"settings":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Settings"},"auto_translate_missing":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Translate Missing"},"reset_old_source_to_review":{"type":"boolean","title":"Reset Old Source To Review","default":true}},"type":"object","title":"ProjectPatchIn"},"ProjectRoleEntry":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"project_name":{"type":"string","title":"Project Name"},"role":{"type":"string","enum":["owner","admin","developer","translator","qa","reviewer","viewer"],"title":"Role"},"languages_scope":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Languages Scope"},"inherited_from_org":{"type":"boolean","title":"Inherited From Org","default":false}},"type":"object","required":["project_uuid","project_name","role"],"title":"ProjectRoleEntry","description":"One project on which a member holds a role — explicit or inherited.\n\n`inherited_from_org` is True when the role comes from the person's org role\n(owner/admin auto-hold owner/admin on EVERY project, with no project_members\nrow); `languages_scope` is null for inherited rows and for explicit rows with\nno language restriction."},"ProjectRoleResult":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"project_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Name"},"role":{"type":"string","enum":["owner","admin","developer","translator","qa","reviewer","viewer"],"title":"Role"},"languages_scope":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Languages Scope"}},"type":"object","required":["project_uuid","role"],"title":"ProjectRoleResult"},"ProjectSummary":{"properties":{"uuid":{"type":"string","title":"Uuid"},"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"source_language":{"type":"string","title":"Source Language"},"key_count":{"type":"integer","title":"Key Count"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["uuid","slug","name","source_language","key_count","created_at"],"title":"ProjectSummary"},"ProjectsList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ProjectSummary"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"ProjectsList"},"PromoteMissingIn":{"properties":{"uuids":{"items":{"type":"string"},"type":"array","maxItems":500,"minItems":1,"title":"Uuids","description":"Missing-event uuids to promote into project keys (single or bulk)."}},"type":"object","required":["uuids"],"title":"PromoteMissingIn"},"PromoteMissingOut":{"properties":{"results":{"items":{"$ref":"#/components/schemas/PromoteMissingResult"},"type":"array","title":"Results"},"summary":{"$ref":"#/components/schemas/BulkSummary"}},"type":"object","required":["results","summary"],"title":"PromoteMissingOut"},"PromoteMissingResult":{"properties":{"uuid":{"type":"string","title":"Uuid"},"status":{"type":"string","title":"Status"},"key_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Uuid"},"key_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Name"},"namespace_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace Slug"},"created":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Created"},"error":{"anyOf":[{"$ref":"#/components/schemas/BulkItemError"},{"type":"null"}]}},"type":"object","required":["uuid","status"],"title":"PromoteMissingResult"},"PromptCreateIn":{"properties":{"key":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,62}[a-z0-9]$","title":"Key"},"title":{"type":"string","maxLength":200,"minLength":1,"title":"Title"},"template":{"type":"string","maxLength":8000,"minLength":1,"title":"Template"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"section":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Section"},"subsection":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subsection"},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"},"phase":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phase"},"agent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent"},"i18n_key":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"I18N Key"},"variables":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Variables"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"enabled":{"type":"boolean","title":"Enabled","default":true},"is_default":{"type":"boolean","title":"Is Default","default":true}},"type":"object","required":["key","title","template"],"title":"PromptCreateIn"},"PromptDetailOut":{"properties":{"v":{"type":"integer","title":"V","default":1},"prompt":{"$ref":"#/components/schemas/PromptOut"}},"type":"object","required":["prompt"],"title":"PromptDetailOut"},"PromptListOut":{"properties":{"v":{"type":"integer","title":"V","default":1},"items":{"items":{"$ref":"#/components/schemas/PromptOut"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","total"],"title":"PromptListOut"},"PromptOut":{"properties":{"key":{"type":"string","title":"Key"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"section":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Section"},"subsection":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subsection"},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"},"phase":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phase"},"agent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent"},"i18n_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"I18N Key"},"title":{"type":"string","title":"Title"},"template":{"type":"string","title":"Template"},"variables":{"items":{"type":"string"},"type":"array","title":"Variables"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"enabled":{"type":"boolean","title":"Enabled"},"is_default":{"type":"boolean","title":"Is Default"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["key","category","section","subsection","tier","phase","agent","i18n_key","title","template","variables","description","enabled","is_default","updated_at"],"title":"PromptOut"},"PromptPatchIn":{"properties":{"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"section":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Section"},"subsection":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subsection"},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"},"phase":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phase"},"agent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent"},"i18n_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"I18N Key"},"title":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Title"},"template":{"anyOf":[{"type":"string","maxLength":8000,"minLength":1},{"type":"null"}],"title":"Template"},"variables":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Variables"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"is_default":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Default"}},"type":"object","title":"PromptPatchIn"},"PromptResolved":{"properties":{"key":{"type":"string","title":"Key"},"template":{"type":"string","title":"Template"},"resolved":{"type":"string","title":"Resolved"},"variables_used":{"additionalProperties":true,"type":"object","title":"Variables Used"}},"type":"object","required":["key","template","resolved","variables_used"],"title":"PromptResolved"},"ProposePlanIn":{"properties":{"source_value":{"type":"string","title":"Source Value"},"namespace_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace Slug"},"regenerate":{"type":"boolean","title":"Regenerate","default":false}},"type":"object","required":["source_value"],"title":"ProposePlanIn"},"ProposeTranslationsBulkIn":{"properties":{"items":{"items":{"$ref":"#/components/schemas/TranslationBulkItem"},"type":"array","maxItems":500,"minItems":1,"title":"Items"}},"type":"object","required":["items"],"title":"ProposeTranslationsBulkIn"},"ProposeTranslationsBulkOut":{"properties":{"results":{"items":{"$ref":"#/components/schemas/TranslationBulkResult"},"type":"array","title":"Results"},"summary":{"$ref":"#/components/schemas/BulkSummary"},"glossary_violation_count":{"type":"integer","title":"Glossary Violation Count","default":0},"placeholder_mismatch_count":{"type":"integer","title":"Placeholder Mismatch Count","default":0}},"type":"object","required":["results","summary"],"title":"ProposeTranslationsBulkOut"},"ProposedPlanOut":{"properties":{"source_value":{"type":"string","title":"Source Value"},"namespace_slug":{"type":"string","title":"Namespace Slug"},"recommendation":{"type":"string","title":"Recommendation"},"merge_plan":{"anyOf":[{"$ref":"#/components/schemas/MergePlan"},{"type":"null"}]},"reason":{"type":"string","title":"Reason"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"},"charged":{"type":"boolean","title":"Charged","default":false},"cost":{"type":"integer","title":"Cost","default":1},"cached":{"type":"boolean","title":"Cached","default":false}},"type":"object","required":["source_value","namespace_slug","recommendation","reason"],"title":"ProposedPlanOut"},"QuotaCdnDim":{"properties":{"used":{"type":"number","title":"Used"},"included":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Included"},"signal":{"type":"string","title":"Signal"},"overage_gb":{"type":"number","title":"Overage Gb","default":0.0},"projected_cents":{"type":"integer","title":"Projected Cents","default":0}},"type":"object","required":["used","included","signal"],"title":"QuotaCdnDim"},"QuotaStrings":{"properties":{"used":{"type":"integer","title":"Used"},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"},"signal":{"type":"string","title":"Signal"},"breakdown":{"additionalProperties":{"type":"integer"},"type":"object","title":"Breakdown"}},"type":"object","required":["used","limit","signal","breakdown"],"title":"QuotaStrings"},"QuotaWindow":{"properties":{"used":{"type":"integer","title":"Used"},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"},"remaining":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Remaining"},"reset_at":{"type":"string","format":"date-time","title":"Reset At"}},"type":"object","required":["used","limit","remaining","reset_at"],"title":"QuotaWindow","description":"Monthly unit budget for this org.\n\n`limit` and `remaining` are null on unlimited plans (enterprise). `reset_at`\nis the start of the next calendar month (UTC)."},"RateWindow":{"properties":{"used":{"type":"integer","title":"Used"},"limit_per_min":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit Per Min"},"remaining":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Remaining"},"reset_at":{"type":"string","format":"date-time","title":"Reset At"}},"type":"object","required":["used","limit_per_min","remaining","reset_at"],"title":"RateWindow","description":"Per-minute request budget. Mirrors `X-MCP-RateLimit-*` response headers."},"RatingIn":{"properties":{"namespace":{"type":"string","title":"Namespace","default":"common"},"key":{"type":"string","maxLength":300,"minLength":1,"title":"Key"},"language":{"type":"string","maxLength":12,"minLength":2,"title":"Language"},"translation_hash":{"type":"string","maxLength":64,"minLength":1,"title":"Translation Hash"},"stars":{"type":"integer","maximum":5.0,"minimum":1.0,"title":"Stars"}},"type":"object","required":["key","language","translation_hash","stars"],"title":"RatingIn"},"RatingsBatchIn":{"properties":{"ratings":{"items":{"$ref":"#/components/schemas/RatingIn"},"type":"array","maxItems":50,"minItems":1,"title":"Ratings"}},"type":"object","required":["ratings"],"title":"RatingsBatchIn"},"ReadAllOut":{"properties":{"updated":{"type":"integer","title":"Updated"},"unread_count":{"type":"integer","title":"Unread Count"}},"type":"object","required":["updated","unread_count"],"title":"ReadAllOut"},"RecommendSurfacesOut":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"version_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Uuid"},"active_a11y_surfaces":{"items":{"type":"string"},"type":"array","title":"Active A11Y Surfaces"},"keys_scanned":{"type":"integer","title":"Keys Scanned"},"keys_with_gaps":{"type":"integer","title":"Keys With Gaps"},"gaps_by_surface":{"additionalProperties":{"type":"integer"},"type":"object","title":"Gaps By Surface"},"items":{"items":{"$ref":"#/components/schemas/RecommendedKey"},"type":"array","title":"Items"}},"type":"object","required":["project_uuid","version_uuid","active_a11y_surfaces","keys_scanned","keys_with_gaps","gaps_by_surface","items"],"title":"RecommendSurfacesOut"},"RecommendedKey":{"properties":{"key_uuid":{"type":"string","title":"Key Uuid"},"key_name":{"type":"string","title":"Key Name"},"namespace_slug":{"type":"string","title":"Namespace Slug"},"type":{"type":"string","title":"Type"},"base_role":{"type":"string","title":"Base Role"},"recommended_surfaces":{"items":{"$ref":"#/components/schemas/SurfaceRecommendation"},"type":"array","title":"Recommended Surfaces"},"has_gap":{"type":"boolean","title":"Has Gap"}},"type":"object","required":["key_uuid","key_name","namespace_slug","type","base_role","recommended_surfaces","has_gap"],"title":"RecommendedKey"},"ReconcileOut":{"properties":{"v":{"type":"integer","title":"V","default":1},"opened":{"type":"integer","title":"Opened"},"closed":{"type":"integer","title":"Closed"},"reconcilers":{"items":{"type":"string"},"type":"array","title":"Reconcilers"}},"type":"object","required":["opened","closed"],"title":"ReconcileOut"},"RecoveryCodesOut":{"properties":{"recovery_codes":{"items":{"type":"string"},"type":"array","title":"Recovery Codes"}},"type":"object","required":["recovery_codes"],"title":"RecoveryCodesOut"},"RegenerateRecoveryIn":{"properties":{"current_password":{"type":"string","title":"Current Password"}},"type":"object","required":["current_password"],"title":"RegenerateRecoveryIn"},"RemediationApproveIn":{"properties":{"version_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}},"type":"object","title":"RemediationApproveIn"},"RemediationItem":{"properties":{"key_uuid":{"type":"string","title":"Key Uuid"},"locale":{"type":"string","title":"Locale"},"surface":{"type":"string","title":"Surface"},"decision":{"type":"string","pattern":"^(apply|ignore)$","title":"Decision"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value"}},"type":"object","required":["key_uuid","locale","surface","decision"],"title":"RemediationItem"},"RemediationItemOut":{"properties":{"key_uuid":{"type":"string","title":"Key Uuid"},"locale":{"type":"string","title":"Locale"},"surface":{"type":"string","title":"Surface"},"decision":{"type":"string","pattern":"^(apply|ignore)$","title":"Decision"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value"},"applied":{"type":"boolean","title":"Applied","default":false}},"type":"object","required":["key_uuid","locale","surface","decision"],"title":"RemediationItemOut"},"RemediationPlanBody":{"properties":{"items":{"items":{"$ref":"#/components/schemas/RemediationItem"},"type":"array","minItems":1,"title":"Items"}},"type":"object","required":["items"],"title":"RemediationPlanBody"},"RemediationPlanIn":{"properties":{"version_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"},"plan":{"$ref":"#/components/schemas/RemediationPlanBody"}},"type":"object","required":["plan"],"title":"RemediationPlanIn"},"RemediationPlanOut":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"version_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Uuid"},"status":{"type":"string","title":"Status"},"approved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Approved At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"items":{"items":{"$ref":"#/components/schemas/RemediationItemOut"},"type":"array","title":"Items"}},"type":"object","required":["project_uuid","version_uuid","status","items"],"title":"RemediationPlanOut"},"RepoLinkConfig":{"properties":{"strict":{"type":"boolean","title":"Strict","default":false},"languages":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Languages"},"comment":{"type":"boolean","title":"Comment","default":true}},"type":"object","title":"RepoLinkConfig"},"RepoLinkWire":{"properties":{"installation_id":{"type":"integer","title":"Installation Id"},"repo_full_name":{"type":"string","minLength":1,"title":"Repo Full Name"},"project_uuid":{"type":"string","minLength":1,"title":"Project Uuid"},"config":{"$ref":"#/components/schemas/RepoLinkConfig"}},"type":"object","required":["installation_id","repo_full_name","project_uuid"],"title":"RepoLinkWire"},"RepoLinksReplaceIn":{"properties":{"repo_links":{"items":{"$ref":"#/components/schemas/RepoLinkWire"},"type":"array","title":"Repo Links"}},"type":"object","title":"RepoLinksReplaceIn"},"ResolveIn":{"properties":{"choice":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Choice"},"note":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Note"}},"type":"object","title":"ResolveIn"},"ResolveOrphansOut":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"scanned":{"type":"integer","title":"Scanned"},"resolved":{"type":"integer","title":"Resolved"}},"type":"object","required":["project_uuid","scanned","resolved"],"title":"ResolveOrphansOut"},"ResolveOut":{"properties":{"v":{"type":"integer","title":"V","default":1},"human_needed":{"$ref":"#/components/schemas/HumanNeededOut"}},"type":"object","required":["human_needed"],"title":"ResolveOut"},"ResolvePromptOut":{"properties":{"v":{"type":"integer","title":"V","default":1},"prompt":{"$ref":"#/components/schemas/PromptResolved"}},"type":"object","required":["prompt"],"title":"ResolvePromptOut"},"ResolvedDuplicate":{"properties":{"source_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Value"},"survivor_outcome":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Survivor Outcome"},"plan_recorded":{"type":"boolean","title":"Plan Recorded","default":false},"merge_plan":{"anyOf":[{"$ref":"#/components/schemas/ResolvedMergePlan"},{"type":"null"}]},"canonical_key_uuids":{"items":{"type":"string"},"type":"array","title":"Canonical Key Uuids","default":[]},"canonical_key_names":{"items":{"type":"string"},"type":"array","title":"Canonical Key Names","default":[]},"trashed_key_uuids":{"items":{"type":"string"},"type":"array","title":"Trashed Key Uuids","default":[]},"trashed_key_names":{"items":{"type":"string"},"type":"array","title":"Trashed Key Names","default":[]},"files_modified":{"items":{"$ref":"#/components/schemas/FileModified"},"type":"array","title":"Files Modified","default":[]},"resolved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Resolved At"},"resolved_by_user_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolved By User Uuid"},"resolved_by_api_key_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolved By Api Key Uuid"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","title":"ResolvedDuplicate"},"ResolvedMergeCluster":{"properties":{"canonical_key_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Canonical Key Uuid"},"canonical_key_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Canonical Key Name"},"redundant_key_uuids":{"items":{"type":"string"},"type":"array","title":"Redundant Key Uuids","default":[]},"redundant_key_names":{"items":{"type":"string"},"type":"array","title":"Redundant Key Names","default":[]},"applied":{"type":"boolean","title":"Applied","default":false}},"type":"object","title":"ResolvedMergeCluster"},"ResolvedMergePlan":{"properties":{"survivor_outcome":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Survivor Outcome"},"clusters":{"items":{"$ref":"#/components/schemas/ResolvedMergeCluster"},"type":"array","title":"Clusters","default":[]}},"type":"object","title":"ResolvedMergePlan"},"RevertIn":{"properties":{"to_version":{"type":"integer","title":"To Version"},"surface":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Surface"}},"type":"object","required":["to_version"],"title":"RevertIn"},"ReviewActionOut":{"properties":{"results":{"items":{"$ref":"#/components/schemas/ReviewActionResult"},"type":"array","title":"Results"},"summary":{"$ref":"#/components/schemas/BulkSummary"}},"type":"object","required":["results","summary"],"title":"ReviewActionOut"},"ReviewActionResult":{"properties":{"index":{"type":"integer","title":"Index"},"status":{"type":"string","title":"Status"},"key_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Uuid"},"language_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Uuid"},"translation_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Translation Uuid"},"version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Version"},"error":{"anyOf":[{"$ref":"#/components/schemas/BulkItemError"},{"type":"null"}]}},"type":"object","required":["index","status"],"title":"ReviewActionResult"},"ReviewApproveIn":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ReviewItemIn"},"type":"array","maxItems":500,"minItems":1,"title":"Items"}},"type":"object","required":["items"],"title":"ReviewApproveIn"},"ReviewDiff":{"properties":{"previous_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous Value"},"previous_status":{"anyOf":[{"type":"string","enum":["missing","draft","translated","reviewed","approved","rejected"]},{"type":"null"}],"title":"Previous Status"}},"type":"object","title":"ReviewDiff"},"ReviewFindingAcceptOut":{"properties":{"finding":{"$ref":"#/components/schemas/ReviewFindingOut"},"translation_uuid":{"type":"string","title":"Translation Uuid"},"translation_version":{"type":"integer","title":"Translation Version"},"translation_status":{"type":"string","title":"Translation Status"}},"type":"object","required":["finding","translation_uuid","translation_version","translation_status"],"title":"ReviewFindingAcceptOut"},"ReviewFindingBulkResult":{"properties":{"index":{"type":"integer","title":"Index"},"status":{"type":"string","title":"Status"},"finding_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Finding Uuid"},"result":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Result"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail"}},"type":"object","required":["index","status"],"title":"ReviewFindingBulkResult"},"ReviewFindingOut":{"properties":{"uuid":{"type":"string","title":"Uuid"},"project_uuid":{"type":"string","title":"Project Uuid"},"version_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Uuid"},"key_uuid":{"type":"string","title":"Key Uuid"},"language_uuid":{"type":"string","title":"Language Uuid"},"key_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Name"},"namespace_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace Slug"},"language_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Code"},"category":{"type":"string","enum":["identical_to_source","too_long","too_literal","placeholder","terminology","tone","spelling","other"],"title":"Category"},"severity":{"type":"string","enum":["info","warning","error"],"title":"Severity"},"current_value":{"type":"string","title":"Current Value"},"translation_version":{"type":"integer","title":"Translation Version"},"suggested_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggested Value"},"rationale":{"type":"string","title":"Rationale"},"status":{"type":"string","enum":["open","accepted","rejected","stale"],"title":"Status"},"reject_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reject Reason"},"agent":{"additionalProperties":true,"type":"object","title":"Agent"},"created_at":{"title":"Created At"},"updated_at":{"title":"Updated At"},"resolved_at":{"title":"Resolved At"},"resolved_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolved By"}},"type":"object","required":["uuid","project_uuid","key_uuid","language_uuid","category","severity","current_value","translation_version","suggested_value","rationale","status","reject_reason","created_at","updated_at"],"title":"ReviewFindingOut"},"ReviewFindingRejectIn":{"properties":{"reason":{"type":"string","maxLength":1000,"minLength":1,"title":"Reason"}},"type":"object","required":["reason"],"title":"ReviewFindingRejectIn"},"ReviewFindingReportIn":{"properties":{"namespace":{"type":"string","minLength":1,"title":"Namespace"},"key":{"type":"string","minLength":1,"title":"Key"},"language_code":{"type":"string","maxLength":12,"minLength":2,"title":"Language Code"},"category":{"type":"string","enum":["identical_to_source","too_long","too_literal","placeholder","terminology","tone","spelling","other"],"title":"Category"},"severity":{"type":"string","enum":["info","warning","error"],"title":"Severity","default":"warning"},"suggested_value":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}],"title":"Suggested Value"},"rationale":{"type":"string","maxLength":1000,"minLength":1,"title":"Rationale"}},"type":"object","required":["namespace","key","language_code","category","rationale"],"title":"ReviewFindingReportIn"},"ReviewFindingReportOut":{"properties":{"finding_uuid":{"type":"string","title":"Finding Uuid"},"result":{"type":"string","title":"Result"},"status":{"type":"string","title":"Status"}},"type":"object","required":["finding_uuid","result","status"],"title":"ReviewFindingReportOut"},"ReviewFindingsBulkIn":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ReviewFindingReportIn"},"type":"array","maxItems":200,"minItems":1,"title":"Items"}},"type":"object","required":["items"],"title":"ReviewFindingsBulkIn"},"ReviewFindingsBulkOut":{"properties":{"results":{"items":{"$ref":"#/components/schemas/ReviewFindingBulkResult"},"type":"array","title":"Results"},"ok":{"type":"integer","title":"Ok"},"errors":{"type":"integer","title":"Errors"}},"type":"object","required":["results","ok","errors"],"title":"ReviewFindingsBulkOut"},"ReviewFindingsOut":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ReviewFindingOut"},"type":"array","title":"Items"},"cursor_next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor Next"},"counts_by_category":{"additionalProperties":{"type":"integer"},"type":"object","title":"Counts By Category"},"counts_by_status":{"additionalProperties":{"type":"integer"},"type":"object","title":"Counts By Status"}},"type":"object","required":["items","cursor_next"],"title":"ReviewFindingsOut"},"ReviewFindingsPage":{"properties":{"items":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Items"},"cursor_next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor Next"},"counts_by_category":{"additionalProperties":{"type":"integer"},"type":"object","title":"Counts By Category"},"counts_by_status":{"additionalProperties":{"type":"integer"},"type":"object","title":"Counts By Status"}},"type":"object","required":["items","cursor_next","counts_by_category","counts_by_status"],"title":"ReviewFindingsPage"},"ReviewFindingsStatsOut":{"properties":{"open":{"type":"integer","title":"Open"},"by_category":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Category"},"by_status":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Status"}},"type":"object","required":["open","by_category","by_status"],"title":"ReviewFindingsStatsOut"},"ReviewItemIn":{"properties":{"key_uuid":{"type":"string","title":"Key Uuid"},"language_uuid":{"type":"string","title":"Language Uuid"},"expected_version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Version","description":"Optimistic concurrency: reject if the current version differs"}},"type":"object","required":["key_uuid","language_uuid"],"title":"ReviewItemIn"},"ReviewPending":{"properties":{"keys":{"type":"integer","title":"Keys","default":0},"languages":{"items":{"type":"string"},"type":"array","title":"Languages","default":[]},"per_language":{"additionalProperties":{"type":"integer"},"type":"object","title":"Per Language","default":{}}},"type":"object","title":"ReviewPending","description":"task 1626 — the review backlog as a SEPARATE key-count track (NOT part of\nthe completeness %). `keys` = DISTINCT keys with >=1 draft translation across\ntarget languages (a key drafted in N langs counts once)."},"ReviewQueueItem":{"properties":{"translation_uuid":{"type":"string","title":"Translation Uuid"},"key_uuid":{"type":"string","title":"Key Uuid"},"key_name":{"type":"string","title":"Key Name"},"namespace_uuid":{"type":"string","title":"Namespace Uuid"},"language_uuid":{"type":"string","title":"Language Uuid"},"value":{"type":"string","title":"Value"},"status":{"type":"string","enum":["missing","draft","translated","reviewed","approved","rejected"],"title":"Status"},"version":{"type":"integer","title":"Version"},"updated_by_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated By Uuid"},"updated_by_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated By Name"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"proposal_origin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Proposal Origin"},"diff":{"$ref":"#/components/schemas/ReviewDiff"}},"type":"object","required":["translation_uuid","key_uuid","key_name","namespace_uuid","language_uuid","value","status","version","updated_by_uuid","updated_at","diff"],"title":"ReviewQueueItem"},"ReviewQueueOut":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ReviewQueueItem"},"type":"array","title":"Items"},"cursor_next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor Next"},"total":{"type":"integer","title":"Total"},"counts_by_origin":{"additionalProperties":{"type":"integer"},"type":"object","title":"Counts By Origin"}},"type":"object","required":["items","cursor_next","total"],"title":"ReviewQueueOut"},"ReviewRejectIn":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ReviewRejectItemIn"},"type":"array","maxItems":500,"minItems":1,"title":"Items"}},"type":"object","required":["items"],"title":"ReviewRejectIn"},"ReviewRejectItemIn":{"properties":{"key_uuid":{"type":"string","title":"Key Uuid"},"language_uuid":{"type":"string","title":"Language Uuid"},"expected_version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Version","description":"Optimistic concurrency: reject if the current version differs"},"reason":{"type":"string","maxLength":1000,"minLength":1,"title":"Reason"}},"type":"object","required":["key_uuid","language_uuid","reason"],"title":"ReviewRejectItemIn"},"ReviewStateOut":{"properties":{"last_reviewed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Reviewed At"},"new_suggestions":{"type":"integer","title":"New Suggestions"},"new_ratings":{"type":"integer","title":"New Ratings"},"total_new":{"type":"integer","title":"Total New"}},"type":"object","required":["last_reviewed_at","new_suggestions","new_ratings","total_new"],"title":"ReviewStateOut"},"SDKMeta":{"properties":{"lib":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lib"},"ver":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ver"},"env":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Env"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"}},"additionalProperties":true,"type":"object","title":"SDKMeta"},"SearchKeysItem":{"properties":{"key_uuid":{"type":"string","title":"Key Uuid"},"key_name":{"type":"string","title":"Key Name"},"namespace_slug":{"type":"string","title":"Namespace Slug"},"namespace_uuid":{"type":"string","title":"Namespace Uuid"},"plurals":{"type":"boolean","title":"Plurals"},"matched_in":{"items":{"$ref":"#/components/schemas/SearchKeysMatch"},"type":"array","title":"Matched In"}},"type":"object","required":["key_uuid","key_name","namespace_slug","namespace_uuid","plurals","matched_in"],"title":"SearchKeysItem"},"SearchKeysMatch":{"properties":{"language_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Code"},"is_source":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Source"},"field":{"type":"string","title":"Field"},"value":{"type":"string","title":"Value"},"match_start":{"type":"integer","title":"Match Start"},"match_end":{"type":"integer","title":"Match End"}},"type":"object","required":["language_code","is_source","field","value","match_start","match_end"],"title":"SearchKeysMatch","description":"One located hit inside a single field of a key. A key may carry several\n(e.g. term in the fr source AND the en translation AND a plural sub-form)."},"SearchKeysPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/SearchKeysItem"},"type":"array","title":"Items"},"cursor_next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor Next"},"total_keys":{"type":"integer","title":"Total Keys"},"total_matches":{"type":"integer","title":"Total Matches"},"truncated":{"type":"boolean","title":"Truncated"}},"type":"object","required":["items","cursor_next","total_keys","total_matches","truncated"],"title":"SearchKeysPage"},"SearchOut":{"properties":{"keys":{"items":{"$ref":"#/components/schemas/KeyHit"},"type":"array","title":"Keys"},"translations":{"items":{"$ref":"#/components/schemas/TranslationHit"},"type":"array","title":"Translations"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["keys","translations","total"],"title":"SearchOut"},"SeatUsageOut":{"properties":{"used":{"type":"integer","title":"Used"},"included":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Included"},"members":{"type":"integer","title":"Members"},"pending":{"type":"integer","title":"Pending"}},"type":"object","required":["used","included","members","pending"],"title":"SeatUsageOut","description":"Seat consumption vs the plan cap (task #2087). `used` = active members +\npending invitations; a suspended member frees their seat. `included` = plan\nmembers cap (null = unlimited). This is a COUNT only — no metering/overage\n(founder decision, held for v1.1)."},"SectionIn":{"properties":{"title":{"type":"string","maxLength":300,"minLength":1,"title":"Title"},"type":{"type":"string","maxLength":60,"minLength":1,"title":"Type","description":"overview|writing|qa|constraints|terminology|other (open-set).","default":"other"},"languages":{"items":{"type":"string"},"type":"array","title":"Languages","description":"target codes this section applies to; empty = all."},"body":{"type":"string","maxLength":102400,"title":"Body","default":""},"position":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Position"}},"type":"object","required":["title"],"title":"SectionIn"},"SectionLightOut":{"properties":{"uuid":{"type":"string","title":"Uuid"},"title":{"type":"string","title":"Title"},"type":{"type":"string","title":"Type"},"languages":{"items":{"type":"string"},"type":"array","title":"Languages"},"position":{"type":"integer","title":"Position"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["uuid","title","type","languages","position"],"title":"SectionLightOut"},"SectionOut":{"properties":{"uuid":{"type":"string","title":"Uuid"},"title":{"type":"string","title":"Title"},"type":{"type":"string","title":"Type"},"languages":{"items":{"type":"string"},"type":"array","title":"Languages"},"position":{"type":"integer","title":"Position"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"body":{"type":"string","title":"Body"}},"type":"object","required":["uuid","title","type","languages","position","body"],"title":"SectionOut"},"SectionPatch":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":300,"minLength":1},{"type":"null"}],"title":"Title"},"type":{"anyOf":[{"type":"string","maxLength":60,"minLength":1},{"type":"null"}],"title":"Type"},"languages":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Languages"},"body":{"anyOf":[{"type":"string","maxLength":102400},{"type":"null"}],"title":"Body"},"position":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Position"}},"type":"object","title":"SectionPatch"},"SectionReorderIn":{"properties":{"section_ids":{"items":{"type":"string"},"type":"array","title":"Section Ids","description":"section uuids in the desired order"}},"type":"object","required":["section_ids"],"title":"SectionReorderIn"},"SectionRevertIn":{"properties":{"version":{"type":"integer","minimum":1.0,"title":"Version"}},"type":"object","required":["version"],"title":"SectionRevertIn"},"SectionSearchItem":{"properties":{"uuid":{"type":"string","title":"Uuid"},"title":{"type":"string","title":"Title"},"type":{"type":"string","title":"Type"},"languages":{"items":{"type":"string"},"type":"array","title":"Languages"},"position":{"type":"integer","title":"Position"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"snippet":{"type":"string","title":"Snippet","default":""}},"type":"object","required":["uuid","title","type","languages","position"],"title":"SectionSearchItem"},"SectionsListOut":{"properties":{"v":{"type":"integer","title":"V","default":1},"items":{"items":{"$ref":"#/components/schemas/SectionLightOut"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","total"],"title":"SectionsListOut"},"SectionsSearchOut":{"properties":{"v":{"type":"integer","title":"V","default":1},"items":{"items":{"$ref":"#/components/schemas/SectionSearchItem"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","total"],"title":"SectionsSearchOut"},"SecurityPolicyIn":{"properties":{"require_2fa":{"type":"boolean","title":"Require 2Fa"}},"type":"object","required":["require_2fa"],"title":"SecurityPolicyIn"},"SecurityPolicyOut":{"properties":{"require_2fa":{"type":"boolean","title":"Require 2Fa","default":false}},"type":"object","title":"SecurityPolicyOut"},"SendEmailCodeIn":{"properties":{"mfa_token":{"type":"string","title":"Mfa Token"}},"type":"object","required":["mfa_token"],"title":"SendEmailCodeIn"},"SendEmailCodeOut":{"properties":{"sent":{"type":"boolean","title":"Sent"},"retry_in_s":{"type":"integer","title":"Retry In S","default":0}},"type":"object","required":["sent"],"title":"SendEmailCodeOut"},"ServiceApproveIn":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ServiceApproveItem"},"type":"array","maxItems":500,"minItems":1,"title":"Items"}},"type":"object","required":["items"],"title":"ServiceApproveIn"},"ServiceApproveItem":{"properties":{"namespace":{"type":"string","minLength":1,"title":"Namespace"},"key":{"type":"string","maxLength":300,"minLength":1,"title":"Key"},"language_code":{"type":"string","title":"Language Code"}},"type":"object","required":["namespace","key","language_code"],"title":"ServiceApproveItem"},"ServiceApproveOut":{"properties":{"results":{"items":{"$ref":"#/components/schemas/ServiceApproveResult"},"type":"array","title":"Results"},"summary":{"$ref":"#/components/schemas/BulkSummary"}},"type":"object","required":["results","summary"],"title":"ServiceApproveOut"},"ServiceApproveResult":{"properties":{"namespace":{"type":"string","title":"Namespace"},"key":{"type":"string","title":"Key"},"language_code":{"type":"string","title":"Language Code"},"status":{"type":"string","title":"Status"},"translation_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Translation Uuid"},"version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Version"},"error":{"anyOf":[{"$ref":"#/components/schemas/BulkItemError"},{"type":"null"}]}},"type":"object","required":["namespace","key","language_code","status"],"title":"ServiceApproveResult"},"SessionCreateIn":{"properties":{"project_id":{"type":"string","minLength":1,"title":"Project Id"},"target_locales":{"items":{"type":"string"},"type":"array","maxItems":50,"title":"Target Locales"},"ttl_minutes":{"type":"integer","maximum":240.0,"minimum":1.0,"title":"Ttl Minutes","default":30}},"type":"object","required":["project_id"],"title":"SessionCreateIn"},"SessionCreateOut":{"properties":{"session":{"$ref":"#/components/schemas/app__routes__in_context__SessionOut"},"qr":{"$ref":"#/components/schemas/SessionQR"}},"type":"object","required":["session","qr"],"title":"SessionCreateOut"},"SessionListOut":{"properties":{"v":{"type":"integer","title":"V","default":1},"items":{"items":{"$ref":"#/components/schemas/SessionSummary"},"type":"array","title":"Items"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"}},"type":"object","required":["items"],"title":"SessionListOut"},"SessionQR":{"properties":{"pairingToken":{"type":"string","title":"Pairingtoken"},"pairingCode":{"type":"string","title":"Pairingcode"},"channel":{"type":"string","title":"Channel"},"rtUrl":{"type":"string","title":"Rturl"}},"type":"object","required":["pairingToken","pairingCode","channel","rtUrl"],"title":"SessionQR"},"SessionSummary":{"properties":{"session_id":{"type":"string","title":"Session Id"},"agent":{"type":"string","title":"Agent"},"agent_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Type"},"agent_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Version"},"open_source":{"type":"string","title":"Open Source","default":"agent"},"end_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Reason"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"status":{"type":"string","title":"Status"},"started_at":{"type":"string","format":"date-time","title":"Started At"},"ended_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ended At"},"last_event_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Event At"},"counts":{"additionalProperties":true,"type":"object","title":"Counts"}},"type":"object","required":["session_id","agent","title","status","started_at","ended_at","last_event_at","counts"],"title":"SessionSummary"},"SessionsListOut":{"properties":{"items":{"items":{"$ref":"#/components/schemas/app__routes__auth__SessionOut"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"SessionsListOut"},"SessionsWindow":{"properties":{"active":{"type":"integer","title":"Active"},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},"type":"object","required":["active","limit"],"title":"SessionsWindow"},"SetProjectRolesIn":{"properties":{"projects":{"items":{"$ref":"#/components/schemas/MemberProjectRoleIn"},"type":"array","title":"Projects"}},"type":"object","title":"SetProjectRolesIn"},"SetProjectRolesOut":{"properties":{"applied":{"items":{"$ref":"#/components/schemas/ProjectRoleResult"},"type":"array","title":"Applied"},"removed":{"items":{"type":"string"},"type":"array","title":"Removed"}},"type":"object","title":"SetProjectRolesOut"},"SignupIn":{"properties":{"email":{"type":"string","pattern":"^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$","title":"Email"},"password":{"type":"string","title":"Password"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},"type":"object","required":["email","password"],"title":"SignupIn"},"SignupOut":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"Bearer"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"refresh_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refresh Token"},"voucher":{"anyOf":[{"$ref":"#/components/schemas/VoucherApplyResult"},{"type":"null"}]}},"type":"object","required":["access_token","expires_at"],"title":"SignupOut","description":"Signup adds an OPTIONAL soft `voucher` object on top of TokenOut. It is\nnull when no `code` was supplied; existing token fields are unchanged."},"SkillPatchIn":{"properties":{"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"content_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Version"},"hook":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Hook"}},"additionalProperties":false,"type":"object","title":"SkillPatchIn","description":"PARTIAL update. An omitted field is UNCHANGED, never cleared.\n\n`extra=\"forbid\"` rejects unknown fields with 422 instead of ignoring them: a\nsilently dropped field is how an editor believes it saved something it did\nnot."},"SkippedProjectRole":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"role":{"type":"string","enum":["owner","admin","developer","translator","qa","reviewer","viewer"],"title":"Role"},"reason":{"type":"string","title":"Reason"}},"type":"object","required":["project_uuid","role","reason"],"title":"SkippedProjectRole"},"SlackConnectIn":{"properties":{"webhook_url":{"type":"string","title":"Webhook Url"},"channel_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Name"},"team_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team Name"}},"type":"object","required":["webhook_url"],"title":"SlackConnectIn"},"SlackEnabledTypesIn":{"properties":{"type_ids":{"items":{"type":"string"},"type":"array","title":"Type Ids"}},"type":"object","title":"SlackEnabledTypesIn"},"SlackStatusOut":{"properties":{"connected":{"type":"boolean","title":"Connected"},"team_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team Name"},"channel_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Name"},"connected_at":{"anyOf":[{},{"type":"null"}],"title":"Connected At"},"enabled_types":{"items":{"type":"string"},"type":"array","title":"Enabled Types"}},"type":"object","required":["connected"],"title":"SlackStatusOut"},"SlackTestOut":{"properties":{"ok":{"type":"boolean","title":"Ok"}},"type":"object","required":["ok"],"title":"SlackTestOut"},"SourceHealthOut":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"version_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Uuid"},"keys_scanned":{"type":"integer","title":"Keys Scanned"},"total_issues":{"type":"integer","title":"Total Issues"},"by_issue":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Issue"},"by_severity":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Severity"},"items":{"items":{"$ref":"#/components/schemas/HealthItem"},"type":"array","title":"Items"},"duplicates_neutral":{"type":"integer","title":"Duplicates Neutral","default":0},"duplicates_to_fix":{"type":"integer","title":"Duplicates To Fix","default":0},"duplicates_allowed":{"type":"integer","title":"Duplicates Allowed","default":0},"duplicates_resolved":{"type":"integer","title":"Duplicates Resolved","default":0},"resolved_duplicates":{"items":{"$ref":"#/components/schemas/ResolvedDuplicate"},"type":"array","title":"Resolved Duplicates","default":[]}},"type":"object","required":["project_uuid","version_uuid","keys_scanned","total_issues","by_issue","by_severity","items"],"title":"SourceHealthOut"},"SourceLanguagePreviewKey":{"properties":{"uuid":{"type":"string","title":"Uuid"},"name":{"type":"string","title":"Name"},"namespace_uuid":{"type":"string","title":"Namespace Uuid"}},"type":"object","required":["uuid","name","namespace_uuid"],"title":"SourceLanguagePreviewKey"},"SourceLanguagePreviewOut":{"properties":{"target":{"type":"string","title":"Target"},"total_active_keys":{"type":"integer","title":"Total Active Keys"},"empty_source_key_count":{"type":"integer","title":"Empty Source Key Count"},"sample":{"items":{"$ref":"#/components/schemas/SourceLanguagePreviewKey"},"type":"array","title":"Sample"}},"type":"object","required":["target","total_active_keys","empty_source_key_count"],"title":"SourceLanguagePreviewOut"},"StepActor":{"properties":{"type":{"type":"string","title":"Type","description":"user | key | agent"},"label":{"type":"string","title":"Label","description":"Human-readable. For a key: name · prefix…last4 — NEVER a secret."},"key_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Name"},"key_prefix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Prefix"},"key_last4":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Last4"}},"type":"object","required":["type","label"],"title":"StepActor"},"StepContext":{"properties":{"at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"At"},"actor":{"anyOf":[{"$ref":"#/components/schemas/StepActor"},{"type":"null"}]},"detail":{"additionalProperties":true,"type":"object","title":"Detail"}},"type":"object","title":"StepContext"},"StringItem":{"properties":{"namespace":{"type":"string","title":"Namespace"},"key":{"type":"string","title":"Key"},"key_uuid":{"type":"string","title":"Key Uuid"},"language_uuid":{"type":"string","title":"Language Uuid"},"value":{"type":"string","title":"Value"},"translation_hash":{"type":"string","title":"Translation Hash"},"avg_stars":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Stars"},"ratings_count":{"type":"integer","title":"Ratings Count"},"my_rating":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"My Rating"},"source_text":{"type":"string","title":"Source Text"},"source_locale":{"type":"string","title":"Source Locale"},"my_suggestion":{"anyOf":[{"$ref":"#/components/schemas/MySuggestionView"},{"type":"null"}]}},"type":"object","required":["namespace","key","key_uuid","language_uuid","value","translation_hash","avg_stars","ratings_count","my_rating","source_text","source_locale"],"title":"StringItem"},"StringsOut":{"properties":{"project_id":{"type":"string","title":"Project Id"},"language":{"type":"string","title":"Language"},"strings":{"items":{"$ref":"#/components/schemas/StringItem"},"type":"array","title":"Strings"}},"type":"object","required":["project_id","language","strings"],"title":"StringsOut"},"SubscriptionOut":{"properties":{"stripe_subscription_id":{"type":"string","title":"Stripe Subscription Id"},"status":{"type":"string","title":"Status"},"cadence":{"type":"string","title":"Cadence"},"current_period_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Current Period End"},"cancel_at_period_end":{"type":"boolean","title":"Cancel At Period End"},"cancel_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Cancel At"},"seats":{"type":"integer","title":"Seats"}},"type":"object","required":["stripe_subscription_id","status","cadence","current_period_end","cancel_at_period_end","seats"],"title":"SubscriptionOut"},"SuggestionEditIn":{"properties":{"text":{"type":"string","maxLength":2000,"minLength":1,"title":"Text"}},"type":"object","required":["text"],"title":"SuggestionEditIn"},"SuggestionEditOut":{"properties":{"id":{"type":"string","title":"Id"},"text":{"type":"string","title":"Text"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","text","status","created_at","updated_at"],"title":"SuggestionEditOut"},"SuggestionIn":{"properties":{"namespace":{"type":"string","title":"Namespace","default":"common"},"key":{"type":"string","maxLength":300,"minLength":1,"title":"Key"},"language":{"type":"string","maxLength":12,"minLength":2,"title":"Language"},"translation_hash":{"type":"string","maxLength":64,"minLength":1,"title":"Translation Hash"},"suggested_text":{"type":"string","maxLength":2000,"minLength":1,"title":"Suggested Text"},"comment":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Comment"}},"type":"object","required":["key","language","translation_hash","suggested_text"],"title":"SuggestionIn"},"SuggestionView":{"properties":{"suggestion_id":{"type":"string","title":"Suggestion Id"},"namespace":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace"},"key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"current_value":{"type":"string","title":"Current Value"},"suggested_text":{"type":"string","title":"Suggested Text"},"translation_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Translation Hash"},"status":{"type":"string","title":"Status"},"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comment"},"grouping_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grouping Key"},"end_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End User Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"decided_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Decided At"},"moderator":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Moderator"},"applied_revision":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Applied Revision"}},"additionalProperties":true,"type":"object","required":["suggestion_id","namespace","key","language","current_value","suggested_text","translation_hash","status","comment","grouping_key","end_user_id","created_at","decided_at","moderator","applied_revision"],"title":"SuggestionView"},"SuggestionsBatchIn":{"properties":{"suggestions":{"items":{"$ref":"#/components/schemas/SuggestionIn"},"type":"array","maxItems":20,"minItems":1,"title":"Suggestions"}},"type":"object","required":["suggestions"],"title":"SuggestionsBatchIn"},"SuggestionsPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/SuggestionView"},"type":"array","title":"Items"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","page","page_size","total"],"title":"SuggestionsPage"},"SummaryOut":{"properties":{"project_id":{"type":"string","title":"Project Id"},"totals":{"additionalProperties":true,"type":"object","title":"Totals"},"by_language":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"By Language"},"worst":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Worst"},"trend":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Trend"}},"additionalProperties":true,"type":"object","required":["project_id","totals","by_language","worst","trend"],"title":"SummaryOut"},"SupportMessageIn":{"properties":{"message":{"type":"string","maxLength":5000,"minLength":1,"title":"Message"},"screen":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Screen"}},"additionalProperties":false,"type":"object","required":["message"],"title":"SupportMessageIn","description":"`extra=\"forbid\"`: a silently dropped field is how a caller believes it\nsent something it did not."},"SurfaceCoverageItem":{"properties":{"surface":{"type":"string","title":"Surface"},"label":{"type":"string","title":"Label"},"kind":{"type":"string","title":"Kind"},"meaning":{"type":"string","title":"Meaning"},"eligible_keys":{"type":"integer","title":"Eligible Keys"},"eligible_cells":{"type":"integer","title":"Eligible Cells"},"present_cells":{"type":"integer","title":"Present Cells"},"pct":{"type":"integer","title":"Pct"},"by_language":{"items":{"$ref":"#/components/schemas/SurfaceCoverageLanguage"},"type":"array","title":"By Language"}},"type":"object","required":["surface","label","kind","meaning","eligible_keys","eligible_cells","present_cells","pct","by_language"],"title":"SurfaceCoverageItem"},"SurfaceCoverageLanguage":{"properties":{"code":{"type":"string","title":"Code"},"eligible":{"type":"integer","title":"Eligible"},"present":{"type":"integer","title":"Present"},"pct":{"type":"integer","title":"Pct"}},"type":"object","required":["code","eligible","present","pct"],"title":"SurfaceCoverageLanguage"},"SurfaceCoverageOut":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"version_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Uuid"},"languages":{"items":{"type":"string"},"type":"array","title":"Languages"},"keys_total":{"type":"integer","title":"Keys Total"},"surfaces":{"items":{"$ref":"#/components/schemas/SurfaceCoverageItem"},"type":"array","title":"Surfaces"}},"type":"object","required":["project_uuid","version_uuid","languages","keys_total","surfaces"],"title":"SurfaceCoverageOut"},"SurfaceCreateIn":{"properties":{"slug":{"type":"string","maxLength":40,"minLength":1,"title":"Slug"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"}},"type":"object","required":["slug"],"title":"SurfaceCreateIn"},"SurfaceListOut":{"properties":{"surfaces":{"items":{"$ref":"#/components/schemas/SurfaceOut"},"type":"array","title":"Surfaces"}},"type":"object","required":["surfaces"],"title":"SurfaceListOut"},"SurfaceOut":{"properties":{"slug":{"type":"string","title":"Slug"},"label":{"type":"string","title":"Label"},"kind":{"type":"string","title":"Kind"},"builtin":{"type":"boolean","title":"Builtin"},"active":{"type":"boolean","title":"Active"}},"type":"object","required":["slug","label","kind","builtin","active"],"title":"SurfaceOut"},"SurfaceRecommendation":{"properties":{"surface":{"type":"string","title":"Surface"},"active":{"type":"boolean","title":"Active"},"present_in_source":{"type":"boolean","title":"Present In Source"}},"type":"object","required":["surface","active","present_in_source"],"title":"SurfaceRecommendation"},"SurfaceUpdateIn":{"properties":{"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"}},"type":"object","title":"SurfaceUpdateIn"},"SurfaceUpdateOut":{"properties":{"surfaces":{"items":{"$ref":"#/components/schemas/SurfaceOut"},"type":"array","title":"Surfaces"},"affected_variants":{"type":"integer","title":"Affected Variants","default":0}},"type":"object","required":["surfaces"],"title":"SurfaceUpdateOut"},"TaskCreateIn":{"properties":{"type":{"type":"string","maxLength":200,"minLength":1,"title":"Type"},"title":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Title"},"detail":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Detail"},"assignee_user_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assignee User Uuid"},"payload":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Payload"},"count":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Count"},"deep_link":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Deep Link"},"severity":{"anyOf":[{"type":"string","pattern":"^(info|warning|error)$"},{"type":"null"}],"title":"Severity"},"dedupe_key":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Dedupe Key"},"agent_requested":{"type":"boolean","title":"Agent Requested","default":false}},"type":"object","required":["type"],"title":"TaskCreateIn"},"TaskListOut":{"properties":{"v":{"type":"integer","title":"V","default":1},"items":{"items":{"$ref":"#/components/schemas/TaskOut"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"open_total":{"type":"integer","title":"Open Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["items","total","open_total","limit","offset"],"title":"TaskListOut"},"TaskOut":{"properties":{"uuid":{"type":"string","title":"Uuid"},"number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Number"},"type":{"type":"string","title":"Type"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"i18n_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"I18N Key"},"scope":{"type":"string","title":"Scope","default":"project"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"objective":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Objective"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"commands":{"items":{"type":"string"},"type":"array","title":"Commands"},"agent_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Prompt"},"title":{"type":"string","title":"Title"},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail"},"status":{"type":"string","title":"Status"},"assignee_user_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assignee User Uuid"},"source":{"type":"string","title":"Source","default":"system"},"source_agent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Agent"},"payload":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Payload"},"count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Count"},"deep_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deep Link"},"severity":{"type":"string","title":"Severity","default":"info"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"history":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"History"},"resolution":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Resolution"},"links":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Links"},"agent_requested":{"type":"boolean","title":"Agent Requested","default":false},"report":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Report"},"key_sample":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Key Sample"}},"type":"object","required":["uuid","type","title","status","created_at"],"title":"TaskOut"},"TaskTypeListOut":{"properties":{"v":{"type":"integer","title":"V","default":1},"items":{"items":{"$ref":"#/components/schemas/TaskTypeOut"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","total"],"title":"TaskTypeListOut"},"TaskTypeOut":{"properties":{"type":{"type":"string","title":"Type"},"title":{"type":"string","title":"Title"},"i18n_key":{"type":"string","title":"I18N Key"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"severity":{"type":"string","title":"Severity","default":"info"},"deep_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deep Link"},"objective":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Objective"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"scope":{"type":"string","title":"Scope","default":"project"},"commands":{"items":{"type":"string"},"type":"array","title":"Commands"},"agent_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Prompt"},"enabled":{"type":"boolean","title":"Enabled","default":true},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["type","title","i18n_key","updated_at"],"title":"TaskTypeOut"},"TaskUpdateIn":{"properties":{"status":{"anyOf":[{"type":"string","pattern":"^(open|in_progress|done|dismissed)$"},{"type":"null"}],"title":"Status"},"assignee_user_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assignee User Uuid"},"unassign":{"type":"boolean","title":"Unassign","default":false},"note":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Note"},"agent_requested":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Agent Requested"}},"type":"object","title":"TaskUpdateIn"},"TosAcceptIn":{"properties":{"project_id":{"type":"string","minLength":1,"title":"Project Id"},"end_user_id":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"End User Id"},"tos_version":{"type":"string","maxLength":32,"minLength":1,"title":"Tos Version"},"locale":{"anyOf":[{"type":"string","maxLength":12},{"type":"null"}],"title":"Locale"},"consent_mechanism":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Consent Mechanism","description":"How consent was obtained: `explicit_click` | `explicit_checkbox`. Required — an acceptance without it is refused."}},"type":"object","required":["project_id","tos_version"],"title":"TosAcceptIn"},"TransferOwnershipOut":{"properties":{"new_owner_user_uuid":{"type":"string","title":"New Owner User Uuid"},"previous_owner_user_uuid":{"type":"string","title":"Previous Owner User Uuid"},"previous_owner_role":{"type":"string","enum":["owner","admin","member"],"title":"Previous Owner Role"}},"type":"object","required":["new_owner_user_uuid","previous_owner_user_uuid","previous_owner_role"],"title":"TransferOwnershipOut"},"TranslationActivityOut":{"properties":{"v":{"type":"integer","title":"V","default":1},"since":{"type":"string","title":"Since"},"until":{"type":"string","title":"Until"},"days":{"type":"integer","title":"Days"},"max":{"type":"integer","title":"Max"},"languages":{"items":{"$ref":"#/components/schemas/ActivityLangOut"},"type":"array","title":"Languages"}},"type":"object","required":["since","until","days","max","languages"],"title":"TranslationActivityOut"},"TranslationBulkItem":{"properties":{"namespace":{"type":"string","minLength":1,"title":"Namespace"},"key":{"type":"string","maxLength":300,"minLength":1,"title":"Key"},"language_code":{"type":"string","title":"Language Code"},"value":{"type":"string","title":"Value","default":""},"plural_forms":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Plural Forms"},"status":{"anyOf":[{"type":"string","enum":["missing","draft","translated","reviewed","approved","rejected"]},{"type":"null"}],"title":"Status"},"confidence":{"anyOf":[{"type":"string","pattern":"^(high|medium|low)$"},{"type":"null"}],"title":"Confidence"}},"type":"object","required":["namespace","key","language_code"],"title":"TranslationBulkItem"},"TranslationBulkResult":{"properties":{"index":{"type":"integer","title":"Index"},"status":{"type":"string","title":"Status"},"translation_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Translation Uuid"},"key_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Uuid"},"language_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Uuid"},"version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Version"},"key_created":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Key Created"},"error":{"anyOf":[{"$ref":"#/components/schemas/BulkItemError"},{"type":"null"}]},"glossary_violations":{"anyOf":[{"items":{"$ref":"#/components/schemas/app__services__glossary_match__GlossaryViolation"},"type":"array"},{"type":"null"}],"title":"Glossary Violations"},"variable_warnings":{"anyOf":[{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object"},{"type":"null"}],"title":"Variable Warnings"},"placeholder_mismatch":{"anyOf":[{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object"},{"type":"null"}],"title":"Placeholder Mismatch"},"plural_mismatch":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Plural Mismatch"}},"type":"object","required":["index","status"],"title":"TranslationBulkResult"},"TranslationBulkStatusIn":{"properties":{"items":{"items":{"$ref":"#/components/schemas/TranslationBulkStatusItem"},"type":"array","maxItems":500,"minItems":1,"title":"Items"}},"type":"object","required":["items"],"title":"TranslationBulkStatusIn"},"TranslationBulkStatusItem":{"properties":{"key_uuid":{"type":"string","title":"Key Uuid"},"language_uuid":{"type":"string","title":"Language Uuid"},"status":{"type":"string","enum":["missing","draft","translated","reviewed","approved","rejected"],"title":"Status"}},"type":"object","required":["key_uuid","language_uuid","status"],"title":"TranslationBulkStatusItem"},"TranslationBulkStatusOut":{"properties":{"results":{"items":{"$ref":"#/components/schemas/TranslationBulkStatusResult"},"type":"array","title":"Results"},"summary":{"$ref":"#/components/schemas/BulkSummary"}},"type":"object","required":["results","summary"],"title":"TranslationBulkStatusOut"},"TranslationBulkStatusResult":{"properties":{"index":{"type":"integer","title":"Index"},"status":{"type":"string","title":"Status"},"translation_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Translation Uuid"},"key_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Uuid"},"language_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Uuid"},"version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Version"},"error":{"anyOf":[{"$ref":"#/components/schemas/BulkItemError"},{"type":"null"}]}},"type":"object","required":["index","status"],"title":"TranslationBulkStatusResult"},"TranslationCore":{"properties":{"uuid":{"type":"string","title":"Uuid"},"key_uuid":{"type":"string","title":"Key Uuid"},"language_uuid":{"type":"string","title":"Language Uuid"},"value":{"type":"string","title":"Value"},"status":{"type":"string","enum":["missing","draft","translated","reviewed","approved","rejected"],"title":"Status"},"version":{"type":"integer","title":"Version"},"updated_by_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated By Uuid"},"updated_by_is_bot":{"type":"boolean","title":"Updated By Is Bot","default":false},"updated_by_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated By Name"},"proposal_origin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Proposal Origin"},"agent_confidence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Confidence"},"review_comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Review Comment"},"plural_forms":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Plural Forms"},"glossary_violations":{"anyOf":[{"items":{"$ref":"#/components/schemas/app__services__glossary_match__GlossaryViolation"},"type":"array"},{"type":"null"}],"title":"Glossary Violations"},"surface":{"type":"string","title":"Surface","default":"base"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["uuid","key_uuid","language_uuid","value","status","version","updated_by_uuid","created_at","updated_at"],"title":"TranslationCore"},"TranslationHit":{"properties":{"translation_uuid":{"type":"string","title":"Translation Uuid"},"key_uuid":{"type":"string","title":"Key Uuid"},"key_name":{"type":"string","title":"Key Name"},"namespace_uuid":{"type":"string","title":"Namespace Uuid"},"language_uuid":{"type":"string","title":"Language Uuid"},"language_code":{"type":"string","title":"Language Code"},"value":{"type":"string","title":"Value"},"status":{"type":"string","title":"Status"},"plurals":{"type":"boolean","title":"Plurals","default":false},"plural_forms":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Plural Forms"}},"type":"object","required":["translation_uuid","key_uuid","key_name","namespace_uuid","language_uuid","language_code","value","status"],"title":"TranslationHit"},"TranslationJobOut":{"properties":{"job_uuid":{"type":"string","title":"Job Uuid"},"status":{"type":"string","title":"Status"},"phase":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phase"},"terminal":{"type":"boolean","title":"Terminal"},"mode":{"type":"string","title":"Mode"},"tier":{"type":"string","title":"Tier"},"requested":{"type":"integer","title":"Requested"},"translated":{"type":"integer","title":"Translated"},"failed":{"type":"integer","title":"Failed"},"credits_charged":{"type":"integer","title":"Credits Charged"},"credits_refunded":{"type":"integer","title":"Credits Refunded"},"credits_net":{"type":"integer","title":"Credits Net"},"last_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Error"},"batch_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Batch Id"}},"type":"object","required":["job_uuid","status","terminal","mode","tier","requested","translated","failed","credits_charged","credits_refunded","credits_net"],"title":"TranslationJobOut","description":"Unified job object returned by BOTH /generate and GET /jobs/{job_uuid}.\n\n`terminal` is true once status is completed/partial/failed. Sync jobs are\nterminal immediately (results written as drafts → refetch). Batch jobs (PR-2)\nstart queued/running; the client polls GET /jobs/{job_uuid} until terminal."},"TranslationListItem":{"properties":{"key":{"$ref":"#/components/schemas/KeyEmbed"},"translation":{"$ref":"#/components/schemas/TranslationCore"},"source_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Value"},"source_plural_forms":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Source Plural Forms"},"avg_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Rating"},"rating_count":{"type":"integer","title":"Rating Count","default":0},"overlays":{"anyOf":[{"$ref":"#/components/schemas/OverlayPresence"},{"type":"null"}]},"referenced":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Referenced"},"orphan":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Orphan"}},"type":"object","required":["key","translation"],"title":"TranslationListItem"},"TranslationOnKey":{"properties":{"language_code":{"type":"string","title":"Language Code"},"value":{"type":"string","title":"Value"},"status":{"type":"string","title":"Status"},"plural_forms":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Plural Forms"}},"type":"object","required":["language_code","value","status"],"title":"TranslationOnKey"},"TranslationPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/TranslationListItem"},"type":"array","title":"Items"},"cursor_next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor Next"},"total":{"type":"integer","title":"Total"},"measured":{"type":"boolean","title":"Measured","default":false}},"type":"object","required":["items","cursor_next","total"],"title":"TranslationPage"},"TranslationProposeIn":{"properties":{"namespace":{"type":"string","minLength":1,"title":"Namespace"},"key":{"type":"string","maxLength":300,"minLength":1,"title":"Key"},"language_code":{"type":"string","title":"Language Code"},"value":{"type":"string","title":"Value","default":""},"plural_forms":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Plural Forms"},"status":{"anyOf":[{"type":"string","enum":["missing","draft","translated","reviewed","approved","rejected"]},{"type":"null"}],"title":"Status"},"confidence":{"anyOf":[{"type":"string","pattern":"^(high|medium|low)$"},{"type":"null"}],"title":"Confidence"}},"type":"object","required":["namespace","key","language_code"],"title":"TranslationProposeIn"},"TranslationProposeOut":{"properties":{"uuid":{"type":"string","title":"Uuid"},"key_uuid":{"type":"string","title":"Key Uuid"},"language_uuid":{"type":"string","title":"Language Uuid"},"value":{"type":"string","title":"Value"},"status":{"type":"string","enum":["missing","draft","translated","reviewed","approved","rejected"],"title":"Status"},"version":{"type":"integer","title":"Version"},"glossary_violations":{"anyOf":[{"items":{"$ref":"#/components/schemas/app__services__glossary_match__GlossaryViolation"},"type":"array"},{"type":"null"}],"title":"Glossary Violations"},"variable_warnings":{"anyOf":[{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object"},{"type":"null"}],"title":"Variable Warnings"}},"type":"object","required":["uuid","key_uuid","language_uuid","value","status","version"],"title":"TranslationProposeOut"},"TranslationState":{"properties":{"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"plural_forms":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Plural Forms"}},"type":"object","title":"TranslationState"},"TranslationUpsertIn":{"properties":{"value":{"type":"string","title":"Value","default":""},"plural_forms":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Plural Forms","description":"Required when `key.plurals=true`. Map of CLDR category (zero|one|two|few|many|other) -> form string. Must include `other`. When set on a non-plural key the request is rejected 422."},"status":{"anyOf":[{"type":"string","enum":["missing","draft","translated","reviewed","approved","rejected"]},{"type":"null"}],"title":"Status"},"expected_version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Version","description":"Optimistic concurrency: reject if the current version differs"}},"type":"object","title":"TranslationUpsertIn"},"TrashedKeyItem":{"properties":{"key_uuid":{"type":"string","title":"Key Uuid"},"namespace":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace"},"name":{"type":"string","title":"Name"},"deleted_at":{"type":"string","format":"date-time","title":"Deleted At"}},"type":"object","required":["key_uuid","name","deleted_at"],"title":"TrashedKeyItem"},"UnreadCountOut":{"properties":{"unread_count":{"type":"integer","title":"Unread Count"}},"type":"object","required":["unread_count"],"title":"UnreadCountOut"},"UntranslatedKey":{"properties":{"key_uuid":{"type":"string","title":"Key Uuid"},"key_name":{"type":"string","title":"Key Name"},"namespace_slug":{"type":"string","title":"Namespace Slug"},"namespace_uuid":{"type":"string","title":"Namespace Uuid"},"source_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Value"},"plurals":{"type":"boolean","title":"Plurals"},"max_length":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Length"},"type":{"type":"string","title":"Type","default":"text"},"glossary_hints":{"anyOf":[{"items":{"$ref":"#/components/schemas/GlossaryHint"},"type":"array"},{"type":"null"}],"title":"Glossary Hints"}},"type":"object","required":["key_uuid","key_name","namespace_slug","namespace_uuid","source_value","plurals","max_length"],"title":"UntranslatedKey"},"UntranslatedKeysPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/UntranslatedKey"},"type":"array","title":"Items"},"cursor_next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor Next"},"total":{"type":"integer","title":"Total"},"source_missing":{"type":"integer","title":"Source Missing","default":0}},"type":"object","required":["items","cursor_next","total"],"title":"UntranslatedKeysPage"},"UpdateKeysBulkIn":{"properties":{"items":{"items":{"$ref":"#/components/schemas/KeyUpdateBulkItem"},"type":"array","maxItems":500,"minItems":1,"title":"Items"}},"type":"object","required":["items"],"title":"UpdateKeysBulkIn"},"UpdateKeysBulkOut":{"properties":{"results":{"items":{"$ref":"#/components/schemas/KeyUpdateBulkResult"},"type":"array","title":"Results"},"summary":{"$ref":"#/components/schemas/BulkSummary"}},"type":"object","required":["results","summary"],"title":"UpdateKeysBulkOut"},"UpdatedByUser":{"properties":{"uuid":{"type":"string","title":"Uuid"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"email":{"type":"string","title":"Email"}},"type":"object","required":["uuid","name","email"],"title":"UpdatedByUser"},"UsageEventOut":{"properties":{"ts":{"type":"string","format":"date-time","title":"Ts"},"cmd":{"type":"string","title":"Cmd"},"category":{"type":"string","title":"Category"},"units":{"type":"integer","title":"Units"},"duration_ms":{"type":"integer","title":"Duration Ms"},"status":{"type":"integer","title":"Status"},"user_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Uuid"},"api_key_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key Uuid"},"args_size_bytes":{"type":"integer","title":"Args Size Bytes"}},"type":"object","required":["ts","cmd","category","units","duration_ms","status","user_uuid","api_key_uuid","args_size_bytes"],"title":"UsageEventOut","description":"One row from the `usage_events` audit log (emitted by the meter)."},"UsageQuotaOut":{"properties":{"plan":{"type":"string","title":"Plan"},"month":{"type":"string","title":"Month"},"writes_allowed":{"type":"boolean","title":"Writes Allowed"},"quota":{"$ref":"#/components/schemas/QuotaWindow"},"rate":{"$ref":"#/components/schemas/RateWindow"},"sessions":{"$ref":"#/components/schemas/SessionsWindow"}},"type":"object","required":["plan","month","writes_allowed","quota","rate","sessions"],"title":"UsageQuotaOut"},"UsageReport":{"properties":{"range_from":{"type":"string","format":"date-time","title":"Range From"},"range_to":{"type":"string","format":"date-time","title":"Range To"},"events":{"items":{"$ref":"#/components/schemas/UsageEventOut"},"type":"array","title":"Events"},"total":{"type":"integer","title":"Total"},"stats":{"$ref":"#/components/schemas/UsageStats"}},"type":"object","required":["range_from","range_to","events","total","stats"],"title":"UsageReport"},"UsageStats":{"properties":{"total_events":{"type":"integer","title":"Total Events"},"total_units":{"type":"integer","title":"Total Units"},"by_category":{"items":{"$ref":"#/components/schemas/CountBucket"},"type":"array","title":"By Category"},"by_cmd":{"items":{"$ref":"#/components/schemas/CountBucket"},"type":"array","title":"By Cmd"},"by_status":{"items":{"$ref":"#/components/schemas/CountBucket"},"type":"array","title":"By Status"}},"type":"object","required":["total_events","total_units","by_category","by_cmd","by_status"],"title":"UsageStats"},"UserOut":{"properties":{"uuid":{"type":"string","title":"Uuid"},"email":{"type":"string","title":"Email"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"is_staff":{"type":"boolean","title":"Is Staff"},"email_verified":{"type":"boolean","title":"Email Verified"}},"type":"object","required":["uuid","email","name","is_staff","email_verified"],"title":"UserOut"},"ValidateIn":{"properties":{"language_code":{"type":"string","title":"Language Code"},"payload":{"additionalProperties":true,"type":"object","title":"Payload","description":"Flat or nested i18next JSON"},"namespace":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace","description":"Restrict to this namespace"}},"type":"object","required":["language_code"],"title":"ValidateIn"},"ValidateReport":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"language_code":{"type":"string","title":"Language Code"},"namespaces_checked":{"items":{"type":"string"},"type":"array","title":"Namespaces Checked"},"missing_keys":{"items":{"type":"string"},"type":"array","title":"Missing Keys"},"extra_keys":{"items":{"type":"string"},"type":"array","title":"Extra Keys"},"placeholder_mismatches":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Placeholder Mismatches"},"plural_mismatches":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Plural Mismatches"},"quality_issues":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Quality Issues"},"structural_issues":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Structural Issues"},"counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Counts"}},"type":"object","required":["project_uuid","language_code","namespaces_checked","missing_keys","extra_keys","placeholder_mismatches","counts"],"title":"ValidateReport"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VariantMatrixOut":{"properties":{"keyUuid":{"type":"string","title":"Keyuuid"},"keyName":{"type":"string","title":"Keyname"},"plurals":{"type":"boolean","title":"Plurals"},"surfaces":{"items":{"type":"string"},"type":"array","title":"Surfaces"},"surfaceKinds":{"additionalProperties":{"type":"string"},"type":"object","title":"Surfacekinds"},"languages":{"items":{"$ref":"#/components/schemas/LanguageRowOut"},"type":"array","title":"Languages"}},"type":"object","required":["keyUuid","keyName","plurals","surfaces","languages"],"title":"VariantMatrixOut"},"VariantOverrideIn":{"properties":{"value":{"type":"string","title":"Value","default":""},"plural_forms":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Plural Forms","description":"Plural-aware: CLDR category -> form. Same contract as translations."},"asset_ref":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Asset Ref","description":"Optional non-text asset/icon variant, e.g. {'kind':'icon','ref':'cdn://...'}."},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"expected_version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Version","description":"Optimistic concurrency on the override row."}},"type":"object","title":"VariantOverrideIn"},"VerifyEmailIn":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"VerifyEmailIn"},"VerifyIn":{"properties":{"mfa_token":{"type":"string","title":"Mfa Token"},"method":{"type":"string","enum":["totp","email","recovery"],"title":"Method"},"code":{"type":"string","title":"Code"}},"type":"object","required":["mfa_token","method","code"],"title":"VerifyIn"},"VersionCloneIn":{"properties":{"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"},"slug":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,62}[a-z0-9]$","title":"Slug"}},"type":"object","required":["name","slug"],"title":"VersionCloneIn"},"VersionCreateIn":{"properties":{"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"},"slug":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,62}[a-z0-9]$","title":"Slug"},"parent_version_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Version Uuid","description":"When set, copies all keys + translations from the parent version into the new one (clone). Otherwise the new version starts empty."}},"type":"object","required":["name","slug"],"title":"VersionCreateIn"},"VersionDiff":{"properties":{"key_uuid":{"type":"string","title":"Key Uuid"},"language_uuid":{"type":"string","title":"Language Uuid"},"from_version":{"type":"integer","title":"From Version"},"to_version":{"type":"integer","title":"To Version"},"value":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"object","title":"Value"},"status":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"object","title":"Status"},"plural_forms":{"additionalProperties":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"object"},"type":"object","title":"Plural Forms"}},"type":"object","required":["key_uuid","language_uuid","from_version","to_version","value","status","plural_forms"],"title":"VersionDiff"},"VersionListOut":{"properties":{"items":{"items":{"$ref":"#/components/schemas/VersionOut"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"VersionListOut"},"VersionOut":{"properties":{"uuid":{"type":"string","title":"Uuid"},"project_uuid":{"type":"string","title":"Project Uuid"},"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"},"is_production":{"type":"boolean","title":"Is Production"},"is_dev":{"type":"boolean","title":"Is Dev"},"realtime_channel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Realtime Channel"},"key_style":{"type":"string","title":"Key Style","default":"nested"},"key_separator":{"type":"string","title":"Key Separator","default":"."},"parent_version_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Version Uuid"},"created_by_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By Uuid"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["uuid","project_uuid","name","slug","is_production","is_dev","realtime_channel","parent_version_uuid","created_by_uuid","created_at","updated_at"],"title":"VersionOut"},"VersionRef":{"properties":{"uuid":{"type":"string","title":"Uuid"},"slug":{"type":"string","title":"Slug"}},"type":"object","required":["uuid","slug"],"title":"VersionRef"},"VoucherApplyResult":{"properties":{"applied":{"type":"boolean","title":"Applied"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"org_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Uuid"}},"type":"object","required":["applied"],"title":"VoucherApplyResult"},"VoucherRedeemIn":{"properties":{"code":{"type":"string","title":"Code"}},"type":"object","required":["code"],"title":"VoucherRedeemIn"},"WcagCell":{"properties":{"status":{"type":"string","title":"Status"},"fail_count":{"type":"integer","title":"Fail Count"},"sample_items":{"items":{"type":"string"},"type":"array","title":"Sample Items"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["status","fail_count","sample_items"],"title":"WcagCell"},"WcagContentCompleteness":{"properties":{"label":{"type":"string","title":"Label"},"pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pct"},"filled_cells":{"type":"integer","title":"Filled Cells"},"total_cells":{"type":"integer","title":"Total Cells"},"by_locale":{"additionalProperties":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"object","title":"By Locale"},"criteria_evaluated":{"type":"integer","title":"Criteria Evaluated"},"criteria_total":{"type":"integer","title":"Criteria Total"},"note":{"type":"string","title":"Note"}},"type":"object","required":["label","pct","filled_cells","total_cells","by_locale","criteria_evaluated","criteria_total","note"],"title":"WcagContentCompleteness"},"WcagCoverage":{"properties":{"pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pct"},"evaluated_cells":{"type":"integer","title":"Evaluated Cells"},"total_cells":{"type":"integer","title":"Total Cells"},"criteria_evaluated":{"type":"integer","title":"Criteria Evaluated"},"criteria_total":{"type":"integer","title":"Criteria Total"},"note":{"type":"string","title":"Note"}},"type":"object","required":["pct","evaluated_cells","total_cells","criteria_evaluated","criteria_total","note"],"title":"WcagCoverage"},"WcagEvaluatedCriteria":{"properties":{"criteria":{"items":{"type":"string"},"type":"array","title":"Criteria"},"pass_cells":{"type":"integer","title":"Pass Cells"},"fail_cells":{"type":"integer","title":"Fail Cells"},"failing_items":{"type":"integer","title":"Failing Items"},"note":{"type":"string","title":"Note"}},"type":"object","required":["criteria","pass_cells","fail_cells","failing_items","note"],"title":"WcagEvaluatedCriteria"},"WcagMeasures":{"properties":{"content_completeness":{"$ref":"#/components/schemas/WcagContentCompleteness"},"evaluated_criteria":{"$ref":"#/components/schemas/WcagEvaluatedCriteria"},"coverage":{"$ref":"#/components/schemas/WcagCoverage"},"target_level":{"$ref":"#/components/schemas/WcagTargetLevel"},"out_of_scope_count":{"type":"integer","title":"Out Of Scope Count"}},"type":"object","required":["content_completeness","evaluated_criteria","coverage","target_level","out_of_scope_count"],"title":"WcagMeasures"},"WcagOutOfScopeSc":{"properties":{"sc":{"type":"string","title":"Sc"},"name":{"type":"string","title":"Name"},"principle":{"type":"string","title":"Principle"},"level":{"type":"string","title":"Level"},"reason":{"type":"string","title":"Reason"}},"type":"object","required":["sc","name","principle","level","reason"],"title":"WcagOutOfScopeSc"},"WcagReadability":{"properties":{"metric_by_language":{"additionalProperties":{"type":"string"},"type":"object","title":"Metric By Language"},"thresholds":{"additionalProperties":{"type":"number"},"type":"object","title":"Thresholds"}},"type":"object","required":["metric_by_language","thresholds"],"title":"WcagReadability"},"WcagReportOut":{"properties":{"report_schema":{"type":"integer","title":"Report Schema"},"project_uuid":{"type":"string","title":"Project Uuid"},"version_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Uuid"},"standard":{"type":"string","title":"Standard"},"locales":{"items":{"type":"string"},"type":"array","title":"Locales"},"source_locale":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Locale"},"keys_scanned":{"type":"integer","title":"Keys Scanned"},"scope":{"$ref":"#/components/schemas/WcagScope"},"results":{"items":{"$ref":"#/components/schemas/WcagScResult"},"type":"array","title":"Results"},"screen_reader_text":{"$ref":"#/components/schemas/WcagScreenReaderText"},"measures":{"$ref":"#/components/schemas/WcagMeasures"},"readability":{"$ref":"#/components/schemas/WcagReadability"}},"type":"object","required":["report_schema","project_uuid","version_uuid","standard","locales","source_locale","keys_scanned","scope","results","screen_reader_text","measures","readability"],"title":"WcagReportOut"},"WcagScResult":{"properties":{"sc":{"type":"string","title":"Sc"},"name":{"type":"string","title":"Name"},"principle":{"type":"string","title":"Principle"},"level":{"type":"string","title":"Level"},"method":{"type":"string","title":"Method"},"partial":{"type":"boolean","title":"Partial"},"scored":{"type":"boolean","title":"Scored"},"evaluated":{"type":"boolean","title":"Evaluated"},"total_fail_count":{"type":"integer","title":"Total Fail Count"},"by_locale":{"additionalProperties":{"$ref":"#/components/schemas/WcagCell"},"type":"object","title":"By Locale"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["sc","name","principle","level","method","partial","scored","evaluated","total_fail_count","by_locale"],"title":"WcagScResult"},"WcagScope":{"properties":{"content_layer_sc":{"items":{"type":"string"},"type":"array","title":"Content Layer Sc"},"out_of_scope_sc":{"items":{"$ref":"#/components/schemas/WcagOutOfScopeSc"},"type":"array","title":"Out Of Scope Sc"},"note":{"type":"string","title":"Note"}},"type":"object","required":["content_layer_sc","out_of_scope_sc","note"],"title":"WcagScope"},"WcagScreenReaderText":{"properties":{"relevant_keys":{"type":"integer","title":"Relevant Keys"},"with_screen_reader_text":{"type":"integer","title":"With Screen Reader Text"},"coverage_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Coverage Pct"}},"type":"object","required":["relevant_keys","with_screen_reader_text","coverage_pct"],"title":"WcagScreenReaderText"},"WcagTargetLevel":{"properties":{"level":{"type":"string","title":"Level"},"attested":{"type":"boolean","title":"Attested"},"note":{"type":"string","title":"Note"},"aa_sc_not_evaluated":{"items":{"type":"string"},"type":"array","title":"Aa Sc Not Evaluated"}},"type":"object","required":["level","attested","note","aa_sc_not_evaluated"],"title":"WcagTargetLevel"},"WebhookCreateIn":{"properties":{"url":{"type":"string","maxLength":2000,"minLength":1,"title":"Url"},"events":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Events"},"active":{"type":"boolean","title":"Active","default":true}},"type":"object","required":["url","events"],"title":"WebhookCreateIn"},"WebhookListItem":{"properties":{"uuid":{"type":"string","title":"Uuid"},"project_uuid":{"type":"string","title":"Project Uuid"},"url":{"type":"string","title":"Url"},"events":{"items":{"type":"string"},"type":"array","title":"Events"},"active":{"type":"boolean","title":"Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["uuid","project_uuid","url","events","active","created_at","updated_at"],"title":"WebhookListItem"},"WebhookListOut":{"properties":{"items":{"items":{"$ref":"#/components/schemas/WebhookListItem"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"WebhookListOut"},"WebhookOut":{"properties":{"uuid":{"type":"string","title":"Uuid"},"project_uuid":{"type":"string","title":"Project Uuid"},"url":{"type":"string","title":"Url"},"events":{"items":{"type":"string"},"type":"array","title":"Events"},"active":{"type":"boolean","title":"Active"},"secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secret"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["uuid","project_uuid","url","events","active","created_at","updated_at"],"title":"WebhookOut"},"WebhookPatchIn":{"properties":{"url":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Url"},"events":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Events"},"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"},"rotate_secret":{"type":"boolean","title":"Rotate Secret","default":false}},"type":"object","title":"WebhookPatchIn"},"WhoamiOut":{"properties":{"ip":{"type":"string","title":"Ip"}},"type":"object","required":["ip"],"title":"WhoamiOut"},"WrittenBreakdown":{"properties":{"translated":{"type":"integer","title":"Translated","default":0},"reviewed":{"type":"integer","title":"Reviewed","default":0},"approved":{"type":"integer","title":"Approved","default":0},"total":{"type":"integer","title":"Total","default":0}},"type":"object","title":"WrittenBreakdown"},"XliffExportReport":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"source_language":{"type":"string","title":"Source Language"},"target_language":{"type":"string","title":"Target Language"},"namespace_slug":{"type":"string","title":"Namespace Slug"},"version_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Slug"},"included_count":{"type":"integer","title":"Included Count"},"plural_count":{"type":"integer","title":"Plural Count"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings"},"xliff":{"type":"string","title":"Xliff","description":"XLIFF 1.2 document as UTF-8 text"}},"type":"object","required":["project_uuid","source_language","target_language","namespace_slug","version_slug","included_count","plural_count","warnings","xliff"],"title":"XliffExportReport"},"XliffImportIn":{"properties":{"xliff":{"type":"string","minLength":1,"title":"Xliff","description":"XLIFF 1.2 document as text"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version","description":"Version slug; defaults to the production version"}},"type":"object","required":["xliff"],"title":"XliffImportIn"},"XliffImportReport":{"properties":{"project_uuid":{"type":"string","title":"Project Uuid"},"source_language":{"type":"string","title":"Source Language"},"target_language":{"type":"string","title":"Target Language"},"namespace_slug":{"type":"string","title":"Namespace Slug"},"keys_created":{"type":"integer","title":"Keys Created"},"keys_reused":{"type":"integer","title":"Keys Reused"},"translations_created":{"type":"integer","title":"Translations Created"},"translations_updated":{"type":"integer","title":"Translations Updated"},"translations_unchanged":{"type":"integer","title":"Translations Unchanged"},"skipped":{"type":"integer","title":"Skipped"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings"},"applied":{"type":"integer","title":"Applied","default":0},"created":{"type":"integer","title":"Created","default":0},"updated":{"type":"integer","title":"Updated","default":0},"unchanged":{"type":"integer","title":"Unchanged","default":0},"errors":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Errors","default":[]}},"type":"object","required":["project_uuid","source_language","target_language","namespace_slug","keys_created","keys_reused","translations_created","translations_updated","translations_unchanged","skipped","warnings"],"title":"XliffImportReport"},"app__routes__agent_observability__SessionOut":{"properties":{"v":{"type":"integer","title":"V","default":1},"session":{"$ref":"#/components/schemas/SessionSummary"}},"type":"object","required":["session"],"title":"SessionOut"},"app__routes__auth__RefreshIn":{"properties":{"refresh_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refresh Token"}},"type":"object","title":"RefreshIn"},"app__routes__auth__SessionOut":{"properties":{"jti":{"type":"string","title":"Jti"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"},"ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ip"},"geo":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"object"},{"type":"null"}],"title":"Geo"},"device":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"object"},{"type":"null"}],"title":"Device"},"last_active":{"type":"string","format":"date-time","title":"Last Active"},"is_current":{"type":"boolean","title":"Is Current","default":false}},"type":"object","required":["jti","created_at","expires_at","last_active"],"title":"SessionOut"},"app__routes__auth__TokenOut":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"Bearer"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"refresh_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refresh Token"}},"type":"object","required":["access_token","expires_at"],"title":"TokenOut"},"app__routes__billing__EnterprisePricingOut":{"properties":{"monthly_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monthly Cents"},"yearly_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Yearly Cents"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"}},"type":"object","required":["monthly_cents","yearly_cents","currency"],"title":"EnterprisePricingOut"},"app__routes__credits__EstimateIn":{"properties":{"tier":{"type":"string","enum":["standard","premium"],"title":"Tier"},"units":{"type":"integer","minimum":0.0,"title":"Units","description":"Number of translations (keys x target languages)"}},"type":"object","required":["tier","units"],"title":"EstimateIn"},"app__routes__feedback__AddonSku":{"properties":{"sku":{"type":"string","title":"Sku"},"label":{"type":"string","title":"Label"},"monthly_cents":{"type":"integer","title":"Monthly Cents"},"currency":{"type":"string","title":"Currency"},"feedback_languages_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Feedback Languages Limit"},"stripe_price_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Price Id"}},"type":"object","required":["sku","label","monthly_cents","currency","feedback_languages_limit","stripe_price_id"],"title":"AddonSku"},"app__routes__feedback__AddonSkusOut":{"properties":{"skus":{"items":{"$ref":"#/components/schemas/app__routes__feedback__AddonSku"},"type":"array","title":"Skus"}},"type":"object","required":["skus"],"title":"AddonSkusOut"},"app__routes__feedback__RefreshIn":{"properties":{"refresh_token":{"type":"string","minLength":1,"title":"Refresh Token"}},"type":"object","required":["refresh_token"],"title":"RefreshIn"},"app__routes__feedback__TokenOut":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type"},"expires_in":{"type":"integer","title":"Expires In"},"refresh_token":{"type":"string","title":"Refresh Token"},"refresh_expires_in":{"type":"integer","title":"Refresh Expires In"},"end_user_id":{"type":"string","title":"End User Id"},"tos_version":{"type":"string","title":"Tos Version"},"grouping_key":{"type":"string","title":"Grouping Key"}},"type":"object","required":["access_token","token_type","expires_in","refresh_token","refresh_expires_in","end_user_id","tos_version","grouping_key"],"title":"TokenOut"},"app__routes__glossary__GlossaryViolation":{"properties":{"code":{"type":"string","title":"Code"},"message":{"type":"string","title":"Message"},"term":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Term"},"expected":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected"},"detail":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Detail"}},"type":"object","required":["code","message"],"title":"GlossaryViolation"},"app__routes__in_context__AddonSku":{"properties":{"sku":{"type":"string","title":"Sku"},"label":{"type":"string","title":"Label"},"monthly_cents":{"type":"integer","title":"Monthly Cents"},"currency":{"type":"string","title":"Currency"},"stripe_price_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Price Id"}},"type":"object","required":["sku","label","monthly_cents","currency","stripe_price_id"],"title":"AddonSku"},"app__routes__in_context__AddonSkusOut":{"properties":{"skus":{"items":{"$ref":"#/components/schemas/app__routes__in_context__AddonSku"},"type":"array","title":"Skus"}},"type":"object","required":["skus"],"title":"AddonSkusOut"},"app__routes__in_context__RefreshIn":{"properties":{"refresh_token":{"type":"string","minLength":1,"title":"Refresh Token"}},"type":"object","required":["refresh_token"],"title":"RefreshIn"},"app__routes__in_context__SessionOut":{"properties":{"id":{"type":"string","title":"Id"},"projectId":{"type":"string","title":"Projectid"},"status":{"type":"string","enum":["pending","active","ended"],"title":"Status"},"targetLocales":{"items":{"type":"string"},"type":"array","title":"Targetlocales"},"channel":{"type":"string","title":"Channel"},"rtUrl":{"type":"string","title":"Rturl"},"subscriberToken":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscribertoken"},"paired":{"type":"boolean","title":"Paired"},"pairedDevice":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Paireddevice"},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"expiresAt":{"type":"string","format":"date-time","title":"Expiresat"},"endedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Endedat"},"lastActivityAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Lastactivityat"},"lastSeenKeys":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Lastseenkeys"},"editsCount":{"type":"integer","title":"Editscount","default":0}},"type":"object","required":["id","projectId","status","targetLocales","channel","rtUrl","paired","createdAt","expiresAt"],"title":"SessionOut"},"app__routes__in_context__TokenOut":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type"},"expires_in":{"type":"integer","title":"Expires In"},"refresh_token":{"type":"string","title":"Refresh Token"},"refresh_expires_in":{"type":"integer","title":"Refresh Expires In"},"end_user_id":{"type":"string","title":"End User Id"},"tos_version":{"type":"string","title":"Tos Version"},"grouping_key":{"type":"string","title":"Grouping Key"}},"type":"object","required":["access_token","token_type","expires_in","refresh_token","refresh_expires_in","end_user_id","tos_version","grouping_key"],"title":"TokenOut"},"app__routes__keys__KeyCreateIn":{"properties":{"namespace_uuid":{"type":"string","title":"Namespace Uuid"},"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Context"},"plurals":{"type":"boolean","title":"Plurals","default":false},"max_length":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Length"},"screenshots":{"items":{"type":"string"},"type":"array","title":"Screenshots"},"type":{"type":"string","enum":["text","heading","label","caption","badge","tooltip","error_message","toast","button","link","menu_item","input_placeholder","input_label","image","icon","meta_title","meta_description"],"title":"Type","default":"text"},"type_source":{"anyOf":[{"type":"string","enum":["default","detected","manual"]},{"type":"null"}],"title":"Type Source"}},"type":"object","required":["namespace_uuid","name"],"title":"KeyCreateIn"},"app__routes__mcp__KeyCreateIn":{"properties":{"namespace":{"type":"string","minLength":1,"title":"Namespace","description":"Namespace slug (LLM-friendly)"},"name":{"type":"string","maxLength":300,"minLength":1,"title":"Name"},"type":{"type":"string","title":"Type","default":"text"},"source_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Value","description":"Optional source-language value. When set, also upserts a translation row in the project's source language."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"plurals":{"type":"boolean","title":"Plurals","default":false},"max_length":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Length"},"update_source":{"type":"boolean","title":"Update Source","description":"When true, upsert the source value even if the key already exists (otherwise source_value is a no-op on existing keys). Task 750.","default":false}},"type":"object","required":["namespace","name"],"title":"KeyCreateIn"},"app__routes__mcp__NamespaceCreateIn":{"properties":{"slug":{"type":"string","title":"Slug"},"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["slug","name"],"title":"NamespaceCreateIn"},"app__routes__namespaces__NamespaceCreateIn":{"properties":{"slug":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{1,62}[a-z0-9]$","title":"Slug"},"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["slug","name"],"title":"NamespaceCreateIn"},"app__routes__translate__EstimateIn":{"properties":{"tier":{"type":"string","enum":["standard","premium"],"title":"Tier"},"language_codes":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Language Codes","description":"Target BCP-47 codes"},"namespace_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace Uuid"},"key_uuids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Key Uuids","description":"Restrict to these keys"}},"type":"object","required":["tier","language_codes"],"title":"EstimateIn"},"app__services__glossary_match__GlossaryViolation":{"properties":{"rule_type":{"type":"string","enum":["translation","do_not_translate","forbidden"],"title":"Rule Type"},"term":{"type":"string","title":"Term"},"matched_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Matched Text"},"message":{"type":"string","title":"Message"}},"type":"object","required":["rule_type","term","message"],"title":"GlossaryViolation","description":"A glossary-enforcement violation on a proposed translation (task 758).\nShared response shape across the MCP propose/bulk, i18next-import and the\ndashboard upsert paths."}},"securitySchemes":{"ApiKey":{"type":"apiKey","in":"header","name":"Authorization","description":"Programmatic: `ApiKey <token>`. User session: `Bearer <jwt>`. Send the full header value including the scheme word."}}}}