Services
An org can have more than one service for the same scope — for example a local Whisper service and an OpenAI transcription service, both serving `stt`. This endpoint lists them so your client knows which service_ids it can route to.
Why multiple services per scope?
Each service carries its own configuration, limits, and upstream binding. For scopes where that matters — different audio models, different PII thresholds, different language backends — configuring a second service is cleaner than juggling one shared row. Requests without a service_id hit the one flagged as is_default for that scope; requests with a service_id go straight to that service.
Completions route the same way via the model field plus per-model upstream bindings, so service_iddoesn't apply there. TTS voices currently live at the service-config level (piper/kokoro backend per voice), so service_id on /v1/audio/speech and /v1/audio/voices is rejected with a 400 — pick a different voice instead.
List services
/v1/servicesLists the services the caller can reach. For API tokens, filtered to the scopes the token carries; for portal sessions, returns every service in the org.
Request
scopestring- Optional. Narrow to a single scope (e.g. stt, pii, language).
curl https://api.inferada.com/v1/services?scope=stt \
-H "Authorization: Bearer inf_YOUR_TOKEN"Response · 200
services[].idstring- Service identifier. Pass as service_id on scope-specific endpoints.
services[].scopestring- completions, language, pii, stt or tts.
services[].namestring- Human-readable display name.
services[].activeboolean- Inactive services are filtered out but surface here for visibility.
services[].is_defaultboolean- True for the service that handles scope requests when no service_id is given.
{
"services": [
{
"id": "01J5Z...",
"scope": "stt",
"name": "Speech-to-Text (Local Whisper)",
"active": true,
"is_default": true
},
{
"id": "01J6A...",
"scope": "stt",
"name": "Speech-to-Text (OpenAI)",
"active": true,
"is_default": false
}
]
}Route a request with service_id
Pass service_idalongside the normal request body (or as a form field for multipart endpoints). The gateway validates that the service belongs to your org and matches the endpoint's scope, then routes there instead of the default.
curl https://api.inferada.com/v1/audio/transcriptions \
-H "Authorization: Bearer inf_YOUR_TOKEN" \
-F service_id=01J6A... \
-F file=@speech.mp3Errors: unknown service_id → 404; service_id from another org or with the wrong scope → 403.