Skip to main content

Troubleshooting: voice-model credential rejected

This page owns the 422 VOICE_CREDENTIAL_PROVIDER_REJECTED response on the voice-model credential write surface — both PUT /api/v1/voice/voice-provider-credential/{kind} (register) and POST /api/v1/voice/voice-provider-credential/{kind}/rotate (rotate). The code fires when the upstream TTS or STT provider refuses the credential you submitted before Orbit persists it.

Why registration returns a 422

Both register and rotate probe the credential live against the provider you named. If the provider answers with a 401, 403, or any other refusal that means “this key is not valid,” the call returns VOICE_CREDENTIAL_PROVIDER_REJECTED and nothing is written — the bad key never reaches your organization settings, never becomes active, and never gets enforced. This is deliberate: a credential that downstream services (STT playground comparisons, on-call transcription, TTS synthesis) would reject on every use is caught at the control plane instead. The supported providers per kind are:

Cause table

Fix the credential

  1. Open the provider dashboard where the key was created (Cartesia for TTS, Deepgram for STT).
  2. Confirm the key is active and has the required permissions for the kind you are registering.
  3. If the key is revoked, expired, or scope-restricted, create a replacement key there.
  4. Re-copy the key directly from the provider dashboard — avoid pasting through a chat window or document, which can add whitespace.
  5. Retry the registration or rotation in Settings → Voice or through the API.
If you no longer want to manage a provider key, revoke the existing credential instead of rotating it; voice traffic for that kind then falls back to the platform-owned key.

Retry-safety

Do not retry the same payload in a loop. VOICE_CREDENTIAL_PROVIDER_REJECTED is a deterministic provider verdict — the provider will refuse the same credential every time until you replace it. Fix or replace the key first, then submit once.

Envelope sample

Ticket checklist

Only escalate after you have replaced or revoked the key and the same call still returns VOICE_CREDENTIAL_PROVIDER_REJECTED:
  1. The code (VOICE_CREDENTIAL_PROVIDER_REJECTED) and the endpoint (PUT /api/v1/voice/voice-provider-credential/{kind} or POST /api/v1/voice/voice-provider-credential/{kind}/rotate).
  2. The kind and provider from error.details.
  3. The provider HTTP status (error.details.provider_status) — 401, 403, or another value.
  4. Your organization ID.

See also