apps/api/app/routers/auth.py, prefix /api/v1/auth. Credentials are provider-level — one key set per provider per organisation, shared across whichever of STT, TTS, and LLM that vendor serves. The whole auth object is Fernet-encrypted at rest with PROVIDER_AUTH_ENCRYPTION_KEY. See Provider credentials (ProviderAuth).
GET /auth/catalog
Bearer. Auth field schemas for every provider that takes credentials.
GET /auth/catalog/{provider}
Bearer. One provider’s schema, with fields merged across the kinds it serves. Unknown provider returns 404.
GET /auth/configured
Bearer. A bare JSON array of provider ids the caller’s organisation has stored credentials for:
POST /auth
Bearer, admin or super_admin. 201. Upsert — creating and updating are the same call.
ProviderAuthResponse: org_id, provider, auth, created_at, updated_at. The field names inside auth come from GET /auth/catalog/{provider} — send only secrets here, never model settings.
GET /auth/{provider}
Bearer. Returns ProviderAuthResponse with the decrypted auth. Secrets are masked for callers whose role is neither admin nor super_admin. No stored credentials returns 404 No auth stored for provider: {provider}.
DELETE /auth/{provider}
Bearer, admin or super_admin. Returns SuccessResponse. Nothing stored returns 404.
Related
- Endpoints cheatsheet — every route on one page
- Authentication — tokens, headers, and roles
- Errors — status codes and error shapes