{"openapi":"3.1.0","info":{"title":"Pozeidon Demo","version":"0.1.0"},"paths":{"/api/tenants":{"post":{"tags":["tenants"],"summary":"Create Tenant","operationId":"create_tenant_api_tenants_post","parameters":[{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTenantRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTenantResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["tenants"],"summary":"List Tenants","operationId":"list_tenants_api_tenants_get","parameters":[{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TenantInfo"},"title":"Response List Tenants Api Tenants Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tenants/{tenant_id}":{"get":{"tags":["tenants"],"summary":"Get Tenant","operationId":"get_tenant_api_tenants__tenant_id__get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}},{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tenants/{tenant_id}/services":{"get":{"tags":["tenants"],"summary":"Get Tenant Services","description":"The tenant's stored `allowed_services` (spec allowed-services-p1 §6).\n`always_on` are on for every tenant and never stored.","operationId":"get_tenant_services_api_tenants__tenant_id__services_get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}},{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Tenant Services Api Tenants  Tenant Id  Services Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["tenants"],"summary":"Put Tenant Services","description":"Replace the tenant's `allowed_services`. Bubbleye admins only —\ntenants cannot change their own list; that is the point of the list.\n\nOnly GOVERNED names are accepted. An ALWAYS_ON name is refused too, so\nthe caller learns it is always on rather than believing it stored it.","operationId":"put_tenant_services_api_tenants__tenant_id__services_put","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}},{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantServicesIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Put Tenant Services Api Tenants  Tenant Id  Services Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tenants/{tenant_id}/budget-ceiling":{"patch":{"tags":["tenants"],"summary":"Set Budget Ceiling","description":"Set the maximum percentage a campaign budget may move in one update.\n\nBubbleye admins only, on customer request. The copilots BLOCK any change\nabove this figure -- a user confirmation cannot override it -- so raising\nit genuinely widens what a mistake can cost.","operationId":"set_budget_ceiling_api_tenants__tenant_id__budget_ceiling_patch","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}},{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BudgetCeilingIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Budget Ceiling Api Tenants  Tenant Id  Budget Ceiling Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["tenants"],"summary":"Get Budget Ceiling","description":"Narrow read for the three sibling copilots that only need this one\ninteger. GET /{tenant_id} above returns it too, but also every user's\nemail, auth-provider linkage and invite state -- under the same\nomnipotent admin secret that creates tenants and users. This endpoint\nis gated the same way but can't leak anything beyond the ceiling.","operationId":"get_budget_ceiling_api_tenants__tenant_id__budget_ceiling_get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}},{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Budget Ceiling Api Tenants  Tenant Id  Budget Ceiling Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tenants/{tenant_id}/users":{"post":{"tags":["tenants"],"summary":"Create User","description":"Add a user to an existing tenant (name + email; no key, no password).\n\nRestores the user creation the retired create-key flow did as a side\neffect. Afterwards use the per-user Invite button to email a set-password\nlink, or the user signs in via SSO. Reuses an existing user-by-email\n(idempotent) instead of creating a duplicate row.","operationId":"create_user_api_tenants__tenant_id__users_post","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}},{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUserRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tenants/{tenant_id}/users/{user_id}/revoke-sessions":{"post":{"tags":["tenants"],"summary":"Revoke User Sessions","description":"Force-logout a user from every OIDC client (all copilots + pozeidon).\n\nBumps ``session_epoch`` and revokes the user's outstanding refresh-token\nfamilies. The OIDC refresh path (``oauth_provider/grants.py``) re-checks\nthe live epoch on every refresh, so the next refresh from any client is\ndenied (``session revoked``) — no copilot-side coordination needed. The\nuser's current access token still lives out its short TTL.","operationId":"revoke_user_sessions_api_tenants__tenant_id__users__user_id__revoke_sessions_post","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tenants/{tenant_id}/users/{user_id}/offboard":{"post":{"tags":["tenants"],"summary":"Offboard User","description":"Offboard a user: LOCK the account, cut its cross-tenant reach, end every\nsession, and record who did it (G-OFFBOARD, docs/folds/user-offboarding.md).\n\nDistinct from ``revoke-sessions`` above, which is a *kick*: it ends the\nsessions that exist, but the same person logs straight back in tomorrow.\nThis is the *lock*. Four things, in this order, so that no ordering leaves a\nusable window:\n\n1. ``users.disabled_at`` — every entry point that turns a users row into a\n   credential refuses from this instant (``app/user_active.py`` names them).\n   FIRST, so nothing can start a new session while the rest runs.\n2. ``cross_tenant_grants`` — the reach into other tenants goes with the\n   account (docs/design/2026-06-03-delegated-tenant-access-act-as.md).\n3. ``revoke_user_sessions`` — the existing kick, unchanged: bumps\n   session_epoch and revokes outstanding refresh families, so live copilot\n   sessions die at their next revalidation and meta-copilot's revocation\n   mirror picks the user up from ``session_revoked_at``.\n4. one ``user_offboardings`` row.\n\nIdempotent. A second call reports ``already_disabled: true``, leaves the\noriginal ``disabled_at`` alone, and STILL re-runs steps 2–4 — a repeat is\nwhat an operator reaches for when they suspect the first one half-landed,\nso it must re-close the door rather than report success and do nothing.","operationId":"offboard_user_api_tenants__tenant_id__users__user_id__offboard_post","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OffboardUserRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tenants/{tenant_id}/quota":{"patch":{"tags":["tenants"],"summary":"Update Tenant Quota","operationId":"update_tenant_quota_api_tenants__tenant_id__quota_patch","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}},{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateQuotaRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tenants/{tenant_id}/users/{user_id}/developer":{"patch":{"tags":["tenants"],"summary":"Update User Developer","operationId":"update_user_developer_api_tenants__tenant_id__users__user_id__developer_patch","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDeveloperRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tenants/{tenant_id}/users/{user_id}/name":{"patch":{"tags":["tenants"],"summary":"Update User Name","operationId":"update_user_name_api_tenants__tenant_id__users__user_id__name_patch","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUserNameRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tenants/{tenant_id}/name":{"patch":{"tags":["tenants"],"summary":"Rename Tenant","operationId":"rename_tenant_api_tenants__tenant_id__name_patch","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}},{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenameTenantRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tenants/{tenant_id}/avatar":{"post":{"tags":["tenants"],"summary":"Upload Tenant Avatar","description":"Set the tenant's default avatar (admin-only). Raw image bytes; Content-Type\ndeclares the mime. No square requirement — tenant logos render round via\nobject-fit. 404 if the tenant doesn't exist.","operationId":"upload_tenant_avatar_api_tenants__tenant_id__avatar_post","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}},{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["tenants"],"summary":"Remove Tenant Avatar","operationId":"remove_tenant_avatar_api_tenants__tenant_id__avatar_delete","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}},{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/users/invite":{"post":{"tags":["admin"],"summary":"Invite User","operationId":"invite_user_api_admin_users_invite_post","parameters":[{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Invite User Api Admin Users Invite Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/sources/redshift":{"post":{"tags":["admin"],"summary":"Upsert Source","operationId":"upsert_source_api_admin_sources_redshift_post","parameters":[{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedshiftSourceIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/sources/redshift/{tenant_id}":{"get":{"tags":["admin"],"summary":"Get Source","operationId":"get_source_api_admin_sources_redshift__tenant_id__get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}},{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["admin"],"summary":"Patch Source","operationId":"patch_source_api_admin_sources_redshift__tenant_id__patch","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}},{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedshiftSourcePatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin"],"summary":"Delete Source","operationId":"delete_source_api_admin_sources_redshift__tenant_id__delete","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}},{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me":{"get":{"tags":["me"],"summary":"Me","operationId":"me_api_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeResponse"}}}}}}},"/api/me/user":{"patch":{"tags":["me"],"summary":"Update User","description":"Update the authenticated user's name and/or email.\n\nNo-op fields (None) are skipped; pass exactly the columns you want to\nchange. Email shape is enforced at the DB level by the users_email_shape\nCHECK constraint.","operationId":"update_user_api_me_user_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUserRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/memory":{"get":{"tags":["memory"],"summary":"List Memory","description":"List the caller's memory entries (newest concepts first by creation).","operationId":"list_memory_api_memory_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/MemoryEntryOut"},"type":"array","title":"Response List Memory Api Memory Get"}}}}}},"delete":{"tags":["memory"],"summary":"Delete All Memory","description":"Hard-delete every memory entry for the caller (clear-all).","operationId":"delete_all_memory_api_memory_delete","responses":{"204":{"description":"Successful Response"}}}},"/api/memory/{entry_id}/approve":{"post":{"tags":["memory"],"summary":"Approve Memory Entry","description":"Approve a proposed entry so it starts being injected.\n\nThis click is now the ONLY way anything reaches the prompt — recurrence\nstopped promoting on 2026-09-17 — so it is also the last place a false\nfact can be stopped. 409 with the disagreement named when the entry\ncontradicts the account roster; the fix is then the memory or the mirror,\nand the caller can see which.","operationId":"approve_memory_entry_api_memory__entry_id__approve_post","parameters":[{"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"}}}}}}},"/api/memory/{entry_id}":{"delete":{"tags":["memory"],"summary":"Delete Memory Entry","description":"Hard-delete one of the caller's memory entries (idempotent).","operationId":"delete_memory_entry_api_memory__entry_id__delete","parameters":[{"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"}}}}}}},"/api/admin/server":{"get":{"tags":["admin"],"summary":"Server Metrics","operationId":"server_metrics_api_admin_server_get","parameters":[{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/server/history":{"get":{"tags":["admin"],"summary":"Server History","operationId":"server_history_api_admin_server_history_get","parameters":[{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/dashboard":{"get":{"tags":["admin"],"summary":"Dashboard","operationId":"dashboard_api_admin_dashboard_get","parameters":[{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/accounts":{"get":{"tags":["admin"],"summary":"Accounts","operationId":"accounts_api_admin_accounts_get","parameters":[{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/sync":{"get":{"tags":["admin"],"summary":"Sync Status","operationId":"sync_status_api_admin_sync_get","parameters":[{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/sync/trigger":{"post":{"tags":["admin"],"summary":"Sync Trigger","operationId":"sync_trigger_api_admin_sync_trigger_post","parameters":[{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/sync/jobs":{"get":{"tags":["admin"],"summary":"Sync Jobs","operationId":"sync_jobs_api_admin_sync_jobs_get","parameters":[{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/transcripts/filters":{"get":{"tags":["admin"],"summary":"Admin Transcripts Filters","description":"Distinct tenants + users that actually have transcripts — for the\nTranscripts page filter dropdowns.","operationId":"admin_transcripts_filters_api_admin_transcripts_filters_get","parameters":[{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/transcripts":{"get":{"tags":["admin"],"summary":"Admin Transcripts","operationId":"admin_transcripts_api_admin_transcripts_get","parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(ui|mcp|readonly|to_change)$"},{"type":"null"}],"title":"Source"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/gateway/sessions":{"get":{"tags":["admin"],"summary":"Admin Gateway Sessions","operationId":"admin_gateway_sessions_api_admin_gateway_sessions_get","parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/gateway/calls":{"get":{"tags":["admin"],"summary":"Admin Gateway Calls","description":"One gateway session's calls: its stated conversation id, or else a user's\nid-less calls between the session's start and end.","operationId":"admin_gateway_calls_api_admin_gateway_calls_get","parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","title":"Tenant Id"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},{"name":"since","in":"query","required":true,"schema":{"type":"string","format":"date-time","title":"Since"}},{"name":"until","in":"query","required":true,"schema":{"type":"string","format":"date-time","title":"Until"}},{"name":"conversation_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Conversation Id"}},{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/transcripts/{transcript_id}":{"get":{"tags":["admin"],"summary":"Admin Transcript Detail","operationId":"admin_transcript_detail_api_admin_transcripts__transcript_id__get","parameters":[{"name":"transcript_id","in":"path","required":true,"schema":{"type":"string","title":"Transcript Id"}},{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/audit":{"get":{"tags":["admin"],"summary":"Audit Log","operationId":"audit_log_api_admin_audit_get","parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"}},{"name":"action_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action Type"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"network","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Network"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/audit/{network}/{tool_call_id}":{"get":{"tags":["admin"],"summary":"Audit Detail","operationId":"audit_detail_api_admin_audit__network___tool_call_id__get","parameters":[{"name":"network","in":"path","required":true,"schema":{"type":"string","title":"Network"}},{"name":"tool_call_id","in":"path","required":true,"schema":{"type":"string","title":"Tool Call Id"}},{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/sandbox-usage":{"get":{"tags":["admin"],"summary":"Sandbox Usage","description":"run_python usage per tenant/user — cross-tenant, so the admin pool.\nSQL shape and outcome detection: app/sandbox_usage.py.","operationId":"sandbox_usage_api_admin_sandbox_usage_get","parameters":[{"name":"range","in":"query","required":false,"schema":{"type":"string","pattern":"^(1h|24h|7d|30d)$","default":"24h","title":"Range"}},{"name":"group","in":"query","required":false,"schema":{"type":"string","pattern":"^(tenant|user)$","default":"tenant","title":"Group"}},{"name":"include_internal","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Internal"}},{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/users/{user_id}/compute-tool":{"put":{"tags":["admin"],"summary":"Set Compute Tool","description":"Switch a user's one compute tool (pozeidon.users.compute_tool, V327);\nnull = the default (run_python). Takes effect on the user's next turn.\nCross-tenant by nature, so the admin pool.","operationId":"set_compute_tool_api_admin_users__user_id__compute_tool_put","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComputeToolBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/errors":{"get":{"tags":["admin"],"summary":"Errors","operationId":"errors_api_admin_errors_get","parameters":[{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/db/slow-queries":{"get":{"tags":["admin"],"summary":"Slow Queries","operationId":"slow_queries_api_admin_db_slow_queries_get","parameters":[{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/db/explain":{"post":{"tags":["admin"],"summary":"Explain Query","operationId":"explain_query_api_admin_db_explain_post","parameters":[{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/connection-timeline":{"get":{"tags":["admin"],"summary":"Connection Timeline","operationId":"connection_timeline_api_admin_connection_timeline_get","parameters":[{"name":"session","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session"}},{"name":"trace","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace"}},{"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"}},{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/grants":{"post":{"tags":["grants"],"summary":"Create Grant","operationId":"create_grant_api_admin_grants_post","parameters":[{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGrantRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GrantOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["grants"],"summary":"List Grants","operationId":"list_grants_api_admin_grants_get","parameters":[{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/GrantOut"},"title":"Response List Grants Api Admin Grants Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/grants/{grant_id}":{"delete":{"tags":["grants"],"summary":"Revoke Grant","operationId":"revoke_grant_api_admin_grants__grant_id__delete","parameters":[{"name":"grant_id","in":"path","required":true,"schema":{"type":"integer","title":"Grant Id"}},{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/gads/oauth/callback":{"get":{"tags":["gads-oauth"],"summary":"Oauth Callback","operationId":"oauth_callback_api_gads_oauth_callback_get","parameters":[{"name":"code","in":"query","required":true,"schema":{"type":"string","title":"Code"}},{"name":"state","in":"query","required":true,"schema":{"type":"string","title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/uploads":{"post":{"summary":"Proxy Upload","operationId":"proxy_upload_api_uploads_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/usage/me":{"get":{"summary":"Usage Me","operationId":"usage_me_api_usage_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Usage Me Api Usage Me Get"}}}}}}},"/api/transcripts/{transcript_id}/tool-calls":{"get":{"summary":"Transcript Tool Calls","operationId":"transcript_tool_calls_api_transcripts__transcript_id__tool_calls_get","parameters":[{"name":"transcript_id","in":"path","required":true,"schema":{"type":"string","title":"Transcript Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Transcript Tool Calls Api Transcripts  Transcript Id  Tool Calls Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/transcripts/{transcript_id}/results/{file_id}.ndjson":{"get":{"summary":"Result Ndjson","operationId":"result_ndjson_api_transcripts__transcript_id__results__file_id__ndjson_get","parameters":[{"name":"transcript_id","in":"path","required":true,"schema":{"type":"string","title":"Transcript Id"}},{"name":"file_id","in":"path","required":true,"schema":{"type":"string","title":"File Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/transcripts/{transcript_id}/results/{file_id}.csv":{"get":{"summary":"Result Csv","operationId":"result_csv_api_transcripts__transcript_id__results__file_id__csv_get","parameters":[{"name":"transcript_id","in":"path","required":true,"schema":{"type":"string","title":"Transcript Id"}},{"name":"file_id","in":"path","required":true,"schema":{"type":"string","title":"File Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/files/dl/{token}":{"get":{"summary":"Download","operationId":"download_api_files_dl__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/query/agent/attach":{"get":{"summary":"Attach","operationId":"attach_api_query_agent_attach_get","parameters":[{"name":"transcript_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcript Id"}},{"name":"session_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"}},{"name":"after_seq","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"After Seq"}},{"name":"Last-Event-ID","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last-Event-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/jobs/history":{"get":{"summary":"Get Jobs History","description":"Paginated job history grouped by session. See spec §6.1.\n\nPhase C v1 limitations:\n- `search` matches label and customer_id only (error_message is not searchable\n  server-side — would require a second pass post-fan-out, deferred).\n- `customer_label` is not returned (no source table for human-readable customer\n  names today — frontend renders raw customer_id; tracked as Phase C+ enhancement).\n- No cursor pagination — endpoint returns all rows in the since_days window.\n  Acceptable for current volumes; add cursor if rows-per-page exceeds ~200.","operationId":"get_jobs_history_api_jobs_history_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"enum":["all","running","failed"],"type":"string","default":"all","title":"Status"}},{"name":"since_days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":30,"title":"Since Days"}},{"name":"customer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Customer Id"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Search"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Jobs History Api Jobs History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/jobs/{job_id}/audit":{"get":{"summary":"Get Job Audit","description":"Single-job audit envelope. See spec §6.2.\n\nThe ownership/transcript reads and the copilot's live job status do not\ndepend on each other, so they run together: the details pane waited for\ntheir sum (~480 ms, 2026-10-02). A job the caller does not own still\n404s before anything is returned — the live read is discarded. Phase\ntimes go out as Server-Timing so the next slow click is measured in the\nbrowser, not guessed.","operationId":"get_job_audit_api_jobs__job_id__audit_get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Job Audit Api Jobs  Job Id  Audit Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/jobs/{job_id}":{"get":{"summary":"Get Job","description":"Return google-copilot's view of ``job_id``.\n\nReturns 404 if the job is not joined to any transcript the caller\nowns, OR if google-copilot does not recognize the job.","operationId":"get_job_api_jobs__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Job Api Jobs  Job Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/jobs":{"get":{"summary":"List Jobs","description":"List jobs owned by the caller, enriched with live status + progress\n+ error_message from google-copilot.\n\nstatus=running (default): only rows whose live status is queued|running.\nstatus=all: all rows, regardless of live status.\n\nRows missing from the jobs_progress cache get one live GcHttpClient.get_job:\na copilot 404 is persisted as 'cancelled'; a failed fetch is returned as\n'unknown' and persists nothing.","operationId":"list_jobs_api_jobs_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"enum":["running","all"],"type":"string","default":"running","title":"Status"}},{"name":"since_hours","in":"query","required":false,"schema":{"type":"integer","maximum":168,"minimum":1,"default":24,"title":"Since Hours"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Jobs Api Jobs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/skills":{"get":{"tags":["skills"],"summary":"List Skills","operationId":"list_skills_api_skills_get","parameters":[{"name":"include_archived","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Archived"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response List Skills Api Skills Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/skills/{name}":{"get":{"tags":["skills"],"summary":"Get Skill","operationId":"get_skill_api_skills__name__get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Get Skill Api Skills  Name  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["skills"],"summary":"Update Skill","operationId":"update_skill_api_skills__name__patch","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Patch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Update Skill Api Skills  Name  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/skills/{name}/archive":{"post":{"tags":["skills"],"summary":"Archive Skill","operationId":"archive_skill_api_skills__name__archive_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Archive Skill Api Skills  Name  Archive Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/skills/{name}/restore":{"post":{"tags":["skills"],"summary":"Restore Skill","operationId":"restore_skill_api_skills__name__restore_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Restore Skill Api Skills  Name  Restore Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/skills/{name}/history":{"get":{"tags":["skills"],"summary":"Skill History","operationId":"skill_history_api_skills__name__history_get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Skill History Api Skills  Name  History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/skills/{name}/revert/{history_id}":{"post":{"tags":["skills"],"summary":"Revert Skill","operationId":"revert_skill_api_skills__name__revert__history_id__post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"history_id","in":"path","required":true,"schema":{"type":"string","title":"History Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Revert Skill Api Skills  Name  Revert  History Id  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/drive-thumbnails/{file_id}":{"get":{"summary":"Proxy Drive Thumbnail","description":"Verify the signed URL, then proxy the JPEG from the storage service\nunder a scoped token. Any failure → placeholder (see module docstring).\n\nDual-served at both `/api/thumbnails` (new, provider-neutral) and the\nlegacy `/api/drive-thumbnails`. The original reason was in-flight signed\nURLs (6h TTL) during the signer-base flip, and that window closed long ago.\nThe mount STAYS for a different reason, measured 2026-09-01.\n\n145 of 3,085 rows in `pozeidon.transcripts` still carry the old path in\ntheir stored events (newest 2026-06-04; nothing has emitted it since —\n`sign_thumbnail_url` builds only `/api/thumbnails`). Row count alone does\nnot justify the mount, because `/api/transcripts` lists a tenant's newest\n50 (200 max) — so most of those are past the end of the list. Ranking them\nper tenant is what decides it:\n\n    tenant                       old  best_rank  in_50  in_200\n    t_019e4d70…bc292bd5dead      107       1574      0       0\n    t_019dbe27…ef5a22c56db7       33         23      5      33\n    t_019e8283…889aec7c0d33        5          6      5       5\n\n107 are indeed unreachable. But **38 sit inside the visible list for two\ntenants, and 10 of those are on the first page** — one tenant's 6th-most-\nrecent conversation is among them, because that tenant has barely run\nanything since June, so its June history IS its recent history.\n\nThose signatures are long expired, so the route answers them with the\nplaceholder; drop the mount and those 38 render a broken-image icon on\nthe first screen two tenants see. One decorator is cheaper than that.\n\nRe-run the query above before removing this: when the two tenants push\nthose rows past rank 200, the mount has nothing left to protect.","operationId":"proxy_drive_thumbnail_api_drive_thumbnails__file_id__get","parameters":[{"name":"file_id","in":"path","required":true,"schema":{"type":"string","title":"File Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/thumbnails/{file_id}":{"get":{"summary":"Proxy Drive Thumbnail","description":"Verify the signed URL, then proxy the JPEG from the storage service\nunder a scoped token. Any failure → placeholder (see module docstring).\n\nDual-served at both `/api/thumbnails` (new, provider-neutral) and the\nlegacy `/api/drive-thumbnails`. The original reason was in-flight signed\nURLs (6h TTL) during the signer-base flip, and that window closed long ago.\nThe mount STAYS for a different reason, measured 2026-09-01.\n\n145 of 3,085 rows in `pozeidon.transcripts` still carry the old path in\ntheir stored events (newest 2026-06-04; nothing has emitted it since —\n`sign_thumbnail_url` builds only `/api/thumbnails`). Row count alone does\nnot justify the mount, because `/api/transcripts` lists a tenant's newest\n50 (200 max) — so most of those are past the end of the list. Ranking them\nper tenant is what decides it:\n\n    tenant                       old  best_rank  in_50  in_200\n    t_019e4d70…bc292bd5dead      107       1574      0       0\n    t_019dbe27…ef5a22c56db7       33         23      5      33\n    t_019e8283…889aec7c0d33        5          6      5       5\n\n107 are indeed unreachable. But **38 sit inside the visible list for two\ntenants, and 10 of those are on the first page** — one tenant's 6th-most-\nrecent conversation is among them, because that tenant has barely run\nanything since June, so its June history IS its recent history.\n\nThose signatures are long expired, so the route answers them with the\nplaceholder; drop the mount and those 38 render a broken-image icon on\nthe first screen two tenants see. One decorator is cheaper than that.\n\nRe-run the query above before removing this: when the two tenants push\nthose rows past rank 200, the mount has nothing left to protect.","operationId":"proxy_drive_thumbnail_api_thumbnails__file_id__get","parameters":[{"name":"file_id","in":"path","required":true,"schema":{"type":"string","title":"File Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/credentials/unityads":{"post":{"tags":["credentials"],"summary":"Submit Unityads Credentials","operationId":"submit_unityads_credentials_api_credentials_unityads_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_UnityAdsCredsBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/credentials/axon":{"post":{"tags":["credentials"],"summary":"Submit Axon Credentials","operationId":"submit_axon_credentials_api_credentials_axon_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_AxonCredsBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/credentials/mintegral":{"post":{"tags":["credentials"],"summary":"Submit Mintegral Credentials","operationId":"submit_mintegral_credentials_api_credentials_mintegral_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_MintegralCredsBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/webhook-healthcheck":{"post":{"summary":"Webhook Healthcheck","description":"HMAC-verified boot canary. See module docstring.","operationId":"webhook_healthcheck_internal_webhook_healthcheck_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookHealthcheckOut"}}}}}}},"/internal/mint-service-jwt":{"post":{"summary":"Mint Service Jwt Endpoint","operationId":"mint_service_jwt_endpoint_internal_mint_service_jwt_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MintServiceJwtResponse"}}}}}}},"/internal/mint-mcp-token":{"post":{"summary":"Mint Mcp Token Endpoint","operationId":"mint_mcp_token_endpoint_internal_mint_mcp_token_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/internal/mint-delegate-token":{"post":{"summary":"Mint Delegate Token Endpoint","description":"Mint a delegated (\"view as user\") token: sub = the customer, act = the\nsupport human. Authorization is authoritative HERE — the ACTOR must hold a\ncross-tenant grant covering the subject's tenant, and the SUBJECT must really\nbelong to it. Read-only enforcement is the consuming copilot's job (it detects\nthe `act` claim); pozeidon only ships the attributable primitive. See\ndocs/design/2026-06-16-support-view-as-token-flow.html.","operationId":"mint_delegate_token_endpoint_internal_mint_delegate_token_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/internal/reachable-tenants":{"post":{"summary":"Reachable Tenants Endpoint","operationId":"reachable_tenants_endpoint_internal_reachable_tenants_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/internal/budget-ceiling":{"post":{"summary":"Budget Ceiling Endpoint","description":"The maximum percentage a budget may move in one update, per tenant.\n\nRead by the Meta/Google/AppLovin copilots at write time. They fail CLOSED\nwhen this is unreachable (all >10% changes blocked), so this route must\nnever invent a value: an unknown tenant is a 404, not a default.","operationId":"budget_ceiling_endpoint_internal_budget_ceiling_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/internal/tenant-services":{"post":{"summary":"Tenant Services Endpoint","description":"The services a tenant holds: its stored `allowed_services` ∪ ALWAYS_ON.\n\nRead by meta-copilot at session refresh. Meta mints its own session JWT and\notherwise never re-contacts pozeidon after login (see /internal/revocations\nbelow), so this is how a tenant that lost meta_copilot stops getting fresh\nmeta sessions. A failed read raises ServicesUnavailable, which main.py\nanswers 503 — never a default list; meta refuses the refresh either way.","operationId":"tenant_services_endpoint_internal_tenant_services_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/internal/revocations":{"post":{"summary":"Revocations Endpoint","description":"Revocation feed for stateless relying parties (meta-copilot).\n\nMeta validates its own JWT per-request and never re-contacts pozeidon after\nlogin, so pozeidon's force-logout can't reach it by the refresh path the\ncookie copilots use. Meta instead polls this feed and mirrors each row into\nits own per-request denylist, keyed by `revoked_after` vs the token's `iat`.","operationId":"revocations_endpoint_internal_revocations_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/internal/spool-upload":{"post":{"summary":"Spool Upload Endpoint","description":"Service-to-service spool: sibling copilots (unity-copilot first) POST an\noversize tool result here as NDJSON text; we forward it to analyze-mcp's\n/uploads (same short-TTL proxy JWT as backend/app/uploads.py's /api/uploads)\nand hand back analyze's file sidecar (file_id, columns, sample, ...)\nverbatim, so the caller can hand the agent a file_id instead of the raw\nrows. HMAC-gated like the other /internal/* routes in this module — but\nHMAC alone only proves \"a sibling service\", not \"for THIS tenant\": any\nHMAC-authenticated caller could otherwise assert an arbitrary tenant_id, a\ndurable cross-tenant write. So the caller MUST also present, as a Bearer\ntoken, the SAME pozeidon-signed JWT it was handed for its live MCP\nrequest (minted by mint_tenant_jwt) — proof-of-tenant, verified against\nour own signing keys (see auth.verify_tenant_proof_jwt) with its\n`tenant_id` claim required to exactly match the body's tenant_id.","operationId":"spool_upload_endpoint_internal_spool_upload_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/internal/complete":{"post":{"summary":"Internal Complete","operationId":"internal_complete_internal_complete_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/internal/anomalies/notify":{"post":{"summary":"Anomaly Notify","operationId":"anomaly_notify_internal_anomalies_notify_post","responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/schedules":{"get":{"summary":"List Schedules","operationId":"list_schedules_api_schedules_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/schedules/runs/seen":{"post":{"summary":"Mark Runs Seen","description":"Opening the Scheduled panel: the dot goes out (design §9 guard 8).","operationId":"mark_runs_seen_api_schedules_runs_seen_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/schedules/{schedule_id}":{"get":{"summary":"Get Schedule","operationId":"get_schedule_api_schedules__schedule_id__get","parameters":[{"name":"schedule_id","in":"path","required":true,"schema":{"type":"string","title":"Schedule Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Schedule","operationId":"delete_schedule_api_schedules__schedule_id__delete","parameters":[{"name":"schedule_id","in":"path","required":true,"schema":{"type":"string","title":"Schedule Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/schedules/{schedule_id}/pause":{"post":{"summary":"Pause Schedule","operationId":"pause_schedule_api_schedules__schedule_id__pause_post","parameters":[{"name":"schedule_id","in":"path","required":true,"schema":{"type":"string","title":"Schedule Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/schedules/{schedule_id}/resume":{"post":{"summary":"Resume Schedule","operationId":"resume_schedule_api_schedules__schedule_id__resume_post","parameters":[{"name":"schedule_id","in":"path","required":true,"schema":{"type":"string","title":"Schedule Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/schedules/{schedule_id}/run-now":{"post":{"summary":"Run Schedule Now","description":"Fire the brief now, as its owner, outside the clock: a preview of\nwhat the scheduled task does, and the test of a one-off before its time.","operationId":"run_schedule_now_api_schedules__schedule_id__run_now_post","parameters":[{"name":"schedule_id","in":"path","required":true,"schema":{"type":"string","title":"Schedule Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/schedules/{schedule_id}/runs":{"get":{"summary":"Schedule Runs","operationId":"schedule_runs_api_schedules__schedule_id__runs_get","parameters":[{"name":"schedule_id","in":"path","required":true,"schema":{"type":"string","title":"Schedule Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/followups":{"get":{"summary":"List Followups","operationId":"list_followups_api_followups_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/followups/{followup_id}/fire":{"post":{"summary":"Fire Followup","description":"The old contract: hand the prompt back for the browser to submit as a\nturn, and retire the one-off.","operationId":"fire_followup_api_followups__followup_id__fire_post","parameters":[{"name":"followup_id","in":"path","required":true,"schema":{"type":"string","title":"Followup Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/followups/dismiss-due":{"post":{"summary":"Dismiss Due Followups","description":"The old contract, kept: one UPDATE scoped to the caller's tenant,\nthrough the given date, clamped to UTC tomorrow so a client cannot\ndismiss upcoming rows. A dismissed one-off is paused (its history\nstays), which is what \"gone from the list\" means here.","operationId":"dismiss_due_followups_api_followups_dismiss_due_post","parameters":[{"name":"through","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Through"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/followups/{followup_id}/dismiss":{"post":{"summary":"Dismiss Followup","operationId":"dismiss_followup_api_followups__followup_id__dismiss_post","parameters":[{"name":"followup_id","in":"path","required":true,"schema":{"type":"string","title":"Followup Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/anomalies/healthcheck":{"post":{"summary":"Anomaly Healthcheck","operationId":"anomaly_healthcheck_internal_anomalies_healthcheck_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnomalyHealthcheckOut"}}}}}}},"/api/agent/confirmations/pending":{"get":{"summary":"List Pending Confirmations","description":"Pending confirmation cards for ONE session, in the exact shape the\nSSE `tool_confirmation_required` event uses — so the frontend can\nre-render live cards when a session is OPENED (Recent panel / page\nrefresh), where no POST happens and the SSE reconnect re-emit\n(agent.py, Task 12) never fires.\n\nLive-caught 2026-07-13 (run 23, Bruce): a browser restart mid-review\nmade the pending card unrecoverable — it existed only as a DB row\nuntil TTL expiry. History replay deliberately skips confirmation\nevents (they'd render dead buttons); THIS endpoint is the live\ncomplement. Owner-scoped: only the caller's own pending rows,\nfiltered to the requested session.","operationId":"list_pending_confirmations_api_agent_confirmations_pending_get","parameters":[{"name":"session_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent/confirmations/resolve":{"post":{"summary":"Resolve Many Confirmations","description":"The /approvals page's \"Approve all\" / \"Cancel all\" (G-BASKET P9).\n\nOne person, one gesture, N cards — each decided through resolve_card\nexactly as a single click would be, so D1 holds (a person answers every\ncard) and nothing about ownership, expiry or execution routing is\nre-implemented. Each card succeeds or fails on its own: one that expired\nor was answered elsewhere while the modal was open reports its own\n404/410 and never sinks the rest. Stamped `web_ui_bulk` so the audit can\ntell one action for N cards from N clicks.","operationId":"resolve_many_confirmations_api_agent_confirmations_resolve_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveManyBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent/confirmations/{confirmation_id}":{"post":{"summary":"Resolve Confirmation","description":"Resolve a pending mutation-gate confirmation card.\n\nRules:\n- `decision=approve` with `edited_args` must supply the **same set of\n  top-level keys** as the original input (no new keys, no dropped keys).\n- Returns 404 when the confirmation doesn't exist or belongs to a\n  different user.\n- Returns 410 when the confirmation is already resolved.\n- Returns 200 on success with the updated row.","operationId":"resolve_confirmation_api_agent_confirmations__confirmation_id__post","parameters":[{"name":"confirmation_id","in":"path","required":true,"schema":{"type":"string","title":"Confirmation Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Get Confirmation","description":"One confirmation row incl. its broker execution outcome (F4-P1 D2).\n\nUnlike /pending this RETURNS RESOLVED ROWS (codex R1-4) — the card\npolls it after approve to render \"executed ✓ → result\" / the error.\nOwnership enforced in the query: a foreign row is a 404, same contract\nas resolve. Registered AFTER /pending so the static path wins.","operationId":"get_confirmation_api_agent_confirmations__confirmation_id__get","parameters":[{"name":"confirmation_id","in":"path","required":true,"schema":{"type":"string","title":"Confirmation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent/confirmations/{confirmation_id}/rendered":{"post":{"summary":"Confirmation Rendered","description":"Telemetry stamp: the card actually rendered in this user's browser.\nFirst render wins; no status guard (T-card-rendered).","operationId":"confirmation_rendered_api_agent_confirmations__confirmation_id__rendered_post","parameters":[{"name":"confirmation_id","in":"path","required":true,"schema":{"type":"string","title":"Confirmation Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent/confirmations/history":{"get":{"summary":"Confirmation History","description":"The caller's approved writes, newest first, each with its outcome.\n\n\"My actions\" (G-APPROVEOUT): every gated write of every copilot leaves a\ntool_confirmations row, so this is the one place that can answer \"what\ndid I do, and did it work?\" — jobs are one kind of outcome, and most\nwrites (queue, attach, remove) never dispatch one. Owner-scoped in the\nquery, same contract as GET /{id}. A card the person cancelled is listed\ntoo (state \"rejected\"): with several decided at once from the rail\n(G-RAILDECIDE), a wrong reject has to be findable. A card the agent\nwithdrew is not — the person decided nothing.","operationId":"confirmation_history_api_agent_confirmations_history_get","parameters":[{"name":"since_days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Since Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent/client-gone":{"post":{"summary":"Client Gone","operationId":"client_gone_api_agent_client_gone_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientGone"}}},"required":true},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/login":{"post":{"tags":["auth"],"summary":"Login","operationId":"login_api_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Login Api Auth Login Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/providers":{"get":{"tags":["auth"],"summary":"Auth Providers","description":"Which social providers are configured — drives the frontend's conditional buttons.","operationId":"auth_providers_api_auth_providers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Auth Providers Api Auth Providers Get"}}}}}}},"/api/auth/logout":{"post":{"tags":["auth"],"summary":"Logout","operationId":"logout_api_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Logout Api Auth Logout Post"}}}}}}},"/api/auth/password/forgot":{"post":{"tags":["auth"],"summary":"Forgot Password","operationId":"forgot_password_api_auth_password_forgot_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Forgot Password Api Auth Password Forgot Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/password/set":{"post":{"tags":["auth"],"summary":"Set Password","operationId":"set_password_api_auth_password_set_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetPasswordIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Set Password Api Auth Password Set Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/realm":{"get":{"tags":["auth"],"summary":"Realm Probe","description":"Soft SSO hint for the set-password page. Rate-limited; never a membership oracle\n(no DB lookup, no per-account branching).","operationId":"realm_probe_api_auth_realm_get","parameters":[{"name":"email","in":"query","required":true,"schema":{"type":"string","minLength":3,"title":"Email"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Realm Probe Api Auth Realm Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/invite-info":{"get":{"tags":["auth"],"summary":"Invite Info","description":"Non-consuming: the invited email + its detected SSO provider (resolved server-side\nso the set-password page renders its final state in one pass — no client realm probe,\nno flash). Returns {\"email\": null, \"sso_provider\": null} for bad tokens.","operationId":"invite_info_api_auth_invite_info_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"title":"Response Invite Info Api Auth Invite Info Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/{provider}/start":{"get":{"tags":["auth"],"summary":"Social Start","operationId":"social_start_api_auth__provider__start_get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/{provider}/callback":{"get":{"tags":["auth"],"summary":"Social Callback","operationId":"social_callback_api_auth__provider__callback_get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/access-request/name":{"get":{"tags":["auth"],"summary":"Access Request Name","operationId":"access_request_name_api_auth_access_request_name_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Access Request Name Api Auth Access Request Name Get"}}}}}},"post":{"tags":["auth"],"summary":"Set Access Request Name","operationId":"set_access_request_name_api_auth_access_request_name_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessRequestNameIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Set Access Request Name Api Auth Access Request Name Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/.well-known/openid-configuration":{"get":{"tags":["oidc"],"summary":"Discovery","operationId":"discovery__well_known_openid_configuration_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Discovery  Well Known Openid Configuration Get"}}}}}}},"/.well-known/oauth-authorization-server":{"get":{"tags":["oidc"],"summary":"Discovery","operationId":"discovery__well_known_oauth_authorization_server_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Discovery  Well Known Oauth Authorization Server Get"}}}}}}},"/.well-known/jwks.json":{"get":{"tags":["oidc"],"summary":"Jwks","operationId":"jwks__well_known_jwks_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Jwks  Well Known Jwks Json Get"}}}}}}},"/oauth2/logout":{"get":{"tags":["oidc"],"summary":"End Session","description":"RP-initiated logout (OIDC). Clears the pozeidon SSO session cookie so the\nnext /oauth2/authorize prompts a real login (instead of silently re-issuing\na code). Redirects to `post_logout_redirect_uri` ONLY when it shares an\norigin with the calling client's registered redirect_uris — else falls back\nto pozeidon's own login. The cookie is cleared regardless of the target.","operationId":"end_session_oauth2_logout_get","parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}},{"name":"post_logout_redirect_uri","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Post Logout Redirect Uri"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/oauth2/client-branding":{"get":{"tags":["oidc"],"summary":"Client Branding","description":"Public, unauthenticated: the login page (pre-auth) fetches a client's\nnon-secret branding (display_name/logo_url/accent_color) by client_id to\nco-brand the IdP login. Unknown client_id → 404 → default POZEIDON theme.\nNever exposes the secret hash or redirect_uris.","operationId":"client_branding_oauth2_client_branding_get","parameters":[{"name":"client_id","in":"query","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Client Branding Oauth2 Client Branding Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/oauth2/apps":{"get":{"tags":["oidc"],"summary":"Apps Directory","description":"Public, unauthenticated: the /apps launcher page lists the registered\napps (display_name/logo/accent/home_url — all non-secret). Destinations\nderive from REGISTERED redirect_uris, so nothing here is caller-controlled.","operationId":"apps_directory_oauth2_apps_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Apps Directory Oauth2 Apps Get"}}}}}}},"/api/apps":{"get":{"tags":["oidc"],"summary":"My Apps","description":"The signed-in tenant's launcher: the /oauth2/apps directory narrowed\nto copilots (tenant_services.COPILOT_SERVICE) whose service the tenant\nholds — the same rule /oauth2/authorize enforces. An unmapped client is\ndropped (fail closed). `withheld` names the registered copilots the\ntenant lacks, so the launcher hides them rather than showing SOON;\n`services` lets it hide the Pozeidon card too.","operationId":"my_apps_api_apps_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response My Apps Api Apps Get"}}}}}}},"/oauth2/authorize":{"get":{"tags":["oidc"],"summary":"Authorize","operationId":"authorize_oauth2_authorize_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth2/token":{"post":{"tags":["oidc"],"summary":"Token","operationId":"token_oauth2_token_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth2/userinfo":{"get":{"tags":["oidc"],"summary":"Userinfo","operationId":"userinfo_oauth2_userinfo_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth2/revoke":{"post":{"tags":["oidc"],"summary":"Revoke","operationId":"revoke_oauth2_revoke_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/oauth-clients":{"get":{"tags":["admin"],"summary":"List Clients","operationId":"list_clients_api_admin_oauth_clients_get","parameters":[{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin"],"summary":"Register Client","operationId":"register_client_api_admin_oauth_clients_post","parameters":[{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterClientRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/oauth-clients/{client_id}/colleague":{"patch":{"tags":["admin"],"summary":"Set Colleague Access","description":"Add or remove one client from the colleague-MCP audience allow-list.\n\nThis is the whole onboarding/offboarding switch: no env edit, no restart.\nEnabling takes effect on the client's next token verify; disabling stops\nnew authentications immediately (existing access tokens still expire on\ntheir own short TTL — revoke the refresh-token family to cut a live one).","operationId":"set_colleague_access_api_admin_oauth_clients__client_id__colleague_patch","parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}},{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ColleaguePatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/oauth-clients/{client_id}":{"patch":{"tags":["admin"],"summary":"Patch Client Branding","description":"Update login branding on an already-registered client (lets us brand the\nexisting unity-copilot client without re-registering). Only provided\n(non-None) fields are written; 404 if the client doesn't exist.","operationId":"patch_client_branding_api_admin_oauth_clients__client_id__patch","parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}},{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandingPatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin"],"summary":"Delete Client","operationId":"delete_client_api_admin_oauth_clients__client_id__delete","parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}},{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/access-requests":{"get":{"tags":["access_requests"],"summary":"List Requests","operationId":"list_requests_api_access_requests_get","parameters":[{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Requests Api Access Requests Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/access-requests/count":{"get":{"tags":["access_requests"],"summary":"Count Requests","operationId":"count_requests_api_access_requests_count_get","parameters":[{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Count Requests Api Access Requests Count Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/access-requests/{request_id}/approve":{"post":{"tags":["access_requests"],"summary":"Approve Request","operationId":"approve_request_api_access_requests__request_id__approve_post","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Request Id"}},{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApproveIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Approve Request Api Access Requests  Request Id  Approve Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/access-requests/{request_id}/reject":{"post":{"tags":["access_requests"],"summary":"Reject Request","operationId":"reject_request_api_access_requests__request_id__reject_post","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Request Id"}},{"name":"x-admin-secret","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Secret"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejectIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reject Request Api Access Requests  Request Id  Reject Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/avatars":{"post":{"summary":"Internal Post","operationId":"internal_post_internal_avatars_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"delete":{"summary":"Internal Delete","operationId":"internal_delete_internal_avatars_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/avatars":{"post":{"summary":"Api Post","operationId":"api_post_api_avatars_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"delete":{"summary":"Api Delete","operationId":"api_delete_api_avatars_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/avatars/{user_id}":{"get":{"summary":"Serve","description":"Public. Resolves personal → the user's tenant default → 404, so the\ntenant default appears everywhere a user has no personal avatar. With\n``?personal=1`` only the personal avatar is considered (404 otherwise) —\nupload forms use this to render an 'empty' state instead of the tenant\ndefault. 404 lets the shared UserAvatar fall back to its generic icon.","operationId":"serve_api_avatars__user_id__get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"personal","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Personal"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tenant-avatars/{tenant_id}":{"get":{"summary":"Serve Tenant Avatar","description":"Public. The tenant's default avatar bytes (for the admin UI + the\nresolution above). 404 when the tenant has no default set.","operationId":"serve_tenant_avatar_api_tenant_avatars__tenant_id__get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/health":{"get":{"summary":"Health","operationId":"health_api_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/me":{"get":{"summary":"Auth Me","operationId":"auth_me_api_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/mcp-token":{"post":{"summary":"Mint Mcp Token","description":"Mint a short-lived JWT for a direct MCP integration.\n\nCustomers POST here with their pozeidon API key to get a token they\ncan attach as `Authorization: Bearer <token>` when calling the MCP\nserver directly (e.g. https://analyze.pozeidon.bubbleye.ai/mcp).\n\nBody: {\"mcp\": \"analyze\", \"ttl_minutes\": 30}  — ttl_minutes optional,\ndefaults to 30, capped at 60.\nReturns: {\"token\": \"<jwt>\", \"expires_at\": \"<iso8601>\", \"mcp\": \"analyze\"}","operationId":"mint_mcp_token_api_auth_mcp_token_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpTokenRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/integrations":{"get":{"summary":"Integrations","operationId":"integrations_api_integrations_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/stats":{"get":{"summary":"Stats","operationId":"stats_api_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/query/agent":{"post":{"summary":"Q Agent","operationId":"q_agent_api_query_agent_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentPrompt"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/transcripts":{"get":{"summary":"List Transcripts","operationId":"list_transcripts_api_transcripts_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/transcripts/{transcript_id}/thread":{"get":{"summary":"Get Transcript Thread","description":"Every turn in the same session as `transcript_id`, oldest first.\n\nPowers \"Open original conversation\" in the jobs panel: a job points at a\nsingle transcript (one turn), but the user wants to replay the WHOLE\nconversation that turn belonged to. Turns are grouped by session_id (the\nSDK session id, stable across multi-turn resume — same grouping key as\n/api/sessions); a transcript with NULL session_id is its own single-turn\nthread. RLS-scoped to the caller's tenant + user. Returns the anchor id so\nthe client can scroll the replay to the job's turn.","operationId":"get_transcript_thread_api_transcripts__transcript_id__thread_get","parameters":[{"name":"transcript_id","in":"path","required":true,"schema":{"type":"string","title":"Transcript Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/transcripts/{transcript_id}":{"get":{"summary":"Get Transcript","operationId":"get_transcript_api_transcripts__transcript_id__get","parameters":[{"name":"transcript_id","in":"path","required":true,"schema":{"type":"string","title":"Transcript Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sessions":{"get":{"summary":"List Sessions","operationId":"list_sessions_api_sessions_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent/stop":{"post":{"summary":"Stop Agent Turn","description":"Actually cancel the live turn on this session.\n\nDistinct from a client disconnect: event_stream() above is a thin,\ndisposable consumer that sse_starlette may cancel freely, while the\nproducer (_ACTIVE_TURNS) keeps running by design so a flaky network\ndoesn't kill a real answer. The Stop button used to only close the\nclient's own connection — the turn kept generating/calling tools in the\nbackground regardless, which is why a \"stopped\" turn could still show\nup as stream_state='live' 15 minutes later. This is the real cancel.","operationId":"stop_agent_turn_api_agent_stop_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentStopIn"}}},"required":true},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sessions/{session_id}/title":{"patch":{"summary":"Rename Session","description":"Name a conversation so Recent chats is scannable.\n\nWithout a title the sidebar labels every session with its whole first\nprompt (Marta, 2026-07-16). Blank clears the name and falls back to it.","operationId":"rename_session_api_sessions__session_id__title_patch","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionTitleIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sessions/{session_id}/branch":{"post":{"summary":"Branch Session","description":"Fork a conversation: a NEW session seeded with this one's full\naccumulated context (G-MSESS, Misha's actual ask — 'run two parallel\nsessions' meant taking the context somewhere else; his fresh session B\nre-derived it for 40 minutes and got worse answers).\n\nCopies the agent_session_entries rows under a freshly minted id — the\nSDK resumes from OUR store, so any id with rows is a resumable session.\nBecause the store only ever holds COMPLETED turns, branching a running\nconversation is the same operation as branching an idle one: the branch\nknows everything up to the last finished answer; the in-flight turn's\nresult stays with the parent. No locks, no racing the live turn.","operationId":"branch_session_api_sessions__session_id__branch_post","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/folders":{"get":{"summary":"List Folders","description":"This user's conversation folders, with how many chats each holds.","operationId":"list_folders_api_folders_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Create Folder","operationId":"create_folder_api_folders_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/names/resolve":{"get":{"summary":"Resolve Name For Quote","description":"Each (normalised) name → its entity when exactly one row matches, else\nnull. Backs the ◆ chip at send time (G-RE). Reads pozeidon_cross_network.v_entity_names\nunder the tenant's RLS.\n\nBATCHED: `?q=a&q=b&q=c`, at most ``MAX_NAMES`` names, answered by ONE\nSELECT. The first version took a single `q` and the client fired one\nrequest per chip — up to five concurrent unindexed scans of the view for a\nsingle send. Shape of the reply is ``{\"entities\": {<original q>: …}}``,\nkeyed by the string the caller sent so it can map straight back onto its\nchips without re-normalising anything.\n\nFollow-up if this ever shows in pg_stat_statements: a functional index on\n``regexp_replace(lower(name),'[^a-z0-9]','','g')`` over the base tables the\nview unions (a view cannot carry an index itself). Deliberately not done\nnow — one scan per send is a different cost from five.","operationId":"resolve_name_for_quote_api_names_resolve_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"default":[],"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/folders/{folder_id}":{"delete":{"summary":"Delete Folder","description":"Remove a folder. Its conversations are UNFILED, never deleted —\nV224's FK is ON DELETE SET NULL. A folder is a view over the work, not\na container of it.","operationId":"delete_folder_api_folders__folder_id__delete","parameters":[{"name":"folder_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Folder Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sessions/{session_id}/folder":{"patch":{"summary":"File Session","description":"File a conversation into a folder, or unfile it with folder_id=null.","operationId":"file_session_api_sessions__session_id__folder_patch","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionFolderIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin":{"get":{"summary":"Admin Root","operationId":"admin_root_admin_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/{path}":{"get":{"summary":"Admin Fallback","operationId":"admin_fallback_admin__path__get","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"get":{"summary":"Spa Root","operationId":"spa_root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/login":{"get":{"summary":"Spa Login","operationId":"spa_login_login_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/go/{rest}":{"get":{"summary":"Forward","operationId":"forward_go__rest__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/tryme":{"get":{"summary":"Forward","operationId":"forward_tryme_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/llms.txt":{"get":{"summary":"Forward","operationId":"forward_llms_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/sitemap.xml":{"get":{"summary":"Forward","operationId":"forward_sitemap_xml_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/prompts":{"get":{"summary":"Forward","operationId":"forward_prompts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/guides/{rest}":{"get":{"summary":"Forward","operationId":"forward_guides__rest__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/privacy":{"get":{"summary":"Forward","operationId":"forward_privacy_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/terms":{"get":{"summary":"Forward","operationId":"forward_terms_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/compare":{"get":{"summary":"Forward","operationId":"forward_compare_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/{path}":{"get":{"summary":"Spa Fallback","operationId":"spa_fallback__path__get","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AccessRequestNameIn":{"properties":{"name":{"type":"string","title":"Name"}},"type":"object","required":["name"],"title":"AccessRequestNameIn"},"AgentPrompt":{"properties":{"prompt":{"type":"string","maxLength":200000,"title":"Prompt"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"demo_mode":{"type":"boolean","title":"Demo Mode","default":false},"file_ids":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":5},{"type":"null"}],"title":"File Ids"},"model_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Id"},"quotes":{"anyOf":[{"items":{"$ref":"#/components/schemas/Quote"},"type":"array","maxItems":5},{"type":"null"}],"title":"Quotes"},"timezone":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Timezone"}},"type":"object","required":["prompt"],"title":"AgentPrompt"},"AgentStopIn":{"properties":{"session_id":{"type":"string","title":"Session Id"}},"type":"object","required":["session_id"],"title":"AgentStopIn"},"AnomalyHealthcheckOut":{"properties":{"ok":{"type":"boolean","title":"Ok"},"received_kid":{"type":"string","title":"Received Kid"}},"type":"object","required":["ok","received_kid"],"title":"AnomalyHealthcheckOut"},"ApproveIn":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},"type":"object","required":["tenant_id"],"title":"ApproveIn"},"BrandingPatchRequest":{"properties":{"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"accent_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accent Color"},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"}},"type":"object","title":"BrandingPatchRequest"},"BudgetCeilingIn":{"properties":{"budget_change_ceiling_pct":{"type":"integer","maximum":1000.0,"minimum":1.0,"title":"Budget Change Ceiling Pct"}},"type":"object","required":["budget_change_ceiling_pct"],"title":"BudgetCeilingIn"},"ClientGone":{"properties":{"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"reason":{"type":"string","title":"Reason","default":"hidden"}},"type":"object","title":"ClientGone"},"ColleaguePatchRequest":{"properties":{"colleague_enabled":{"type":"boolean","title":"Colleague Enabled"}},"type":"object","required":["colleague_enabled"],"title":"ColleaguePatchRequest"},"ComputeToolBody":{"properties":{"compute_tool":{"anyOf":[{"type":"string","enum":["run_python","run_sql"]},{"type":"null"}],"title":"Compute Tool"}},"additionalProperties":false,"type":"object","required":["compute_tool"],"title":"ComputeToolBody"},"CreateGrantRequest":{"properties":{"email":{"type":"string","title":"Email"},"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"},"granted_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Granted By"}},"type":"object","required":["email"],"title":"CreateGrantRequest"},"CreateTenantRequest":{"properties":{"name":{"type":"string","title":"Name"},"user_name":{"type":"string","title":"User Name"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"}},"type":"object","required":["name","user_name"],"title":"CreateTenantRequest"},"CreateTenantResponse":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"name":{"type":"string","title":"Name"},"user_id":{"type":"string","title":"User Id"}},"type":"object","required":["tenant_id","name","user_id"],"title":"CreateTenantResponse"},"CreateUserRequest":{"properties":{"user_name":{"type":"string","title":"User Name"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"}},"type":"object","required":["user_name"],"title":"CreateUserRequest"},"FolderIn":{"properties":{"name":{"type":"string","maxLength":60,"minLength":1,"title":"Name"}},"type":"object","required":["name"],"title":"FolderIn"},"ForgotIn":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"ForgotIn"},"GrantOut":{"properties":{"id":{"type":"integer","title":"Id"},"user_id":{"type":"string","title":"User Id"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"},"tenant_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Name"},"granted_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Granted By"},"granted_by_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Granted By Email"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","user_id","user_email","tenant_id","tenant_name","granted_by","granted_by_email","created_at"],"title":"GrantOut"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InviteIn":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"}},"type":"object","required":["email"],"title":"InviteIn"},"LoginIn":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"LoginIn"},"McpTokenRequest":{"properties":{"mcp":{"type":"string","title":"Mcp"},"ttl_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ttl Minutes"}},"type":"object","required":["mcp"],"title":"McpTokenRequest"},"MeResponse":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"tenant_name":{"type":"string","title":"Tenant Name"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"user_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Name"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"cross_tenant":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"title":"Cross Tenant"}},"type":"object","required":["tenant_id","tenant_name","user_id","user_name","user_email"],"title":"MeResponse"},"MemoryEntryOut":{"properties":{"id":{"type":"string","title":"Id"},"category":{"type":"string","title":"Category"},"content":{"type":"string","title":"Content"},"source":{"type":"string","title":"Source"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","title":"Created At"},"last_used_at":{"type":"string","title":"Last Used At"}},"type":"object","required":["id","category","content","source","status","created_at","last_used_at"],"title":"MemoryEntryOut"},"MintServiceJwtResponse":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"MintServiceJwtResponse"},"MonthCost":{"properties":{"month":{"type":"string","title":"Month"},"label":{"type":"string","title":"Label"},"cost":{"type":"number","title":"Cost"},"billable":{"type":"number","title":"Billable","default":0.0}},"type":"object","required":["month","label","cost"],"title":"MonthCost"},"OffboardUserRequest":{"properties":{"actor":{"type":"string","minLength":1,"title":"Actor"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["actor"],"title":"OffboardUserRequest"},"Quote":{"properties":{"ref":{"type":"string","maxLength":80,"title":"Ref"},"name":{"type":"string","maxLength":120,"title":"Name"},"label":{"anyOf":[{"type":"string","maxLength":16},{"type":"null"}],"title":"Label"},"text":{"type":"string","maxLength":2000,"minLength":1,"title":"Text"},"range":{"type":"string","enum":["selection","line","block","section"],"title":"Range"},"source":{"type":"string","enum":["auto","picker","click","select"],"title":"Source"},"entity":{"anyOf":[{"$ref":"#/components/schemas/QuoteEntity"},{"type":"null"}]}},"additionalProperties":false,"type":"object","required":["ref","name","text","range","source"],"title":"Quote"},"QuoteEntity":{"properties":{"network":{"type":"string","maxLength":40,"title":"Network"},"type":{"type":"string","maxLength":40,"title":"Type"},"ids":{"additionalProperties":{"type":"string"},"type":"object","title":"Ids"}},"additionalProperties":false,"type":"object","required":["network","type"],"title":"QuoteEntity"},"RedshiftSourceIn":{"properties":{"tenant_id":{"type":"string","minLength":1,"title":"Tenant Id"},"host":{"type":"string","minLength":1,"title":"Host"},"port":{"type":"integer","maximum":65535.0,"minimum":1.0,"title":"Port","default":5439},"database":{"type":"string","minLength":1,"title":"Database"},"username":{"type":"string","minLength":1,"title":"Username"},"password":{"type":"string","minLength":1,"title":"Password"},"statement_timeout_ms":{"type":"integer","maximum":300000.0,"minimum":1000.0,"title":"Statement Timeout Ms","default":30000},"notes":{"type":"string","maxLength":8192,"title":"Notes","default":""}},"type":"object","required":["tenant_id","host","database","username","password"],"title":"RedshiftSourceIn"},"RedshiftSourcePatch":{"properties":{"password":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Password"},"statement_timeout_ms":{"anyOf":[{"type":"integer","maximum":300000.0,"minimum":1000.0},{"type":"null"}],"title":"Statement Timeout Ms"},"notes":{"anyOf":[{"type":"string","maxLength":8192},{"type":"null"}],"title":"Notes"}},"type":"object","title":"RedshiftSourcePatch"},"RegisterClientRequest":{"properties":{"client_id":{"type":"string","title":"Client Id"},"name":{"type":"string","title":"Name"},"redirect_uris":{"items":{"type":"string"},"type":"array","title":"Redirect Uris","default":[]},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"accent_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accent Color"},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"},"colleague_enabled":{"type":"boolean","title":"Colleague Enabled","default":false}},"type":"object","required":["client_id","name"],"title":"RegisterClientRequest"},"RejectIn":{"properties":{"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","title":"RejectIn"},"RenameTenantRequest":{"properties":{"name":{"type":"string","title":"Name"}},"type":"object","required":["name"],"title":"RenameTenantRequest"},"ResolveBody":{"properties":{"decision":{"type":"string","enum":["approve","cancel","deny","revise"],"title":"Decision"},"edited_args":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Edited Args"},"note":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Note"}},"type":"object","required":["decision"],"title":"ResolveBody"},"ResolveManyBody":{"properties":{"ids":{"items":{"type":"string"},"type":"array","maxItems":100,"minItems":1,"title":"Ids"},"decision":{"type":"string","enum":["approve","cancel"],"title":"Decision"},"edited_args":{"anyOf":[{"additionalProperties":{"additionalProperties":true,"type":"object"},"type":"object"},{"type":"null"}],"title":"Edited Args"}},"type":"object","required":["ids","decision"],"title":"ResolveManyBody"},"SessionFolderIn":{"properties":{"folder_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Folder Id"}},"type":"object","required":["folder_id"],"title":"SessionFolderIn"},"SessionTitleIn":{"properties":{"title":{"type":"string","maxLength":120,"title":"Title"}},"type":"object","required":["title"],"title":"SessionTitleIn"},"SetPasswordIn":{"properties":{"token":{"type":"string","title":"Token"},"new_password":{"type":"string","title":"New Password"}},"type":"object","required":["token","new_password"],"title":"SetPasswordIn"},"TenantInfo":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"name":{"type":"string","title":"Name"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","title":"Created At"},"user_count":{"type":"integer","title":"User Count","default":0},"accounts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Accounts","default":{}},"unityads_accounts":{"type":"integer","title":"Unityads Accounts","default":0},"monthly_costs":{"items":{"$ref":"#/components/schemas/MonthCost"},"type":"array","title":"Monthly Costs","default":[]},"budget_change_ceiling_pct":{"type":"integer","title":"Budget Change Ceiling Pct"}},"type":"object","required":["tenant_id","name","status","created_at","budget_change_ceiling_pct"],"title":"TenantInfo"},"TenantServicesIn":{"properties":{"services":{"items":{"type":"string"},"type":"array","title":"Services"},"actor":{"type":"string","minLength":1,"title":"Actor"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["services","actor"],"title":"TenantServicesIn"},"UpdateDeveloperRequest":{"properties":{"is_developer":{"type":"boolean","title":"Is Developer"}},"type":"object","required":["is_developer"],"title":"UpdateDeveloperRequest"},"UpdateQuotaRequest":{"properties":{"monthly_quota_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Monthly Quota Usd"}},"type":"object","required":["monthly_quota_usd"],"title":"UpdateQuotaRequest"},"UpdateUserNameRequest":{"properties":{"name":{"type":"string","title":"Name"}},"type":"object","required":["name"],"title":"UpdateUserNameRequest"},"UpdateUserRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"}},"type":"object","title":"UpdateUserRequest"},"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"},"WebhookHealthcheckOut":{"properties":{"ok":{"type":"boolean","title":"Ok"},"received_kid":{"type":"string","title":"Received Kid"}},"type":"object","required":["ok","received_kid"],"title":"WebhookHealthcheckOut","description":"Echo response. ``received_kid`` lets the caller assert that the\nkid it embedded in its HMAC headers is the kid pozeidon's verifier\nextracted — i.e. both sides agree on the primary signing key."},"_AxonCredsBody":{"properties":{"management_key":{"type":"string","minLength":1,"title":"Management Key"},"report_key":{"type":"string","minLength":1,"title":"Report Key"}},"type":"object","required":["management_key","report_key"],"title":"_AxonCredsBody"},"_MintegralCredsBody":{"properties":{"api_key":{"type":"string","minLength":1,"title":"Api Key"},"access_key":{"type":"string","minLength":1,"title":"Access Key"}},"type":"object","required":["api_key","access_key"],"title":"_MintegralCredsBody"},"_UnityAdsCredsBody":{"properties":{"key_id":{"type":"string","minLength":1,"title":"Key Id"},"secret":{"type":"string","minLength":1,"title":"Secret"}},"type":"object","required":["key_id","secret"],"title":"_UnityAdsCredsBody"}}}}