Install
$ agentstack add skill-vobiz-ai-agent-skills-vobiz-sip-trunking ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ● Network access Used
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Vobiz SIP trunking skill
Use this when the user is provisioning their own SIP infrastructure - connecting an on-prem PBX, a BYOC carrier, or restricting trunk access by IP.
Base URL: https://api.vobiz.ai/api/v1. Auth on every request: X-Auth-ID and X-Auth-Token headers. JSON bodies use Content-Type: application/json.
Resources
- Trunks - the parent SIP container.
POST /Account/{auth_id}/trunks,GET,PUT,DELETE. Creating a trunk auto-generates a SIP domain{trunk_id}.sip.vobiz.ai. - Credentials - username/password for SIP digest auth.
POST /Account/{auth_id}/credentials, list atGET /Account/{auth_id}/trunks/credentials. - IP ACL - IP/CIDR allowlist for inbound SIP traffic.
POST /Account/{auth_id}/ip-acl, list atGET /Account/{auth_id}/trunks/ip-acl. - Origination URIs - outbound SIP routing destinations with priority/weight failover.
POST /Account/{auth_id}/origination-uris, list atGET /Account/{auth_id}/trunks/origination-uris. - Number assignment - route a DID to a trunk.
POST /Account/{auth_id}/numbers/{phone_number}/assignwith body{ "trunk_group_id": "" }.
The four auth/routing layers
A trunk can combine four independent controls. Know which one the user needs before reaching for an endpoint:
- Credentials (SIP digest) - username/password. Use for dynamic IPs, softphones, remote workers, AI agents. Works behind NAT.
- IP ACL - allowlist a source IP or CIDR. Use for static-IP PBXs, SBCs, and carrier interconnects. No per-client config, faster (no auth exchange), but public-IP only.
- Origination URI - outbound termination targets.
priority(lower wins, tried first) selects the route;weightsplits traffic across same-priority URIs (weight 20 gets 2x the traffic of weight 10). - Webhook - informational only.
CallInitiated(withAllowed/Reason) andHangup(withBillsec/MOS) notifications. Fail-open and non-blocking; a webhook response cannot accept or reject a call.
Credentials and IP ACL can be combined for defense-in-depth (require both a whitelisted IP AND valid digest auth).
Trunk lifecycle
POST /Account/{auth_id}/trunkswith{ name, trunk_type, max_concurrent_calls }(the three required fields) → returnstrunk_idand autotrunk_domain.- (optional)
POST /credentialsand/orPOST /ip-aclfor inbound auth. - (optional)
POST /origination-urisfor outbound BYOC routing (setpriority/weight). POST /Account/{auth_id}/numbers/{number}/assignto route a DID inbound.PUT /Account/{auth_id}/trunks/{trunk_id}to update (name,max_concurrent_calls,enabled).DELETE /Account/{auth_id}/trunks/{trunk_id}to remove (or setenabled: falseto keep config).
End-to-end BYOC recipe
AUTH=MA_XXXXXXXX
BASE=https://api.vobiz.ai/api/v1/Account/$AUTH
H=(-H "X-Auth-ID: $AUTH" -H "X-Auth-Token: $TOKEN" -H "Content-Type: application/json")
# 1. Create the trunk (only name, trunk_type, max_concurrent_calls are required)
TRUNK=$(curl -s -X POST "$BASE/trunks" "${H[@]}" \
-d '{"name":"Acme BYOC","trunk_type":"OUTBOUND","max_concurrent_calls":10}' \
| jq -r .trunk_id)
# trunk_domain is now $TRUNK.sip.vobiz.ai
# 2a. Inbound auth via IP ACL (name + ip_address required; CIDR allowed)
curl -s -X POST "$BASE/ip-acl" "${H[@]}" \
-d '{"name":"Prod SBC","ip_address":"10.20.30.0/24"}'
# 2b. ...or via digest credentials (username + password required)
curl -s -X POST "$BASE/credentials" "${H[@]}" \
-d '{"username":"acme_sip_user_01","password":"S3cure-Pass-!2025"}'
# 3. Outbound routing: primary + failover (name + sip_uri + priority required)
curl -s -X POST "$BASE/origination-uris" "${H[@]}" \
-d '{"name":"Primary SBC","sip_uri":"sip:sbc1.example.com:5060","priority":1}'
curl -s -X POST "$BASE/origination-uris" "${H[@]}" \
-d '{"name":"Backup SBC","sip_uri":"sip:sbc2.example.com:5060","priority":2}'
# 4. Route an inbound DID to the trunk (URL-encode + as %2B)
curl -s -X POST "$BASE/numbers/%2B919876543210/assign" "${H[@]}" \
-d "{\"trunk_group_id\":\"$TRUNK\"}"
Webhook signature verification
Trunk webhooks send X-Vobiz-Event and X-Vobiz-Request-ID headers; verify any signature header against the raw body with HMAC-SHA256 before trusting the payload. Compare in constant time.
import hmac, hashlib
def verify(raw_body: bytes, signature_header: str, secret: str) -> bool:
expected = hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, signature_header or "")
> The exact signature header name and signing secret are not defined in openapi.yaml. Confirm both against the live API / Console before relying on this; treat the snippet as the verification pattern, not a verified header contract.
Pitfalls
- Path casing: Trunk, credential, IP ACL, origination-URI, and number-to-trunk endpoints all use uppercase
Account(/api/v1/Account/...). The lowercase/api/v1/account/...form is used only by the DID sub-account assignment endpoints - do not copy that casing onto trunk routes. - List paths differ from create paths. You create at
/Account/{auth_id}/credentials(and/ip-acl,/origination-uris) but list at/Account/{auth_id}/trunks/credentials(and/trunks/ip-acl,/trunks/origination-uris). Thetrunks/segment appears only on the list routes. - Create vs response field names diverge. Origination URI create body uses
sip_uri; the response returns it asuri. IP ACL and credential create bodies requirename/usernamethat are not echoed identically in every response. Read the response schema, not the request. - Required create fields are minimal. Trunk:
name+trunk_type(INBOUND/OUTBOUND) +max_concurrent_calls. IP ACL:name+ip_address. Credential:username+password. Origination URI:name+sip_uri+priority. Anything else (transport, secure, weight) is optional/defaulted or Console-managed. - IP ACL accepts CIDR, not just single IPs (e.g.
10.20.30.0/24). IPv6 is unsupported. The field isip_address(notcidr_ip). The API rejects RFC 5737 documentation prefixes (203.0.113.0/24); use real or RFC 1918 (10.0.0.0/24) ranges. - Write-only secrets. Credential
passwordis never returned (shows as `). Save it at creation;usernameis immutable - rotate by creating a new credential and deleting the old one. Update only changespassword`. - Disable vs delete. Prefer
enabled: false(trunk viaPUT, credential/IP ACL/URI viaPUT) overDELETEto preserve config.DELETEon a trunk cascades to its credentials, IP ACLs, and origination URIs and can return 409 if calls are active. - Number assignment body field is
trunk_group_id(the trunk's UUID), nottrunk_id. URL-encode the phone number with%2Bfor+or you get a 404. cps_limitvsconcurrent_calls_limit: CPS caps new call attempts per second (flood protection); concurrent caps simultaneous live calls (capacity/cost). Defaults seen in responses:cps_limit: 2,concurrent_calls_limit: 10.
When to search docs
- "How do I attach a number to a trunk?" →
trunks/assign-number - "What IP ranges / CIDR work?" →
trunks/ip-acl/create-ip-acl - "Outbound routing with priority + fallback / load balancing" →
trunks/origination-uri/create-origination-uri - "Credentials vs IP ACL - which auth?" →
trunks/ip-acl(comparison table) - "Trunk webhook events / payloads / signature" →
trunks/webhook
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: vobiz-ai
- Source: vobiz-ai/Agent-Skills
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.