Supported providers
| Provider | provider id | Setup methods |
|---|---|---|
| Twilio | twilio | api_key |
| Telnyx | telnyx | api_key, guided_telnyx |
| SignalWire | signalwire | api_key |
| Vonage | vonage | api_key |
| Manual (any SIP trunk) | manual | manual |
Endpoints
| Method | Path | Description |
|---|---|---|
GET | /v1/voip-connections | List connections |
POST | /v1/voip-connections | Create a connection |
GET | /v1/voip-connections/{connection_id} | Retrieve a connection |
PATCH | /v1/voip-connections/{connection_id} | Update credentials / name |
DELETE | /v1/voip-connections/{connection_id} | Remove a connection |
POST | /v1/voip-connections/test | Test raw credentials (no persisted connection) |
POST | /v1/voip-connections/suggest-name | Infer a display name from credentials |
GET | /v1/voip-connections/{connection_id}/available-numbers | List importable numbers |
POST | /v1/voip-connections/{connection_id}/import-numbers | Import selected numbers |
Connection object
| Field | Type | Description |
|---|---|---|
id | integer | Connection id |
name | string | Display name |
provider | string | twilio, telnyx, signalwire, vonage, manual |
setup_method | string | api_key, manual, guided_telnyx |
status | string | pending, testing, connected, error |
inferred_name | boolean | true when we auto-generated the name |
sip_config | object | Provider-specific SIP config (read-only; redacted) |
last_tested_at | timestamp | null | Last successful credential test |
numbers_imported | integer | Count of phone numbers imported through this connection |
Credentials are never returned by the API once saved.
GET responses
carry only the fields above; the full credentials object is
write-only. Use PATCH with the new credentials to rotate them.List connections
Create a connection
Creation is a two-phase flow:- Call
POST /v1/voip-connections/testwith the credentials and get back a verification evidence id if the test passes. - Call this endpoint with the same credentials plus
verification_evidence_id— the evidence proves the credentials were already validated, avoiding double-billing for the test.
Request fields
| Field | Type | Required | Description |
|---|---|---|---|
provider | string | yes | Provider id (see table above) |
name | string | no | Defaults to a provider-inferred value |
setup_method | string | no | Defaults to api_key; Telnyx supports guided_telnyx |
credentials | object | yes | Provider-specific key/secret/connection fields |
sip_config | object | no | Extra SIP config — e.g. {"domain": "..."} |
verification_evidence_id | UUID | yes | Id returned by POST /voip-connections/test |
201 Created with the Connection object.
Errors:
| Status | Condition |
|---|---|
400 | Provider mismatch (evidence generated for a different provider) |
400 | Evidence reused / stale / missing |
422 | Credentials failed re-verification |
Update a connection
| Field | Type | Description |
|---|---|---|
name | string | |
credentials | object | Rotate credentials. Requires a fresh verification_evidence_id |
sip_config | object | |
verification_evidence_id | UUID | Required if credentials is present |
Delete a connection
204 No Content. Phone numbers imported through the deleted
connection are not removed — they stay in your org with
voip_connection_id cleared.
Test credentials
Probes the provider API with the supplied credentials. On success, the response includes averification_evidence_id you can pass to
Create or Update to
create/rotate the connection without a second round trip.
Response (success)
Suggest a connection name
Asks the provider for an inferred display name. Used by the dashboard onboarding flow.Response
List available numbers
Import numbers
Moves the selected numbers into ThunderPhone as Phone number resources. Imports start instatus="provisioning" — call
POST /v1/phone-numbers/{id}/verify-voip
to complete verification (inbound routing + outbound authorization
check).
Response
Related
Phone Numbers
Assign agents to imported numbers and run verify-voip.
Outbound Calls
Outbound calling requires a VoIP-backed number.