welldun. offhook

Core resources

Connections

A connection stores one provider credential, encrypted, for your agents to use. You pay your providers directly; Offhook adds nothing on top.

Supported providers

Each connection has a provider_kind and a provider_name from this list:

KindProvidersSecret fields
sttdeepgramapi_key
ttscartesia, openaiapi_key; Cartesia also takes voice_id
llmgroq, gemini, openrouter, openaiapi_key
telephonyplivo, twilioPlivo: auth_id, auth_token, from_number
Twilio: account_sid, auth_token, from_number

Create a connection

POST /v1/connections

Body parameters

FieldTypeDescription
namerequired string A label for the connection. Must be unique within your tenant.
provider_kindrequired string One of stt, tts, llm or telephony.
provider_namerequired string A provider from the table above.
secretsrequired object The provider's secret fields from the table above. Never returned.
curl -X POST http://localhost:8000/v1/connections \
  -H "Authorization: Bearer $OFFHOOK_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "my-plivo",
    "provider_kind": "telephony",
    "provider_name": "plivo",
    "secrets": {
      "auth_id": "MA…",
      "auth_token": "…",
      "from_number": "+14155550100"
    }
  }'

Creating a connection with a name you already use returns 409.

List and retrieve

GET /v1/connections
GET /v1/connections/{id}

Both return the fields shown above. Secrets are never included in any response.

Rotate a secret

PATCH /v1/connections/{id}

Send a new secrets object, a new name, or both. The new secret is encrypted in place, and agents using the connection pick it up on their next call.

Delete a connection

DELETE /v1/connections/{id}

Returns 409 while an agent still uses the connection. Delete that agent first.