{"openapi":"3.1.0","info":{"title":"OAuth 2.0 Authorization Server Admin API","version":"0.2.0"},"paths":{"/admin/tenants":{"get":{"tags":["tenants"],"summary":"List Tenants","description":"List tenants via repository.","operationId":"list_tenants_admin_tenants_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/TenantOut"},"type":"array","title":"Response List Tenants Admin Tenants Get"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["tenants"],"summary":"Create Tenant","description":"Create a new tenant via repository.","operationId":"create_tenant_admin_tenants_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantIn"}}},"required":true},"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"}}}}},"security":[{"HTTPBearer":[]}]}},"/admin/tenants/{uid}":{"get":{"tags":["tenants"],"summary":"Get Tenant","description":"Get a specific tenant via repository.","operationId":"get_tenant_admin_tenants__uid__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","title":"Uid"}}],"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","description":"Update a tenant via repository.","operationId":"update_tenant_admin_tenants__uid__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","title":"Uid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["tenants"],"summary":"Delete Tenant","description":"Delete a tenant via repository.","operationId":"delete_tenant_admin_tenants__uid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","title":"Uid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/tenants/{uid}/keys":{"get":{"tags":["tenants"],"summary":"Get Tenant Keys","description":"Get jwks for a tenant via service.","operationId":"get_tenant_keys_admin_tenants__uid__keys_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","title":"Uid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["tenants"],"summary":"Generate Tenant Keypair","description":"Generate a keypair for a tenant via service.","operationId":"generate_tenant_keypair_admin_tenants__uid__keys_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","title":"Uid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyGenIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/tenants/{uid}/keys/{kid}/status":{"patch":{"tags":["tenants"],"summary":"Update Key Status","description":"Update a tenant key status: active | retired | revoked.","operationId":"update_key_status_admin_tenants__uid__keys__kid__status_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","title":"Uid"}},{"name":"kid","in":"path","required":true,"schema":{"type":"string","title":"Kid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyStatusIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/tenants/{uid}/clients":{"get":{"tags":["tenants"],"summary":"List Clients","description":"List clients via repository.","operationId":"list_clients_admin_tenants__uid__clients_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","title":"Uid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ClientOut"},"title":"Response List Clients Admin Tenants  Uid  Clients Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["tenants"],"summary":"Create Client","description":"Create a new client via repository.","operationId":"create_client_admin_tenants__uid__clients_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","title":"Uid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/tenants/{uid}/clients/{client_id}":{"get":{"tags":["tenants"],"summary":"Get Client","description":"Get a specific client via repository.","operationId":"get_client_admin_tenants__uid__clients__client_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","title":"Uid"}},{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["tenants"],"summary":"Update Client","description":"Update a client via repository.","operationId":"update_client_admin_tenants__uid__clients__client_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","title":"Uid"}},{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["tenants"],"summary":"Delete Client","description":"Delete a client via repository.","operationId":"delete_client_admin_tenants__uid__clients__client_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","title":"Uid"}},{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/tenants/{uid}/migrations":{"post":{"tags":["migrations"],"summary":"Migrate Tenant","description":"Run migrations for a specific tenant.","operationId":"migrate_tenant_admin_tenants__uid__migrations_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","title":"Uid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MigrationRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/tenants/{uid}/db":{"get":{"tags":["internal"],"summary":"Get Db","description":"Return tenant DB connect URL and schema.","operationId":"get_db_internal_tenants__uid__db_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","title":"Uid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantDbResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/tenants/{uid}/jwks":{"get":{"tags":["internal"],"summary":"Get Jwks","description":"Return public JWKS for the tenant.","operationId":"get_jwks_internal_tenants__uid__jwks_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","title":"Uid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantJwksResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/tenants/{uid}/jwts":{"post":{"tags":["internal"],"summary":"Sign Jwt","description":"Sign a JWT for the tenant.","operationId":"sign_jwt_internal_tenants__uid__jwts_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","title":"Uid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JwtSignRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JwtSignResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/healthz":{"get":{"summary":"Health Check","description":"Simple health check.","operationId":"health_check_healthz_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"ClientIn":{"properties":{"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id","description":"Client ID; if omitted, generated automatically"},"client_auth_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Auth Method","description":"Auth method: client_secret_basic|client_secret_jwt|private_key_jwt"},"client_auth_signing_alg":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Auth Signing Alg","description":"e.g., ES256 or HS256"},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Secret","description":"For client_secret_basic or client_secret_jwt"},"jwks":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Jwks","description":"Public key for private_key_jwt"},"jwks_uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Jwks Uri","description":"Public key URI for private_key_jwt"}},"type":"object","title":"ClientIn","description":"Client onboarding payload."},"ClientOut":{"properties":{"client_id":{"type":"string","title":"Client Id"},"client_auth_method":{"type":"string","title":"Client Auth Method"},"client_auth_signing_alg":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Auth Signing Alg"},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Secret"},"jwks":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Jwks"},"jwks_uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Jwks Uri"}},"type":"object","required":["client_id","client_auth_method"],"title":"ClientOut","description":"Client onboarding response."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"JwtSignRequest":{"properties":{"alg":{"anyOf":[{"type":"string","const":"ES256"},{"type":"null"}],"title":"Alg"},"kid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kid"},"claims":{"additionalProperties":true,"type":"object","title":"Claims"},"ttl_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ttl Seconds"}},"type":"object","required":["claims"],"title":"JwtSignRequest","description":"Payload for signing a JWT."},"JwtSignResponse":{"properties":{"jwt":{"type":"string","title":"Jwt"},"kid":{"type":"string","title":"Kid"},"alg":{"type":"string","title":"Alg"},"exp":{"type":"integer","title":"Exp"}},"type":"object","required":["jwt","kid","alg","exp"],"title":"JwtSignResponse","description":"Response for signing a JWT."},"KeyGenIn":{"properties":{"kid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kid","description":"Key ID; if omitted, generated automatically"},"alg":{"type":"string","title":"Alg","description":"Signing algorithm; only ES256 supported now","default":"ES256"},"not_before":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Not Before"},"not_after":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Not After"},"status":{"type":"string","title":"Status","description":"active | retired | revoked","default":"active"}},"type":"object","title":"KeyGenIn","description":"Key generation payload."},"KeyStatusIn":{"properties":{"status":{"type":"string","title":"Status","description":"active | retired | revoked"}},"type":"object","required":["status"],"title":"KeyStatusIn","description":"Key status update payload."},"MigrationAction":{"type":"string","enum":["upgrade","downgrade"],"title":"MigrationAction","description":"Enum for migration actions."},"MigrationRequest":{"properties":{"action":{"$ref":"#/components/schemas/MigrationAction"},"rev":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rev"}},"type":"object","required":["action"],"title":"MigrationRequest","description":"Migration request payload."},"TenantDbResponse":{"properties":{"db_url":{"type":"string","title":"Db Url"},"db_schema":{"type":"string","title":"Db Schema"}},"type":"object","required":["db_url","db_schema"],"title":"TenantDbResponse","description":"Response model for tenant database connection."},"TenantIn":{"properties":{"uid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uid"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","title":"TenantIn","description":"Tenant create payload."},"TenantJwksResponse":{"properties":{"keys":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Keys"}},"type":"object","required":["keys"],"title":"TenantJwksResponse","description":"Response model for tenant JWKS (JSON Web Key Set)."},"TenantOut":{"properties":{"id":{"type":"integer","title":"Id"},"uid":{"type":"string","title":"Uid"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"active":{"type":"boolean","title":"Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["id","uid","active","created_at","updated_at"],"title":"TenantOut","description":"Tenant response payload."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}