{"openapi":"3.1.0","info":{"title":"B2Metric license-api","version":"0.1.0"},"paths":{"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Health Get"}}}}}}},"/tenants":{"post":{"tags":["tenants"],"summary":"Create Tenant","operationId":"create_tenant_tenants_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/TenantCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["tenants"],"summary":"List Tenants","operationId":"list_tenants_tenants_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TenantOut"},"title":"Response List Tenants Tenants Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants/page":{"get":{"tags":["tenants"],"summary":"Page Tenants","description":"One filtered page of tenants with their licences and seat usage.\n\nThe list screen used to read /overview, which returns every tenant with\nevery licence in a single payload and leaves filtering to the browser. That\ncannot be paged: filtering a page instead of the table drops matches that\nsit on other pages, so the two have to move together. /overview stays what\nits docstring says it is — a dashboard aggregate of KPIs and per-app totals.\n\nAn envelope here, unlike /users/count, because this route is new and has no\ncallers to break. It also saves a round-trip: a page is meaningless without\nthe total behind it.","operationId":"page_tenants_tenants_page_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"app","in":"query","required":false,"schema":{"type":"string","default":"","title":"App"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"","title":"Status"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":25,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Page Tenants Tenants Page Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants/ownerless":{"get":{"tags":["tenants"],"summary":"List Ownerless Tenants","description":"Tenants with nobody holding the `owner` realm role — plus any whose\nstatus could not be established.\n\nAn ownerless tenant is operationally indistinguishable from a healthy one:\nrequire_owner assumes an owner exists, gate.check_access grants setup mode\nonly to an owner, and the stalled report resolves its contact column the\nsame way. So a licensed tenant without one has a setup wizard nobody can\nreach and a report with no address, and nothing anywhere says so (SSO-24).\n\nRows whose status is `unknown` are included on purpose: during a Keycloak\noutage the honest answer is \"could not check\", and hiding those would make\na quiet report look like a clean one.","operationId":"list_ownerless_tenants_tenants_ownerless_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OwnerlessTenantOut"},"title":"Response List Ownerless Tenants Tenants Ownerless Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants/{tenant_id}":{"get":{"tags":["tenants"],"summary":"Get Tenant","operationId":"get_tenant_tenants__tenant_id__get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["tenants"],"summary":"Update Tenant","operationId":"update_tenant_tenants__tenant_id__patch","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants/{tenant_id}/group":{"post":{"tags":["tenants"],"summary":"Repair Tenant Group","description":"Re-run the Keycloak group sync for an existing tenant. Idempotent.\n\nCreate provisions the group best-effort, so a KC outage leaves a tenant\nwith none — and every member operation then 400s. Re-POSTing the same name\nused to paper over that by creating a second row; `uq_tenants_name` (0012)\nnow rejects it, so the sync needs a door of its own. Failures surface here\nrather than being logged and swallowed: syncing the group is the only thing\nthis call does.","operationId":"repair_tenant_group_tenants__tenant_id__group_post","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants/{tenant_id}/members":{"get":{"tags":["tenants"],"summary":"List Members","operationId":"list_members_tenants__tenant_id__members_get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/app__schemas__license__MemberOut"},"title":"Response List Members Tenants  Tenant Id  Members Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["tenants"],"summary":"Add Member","operationId":"add_member_tenants__tenant_id__members_post","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberAdd"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__license__MemberOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants/{tenant_id}/members/{user_id}":{"delete":{"tags":["tenants"],"summary":"Remove Member","operationId":"remove_member_tenants__tenant_id__members__user_id__delete","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants/{tenant_id}/branding":{"get":{"tags":["tenants"],"summary":"Get Branding","operationId":"get_branding_tenants__tenant_id__branding_get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandingOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["tenants"],"summary":"Patch Branding","operationId":"patch_branding_tenants__tenant_id__branding_patch","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandingUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandingOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants/{tenant_id}/branding/logo/{variant}":{"put":{"tags":["tenants"],"summary":"Put Branding Logo","operationId":"put_branding_logo_tenants__tenant_id__branding_logo__variant__put","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"variant","in":"path","required":true,"schema":{"type":"string","title":"Variant"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_put_branding_logo_tenants__tenant_id__branding_logo__variant__put"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandingOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["tenants"],"summary":"Delete Branding Logo","operationId":"delete_branding_logo_tenants__tenant_id__branding_logo__variant__delete","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"variant","in":"path","required":true,"schema":{"type":"string","title":"Variant"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandingOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants/{tenant_id}/branding/font/{weight}":{"put":{"tags":["tenants"],"summary":"Put Branding Font","operationId":"put_branding_font_tenants__tenant_id__branding_font__weight__put","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"weight","in":"path","required":true,"schema":{"type":"integer","title":"Weight"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_put_branding_font_tenants__tenant_id__branding_font__weight__put"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandingOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["tenants"],"summary":"Delete Branding Font","operationId":"delete_branding_font_tenants__tenant_id__branding_font__weight__delete","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"weight","in":"path","required":true,"schema":{"type":"integer","title":"Weight"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandingOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants/{tenant_id}/regional":{"get":{"tags":["tenants"],"summary":"Get Regional","operationId":"get_regional_tenants__tenant_id__regional_get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegionalOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["tenants"],"summary":"Patch Regional","operationId":"patch_regional_tenants__tenant_id__regional_patch","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegionalUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegionalOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants/{tenant_id}/licenses":{"post":{"tags":["licenses"],"summary":"Issue License","operationId":"issue_license_tenants__tenant_id__licenses_post","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicenseIssue"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicenseOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["licenses"],"summary":"List Tenant Licenses","operationId":"list_tenant_licenses_tenants__tenant_id__licenses_get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LicenseOut"},"title":"Response List Tenant Licenses Tenants  Tenant Id  Licenses Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants/{tenant_id}/licenses/{app}/revoke":{"post":{"tags":["licenses"],"summary":"Revoke License","operationId":"revoke_license_tenants__tenant_id__licenses__app__revoke_post","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"app","in":"path","required":true,"schema":{"type":"string","title":"App"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicenseOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants/{tenant_id}/licenses/{app}/suspend":{"post":{"tags":["licenses"],"summary":"Suspend License","operationId":"suspend_license_tenants__tenant_id__licenses__app__suspend_post","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"app","in":"path","required":true,"schema":{"type":"string","title":"App"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicenseOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants/{tenant_id}/licenses/{app}/renew":{"post":{"tags":["licenses"],"summary":"Renew License","operationId":"renew_license_tenants__tenant_id__licenses__app__renew_post","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"app","in":"path","required":true,"schema":{"type":"string","title":"App"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenewIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicenseOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants/{tenant_id}/licenses/{app}/activate":{"post":{"tags":["licenses"],"summary":"Activate License","operationId":"activate_license_tenants__tenant_id__licenses__app__activate_post","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"app","in":"path","required":true,"schema":{"type":"string","title":"App"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicenseOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants/{tenant_id}/licenses/{app}":{"delete":{"tags":["licenses"],"summary":"Delete License","operationId":"delete_license_tenants__tenant_id__licenses__app__delete","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"app","in":"path","required":true,"schema":{"type":"string","title":"App"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants/{tenant_id}/licenses/{app}/key":{"post":{"tags":["licenses"],"summary":"Mint License Key","description":"Mint the signed, offline licence file for a licence (SSO-40).\n\nThis is the delivery artifact for an air-gapped installation: once handed\nover it verifies locally, forever, and cannot be recalled or revoked. That\nmakes it a one-way grant of entitlement rather than a read of one, which is\nwhy it is a POST, platform-admin only, and audited.","operationId":"mint_license_key_tenants__tenant_id__licenses__app__key_post","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"app","in":"path","required":true,"schema":{"type":"string","title":"App"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicenseKeyOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants/{tenant_id}/licenses/{app}/seats":{"post":{"tags":["licenses"],"summary":"Set Seats","operationId":"set_seats_tenants__tenant_id__licenses__app__seats_post","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"app","in":"path","required":true,"schema":{"type":"string","title":"App"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeatsIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicenseOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants/{tenant_id}/licenses/{app}/seat-assignments":{"get":{"tags":["licenses"],"summary":"List Seat Assignments","operationId":"list_seat_assignments_tenants__tenant_id__licenses__app__seat_assignments_get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"app","in":"path","required":true,"schema":{"type":"string","title":"App"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SeatHolderOut"},"title":"Response List Seat Assignments Tenants  Tenant Id  Licenses  App  Seat Assignments Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["licenses"],"summary":"Assign Seat","operationId":"assign_seat_tenants__tenant_id__licenses__app__seat_assignments_post","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"app","in":"path","required":true,"schema":{"type":"string","title":"App"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeatAssignIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Assign Seat Tenants  Tenant Id  Licenses  App  Seat Assignments Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants/{tenant_id}/licenses/{app}/seat-assignments/{user_external_id}":{"delete":{"tags":["licenses"],"summary":"Revoke Seat","operationId":"revoke_seat_tenants__tenant_id__licenses__app__seat_assignments__user_external_id__delete","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"app","in":"path","required":true,"schema":{"type":"string","title":"App"}},{"name":"user_external_id","in":"path","required":true,"schema":{"type":"string","title":"User External Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Revoke Seat Tenants  Tenant Id  Licenses  App  Seat Assignments  User External Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/overview":{"get":{"tags":["overview"],"summary":"Overview","operationId":"overview_overview_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Overview Overview Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/keys/verify":{"post":{"tags":["keys"],"summary":"Verify Key","operationId":"verify_key_keys_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyVerifyIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Verify Key Keys Verify Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/keys/jwks.json":{"get":{"tags":["keys"],"summary":"Jwks Document","description":"Public signing keys, for verifying licences without reaching this service.\n\nUnauthenticated on purpose: this is the value an installer embeds, and it is\npublic key material. It carries only the JWK public members (`kty`, `crv`,\n`x`, `kid`, `alg`, `use`) — never `d`, the OKP private member.","operationId":"jwks_document_keys_jwks_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Jwks Document Keys Jwks Json Get"}}}}}}},"/gate/{app}/consume":{"post":{"tags":["gate"],"summary":"Consume","operationId":"consume_gate__app__consume_post","parameters":[{"name":"app","in":"path","required":true,"schema":{"type":"string","title":"App"}},{"name":"x-b2m-tenant","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-B2M-Tenant"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GateDecisionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/gate/{app}/release":{"post":{"tags":["gate"],"summary":"Release","operationId":"release_gate__app__release_post","parameters":[{"name":"app","in":"path","required":true,"schema":{"type":"string","title":"App"}},{"name":"x-b2m-tenant","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-B2M-Tenant"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Release Gate  App  Release Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/gate/{app}/status":{"get":{"tags":["gate"],"summary":"Status","operationId":"status_gate__app__status_get","parameters":[{"name":"app","in":"path","required":true,"schema":{"type":"string","title":"App"}},{"name":"tenant","in":"query","required":true,"schema":{"type":"string","title":"Tenant"}},{"name":"x-b2m-tenant","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-B2M-Tenant"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Status Gate  App  Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/catalog":{"get":{"tags":["catalog"],"summary":"Get Catalog","operationId":"get_catalog_catalog_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Catalog Catalog Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/me/apps":{"get":{"tags":["me"],"summary":"My Apps","description":"One block per tenant the token names, in claim order; unknown tenants skipped.\n\nWith X-B2M-Tenant (or ?tenant=) the answer is exactly that tenant's block,\nresolved like every other member endpoint (`active_tenant`) — which is how\nstaff open the launcher as a tenant, audited as `tenant.cross_access`.\n\nStaff viewing a tenant cross-tenant hold no seat there, so for them the\nblock lists every app with a valid licence and `launchable` follows the\nlicence alone. Everyone else — staff who are members included — needs an\nopen seat.","operationId":"my_apps_me_apps_get","parameters":[{"name":"tenant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"legacy alias of X-B2M-Tenant","title":"Tenant"},"description":"legacy alias of X-B2M-Tenant"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TenantAppsOut"},"title":"Response My Apps Me Apps Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/me/branding":{"get":{"tags":["me"],"summary":"My Branding","description":"The signed-in user's company brand, for a product to render.\n\nNot owner-gated and not seat-gated — the same posture as `/me/apps`, one\nstep looser. A company's own name and logo is not an entitlement, so any\nauthenticated member of the tenant may read it.\n\nReturned as a Response rather than a model so the ETag and the 304 can be\nset; `response_model` above still documents the 200 body.\n\nThe tenant is `active_tenant`'s: X-B2M-Tenant (alias ?tenant=) narrows a\nmulti-group token, ambiguity is a 400, never a guess.","operationId":"my_branding_me_branding_get","parameters":[{"name":"tenant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"legacy alias of X-B2M-Tenant","title":"Tenant"},"description":"legacy alias of X-B2M-Tenant"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MyBrandingOut"}}}},"304":{"description":"Not modified"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/me/branding/theme":{"get":{"tags":["me"],"summary":"My Branding Theme","description":"The slice of `/me/branding` a stylesheet needs: accent, canvas, secondary,\nfont family and the font faces — without the logos in the RESPONSE.\n\nThe console builds its tenant theme from this on every portal navigation, so\nthe body is deliberately light: no logo data URIs, no font bytes. The row read\nstill loads the logo columns, and the validator is the whole-brand `version`,\nso a logo or name change also moves this ETag — one extra read, never a wrong\nanswer. Same tenant resolution as `/me/branding`, and the same posture: any\nauthenticated member of the tenant may read it.","operationId":"my_branding_theme_me_branding_theme_get","parameters":[{"name":"tenant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"legacy alias of X-B2M-Tenant","title":"Tenant"},"description":"legacy alias of X-B2M-Tenant"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MyThemeOut"}}}},"304":{"description":"Not modified"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/me/regional":{"get":{"tags":["me"],"summary":"My Regional","description":"The signed-in user's company timezone and locale.\n\nThe central value the product owner asked for: ARIA, the Shāhīn console\nand the Ops MCP all read this and format in it. Container `TZ` env is a\ndeploy-time Helm value and is *not* what this returns — the console's\nconsistency check compares the two.","operationId":"my_regional_me_regional_get","parameters":[{"name":"tenant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"legacy alias of X-B2M-Tenant","title":"Tenant"},"description":"legacy alias of X-B2M-Tenant"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MyRegionalOut"}}}},"304":{"description":"Not modified"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users":{"get":{"tags":["users"],"summary":"List Users","description":"One page of users, decorated with realm roles and tenant groups.\n\nThe window used to be hard-coded to the first 20 with no offset, so a realm\nwith more users than that simply could not be browsed — and nothing said\nso, which is what made a truncated list look like the whole one.\n\nWhether more rows exist is reported in the `X-Has-More` header, and it is\nderived by asking Keycloak for one row beyond the page and throwing it\naway. That is deliberate, and replaces a /users/count route that lied:\nKeycloak's user SEARCH excludes service accounts while its user COUNT\nincludes them, so on this realm the list returned 8 and the count said 14.\nThe screen claimed 14 users, six of which it could never show, and offered\na next page that resolved to nothing. Over-fetching asks the same endpoint\nboth questions, so the two cannot disagree — no service-account naming\nconvention to encode, and nothing to keep in sync when Keycloak changes.\n\nThe defaults reproduce the pre-paging behaviour: console-web resolves an\nemail through this route and so does the sso-admin MCP, and neither passes\na window. The body is still a bare array for the same reason — the extra\nfact rides in a header so no caller has to change.\n\n**Filters and a total.** `enabled`, `role` and `group` narrow the list, and\n`total=true` asks for an exact `X-Total-Count`. Both need the whole set: a\nrole or group filter is an intersection (Keycloak cannot search by either)\nand a count is only honest when it is the length of the set the page is cut\nfrom. So those requests enumerate the search once (up to `ENUMERATION_CAP`)\nand slice it; the total is never Keycloak's COUNT, which is the lie above.\nA request that only wants a total on a realm past the cap falls back to the\nwindow with no total (cut from the rows the enumeration already holds when it\ncan be, from a second search when it cannot); a role/group filter there is\nrefused, because filtering one page of a bigger set would show a short list\nthat reads as complete. Everything else keeps the cheap windowed path exactly\nas it was.\n\n**`X-Filters-Applied`.** When at least one of `role`, `group`, `enabled` was\nrequested, a 200 carries the names of the filters it honoured, comma-separated\nin the fixed order `role,group,enabled` (`role,enabled`, or just `enabled`);\nwith none requested the header is absent. It is sent on the enumerated path\nand the plain window alike. Absence from an older API means \"not confirmed\":\nthat API ignores the parameters, and a missing `X-Total-Count` cannot tell the\ncaller so, because a status filter past the cap legitimately has no total.","operationId":"list_users_users_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"role","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"}},{"name":"group","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Group"}},{"name":"enabled","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"}},{"name":"total","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Total"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserOut"},"title":"Response List Users Users Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["users"],"summary":"Create User","description":"Create a Keycloak user. Two provisioning modes:\n\n- ``email``: send an email invite (UPDATE_PASSWORD + VERIFY_EMAIL). Suits the\n  console's own users, who log in via OIDC redirect and CAN complete those\n  interactive actions. Requires a configured SMTP server.\n- ``password``: set a permanent password and verify the email up front, with\n  NO required actions, so the user can log in immediately — including via the\n  direct (password) grant used by signalone/cockpit. The password is returned\n  once for the admin to hand off.","operationId":"create_user_users_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/UserCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__user__InviteOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/groups":{"get":{"tags":["users"],"summary":"Realm Groups","description":"Every group in the realm, for the \"+ group\" menu.\n\nTenant groups and permission groups (`shahin-admins`, `k8s-admins`) are all\nKeycloak groups; which is which is the caller's reading, not Keycloak's.","operationId":"realm_groups_users_groups_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/GroupRef"},"title":"Response Realm Groups Users Groups Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/roles":{"get":{"tags":["users"],"summary":"Assignable Roles","operationId":"assignable_roles_users_roles_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Assignable Roles Users Roles Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/{user_id}/roles":{"post":{"tags":["users"],"summary":"Add Role","operationId":"add_role_users__user_id__roles_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Add Role Users  User Id  Roles Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/{user_id}/roles/{role}":{"delete":{"tags":["users"],"summary":"Remove Role","operationId":"remove_role_users__user_id__roles__role__delete","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"role","in":"path","required":true,"schema":{"type":"string","title":"Role"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Remove Role Users  User Id  Roles  Role  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/{user_id}/groups":{"post":{"tags":["users"],"summary":"Add Group","operationId":"add_group_users__user_id__groups_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Add Group Users  User Id  Groups Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/{user_id}/groups/{group_id}":{"delete":{"tags":["users"],"summary":"Remove Group","operationId":"remove_group_users__user_id__groups__group_id__delete","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"group_id","in":"path","required":true,"schema":{"type":"string","title":"Group Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Remove Group Users  User Id  Groups  Group Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/{user_id}/password":{"post":{"tags":["users"],"summary":"Reset Password","description":"Super-admin reset for ANY user's password. Auto-generates a strong\npassword if `password` is omitted. Returned once — admin hands it off\nto the user via a side channel (no email sent here).","operationId":"reset_password_users__user_id__password_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/roles":{"get":{"tags":["iam"],"summary":"List Roles","operationId":"list_roles_roles_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Roles Roles Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["iam"],"summary":"Create Role","operationId":"create_role_roles_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/RoleCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Role Roles Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/roles/{name}":{"delete":{"tags":["iam"],"summary":"Delete Role","operationId":"delete_role_roles__name__delete","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Role Roles  Name  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clients":{"get":{"tags":["iam"],"summary":"List Clients","operationId":"list_clients_clients_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ClientOut"},"title":"Response List Clients Clients Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clients/{client_id}/enabled":{"post":{"tags":["iam"],"summary":"Set Client Enabled","operationId":"set_client_enabled_clients__client_id__enabled_post","parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnabledIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Client Enabled Clients  Client Id  Enabled Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/portal/requests":{"post":{"tags":["portal"],"summary":"Submit Request","operationId":"submit_request_portal_requests_post","parameters":[{"name":"tenant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"legacy alias of X-B2M-Tenant","title":"Tenant"},"description":"legacy alias of X-B2M-Tenant"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["portal"],"summary":"My Requests","operationId":"my_requests_portal_requests_get","parameters":[{"name":"tenant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"legacy alias of X-B2M-Tenant","title":"Tenant"},"description":"legacy alias of X-B2M-Tenant"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RequestOut"},"title":"Response My Requests Portal Requests Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/portal/licenses":{"get":{"tags":["portal"],"summary":"My Licenses","operationId":"my_licenses_portal_licenses_get","parameters":[{"name":"tenant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"legacy alias of X-B2M-Tenant","title":"Tenant"},"description":"legacy alias of X-B2M-Tenant"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LicenseOut"},"title":"Response My Licenses Portal Licenses Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/portal/checkout":{"post":{"tags":["portal"],"summary":"Checkout","operationId":"checkout_portal_checkout_post","parameters":[{"name":"tenant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"legacy alias of X-B2M-Tenant","title":"Tenant"},"description":"legacy alias of X-B2M-Tenant"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/portal/billing-portal":{"post":{"tags":["portal"],"summary":"Billing Portal","operationId":"billing_portal_portal_billing_portal_post","parameters":[{"name":"tenant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"legacy alias of X-B2M-Tenant","title":"Tenant"},"description":"legacy alias of X-B2M-Tenant"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/portal/redeem":{"post":{"tags":["portal"],"summary":"Redeem Code","operationId":"redeem_code_portal_redeem_post","parameters":[{"name":"tenant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"legacy alias of X-B2M-Tenant","title":"Tenant"},"description":"legacy alias of X-B2M-Tenant"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedeemIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Redeem Code Portal Redeem Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/portal/requests/{request_id}":{"delete":{"tags":["portal"],"summary":"Delete My Request","operationId":"delete_my_request_portal_requests__request_id__delete","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Request Id"}},{"name":"tenant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"legacy alias of X-B2M-Tenant","title":"Tenant"},"description":"legacy alias of X-B2M-Tenant"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/portal/licenses/{app}/seats":{"post":{"tags":["portal"],"summary":"Set My Seats","operationId":"set_my_seats_portal_licenses__app__seats_post","parameters":[{"name":"app","in":"path","required":true,"schema":{"type":"string","title":"App"}},{"name":"tenant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"legacy alias of X-B2M-Tenant","title":"Tenant"},"description":"legacy alias of X-B2M-Tenant"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeatsIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicenseOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/portal/status":{"get":{"tags":["portal"],"summary":"My Status","description":"Customer admin dashboard payload: tenant + per-license summary + billing flag.\nUsed by the /portal/status page in the customer console.","operationId":"my_status_portal_status_get","parameters":[{"name":"tenant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"legacy alias of X-B2M-Tenant","title":"Tenant"},"description":"legacy alias of X-B2M-Tenant"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response My Status Portal Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/portal/members":{"get":{"tags":["portal"],"summary":"List My Tenant Members","description":"Members of the owner's tenant (KC group). Roles are surfaced so the UI\ncan hide reset/edit actions against any platform-admin in the same group.","operationId":"list_my_tenant_members_portal_members_get","parameters":[{"name":"tenant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"legacy alias of X-B2M-Tenant","title":"Tenant"},"description":"legacy alias of X-B2M-Tenant"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/app__schemas__user__MemberOut"},"title":"Response List My Tenant Members Portal Members Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["portal"],"summary":"Invite Member","description":"Owner invites a teammate into their OWN tenant. Creates a directly-usable\nKeycloak login (permanent password, no required actions) and adds it to the\ntenant group. No role input — the member gets the realm default role only, so\nan owner can never mint a platform-admin/owner.","operationId":"invite_member_portal_members_post","parameters":[{"name":"tenant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"legacy alias of X-B2M-Tenant","title":"Tenant"},"description":"legacy alias of X-B2M-Tenant"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberInvite"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__user__InviteOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/portal/members/{user_id}/password":{"post":{"tags":["portal"],"summary":"Reset Member Password","description":"Owner resets a tenant-member's password. Hard-scoped to the owner's\nown tenant; refuses to reset platform-admin users (privilege guard).","operationId":"reset_member_password_portal_members__user_id__password_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"tenant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"legacy alias of X-B2M-Tenant","title":"Tenant"},"description":"legacy alias of X-B2M-Tenant"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/portal/licenses/{app}/seat-assignments":{"get":{"tags":["portal"],"summary":"My Seat Assignments","operationId":"my_seat_assignments_portal_licenses__app__seat_assignments_get","parameters":[{"name":"app","in":"path","required":true,"schema":{"type":"string","title":"App"}},{"name":"tenant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"legacy alias of X-B2M-Tenant","title":"Tenant"},"description":"legacy alias of X-B2M-Tenant"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SeatHolderOut"},"title":"Response My Seat Assignments Portal Licenses  App  Seat Assignments Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["portal"],"summary":"Assign My Seat","description":"Owner grants a seat on their tenant's license to a member — identified by\nemail and hard-scoped to members of the owner's own tenant group.","operationId":"assign_my_seat_portal_licenses__app__seat_assignments_post","parameters":[{"name":"app","in":"path","required":true,"schema":{"type":"string","title":"App"}},{"name":"tenant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"legacy alias of X-B2M-Tenant","title":"Tenant"},"description":"legacy alias of X-B2M-Tenant"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeatAssignByEmail"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Assign My Seat Portal Licenses  App  Seat Assignments Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/portal/licenses/{app}/seat-assignments/{user_external_id}":{"delete":{"tags":["portal"],"summary":"Revoke My Seat","operationId":"revoke_my_seat_portal_licenses__app__seat_assignments__user_external_id__delete","parameters":[{"name":"app","in":"path","required":true,"schema":{"type":"string","title":"App"}},{"name":"user_external_id","in":"path","required":true,"schema":{"type":"string","title":"User External Id"}},{"name":"tenant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"legacy alias of X-B2M-Tenant","title":"Tenant"},"description":"legacy alias of X-B2M-Tenant"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/portal/branding":{"get":{"tags":["portal"],"summary":"My Branding Admin","operationId":"my_branding_admin_portal_branding_get","parameters":[{"name":"tenant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"legacy alias of X-B2M-Tenant","title":"Tenant"},"description":"legacy alias of X-B2M-Tenant"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandingOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["portal"],"summary":"Patch My Branding","operationId":"patch_my_branding_portal_branding_patch","parameters":[{"name":"tenant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"legacy alias of X-B2M-Tenant","title":"Tenant"},"description":"legacy alias of X-B2M-Tenant"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandingUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandingOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/portal/branding/logo/{variant}":{"put":{"tags":["portal"],"summary":"Put My Branding Logo","operationId":"put_my_branding_logo_portal_branding_logo__variant__put","parameters":[{"name":"variant","in":"path","required":true,"schema":{"type":"string","title":"Variant"}},{"name":"tenant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"legacy alias of X-B2M-Tenant","title":"Tenant"},"description":"legacy alias of X-B2M-Tenant"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_put_my_branding_logo_portal_branding_logo__variant__put"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandingOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["portal"],"summary":"Delete My Branding Logo","operationId":"delete_my_branding_logo_portal_branding_logo__variant__delete","parameters":[{"name":"variant","in":"path","required":true,"schema":{"type":"string","title":"Variant"}},{"name":"tenant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"legacy alias of X-B2M-Tenant","title":"Tenant"},"description":"legacy alias of X-B2M-Tenant"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandingOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/portal/branding/font/{weight}":{"put":{"tags":["portal"],"summary":"Put My Branding Font","operationId":"put_my_branding_font_portal_branding_font__weight__put","parameters":[{"name":"weight","in":"path","required":true,"schema":{"type":"integer","title":"Weight"}},{"name":"tenant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"legacy alias of X-B2M-Tenant","title":"Tenant"},"description":"legacy alias of X-B2M-Tenant"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_put_my_branding_font_portal_branding_font__weight__put"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandingOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["portal"],"summary":"Delete My Branding Font","operationId":"delete_my_branding_font_portal_branding_font__weight__delete","parameters":[{"name":"weight","in":"path","required":true,"schema":{"type":"integer","title":"Weight"}},{"name":"tenant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"legacy alias of X-B2M-Tenant","title":"Tenant"},"description":"legacy alias of X-B2M-Tenant"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandingOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/portal/regional":{"get":{"tags":["portal"],"summary":"My Regional","operationId":"my_regional_portal_regional_get","parameters":[{"name":"tenant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"legacy alias of X-B2M-Tenant","title":"Tenant"},"description":"legacy alias of X-B2M-Tenant"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegionalOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["portal"],"summary":"Patch My Regional","operationId":"patch_my_regional_portal_regional_patch","parameters":[{"name":"tenant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"legacy alias of X-B2M-Tenant","title":"Tenant"},"description":"legacy alias of X-B2M-Tenant"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegionalUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegionalOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/requests":{"get":{"tags":["requests"],"summary":"List Requests","operationId":"list_requests_requests_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RequestOut"},"title":"Response List Requests Requests Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/requests/{request_id}/approve":{"post":{"tags":["requests"],"summary":"Approve","operationId":"approve_requests__request_id__approve_post","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Request Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ApproveIn"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/requests/{request_id}/reject":{"post":{"tags":["requests"],"summary":"Reject","operationId":"reject_requests__request_id__reject_post","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Request Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejectIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/codes":{"post":{"tags":["codes"],"summary":"Create Code","operationId":"create_code_codes_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/RedeemCodeCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedeemCodeOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["codes"],"summary":"List Codes","operationId":"list_codes_codes_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RedeemCodeOut"},"title":"Response List Codes Codes Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/codes/{code_id}/disable":{"post":{"tags":["codes"],"summary":"Disable Code","operationId":"disable_code_codes__code_id__disable_post","parameters":[{"name":"code_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Code Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedeemCodeOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/stripe/webhook":{"post":{"tags":["stripe"],"summary":"Stripe Webhook","operationId":"stripe_webhook_stripe_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Stripe Webhook Stripe Webhook Post"}}}}}}},"/admin/ops-config":{"get":{"tags":["admin"],"summary":"List Ops Config","operationId":"list_ops_config_admin_ops_config_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Ops Config Admin Ops Config Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/ops-config/{key}":{"put":{"tags":["admin"],"summary":"Set Ops Config","operationId":"set_ops_config_admin_ops_config__key__put","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Ops Config Admin Ops Config  Key  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/health":{"get":{"tags":["admin"],"summary":"Admin Health","operationId":"admin_health_admin_health_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Admin Health Admin Health Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/kc/master-password":{"post":{"tags":["admin"],"summary":"Rotate Master Password","operationId":"rotate_master_password_admin_kc_master_password_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Rotate Master Password Admin Kc Master Password Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/audit":{"get":{"tags":["admin"],"summary":"List Audit","operationId":"list_audit_admin_audit_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"tenant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant"}},{"name":"app","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"App"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Type"}},{"name":"action","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"description":"legacy alias of type","title":"Action"},"description":"legacy alias of type"},{"name":"actor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Since"}},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Until"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminAuditPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/portal/audit":{"get":{"tags":["portal"],"summary":"List My Audit","operationId":"list_my_audit_portal_audit_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"app","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"App"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Type"}},{"name":"action","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"description":"legacy alias of type","title":"Action"},"description":"legacy alias of type"},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Since"}},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Until"}},{"name":"tenant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"legacy alias of X-B2M-Tenant","title":"Tenant"},"description":"legacy alias of X-B2M-Tenant"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/onboarding/{app}/milestones/{key}":{"post":{"tags":["onboarding"],"summary":"Report Milestone","operationId":"report_milestone_onboarding__app__milestones__key__post","parameters":[{"name":"app","in":"path","required":true,"schema":{"type":"string","title":"App"}},{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantRef"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransitionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/onboarding/{app}/failed":{"post":{"tags":["onboarding"],"summary":"Report Failure","operationId":"report_failure_onboarding__app__failed_post","parameters":[{"name":"app","in":"path","required":true,"schema":{"type":"string","title":"App"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FailureIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FailureOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/onboarding/{app}/rounds":{"post":{"tags":["onboarding"],"summary":"Start Round","operationId":"start_round_onboarding__app__rounds_post","parameters":[{"name":"app","in":"path","required":true,"schema":{"type":"string","title":"App"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantRef"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoundOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/onboarding/{app}/state":{"get":{"tags":["onboarding"],"summary":"Read State","operationId":"read_state_onboarding__app__state_get","parameters":[{"name":"app","in":"path","required":true,"schema":{"type":"string","title":"App"}},{"name":"tenant","in":"query","required":true,"schema":{"type":"string","title":"Tenant"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/onboarding/stalled":{"get":{"tags":["admin-onboarding"],"summary":"Stalled","operationId":"stalled_admin_onboarding_stalled_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":3,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StalledOut"},"title":"Response Stalled Admin Onboarding Stalled Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/onboarding/backfill":{"post":{"tags":["admin-onboarding"],"summary":"Backfill","description":"Create missing state rows for licences that predate the feature.\n\nIdempotent: it selects only licences with no row, and ensure_onboarding_state\nis itself idempotent, so a second run is a no-op. Safe to re-run after a\npartial failure.","operationId":"backfill_admin_onboarding_backfill_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Backfill Admin Onboarding Backfill Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/audit/events":{"post":{"tags":["audit"],"summary":"Post Event","operationId":"post_event_audit_events_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/AuditEventIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/brand-fonts/{name}":{"get":{"tags":["public"],"summary":"Brand Font","operationId":"brand_font_public_brand_fonts__name__get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"if-none-match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/setup/verify-token":{"post":{"tags":["setup"],"summary":"Verify Token","operationId":"verify_token_setup_verify_token_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupStatusOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/setup/steps/{step}":{"post":{"tags":["setup"],"summary":"Complete Step","operationId":"complete_step_setup_steps__step__post","parameters":[{"name":"step","in":"path","required":true,"schema":{"type":"string","title":"Step"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupStatusOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/setup/complete":{"post":{"tags":["setup"],"summary":"Complete","operationId":"complete_setup_complete_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupStatusOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants/{tenant_id}/llm":{"get":{"tags":["tenant-llm"],"summary":"Get Llm","operationId":"get_llm_tenants__tenant_id__llm_get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LlmConfigOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["tenant-llm"],"summary":"Put Llm","operationId":"put_llm_tenants__tenant_id__llm_put","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LlmConfigIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LlmConfigOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants/{tenant_id}/llm/verify":{"post":{"tags":["tenant-llm"],"summary":"Verify Llm","operationId":"verify_llm_tenants__tenant_id__llm_verify_post","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LlmConfigOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants/{tenant_id}/llm/rotate":{"post":{"tags":["tenant-llm"],"summary":"Rotate Llm","operationId":"rotate_llm_tenants__tenant_id__llm_rotate_post","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LlmRotateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LlmConfigOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/tenants/{tenant_id}/llm-credential":{"get":{"tags":["tenant-llm"],"summary":"Llm Credential","operationId":"llm_credential_internal_tenants__tenant_id__llm_credential_get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LlmCredentialOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/workspaces/{workspace_id}/llm-credential":{"get":{"tags":["tenant-llm"],"summary":"Llm Credential By Workspace","description":"Same read for a caller that only knows `Tenant.workspace_id` (asky). The client\nallow-list is a dependency, so it runs before this body: a client that may not read\nkeys gets the same 403 for a real and an unknown workspace.","operationId":"llm_credential_by_workspace_internal_workspaces__workspace_id__llm_credential_get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Workspace Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LlmCredentialOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants/{tenant_id}/llm/limits":{"get":{"tags":["tenant-llm"],"summary":"Get Llm Limits","operationId":"get_llm_limits_tenants__tenant_id__llm_limits_get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LlmLimitsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["tenant-llm"],"summary":"Put Llm Limits","description":"Operator only. Changes the overrides and writes the key metadata; never mints a key (plan L2).","operationId":"put_llm_limits_tenants__tenant_id__llm_limits_put","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LlmLimitsIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LlmLimitsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/tenants/{tenant_id}/llm/quota":{"get":{"tags":["tenant-llm"],"summary":"Llm Quota By Tenant","operationId":"llm_quota_by_tenant_internal_tenants__tenant_id__llm_quota_get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"user","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"User"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LlmQuotaOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/workspaces/{workspace_id}/llm/quota":{"get":{"tags":["tenant-llm"],"summary":"Llm Quota By Workspace","operationId":"llm_quota_by_workspace_internal_workspaces__workspace_id__llm_quota_get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Workspace Id"}},{"name":"user","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"User"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LlmQuotaOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants/{tenant_id}/llm/quota":{"get":{"tags":["tenant-llm"],"summary":"Llm Quota","operationId":"llm_quota_tenants__tenant_id__llm_quota_get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"user","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"User"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LlmQuotaOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tenants/{tenant_id}/invites":{"post":{"tags":["invites"],"summary":"Create Invite","operationId":"create_invite_tenants__tenant_id__invites_post","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__invite__InviteOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/invites/redeem":{"post":{"tags":["invites"],"summary":"Redeem Invite","operationId":"redeem_invite_invites_redeem_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/InviteRedeem"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteRedeemed"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/products":{"get":{"tags":["admin-products"],"summary":"List Products","operationId":"list_products_admin_products_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/products/{product}":{"get":{"tags":["admin-products"],"summary":"Get Product","operationId":"get_product_admin_products__product__get","parameters":[{"name":"product","in":"path","required":true,"schema":{"type":"string","title":"Product"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductDetailOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/products/{product}/editions/{edition}":{"get":{"tags":["admin-products"],"summary":"Get Edition","operationId":"get_edition_admin_products__product__editions__edition__get","parameters":[{"name":"product","in":"path","required":true,"schema":{"type":"string","title":"Product"}},{"name":"edition","in":"path","required":true,"schema":{"type":"string","title":"Edition"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EditionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/products/{product}/editions/{edition}/slots/{slot}/models":{"put":{"tags":["admin-products"],"summary":"Put Edition Models","operationId":"put_edition_models_admin_products__product__editions__edition__slots__slot__models_put","parameters":[{"name":"product","in":"path","required":true,"schema":{"type":"string","title":"Product"}},{"name":"edition","in":"path","required":true,"schema":{"type":"string","title":"Edition"}},{"name":"slot","in":"path","required":true,"schema":{"type":"string","title":"Slot"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EditionModelsIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EditionModelsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/site-models":{"get":{"tags":["admin-products"],"summary":"List Site Models","operationId":"list_site_models_admin_site_models_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Q"}},{"name":"sql_evaluated","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Sql Evaluated"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteModelPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/tenants/{tenant_id}/models":{"get":{"tags":["tenant-models"],"summary":"Get Tenant Models","operationId":"get_tenant_models_admin_tenants__tenant_id__models_get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantModelsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/tenants/{tenant_id}/models/{product}/{slot}":{"put":{"tags":["tenant-models"],"summary":"Put Tenant Model","operationId":"put_tenant_model_admin_tenants__tenant_id__models__product___slot__put","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"product","in":"path","required":true,"schema":{"type":"string","title":"Product"}},{"name":"slot","in":"path","required":true,"schema":{"type":"string","title":"Slot"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChoiceIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantModelsOut"}}}},"202":{"description":"choice stored, key update pending","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantModelsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/workspaces/{workspace_id}/model-slots":{"get":{"tags":["tenant-models"],"summary":"Model Slots By Workspace","description":"The effective model per slot for the tenant behind `workspace_id`, for ASKY's read-only\nmodel table. Same caller check as the credential read (asky only), so the 403 is the same\nfor a real and an unknown workspace.","operationId":"model_slots_by_workspace_internal_workspaces__workspace_id__model_slots_get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Workspace Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceModelSlotsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/portal/models":{"get":{"tags":["portal"],"summary":"My Models","operationId":"my_models_portal_models_get","parameters":[{"name":"tenant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"legacy alias of X-B2M-Tenant","title":"Tenant"},"description":"legacy alias of X-B2M-Tenant"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortalModelsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/portal/models/{product}/{slot}":{"put":{"tags":["portal"],"summary":"Put My Model","operationId":"put_my_model_portal_models__product___slot__put","parameters":[{"name":"product","in":"path","required":true,"schema":{"type":"string","title":"Product"}},{"name":"slot","in":"path","required":true,"schema":{"type":"string","title":"Slot"}},{"name":"tenant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"legacy alias of X-B2M-Tenant","title":"Tenant"},"description":"legacy alias of X-B2M-Tenant"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChoiceIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantModelsOut"}}}},"202":{"description":"choice stored, key update pending","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantModelsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/portal/features":{"get":{"tags":["portal"],"summary":"Portal Features","operationId":"portal_features_portal_features_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortalFeaturesOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AdminAuditEntryOut":{"properties":{"id":{"type":"integer","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"actor_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor Email"},"action":{"type":"string","title":"Action"},"target":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target"},"details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Details"},"app":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App"},"staff":{"type":"boolean","title":"Staff","default":false},"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"},"actor_sub":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor Sub"}},"type":"object","required":["id","created_at","action"],"title":"AdminAuditEntryOut"},"AdminAuditPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AdminAuditEntryOut"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","total"],"title":"AdminAuditPage"},"ApproveIn":{"properties":{"free":{"type":"boolean","title":"Free","default":false}},"type":"object","title":"ApproveIn"},"AuditEntryOut":{"properties":{"id":{"type":"integer","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"actor_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor Email"},"action":{"type":"string","title":"Action"},"target":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target"},"details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Details"},"app":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App"},"staff":{"type":"boolean","title":"Staff","default":false}},"type":"object","required":["id","created_at","action"],"title":"AuditEntryOut"},"AuditEventIn":{"properties":{"type":{"type":"string","enum":["tenant.cross_access","connection.use"],"title":"Type"},"at":{"type":"string","format":"date-time","title":"At"},"app":{"type":"string","maxLength":64,"title":"App"},"actor_sub":{"type":"string","maxLength":255,"title":"Actor Sub"},"actor_email":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Actor Email"},"actor_tenants":{"items":{"type":"string"},"type":"array","maxItems":64,"title":"Actor Tenants"},"target_workspace_id":{"type":"string","format":"uuid","title":"Target Workspace Id"},"target_tenant":{"type":"string","maxLength":255,"title":"Target Tenant"},"access":{"anyOf":[{"type":"string","enum":["read","write"]},{"type":"null"}],"title":"Access"},"resource":{"type":"string","maxLength":512,"title":"Resource"},"connection_id":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Connection Id"},"request_id":{"type":"string","maxLength":128,"minLength":1,"title":"Request Id"}},"type":"object","required":["type","at","app","actor_sub","target_workspace_id","target_tenant","resource","request_id"],"title":"AuditEventIn"},"AuditPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AuditEntryOut"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","total"],"title":"AuditPage"},"Body_put_branding_font_tenants__tenant_id__branding_font__weight__put":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_put_branding_font_tenants__tenant_id__branding_font__weight__put"},"Body_put_branding_logo_tenants__tenant_id__branding_logo__variant__put":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_put_branding_logo_tenants__tenant_id__branding_logo__variant__put"},"Body_put_my_branding_font_portal_branding_font__weight__put":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_put_my_branding_font_portal_branding_font__weight__put"},"Body_put_my_branding_logo_portal_branding_logo__variant__put":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_put_my_branding_logo_portal_branding_logo__variant__put"},"BrandingOut":{"properties":{"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"accent_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accent Color"},"has_logo_light":{"type":"boolean","title":"Has Logo Light","default":false},"has_logo_dark":{"type":"boolean","title":"Has Logo Dark","default":false},"logo_light":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Light"},"logo_dark":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Dark"},"product_names":{"additionalProperties":{"type":"string"},"type":"object","title":"Product Names","default":{}},"font_family":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Font Family"},"theme_canvas":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme Canvas"},"theme_secondary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme Secondary"},"fonts":{"items":{"$ref":"#/components/schemas/FontFaceOut"},"type":"array","title":"Fonts","default":[]},"version":{"type":"string","title":"Version"}},"type":"object","required":["version"],"title":"BrandingOut","description":"The editing view — what the console form renders."},"BrandingUpdate":{"properties":{"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"accent_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accent Color"},"product_names":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Product Names"},"font_family":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Font Family"},"theme_canvas":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme Canvas"},"theme_secondary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme Secondary"}},"type":"object","title":"BrandingUpdate","description":"A field left absent is unchanged; an explicit empty string clears it.\n\n`product_names` is replaced whole, not merged: the console sends the full\nmap it renders, and `{}` clears every name. Shape rules (key pattern, value\nlength, entry cap) are enforced in `services.branding`, where the accent\ncolour's are, so both routers answer 400 with the same message.\n\n`font_family`, `theme_canvas` and `theme_secondary` follow the same rule as\nthe accent: inputs the customer chose, stored as given (trimmed), derived\ninto tokens by the product. The font FILES are uploaded separately, per weight."},"CheckoutIn":{"properties":{"app":{"type":"string","title":"App"}},"type":"object","required":["app"],"title":"CheckoutIn"},"CheckoutOut":{"properties":{"url":{"type":"string","title":"Url"}},"type":"object","required":["url"],"title":"CheckoutOut"},"ChoiceIn":{"properties":{"model":{"anyOf":[{"type":"string","maxLength":160,"minLength":1},{"type":"null"}],"title":"Model"},"reason":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Reason"}},"additionalProperties":false,"type":"object","title":"ChoiceIn"},"ClientOut":{"properties":{"id":{"type":"string","title":"Id"},"client_id":{"type":"string","title":"Client Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"enabled":{"type":"boolean","title":"Enabled","default":true},"public_client":{"type":"boolean","title":"Public Client","default":false},"redirect_uris":{"items":{"type":"string"},"type":"array","title":"Redirect Uris","default":[]}},"type":"object","required":["id","client_id"],"title":"ClientOut"},"EditionModelsIn":{"properties":{"models":{"items":{"type":"string"},"type":"array","maxItems":50,"title":"Models"},"default":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default"}},"additionalProperties":false,"type":"object","required":["models"],"title":"EditionModelsIn"},"EditionModelsOut":{"properties":{"slot":{"type":"string","title":"Slot"},"models":{"items":{"type":"string"},"type":"array","title":"Models"},"default":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default"},"product":{"type":"string","title":"Product"},"edition":{"type":"string","title":"Edition"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings"},"key_sync":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Key Sync"}},"type":"object","required":["slot","models","default","product","edition","warnings"],"title":"EditionModelsOut"},"EditionOut":{"properties":{"key":{"type":"string","title":"Key"},"name":{"type":"string","title":"Name"},"default_budget":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Default Budget"},"default_rpm":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Default Rpm"},"slots":{"items":{"$ref":"#/components/schemas/SlotModelsOut"},"type":"array","title":"Slots"}},"type":"object","required":["key","name","default_budget","default_rpm","slots"],"title":"EditionOut"},"EnabledIn":{"properties":{"enabled":{"type":"boolean","title":"Enabled"}},"type":"object","required":["enabled"],"title":"EnabledIn"},"FailureIn":{"properties":{"tenant":{"type":"string","title":"Tenant","description":"Keycloak group name identifying the tenant"},"reason":{"type":"string","maxLength":500,"title":"Reason"}},"type":"object","required":["tenant","reason"],"title":"FailureIn"},"FailureOut":{"properties":{"ok":{"type":"boolean","title":"Ok"}},"type":"object","required":["ok"],"title":"FailureOut"},"FontFaceOut":{"properties":{"weight":{"type":"integer","title":"Weight"},"format":{"type":"string","title":"Format"},"digest":{"type":"string","title":"Digest"},"size":{"type":"integer","title":"Size"},"path":{"type":"string","title":"Path"}},"type":"object","required":["weight","format","digest","size","path"],"title":"FontFaceOut","description":"One uploaded face, without its bytes.\n\n`path` is relative to license-api and served by the public, content-addressed\nfont route — it is a URL for a browser only once something in front of\nlicense-api exposes it (the console's `/brand-fonts/…` proxy does)."},"GateDecisionOut":{"properties":{"granted":{"type":"boolean","title":"Granted"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"mode":{"type":"string","enum":["normal","setup"],"title":"Mode","default":"normal"}},"type":"object","required":["granted"],"title":"GateDecisionOut"},"GateRequest":{"properties":{"tenant":{"type":"string","title":"Tenant"},"user":{"type":"string","title":"User"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"roles":{"items":{"type":"string"},"type":"array","title":"Roles","default":[]}},"type":"object","required":["tenant","user"],"title":"GateRequest"},"GroupIn":{"properties":{"group_id":{"type":"string","title":"Group Id"}},"type":"object","required":["group_id"],"title":"GroupIn"},"GroupRef":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"}},"type":"object","required":["id","name"],"title":"GroupRef","description":"A Keycloak group by id and name — what removing or adding it needs."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InviteCreate":{"properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"}},"additionalProperties":false,"type":"object","title":"InviteCreate"},"InviteRedeem":{"properties":{"token":{"type":"string","maxLength":128,"minLength":16,"title":"Token"}},"additionalProperties":false,"type":"object","required":["token"],"title":"InviteRedeem"},"InviteRedeemed":{"properties":{"tenant":{"type":"string","title":"Tenant"},"tenant_id":{"type":"string","title":"Tenant Id"}},"type":"object","required":["tenant","tenant_id"],"title":"InviteRedeemed"},"KeyVerifyIn":{"properties":{"key":{"type":"string","title":"Key"}},"type":"object","required":["key"],"title":"KeyVerifyIn"},"LicenseIssue":{"properties":{"valid_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Valid Until"},"perpetual":{"type":"boolean","title":"Perpetual","default":false},"app":{"type":"string","title":"App"},"plan":{"type":"string","title":"Plan"},"features":{"items":{"type":"string"},"type":"array","title":"Features"},"seats":{"type":"integer","title":"Seats"},"valid_from":{"type":"string","format":"date-time","title":"Valid From"}},"type":"object","required":["app","plan","seats","valid_from"],"title":"LicenseIssue"},"LicenseKeyOut":{"properties":{"key":{"type":"string","title":"Key"},"kid":{"type":"string","title":"Kid"},"payload":{"additionalProperties":true,"type":"object","title":"Payload"}},"type":"object","required":["key","kid","payload"],"title":"LicenseKeyOut","description":"A signed, offline licence file.\n\n`key` is the artifact that travels to an air-gapped installation; `kid`\nnames the signing key so the installation can pick it out of the published\nJWKS. `payload` is returned decoded purely so an operator can eyeball what\nthey are about to hand over — it is not the trusted copy, the signed bytes\ninside `key` are."},"LicenseOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"app":{"type":"string","title":"App"},"plan":{"type":"string","title":"Plan"},"features":{"items":{"type":"string"},"type":"array","title":"Features"},"seats":{"type":"integer","title":"Seats"},"pending_seats":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pending Seats"},"valid_from":{"type":"string","format":"date-time","title":"Valid From"},"valid_until":{"type":"string","format":"date-time","title":"Valid Until"},"perpetual":{"type":"boolean","title":"Perpetual","default":false},"status":{"type":"string","title":"Status"},"jti":{"type":"string","title":"Jti"}},"type":"object","required":["id","tenant_id","app","plan","features","seats","valid_from","valid_until","status","jti"],"title":"LicenseOut"},"LlmConfigIn":{"properties":{"mode":{"type":"string","enum":["platform","byok"],"title":"Mode"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"},"api_key":{"anyOf":[{"type":"string","format":"password","writeOnly":true},{"type":"null"}],"title":"Api Key"},"max_budget":{"anyOf":[{"type":"number","maximum":1000000.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Max Budget"},"rpm_limit":{"anyOf":[{"type":"integer","maximum":100000.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Rpm Limit"}},"additionalProperties":false,"type":"object","required":["mode"],"title":"LlmConfigIn"},"LlmConfigOut":{"properties":{"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"mode":{"type":"string","title":"Mode"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"},"model_group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Group"},"key_alias":{"type":"string","title":"Key Alias"},"key_last4":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Last4"},"max_budget":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Max Budget"},"rpm_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rpm Limit"},"status":{"type":"string","title":"Status"},"last_verified_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Verified At"},"last_verify_ok":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Last Verify Ok"},"last_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Error"},"last_error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Error Code"}},"type":"object","required":["tenant_id","mode","provider","model_group","key_alias","key_last4","max_budget","rpm_limit","status","last_verified_at","last_verify_ok","last_error"],"title":"LlmConfigOut"},"LlmCredentialOut":{"properties":{"key_alias":{"type":"string","title":"Key Alias"},"virtual_key":{"type":"string","title":"Virtual Key"},"mode":{"type":"string","title":"Mode"},"models":{"items":{"type":"string"},"type":"array","title":"Models"},"chat_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chat Model"}},"type":"object","required":["key_alias","virtual_key","mode","models","chat_model"],"title":"LlmCredentialOut","description":"Service-only: what asky needs to call LiteLLM as this tenant."},"LlmLimitsIn":{"properties":{"daily_token_limit":{"anyOf":[{"type":"integer","maximum":9.223372036854776e+18,"minimum":-1.0},{"type":"null"}],"title":"Daily Token Limit"},"monthly_token_limit":{"anyOf":[{"type":"integer","maximum":9.223372036854776e+18,"minimum":-1.0},{"type":"null"}],"title":"Monthly Token Limit"},"user_daily_token_limit":{"anyOf":[{"type":"integer","maximum":9.223372036854776e+18,"minimum":-1.0},{"type":"null"}],"title":"User Daily Token Limit"},"app_daily_token_limit":{"anyOf":[{"type":"integer","maximum":9.223372036854776e+18,"minimum":-1.0},{"type":"null"}],"title":"App Daily Token Limit"}},"additionalProperties":false,"type":"object","title":"LlmLimitsIn","description":"Operator override of the token limits. A field left out is unchanged, null clears the override, -1 is\nunlimited (quota spec section 2)."},"LlmLimitsOut":{"properties":{"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"edition":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Edition"},"overrides":{"additionalProperties":{"anyOf":[{"type":"integer"},{"type":"null"}]},"type":"object","title":"Overrides"},"effective":{"additionalProperties":{"type":"integer"},"type":"object","title":"Effective"},"synced":{"type":"boolean","title":"Synced","default":true}},"type":"object","required":["tenant_id","edition","overrides","effective"],"title":"LlmLimitsOut"},"LlmQuotaOut":{"properties":{"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"timezone":{"type":"string","title":"Timezone"},"levels":{"items":{"$ref":"#/components/schemas/QuotaLevelOut"},"type":"array","title":"Levels"},"key_sync_pending":{"type":"boolean","title":"Key Sync Pending","default":false}},"type":"object","required":["tenant_id","timezone","levels"],"title":"LlmQuotaOut"},"LlmRotateIn":{"properties":{"api_key":{"anyOf":[{"type":"string","format":"password","writeOnly":true},{"type":"null"}],"title":"Api Key"}},"additionalProperties":false,"type":"object","title":"LlmRotateIn"},"MemberAdd":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"MemberAdd"},"MemberInvite":{"properties":{"email":{"type":"string","title":"Email"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"}},"type":"object","required":["email","first_name","last_name"],"title":"MemberInvite","description":"Owner-scoped member invite: creates a directly-usable login (permanent\npassword, no required actions) in the owner's OWN tenant group. No role\ninput — members get the realm default role only (owners can't mint admins)."},"MyBrandingOut":{"properties":{"tenant":{"type":"string","title":"Tenant"},"workspace_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workspace Id"},"display_name":{"type":"string","title":"Display Name"},"accent_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accent Color"},"logo_light":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Light"},"logo_dark":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Dark"},"product_names":{"additionalProperties":{"type":"string"},"type":"object","title":"Product Names","default":{}},"font_family":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Font Family"},"theme_canvas":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme Canvas"},"theme_secondary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme Secondary"},"fonts":{"items":{"$ref":"#/components/schemas/FontFaceOut"},"type":"array","title":"Fonts","default":[]},"version":{"type":"string","title":"Version"}},"type":"object","required":["tenant","display_name","version"],"title":"MyBrandingOut","description":"The product view. `display_name` always carries something to render:\nit falls back to the tenant's own name when no brand has been entered."},"MyRegionalOut":{"properties":{"timezone":{"type":"string","title":"Timezone"},"locale":{"type":"string","title":"Locale"},"tenant":{"type":"string","title":"Tenant"},"workspace_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workspace Id"}},"type":"object","required":["timezone","locale","tenant"],"title":"MyRegionalOut","description":"The product view: what every B2Metric app reads to render a timestamp."},"MyThemeOut":{"properties":{"tenant":{"type":"string","title":"Tenant"},"accent_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accent Color"},"theme_canvas":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme Canvas"},"theme_secondary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme Secondary"},"font_family":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Font Family"},"fonts":{"items":{"$ref":"#/components/schemas/FontFaceOut"},"type":"array","title":"Fonts","default":[]},"version":{"type":"string","title":"Version"}},"type":"object","required":["tenant","version"],"title":"MyThemeOut","description":"The slice of the brand a product's STYLESHEET needs — no logos, no names.\n\n`GET /me/branding` inlines up to two 85 KB base64 logos. The console reads\nthe theme on every portal navigation, where that is pure waste, so this is\nthe same data minus them, under the same version."},"OnboardingBlock":{"properties":{"status":{"type":"string","title":"Status"},"milestone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Milestone"},"mode":{"type":"string","title":"Mode"}},"type":"object","required":["status","milestone","mode"],"title":"OnboardingBlock","description":"Why a gated app can or cannot be opened. Absent for ungated apps."},"OwnerlessLicenceOut":{"properties":{"app":{"type":"string","title":"App"},"status":{"type":"string","title":"Status"}},"type":"object","required":["app","status"],"title":"OwnerlessLicenceOut"},"OwnerlessTenantOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"workspace_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Workspace Id"},"kc_group_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kc Group Id"},"licenses":{"items":{"$ref":"#/components/schemas/OwnerlessLicenceOut"},"type":"array","title":"Licenses","default":[]},"blocking":{"type":"boolean","title":"Blocking","default":false},"owner_status":{"type":"string","title":"Owner Status"}},"type":"object","required":["id","name","owner_status"],"title":"OwnerlessTenantOut","description":"A tenant with nobody holding the `owner` realm role in its group.\n\n`blocking` is the triage signal, not the licence count: a tenant whose\nlicences are all revoked is untidy, while one with a licence somebody could\nbe entitled to *today* has a setup wizard nobody can reach and a stalled\nreport with no address (SSO-24).\n\nIt is computed with `licenses.is_valid` — the same function the gate uses —\nso the report and the gate cannot disagree about what \"usable\" means."},"PasswordResetIn":{"properties":{"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"}},"type":"object","title":"PasswordResetIn","description":"Admin/owner password reset payload. Leave `password` blank to\nauto-generate (returned once in PasswordResetOut so the admin can hand\nit off to the user)."},"PasswordResetOut":{"properties":{"id":{"type":"string","title":"Id"},"password":{"type":"string","title":"Password"}},"type":"object","required":["id","password"],"title":"PasswordResetOut"},"PortalFeaturesOut":{"properties":{"owner_model_choice":{"type":"boolean","title":"Owner Model Choice"}},"type":"object","required":["owner_model_choice"],"title":"PortalFeaturesOut"},"PortalModelsOut":{"properties":{"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode"},"key_sync_pending":{"type":"boolean","title":"Key Sync Pending"},"key_synced_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Key Synced At"},"products":{"items":{"$ref":"#/components/schemas/ProductChoicesOut"},"type":"array","title":"Products"},"key_sync":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Sync"},"names":{"additionalProperties":{"$ref":"#/components/schemas/ProductNamesOut"},"type":"object","title":"Names"}},"type":"object","required":["tenant_id","mode","key_sync_pending","key_synced_at","products","names"],"title":"PortalModelsOut","description":"The owner's view (PLATFORM-159): the same state, plus the display names the admin\nscreen reads from /admin/products, which owners cannot call."},"ProductChoicesOut":{"properties":{"product":{"type":"string","title":"Product"},"edition":{"type":"string","title":"Edition"},"slots":{"items":{"$ref":"#/components/schemas/SlotChoiceOut"},"type":"array","title":"Slots"}},"type":"object","required":["product","edition","slots"],"title":"ProductChoicesOut"},"ProductDetailOut":{"properties":{"key":{"type":"string","title":"Key"},"name":{"type":"string","title":"Name"},"slots":{"items":{"$ref":"#/components/schemas/SlotOut"},"type":"array","title":"Slots"},"editions":{"items":{"$ref":"#/components/schemas/EditionOut"},"type":"array","title":"Editions"}},"type":"object","required":["key","name","slots","editions"],"title":"ProductDetailOut"},"ProductNamesOut":{"properties":{"name":{"type":"string","title":"Name"},"editions":{"additionalProperties":{"type":"string"},"type":"object","title":"Editions"}},"type":"object","required":["name","editions"],"title":"ProductNamesOut"},"ProductOut":{"properties":{"key":{"type":"string","title":"Key"},"name":{"type":"string","title":"Name"}},"type":"object","required":["key","name"],"title":"ProductOut"},"ProductPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ProductOut"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","total"],"title":"ProductPage"},"QuotaLevelOut":{"properties":{"level":{"type":"string","title":"Level"},"period":{"type":"string","title":"Period"},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"},"used":{"type":"integer","title":"Used"},"remaining":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Remaining"},"unlimited":{"type":"boolean","title":"Unlimited"},"reset_at":{"type":"string","title":"Reset At"}},"type":"object","required":["level","period","limit","used","remaining","unlimited","reset_at"],"title":"QuotaLevelOut"},"RedeemCodeCreate":{"properties":{"kind":{"type":"string","title":"Kind"},"app":{"type":"string","title":"App"},"plan":{"type":"string","title":"Plan"},"seats":{"type":"integer","title":"Seats"},"discount_percent":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Discount Percent"},"max_redemptions":{"type":"integer","title":"Max Redemptions","default":1},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"}},"type":"object","required":["kind","app","plan","seats"],"title":"RedeemCodeCreate"},"RedeemCodeOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"code":{"type":"string","title":"Code"},"kind":{"type":"string","title":"Kind"},"app":{"type":"string","title":"App"},"plan":{"type":"string","title":"Plan"},"seats":{"type":"integer","title":"Seats"},"discount_percent":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Discount Percent"},"max_redemptions":{"type":"integer","title":"Max Redemptions"},"times_redeemed":{"type":"integer","title":"Times Redeemed"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"status":{"type":"string","title":"Status"}},"type":"object","required":["id","code","kind","app","plan","seats","max_redemptions","times_redeemed","status"],"title":"RedeemCodeOut"},"RedeemIn":{"properties":{"code":{"type":"string","title":"Code"}},"type":"object","required":["code"],"title":"RedeemIn"},"RegionalOut":{"properties":{"timezone":{"type":"string","title":"Timezone"},"locale":{"type":"string","title":"Locale"}},"type":"object","required":["timezone","locale"],"title":"RegionalOut","description":"The editing view (admin + owner routes). Always strings — an unset row\nreads as the defaults, see ``regional.coerce_*``."},"RegionalUpdate":{"properties":{"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone"},"locale":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locale"}},"type":"object","title":"RegionalUpdate","description":"A field left absent is unchanged. There is no \"clear\": the explicit reset\nis ``\"UTC\"`` / ``\"en-GB\"``, because a tenant is never without a timezone.\n\nValidation is a 422, never a silent coerce — the admin who typo'd their zone\nmust not be shown \"saved\" while every product quietly stays on UTC. The rules\nlive in :mod:`app.services.regional`; this is only where they meet HTTP."},"RejectIn":{"properties":{"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","title":"RejectIn"},"RenewIn":{"properties":{"valid_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Valid Until"},"perpetual":{"type":"boolean","title":"Perpetual","default":false}},"type":"object","title":"RenewIn","description":"`valid_until` or `perpetual` — see `LicenceTerm`. Renewing a perpetual\nlicence with a real date is allowed and makes it a term licence again."},"RequestCreate":{"properties":{"app":{"type":"string","title":"App"},"plan":{"type":"string","title":"Plan"},"seats":{"type":"integer","title":"Seats"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["app","plan","seats"],"title":"RequestCreate"},"RequestOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"app":{"type":"string","title":"App"},"plan":{"type":"string","title":"Plan"},"seats":{"type":"integer","title":"Seats"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"status":{"type":"string","title":"Status"},"requested_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Requested By"},"decision_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Decision Note"},"decided_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Decided At"}},"type":"object","required":["id","tenant_id","app","plan","seats","status"],"title":"RequestOut"},"RoleCreate":{"properties":{"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["name"],"title":"RoleCreate"},"RoleIn":{"properties":{"role":{"type":"string","title":"Role"}},"type":"object","required":["role"],"title":"RoleIn"},"RoundOut":{"properties":{"round":{"type":"integer","title":"Round"}},"type":"object","required":["round"],"title":"RoundOut"},"SeatAssignByEmail":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"SeatAssignByEmail","description":"Owner-scoped seat assignment: identify the member by email; the API\nresolves it to the Keycloak sub and enforces the target is in the owner's\nown tenant group before granting the seat."},"SeatAssignIn":{"properties":{"user_external_id":{"type":"string","title":"User External Id"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"}},"type":"object","required":["user_external_id"],"title":"SeatAssignIn"},"SeatHolderOut":{"properties":{"user_external_id":{"type":"string","title":"User External Id"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"assigned_at":{"type":"string","title":"Assigned At"}},"type":"object","required":["user_external_id","assigned_at"],"title":"SeatHolderOut"},"SeatsIn":{"properties":{"seats":{"type":"integer","title":"Seats"}},"type":"object","required":["seats"],"title":"SeatsIn"},"ServiceProductOut":{"properties":{"product":{"type":"string","title":"Product"},"edition":{"type":"string","title":"Edition"},"slots":{"items":{"$ref":"#/components/schemas/ServiceSlotOut"},"type":"array","title":"Slots"}},"type":"object","required":["product","edition","slots"],"title":"ServiceProductOut"},"ServiceSlotOut":{"properties":{"slot":{"type":"string","title":"Slot"},"role_name":{"type":"string","title":"Role Name"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"},"default":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default"},"chosen":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chosen"},"fallback_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback Reason"}},"type":"object","required":["slot","role_name","model","default","chosen","fallback_reason"],"title":"ServiceSlotOut"},"SetupStatusOut":{"properties":{"status":{"type":"string","title":"Status"},"completed_steps":{"items":{"type":"string"},"type":"array","title":"Completed Steps"},"steps":{"items":{"type":"string"},"type":"array","title":"Steps"}},"type":"object","required":["status","completed_steps","steps"],"title":"SetupStatusOut"},"SiteModelOut":{"properties":{"name":{"type":"string","title":"Name"},"sql_evaluated":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Sql Evaluated"},"residency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Residency"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"},"price_class":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Price Class"}},"type":"object","required":["name","sql_evaluated","residency","provider","price_class"],"title":"SiteModelOut","description":"A gateway model. Only these fields leave the service: never `litellm_params`."},"SiteModelPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/SiteModelOut"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","total"],"title":"SiteModelPage"},"SlotChoiceOut":{"properties":{"slot":{"type":"string","title":"Slot"},"role_name":{"type":"string","title":"Role Name"},"locked":{"type":"boolean","title":"Locked"},"allowed":{"items":{"type":"string"},"type":"array","title":"Allowed"},"default":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default"},"chosen":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chosen"},"chosen_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chosen By"},"chosen_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Chosen At"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"effective":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Effective"},"fallback_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback Reason"},"fallback_since":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Fallback Since"}},"type":"object","required":["slot","role_name","locked","allowed","default","chosen","chosen_by","chosen_at","reason","effective","fallback_reason","fallback_since"],"title":"SlotChoiceOut"},"SlotModelsOut":{"properties":{"slot":{"type":"string","title":"Slot"},"models":{"items":{"type":"string"},"type":"array","title":"Models"},"default":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default"}},"type":"object","required":["slot","models","default"],"title":"SlotModelsOut"},"SlotOut":{"properties":{"slot":{"type":"string","title":"Slot"},"role_name":{"type":"string","title":"Role Name"},"locked_after_onboarding":{"type":"boolean","title":"Locked After Onboarding"}},"type":"object","required":["slot","role_name","locked_after_onboarding"],"title":"SlotOut"},"StalledOut":{"properties":{"tenant":{"type":"string","title":"Tenant"},"app":{"type":"string","title":"App"},"milestone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Milestone"},"status":{"type":"string","title":"Status"},"owner_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Email"},"started_at":{"type":"string","format":"date-time","title":"Started At"},"last_progress_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Progress At"}},"type":"object","required":["tenant","app","milestone","status","owner_email","started_at","last_progress_at"],"title":"StalledOut"},"StateOut":{"properties":{"app":{"type":"string","title":"App"},"milestone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Milestone"},"status":{"type":"string","title":"Status"},"round":{"type":"integer","title":"Round"},"launchable":{"type":"boolean","title":"Launchable"},"started_at":{"type":"string","format":"date-time","title":"Started At"},"last_progress_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Progress At"},"first_ready_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Ready At"},"failure_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Failure Reason"}},"type":"object","required":["app","milestone","status","round","launchable","started_at","last_progress_at","first_ready_at","failure_reason"],"title":"StateOut"},"TenantAppsOut":{"properties":{"tenant":{"type":"string","title":"Tenant"},"workspace_id":{"type":"string","format":"uuid","title":"Workspace Id"},"apps":{"items":{"$ref":"#/components/schemas/UserAppOut"},"type":"array","title":"Apps"}},"type":"object","required":["tenant","workspace_id","apps"],"title":"TenantAppsOut","description":"`/me/apps` is per tenant: the same app in two tenants is two launch\ntargets, and the launcher hands the tenant to the product (?tenant=)."},"TenantCreate":{"properties":{"name":{"type":"string","title":"Name"}},"type":"object","required":["name"],"title":"TenantCreate"},"TenantModelsOut":{"properties":{"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode"},"key_sync_pending":{"type":"boolean","title":"Key Sync Pending"},"key_synced_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Key Synced At"},"products":{"items":{"$ref":"#/components/schemas/ProductChoicesOut"},"type":"array","title":"Products"},"key_sync":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Sync"}},"type":"object","required":["tenant_id","mode","key_sync_pending","key_synced_at","products"],"title":"TenantModelsOut"},"TenantOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"workspace_id":{"type":"string","format":"uuid","title":"Workspace Id"},"kc_group_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kc Group Id"},"timezone":{"type":"string","title":"Timezone","default":"UTC"},"locale":{"type":"string","title":"Locale","default":"en-GB"},"legal_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legal Name"},"contact_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Name"},"contact_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Email"}},"type":"object","required":["id","name","workspace_id"],"title":"TenantOut"},"TenantRef":{"properties":{"tenant":{"type":"string","title":"Tenant","description":"Keycloak group name identifying the tenant"}},"type":"object","required":["tenant"],"title":"TenantRef"},"TenantUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"legal_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legal Name"},"contact_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Name"},"contact_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Email"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone"},"locale":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locale"}},"type":"object","title":"TenantUpdate"},"TransitionOut":{"properties":{"changed":{"type":"boolean","title":"Changed"},"milestone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Milestone"},"status":{"type":"string","title":"Status"}},"type":"object","required":["changed","milestone","status"],"title":"TransitionOut"},"UserAppOut":{"properties":{"app":{"type":"string","title":"App"},"plan":{"type":"string","title":"Plan"},"valid_until":{"type":"string","format":"date-time","title":"Valid Until"},"launchable":{"type":"boolean","title":"Launchable","default":true},"onboarding":{"anyOf":[{"$ref":"#/components/schemas/OnboardingBlock"},{"type":"null"}]}},"type":"object","required":["app","plan","valid_until"],"title":"UserAppOut","description":"An app the current user is entitled to. Note \"entitled\", not \"openable\":\nan app whose product setup is unfinished is still listed, with\n`launchable=False` and an `onboarding` block saying why. Hiding it would\nrender as \"no access\", which is a different and wrong message."},"UserCreate":{"properties":{"email":{"type":"string","title":"Email"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"},"tenant_group_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Group Id"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"mode":{"type":"string","enum":["email","password"],"title":"Mode","default":"email"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"}},"type":"object","required":["email","first_name","last_name"],"title":"UserCreate"},"UserOut":{"properties":{"id":{"type":"string","title":"Id"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"enabled":{"type":"boolean","title":"Enabled","default":true},"roles":{"items":{"type":"string"},"type":"array","title":"Roles","default":[]},"tenants":{"items":{"type":"string"},"type":"array","title":"Tenants","default":[]},"groups":{"items":{"$ref":"#/components/schemas/GroupRef"},"type":"array","title":"Groups","default":[]}},"type":"object","required":["id"],"title":"UserOut"},"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"},"WorkspaceModelSlotsOut":{"properties":{"workspace_id":{"type":"string","format":"uuid","title":"Workspace Id"},"products":{"items":{"$ref":"#/components/schemas/ServiceProductOut"},"type":"array","title":"Products"}},"type":"object","required":["workspace_id","products"],"title":"WorkspaceModelSlotsOut","description":"What ASKY reads to show its read-only model table. No key, no allowed lists."},"app__schemas__invite__InviteOut":{"properties":{"url":{"type":"string","title":"Url"},"expires_at":{"type":"string","title":"Expires At"}},"type":"object","required":["url","expires_at"],"title":"InviteOut"},"app__schemas__license__MemberOut":{"properties":{"id":{"type":"string","title":"Id"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},"type":"object","required":["id"],"title":"MemberOut"},"app__schemas__user__InviteOut":{"properties":{"id":{"type":"string","title":"Id"},"invite":{"additionalProperties":true,"type":"object","title":"Invite"}},"type":"object","required":["id","invite"],"title":"InviteOut"},"app__schemas__user__MemberOut":{"properties":{"id":{"type":"string","title":"Id"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"enabled":{"type":"boolean","title":"Enabled","default":true},"roles":{"items":{"type":"string"},"type":"array","title":"Roles","default":[]}},"type":"object","required":["id"],"title":"MemberOut","description":"A user that belongs to the owner's tenant — used by /portal/members."}}}}