Overview
Bland supports inbound and outbound SIP, allowing customers to direct calls from their SIP provider to Bland for handling - or to direct Bland to make contact with their SIP provider.
This guide provides:
- SIP connection details
- Requirements and security settings
- Instructions for attaching, verifying, updating, and detaching SIP routes via Bland’s API
- Schema definitions and usage patterns
Entitlement Requirement
All /sip
endpoints are protected by an entitlement check.
Your organization must have the SIP
entitlement enabled to use SIP features. If not, all requests to the /sip
routes will return an error.
Contact support to have SIP enabled for your Enterprise organization.
SIP Connection Details
SIP Signaling Endpoint FQDN(s):
- You must use TCP over TLS for all SIP signaling.
- You must use Secure Media / SRTP for all media streams.
- Bland does not accept UDP for SIP signaling.
- You must whitelist all IP addresses listed below in your firewall to allow inbound and outbound SIP traffic.
- If required, we provide which IP addresses are used for incoming SIP messages, and which are used for outgoing SIP messages.
US1 (Oregon):
us1.sip.bland.ai:5061;transport=tls
--
EU1 (Ireland):
eu1.sip.bland.ai:5061;transport=tls
--
ASIA1 (Sydney):
asia1.sip.bland.ai:5061;transport=tls
Static IP Addresses of the SIP Signalling Server(s):
You must whitelist all IP addresses for your region. Failure to do so can lead to connectivity issues.
US1 (Oregon):
35.80.235.26
54.189.4.67
100.20.173.20
35.161.106.231
35.81.41.38
35.82.125.138
35.82.184.232
35.84.252.131
44.224.206.111
44.224.67.132
44.225.32.9
44.235.59.237
44.240.150.132
44.252.152.176
52.27.109.95
52.38.0.204
52.41.242.206
52.42.27.92
54.172.60.0
54.172.60.1
54.172.60.2
54.172.60.3
54.244.51.0
54.244.51.1
54.244.51.2
54.244.51.3
EU1 (Ireland):
52.17.69.204
52.210.181.150
54.171.127.192
54.171.127.193
54.171.127.194
54.171.127.195
35.156.191.128
35.156.191.129
35.156.191.130
35.156.191.131
ASIA1 (Sydney):
13.237.152.149
3.104.178.155
54.252.254.64
54.252.254.65
54.252.254.66
54.252.254.67
Static IP Addresses of the Media Stream Server(s):
IP Addresses listed above for SIP Signalling are used equivocally for Media Stream Servers. These connections will be opened between ports 16384
and 32768
.
Requirements and Security Settings
Supported Codecs:
- Currently Supported: PCMU, PCMA, Opus
Security Requirements:
- SIP Signaling: TLS 1.2 or higher
- RTP Media: SRTP using AES_CM_128_HMAC_SHA1_80
From
Header FQDN: Bland will enforce validity of the FQDN provided for in your From
header. If this should be the same as the signaling endpoint, or a non-valid FQDN, we may reject your request(s) in the future.
Other Configurations:
-
RTCP: Uses port RTP + 1
-
DTMF: RFC 2833 (Out-of-band via RTP payload)
-
Transport: TCP over TLS
-
Methods: INVITE, ACK, BYE, CANCEL, OPTIONS, REFER
-
Number Format: +E.164 or E.164 (both supported for origination and termination)
-
SIP Registration: Not required (Bland determines routing based on predefined configurations configurable below.)
API Reference
Attach SIP Endpoint
POST /sip/attach
Attach a SIP configuration to a phone number.
The phone number to associate with the SIP configuration. Must be in E.164 format.
An array of directions for the SIP routing. Valid values: inbound
, outbound
. If outbound, you must also provide a sip_endpoint
.
curl -X POST https://api.bland.ai/v1/sip/attach \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"phone_number": "+14150000000",
"directions": [
{
"type": "inbound",
"headers": {
"direction": "inbound", // Must be set to the parent objects direction.
"headers": [
// Passthrough Off. We take the incoming SIP header's value for "X-Cool-Guy" and assign it to the pathway variable's value for "First_Name".
{ "type": "custom", "key": "X-Cool-Guy", "value": "First_Name" },
// Passthrough On. We inject this header key value pair directly into the pathway variable state.
{ "type": "custom", "key": "Account_Type", "value": "VIP", "passthrough": true },
// Inbound UUI Example. If an inbound UUI header with purpose=bland arrives,
// its decoded value will be stored in the pathway variable "CustomerId".
// For example, a wire header like:
// SipHeader_user-to-user: 3432;encoding=hex;purpose=bland;content=id
// will decode hex(3432) -> "42", then assign { "CustomerId": "42" }.
{ "type": "uui", "target": "CustomerId", "purpose": "bland", "encoding": "hex", "content": "id" }
]
}
},
{
"type": "outbound",
"sip_endpoint": "sip:your.provider.com", // FQDN Only. Port must be defined here, or in options. Prefixed with `sip:`
"options": {
"port": 1234, // Will overwrite any port defined in your sip_endpoint.
"transport": "tls", // Other available: tls, tcp, udp
"secure_media": true, // True, False
"sip_username": "bland", // Optional
"sip_password": "password" // Optional
},
"headers": {
"direction": "outbound", // Must be set to the parent objects direction.
"headers": [
// Passthrough off. We bind a specific header's **value** to a pathway variable provided for (if available). So the value of "X-Favorite-Color" is assigned
// as the value for "Favorite_Color".
{
"type": "custom", // "custom" or "uui" supported.
"key": "Favorite_Color",
"value": "X-Favorite-Color"
},
// Passthrough on. We directly pass the key and value as-is.
{
"type": "custom",
"key": "x-custom-id",
"value": "12345",
"passthrough": true
},
// Outbound UUI Example. If the pathway variable "CustomerKV" has a value,
// it will be hex-encoded and sent in a UUI header with purpose=bland and content=customerid_1234.
// For example, { "CustomerKV": "id=12345" } becomes:
// SipHeader_user-to-user: 69643d3132333435;encoding=hex;purpose=bland;content=customerid_1234
{
"type": "uui",
"target": "CustomerKV", // Variable to look up in pathway state.
"purpose": "bland", // Outbound purpose field in the UUI header.
"content": "customerid_1234", // Used as the "content" parameter in the UUI header.
"encoding": "hex" // Supported: "hex", "ascii"
}
]
}
}
],
"service": "sip"
}'
Verify SIP Number (Outbound)
PUT /sip/verify
To prove that you own the number, you’ll need to perform a one-time verification.
Be ready! Once you make this request, you’ll receive a phone call to the specified phone number, from +14157234000
- which will require you to input the code returned from the below request into your keypad.
The phone number to verify SIP calling from. It must be attached to your organization first before attempting to verify.
curl -X PUT https://api.bland.ai/v1/sip/verify \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"phone_number": "+14150000000",
}'
Update SIP Direction
POST /sip/update
Update a phone number’s SIP routing direction.
The phone number for which to update the direction.
The updated direction object. Use type: outbound
and provide sip_endpoint
, or type: inbound
.
curl -X POST https://api.bland.ai/v1/sip/update \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"phone_number": "+14150000000",
"updates": {
"type": "outbound",
"sip_endpoint": "sip:your.provider.com", // Only available for outbound SIP Types.
"options": { // Only available for outbound SIP Types.
"port": 1234, // Will overwrite any port defined in your sip_endpoint.
"transport": "tls", // Other available: tls, tcp, udp
"secure_media": true, // True, False
"sip_username": "bland", // Optional
"sip_password": "password" // Optional
}
}
}'
Detach SIP Endpoint
POST /sip/detach
Remove SIP configuration from a number.
The phone number to detach SIP routing from.
Direction(s) to remove. Either inbound
or outbound
.
curl -X POST https://api.bland.ai/v1/sip/detach \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"phone_number": "+14150000000",
"directions": [
{ "type": "inbound" }
],
"service": "sip"
}'
Making your first SIP Call (Outbound)
To use a number that was registered for SIP, in an outbound direction - all that is required is to specify this as your from number.
Note: You’ll need to ensure that you’ve verified your number ahead of time, as instructed above.
curl -X POST https://api.bland.ai/v1/calls \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"task": "Say hi to the nice person!",
"from": "+12341234123", // The number above registered as a SIP Outbound number.
"phone_number": "<the callee's phone number>"
}'
Get SIP Config
GET /sip?phone_number={phone_number}
Returns current SIP configuration (if any) for a given phone_number
.
The phone number of the number to fetch SIP configuration for.
curl -X GET 'https://api.bland.ai/v1/sip?phone_number=+1231231234' \
-H "Authorization: Bearer <token>"
Example Response
{
"data": {
"inbound": { // May be null if not present.
number: string;
id: string;
org_id: string;
direction: string;
sip_endpoint: string | null;
created_at: Date;
updated_at: Date;
headers: Object | null;
options: Object | null; // As above
inbound_id: bigint | null;
},
"outbound": { // May be null if not present.
number: string;
id: string;
org_id: string;
direction: string;
sip_endpoint: string | null;
created_at: Date;
updated_at: Date;
headers: Object | null;
options: Object | null; // As above
inbound_id: bigint | null;
}
},
"errors": null
}
Notes
- Phone numbers can be attached independently for inbound and outbound routing via the API.
- All requests must conform to the expected schema; invalid payloads will be rejected with a 400 response.
- Each API response includes a success status and, if applicable, an error message to aid debugging.