Skip to main content
GET
/
byok
/
providers
curl -X GET https://api.thinnest.ai/byok/providers \
  -H "Authorization: Bearer $THINNESTAI_API_KEY"
{
  "providers": [
    {
      "provider": "openai",
      "name": "OpenAI",
      "type": "llm",
      "description": "GPT-4o, GPT-4o-mini, o1, o3, o4",
      "docs_url": "https://platform.openai.com/api-keys",
      "key_prefix": "sk-",
      "logo": "/logos/OpenAI.png"
    },
    {
      "provider": "anthropic",
      "name": "Anthropic",
      "type": "llm",
      "description": "Claude 4, Claude 3.5 Sonnet, Claude 3 Opus/Haiku",
      "docs_url": "https://console.anthropic.com/settings/keys",
      "key_prefix": "sk-ant-",
      "logo": "/logos/anthropic.png"
    }
  ]
}
curl -X GET https://api.thinnest.ai/byok/providers \
  -H "Authorization: Bearer $THINNESTAI_API_KEY"

List BYOK Providers

Returns all supported LLM, STT, TTS, and Phone providers that accept BYOK API keys.

Request

GET /byok/providers
No authentication required.

Response

{
  "providers": [
    {
      "provider": "openai",
      "name": "OpenAI",
      "type": "llm",
      "description": "GPT-4o, GPT-4o-mini, o1, o3, o4",
      "docs_url": "https://platform.openai.com/api-keys",
      "key_prefix": "sk-",
      "logo": "/logos/OpenAI.png"
    },
    {
      "provider": "anthropic",
      "name": "Anthropic",
      "type": "llm",
      "description": "Claude 4, Claude 3.5 Sonnet, Claude 3 Opus/Haiku",
      "docs_url": "https://console.anthropic.com/settings/keys",
      "key_prefix": "sk-ant-",
      "logo": "/logos/anthropic.png"
    }
  ]
}

Supported Providers

ProviderTypeModels / Use
openaiLLMGPT-4o, GPT-4o-mini, o1, o3
anthropicLLMClaude 4, Claude 3.5 Sonnet
googleLLMGemini 2.5, 2.0 Flash, 1.5 Pro
groqLLMLlama, Qwen, GPT-OSS, Kimi K2
mistralLLMMistral Large, Codestral
deepseekLLMDeepSeek V3, R1
cohereLLMCommand R+, Command R
xaiLLMGrok-2, Grok-3
perplexityLLMSonar Large/Small
togetherLLM100+ open models
deepgramSTTNova-3, Nova-2, Aura TTS
assemblyaiSTTUniversal-3 Pro
cartesiaTTSSonic-3, Ink Whisper STT
elevenlabsTTSTurbo v2.5, Scribe STT
sarvamSTT/TTSSaarika/Saaras STT, Bulbul v2/v3 TTS
rimeTTSMist
google_cloudSTTChirp, Studio TTS
vobizPhoneImport your own Vobiz Indian DID numbers
twilioPhoneImport your own Twilio phone numbers
plivoPhoneImport your own Plivo numbers (per-phone webhook signature uses your auth token)
exotelPhoneImport your own Exotel numbers (per-phone webhook uses IP allowlist + token)
telnyxPhoneImport your own Telnyx numbers — webhook signatures verified via your portal-exported Ed25519 public key
razorpay_key_id + razorpay_key_secretToolPer-tenant Razorpay merchant credentials for the UPI Payment voice tool
surepassToolPer-tenant Surepass API key for the Aadhaar eKYC voice tool

Phone Provider BYOK

Phone providers require two credentials (stored as a JSON string): Vobiz:
{
  "auth_id": "your_vobiz_auth_id",
  "auth_token": "your_vobiz_auth_token"
}
Twilio:
{
  "account_sid": "ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "auth_token": "your_twilio_auth_token"
}
Plivo:
{
  "auth_id": "your_plivo_auth_id",
  "auth_token": "your_plivo_auth_token"
}
The auth_token is reused at runtime to verify X-Plivo-Signature-V3 on inbound /plivo/incoming/{phone_id} and /plivo/status/{phone_id} webhooks (HMAC-SHA256 over url + nonce + body). Exotel:
{
  "api_key": "...",
  "api_token": "...",
  "account_sid": "...",
  "subdomain": "api.exotel.com"
}
Exotel doesn’t sign webhooks — instead the /exotel/incoming/{phone_id} and /exotel/status/{phone_id} endpoints fail closed unless the request comes from an IP in the EXOTEL_ALLOWED_IPS env (default: built-in allowlist of current AP-South-1 + US-West-2 callback IPs). Optionally add a per-phone token to the URL as a ?token=… query param and store it as phone_numbers.config.exotel_webhook_token. Telnyx:
{
  "api_key": "your_telnyx_api_key",
  "public_key": "<base64 Ed25519 public key from Portal → Webhooks → Public Keys>"
}
The public_key is REQUIRED if you want inbound webhook signature verification — /webhooks/telnyx/voice rejects unsigned POSTs (pre-fix they were accepted, which let any internet attacker dispatch a billable agent on call.initiated). Rotates ~annually from the Telnyx portal. Use the dedicated BYOK endpoints for phone providers:
  • POST /voice/vobiz/byok/validate — Validate Vobiz credentials and list numbers
  • POST /voice/vobiz/byok/import — Import a Vobiz number
  • POST /voice/twilio/byok/validate — Validate Twilio credentials and list numbers
  • POST /voice/twilio/byok/import — Import a Twilio number
  • POST /voice/plivo/byok/validate — Validate Plivo credentials and list numbers
  • POST /voice/plivo/byok/import — Import a Plivo number
  • POST /voice/exotel/byok/validate — Validate Exotel credentials and list numbers
  • POST /voice/exotel/byok/import — Import an Exotel number
  • POST /voice/telnyx/byok/validate — Validate Telnyx credentials and list numbers
  • POST /voice/telnyx/byok/import — Import a Telnyx number
Phone BYOK numbers have billing_status: "byok" and monthly_cost_cents: 0. You pay your phone provider directly — thinnestAI only charges for AI agent processing minutes.

Tool Provider BYOK (UPI Payment, Aadhaar eKYC)

Some voice tools are per-tenant: each agent owner brings their own merchant / KYC account so the platform never holds custody of the underlying credentials. UPI Payment — uses Razorpay. Set both keys with POST /byok/set:
curl -X POST https://api.thinnest.ai/byok/set \
  -H "Authorization: Bearer $THINNESTAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "provider": "razorpay_key_id",
    "key": "rzp_live_..."
  }'
curl -X POST https://api.thinnest.ai/byok/set \
  -H "Authorization: Bearer $THINNESTAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "provider": "razorpay_key_secret",
    "key": "..."
  }'
Aadhaar eKYC — uses Surepass:
curl -X POST https://api.thinnest.ai/byok/set \
  -H "Authorization: Bearer $THINNESTAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "provider": "surepass",
    "key": "your_surepass_api_key"
  }'
Without these keys saved, the corresponding tools refuse to load and the agent surfaces “tool not configured” instead of falling back to platform credentials.

Authorizations

Authorization
string
header
required

Bearer authentication header of the form Bearer <token>, where <token> is your auth token.

Response

200 - application/json

Successful Response