---
title: "Create an outbound SIP trunk (REGISTER or static peering)"
method: POST
path: "/sip/trunks"
tags: ["SIP Trunks"]
---

# Create an outbound SIP trunk (REGISTER or static peering)

`POST /sip/trunks`

Creates a typed SIP trunk. For `type: "sip_register"`, VoiceBlender begins REGISTERing to the supplied registrar URI with digest auth, refreshes before expiry, and routes inbound INVITEs that arrive on that peer's socket plus outbound INVITEs whose `from` matches the AOR through the trunk. Set `sip_register.outbound_proxy` to send both the REGISTER and those INVITEs via a next-hop proxy instead of straight at the registrar; the Request-URI and digest authentication still target `registrar_uri`. It defaults to `SIP_OUTBOUND_PROXY` and is resolved at creation time, so the trunk snapshot reports the hop actually in effect. For `type: "ip_ip"`, returns 501 (reserved, not yet implemented).

## Request body

- CreateTrunkRequest
  - `type` 'sip_register' | 'ip_ip', required — Trunk type discriminator. Only `sip_register` is implemented today; `ip_ip` is reserved and returns 501.
  - `app_id` string — Application identifier carried through to every event emitted by this trunk.
  - `sip_register` SIPRegisterTrunkSpec
    - `registrar_uri` string, required — Upstream registrar SIP URI (e.g. "sip:pbx.example.com:5060" or "sips:pbx.example.com:5061"). Transport is taken from the URI: a "sips:" scheme or a ";transport=tls" parameter selects TLS, ";transport=tcp" selects TCP, otherwise UDP. Note that "transport" is a URI parameter (";"), not a URI header ("?") — RFC 3261 section 19.1.
    - `outbound_proxy` string — Next-hop SIP proxy for this trunk's REGISTER and for outbound INVITEs placed from its AOR, attached as a loose `Route` header (the Request-URI is left unchanged, and digest auth still targets `registrar_uri`). E.g. "sip:edge.example.com:5060;transport=tcp". Defaults to `SIP_OUTBOUND_PROXY`; when neither is set, requests go straight to `registrar_uri`.
    - `aor` string, required — Address-of-record this trunk REGISTERs (e.g. "sip:alice@pbx.example.com"). Becomes the From URI on outbound REGISTER, and the From / P-Asserted-Identity host on outbound INVITEs placed `from` this AOR.
    - `username` string — Digest auth username. Defaults to the AOR user-part when empty.
    - `password` string, required — Digest auth password. Required. Never returned in any response.
    - `contact_user` string — Override the user-part of the Contact header sent in REGISTER. Defaults to the AOR user-part.
    - `expires_seconds` integer — Requested registration lifetime in seconds. Clamped to [SIP_OUTBOUND_REGISTRATION_MIN_EXPIRES_SECONDS, SIP_OUTBOUND_REGISTRATION_MAX_EXPIRES_SECONDS]. Default: SIP_OUTBOUND_REGISTRATION_DEFAULT_EXPIRES_SECONDS (3600).
    - `tls_insecure_skip_verify` boolean — Accept this trunk's next-hop certificate without verifying it, for a `sips:` / `;transport=tls` registrar or outbound proxy whose certificate is self-signed, privately signed, or carries no SAN (`x509: certificate relies on legacy Common Name field`). Scoped to that peer's hostname — every other TLS peer is still verified in full, unlike the server-wide `SIP_TLS_INSECURE_SKIP_VERIFY`. Ignored (with a logged warning) when the next hop is not TLS, or when it is named by IP literal: such a dial sends no SNI and cannot be told apart from any other, so use `SIP_TLS_CA_FILE` or `SIP_TLS_INSECURE_SKIP_VERIFY` there. Prefer `SIP_TLS_CA_FILE` when the peer's CA can simply be trusted.
  - `ip_ip` IPIPTrunkSpec
    - `peer_uri` string — Static peer SIP URI for IP-IP peering. Reserved; not yet implemented.

## Response `202`

Trunk accepted; REGISTER runs asynchronously

- CreateTrunkResponse
  - `id` string, required
  - `type` string, required
  - `status` string, required

## Other responses

- `400` — Invalid JSON, missing required field, or unknown type
- `501` — Trunk type reserved but not yet implemented (e.g. ip_ip)

---

[API](https://skmtc.net/voiceblender/apis/voiceblender-api.md) · [All operations](https://skmtc.net/voiceblender/apis/voiceblender-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/voiceblender/voiceblender-api/revisions/126565efa2b4/schema)
