API Reference
SIP Trunk

Connect or update the workspace's SIP trunk

PUT
/v1/sip-trunk

Upserts the workspace's single trunk — there is no trunk ID in the path because a workspace has only ever had, at most, one. Refused with workspace.locked_to_platform_numbers on a workspace that already buys numbers from Sautikit.

For a registration trunk, the password is pushed to Sautikit's box and a REGISTER is attempted synchronously, inside this same request (up to ~20s). The response's status reflects the outcome immediately: active on success, failed (with last_error) if the provider rejected the credentials or was unreachable — the workspace stays unlocked either way until it actually succeeds. Omit password on a later PUT to keep the password already on file (e.g. when only changing a label); a password rotation re-signals every active BYO number on the trunk automatically.

For an ip_allowlist (signaling) trunk, this only submits the trunk for review — it lands at pending_approval and does not go live, or lock the workspace, until a person on Sautikit's operations team approves it and installs both the signalling and media IPs on the box.

Authorization

bearerAuth
AuthorizationBearer <token>

Long-lived ES256 JWT minted from the dashboard (https://app.sautikit.com/developers/api-keys). Signed by the platform keyring. Carries workspace_id and scopes claims; revoked via the platform deny-list.

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

curl -X PUT "https://example.com/v1/sip-trunk" \  -H "Content-Type: application/json" \  -d '{    "label": "Head office trunk",    "auth_mode": "registration",    "proxy": "sip.example-carrier.com",    "transport": "udp",    "username": "sautikit_100",    "password": "…"  }'
{  "auth_mode": "registration",  "label": "string",  "realm": "string",  "proxy": "string",  "transport": "udp",  "username": "string",  "auth_username": "string",  "has_password": true,  "signaling_ips": [    "string"  ],  "media_ips": [    "string"  ],  "country_code": "string",  "outbound_number_format": "string",  "outbound_codec_prefs": "string",  "outbound_media_security": "string",  "status": "pending",  "last_error": "string"}
{  "error": {    "code": "validation.bad_request",    "message": "string",    "request_id": "string",    "details": [      "string"    ]  }}
{  "error": {    "code": "validation.bad_request",    "message": "string",    "request_id": "string",    "details": [      "string"    ]  }}