Download OpenAPI specification:Download
DialStack — Business Voice for Vertical SaaS
DialStack supports three authentication methods:
For server-side integrations, use your secret API key (starts with sk_live_) in the Authorization header.
Example: Authorization: Bearer sk_live_YOUR_SECRET_KEY
For embedded voice components in your frontend, create a session using the Account Session API and use the client_secret JWT token in the Authorization header.
Example: Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Sessions are account-scoped and expire after 1 hour.
For client-side applications where end users interact directly (softphones, call history,
voicemail), authenticate users via POST /v1/user_sessions and use the returned user token.
Example: Authorization: Bearer eyJhbGciOiJFZERTQSIs...
User tokens are scoped to a single user within an account and grant access to the WebRTC signalling channel, call history, voicemails, and presence. See the Authentication guide for setup details.
Most API endpoints require an account context. This is specified differently depending on the authentication method:
Include the DialStack-Account header with the account ID:
DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41
The account is automatically derived from the JWT claims. No header is needed.
All list API methods support URL-based cursor pagination. Results are returned in reverse chronological order.
limit - Number of objects to return (1-100, default 10)page - Opaque cursor token (only used when following pagination URLs)List responses include:
object - Always "list"url - The endpoint URLnext_page_url - URL to fetch the next page (null if no more pages)previous_page_url - URL to fetch the previous page (null if on first page)data - Array of objectsTo paginate, simply follow the URLs provided in next_page_url and previous_page_url.
Do not construct pagination URLs manually - the cursor format is opaque and may change.
Some endpoints support the expand[] parameter to include related resources inline.
Without expansion, the related data is omitted from the response.
For example, to include extensions when listing users:
GET /v1/users?expand[]=extensions
The expanded field appears as a nested list object:
{
"id": "user_01h2xcejqtf2nbrexx3vqjhp42",
"name": "Dr. Alice Smith",
"extensions": {
"object": "list",
"data": [
{
"number": "105",
"target": "user_01h2xcejqtf2nbrexx3vqjhp42",
"status": "active",
"created_at": "2025-10-18T10:00:00Z",
"updated_at": "2025-10-18T10:00:00Z"
}
]
}
}
Expandable fields are noted in endpoint descriptions.
For building programmable voice applications with webhooks and real-time audio streaming, see the Voice Apps Guide.
A routing target is a resource that can receive calls. The following resource types are valid routing targets:
All resource IDs in the API are opaque strings of at most 255 characters. Do not parse or make assumptions about their format — treat them as identifiers to store and pass back to the API.
Account (customer organization) management.
These endpoints operate at the platform level and don't require the DialStack-Account header.
Creates a new account (customer organization) within the platform. Accounts represent individual customer organizations (e.g., Jones Chiropractic) that use the vSaaS platform.
string <email> Email address for the account | |
| name | string Company or organization name |
| phone | string Phone number in E.164 format |
| primary_contact_name | string Name of the primary contact |
object (AccountConfig) Account-level configuration settings |
| id required | string Unique identifier |
string or null <email> Email address for the account (optional) | |
| name | string or null Company or organization name |
| phone | string or null Phone number in E.164 format |
| primary_contact_name | string or null Name of the primary contact |
required | object (AccountConfig) Account-level configuration settings |
| default_outbound_did_id | string or null ID of the phone number to use as the default outbound caller ID. When null, the first outbound-enabled number is used. |
| hold_music_clip_id | string or null ID of an audio clip on the account played in a loop to held callers (regular SIP hold, parking, queue wait). When null, callers hear the platform default hold music. |
| provisioning_base_url | string or null The full provisioning base URL for this account. Phones use this URL prefix for auto-provisioning configuration files. |
Address (object) or null The account's billing/business address, geocoded via address validation. Null if not set. | |
| created_at required | string <date-time> Timestamp when it was created |
| updated_at | string <date-time> Timestamp when it was last updated |
{- "email": "contact@example.com"
}{- "id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
- "email": "contact@example.com",
- "config": { },
- "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T10:00:00Z"
}List all accounts for the authenticated platform. Results are returned in reverse chronological order (newest first).
| limit | integer [ 1 .. 100 ] Default: 10 Example: limit=10 Number of objects to return. Defaults to 10. Maximum is 100. |
| object required | string (ListObject) Value: "list" String representing the object's type. Always "list" for list responses. |
| url required | string (ListUrl) The URL for accessing this list. |
| next_page_url required | string or null (NextPageUrl) URL to fetch the next page of results. If |
| previous_page_url required | string or null (PreviousPageUrl) URL to fetch the previous page of results. If |
required | Array of objects (Account) |
curl -X GET \ 'https://api.dialstack.ai/v1/accounts?limit=10' \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN'
{- "object": "list",
- "url": "/v1/accounts",
- "next_page_url": null,
- "previous_page_url": null,
- "data": [
- {
- "id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
- "email": "contact@example.com",
- "config": { },
- "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T10:00:00Z"
}
]
}Retrieve a specific account by ID.
| account_id required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier |
| id required | string Unique identifier |
string or null <email> Email address for the account (optional) | |
| name | string or null Company or organization name |
| phone | string or null Phone number in E.164 format |
| primary_contact_name | string or null Name of the primary contact |
required | object (AccountConfig) Account-level configuration settings |
| default_outbound_did_id | string or null ID of the phone number to use as the default outbound caller ID. When null, the first outbound-enabled number is used. |
| hold_music_clip_id | string or null ID of an audio clip on the account played in a loop to held callers (regular SIP hold, parking, queue wait). When null, callers hear the platform default hold music. |
| provisioning_base_url | string or null The full provisioning base URL for this account. Phones use this URL prefix for auto-provisioning configuration files. |
Address (object) or null The account's billing/business address, geocoded via address validation. Null if not set. | |
| created_at required | string <date-time> Timestamp when it was created |
| updated_at | string <date-time> Timestamp when it was last updated |
curl -X GET \ https://api.dialstack.ai/v1/accounts/acct_01h2xcejqtf2nbrexx3vqjhp41 \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN'
{- "id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
- "email": "contact@example.com",
- "name": "Acme Corp",
- "phone": "+12125550100",
- "primary_contact_name": "Jane Doe",
- "config": {
- "region": "US",
- "extension_length": 4,
- "transcription_enabled": true,
- "recording_enabled": true,
- "timezone": "America/New_York",
- "max_phone_numbers": 25,
- "parking_timeout_seconds": 300,
- "e911_notification": {
- "emails": [
- "security@example.com",
- "frontdesk@example.com"
]
}
}, - "default_outbound_did_id": "string",
- "hold_music_clip_id": "string",
- "billing_address": {
- "place_id": "string",
- "address_number": "string",
- "street": "string",
- "unit": "string",
- "city": "New York",
- "state": "NY",
- "postal_code": "10001",
- "country": "US",
- "latitude": 0.1,
- "longitude": 0.1,
- "formatted_address": "123 Main St, New York, NY 10001, US"
}, - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}Update account details.
| account_id required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier |
string <email> Email address for the account | |
| name | string Company or organization name |
| phone | string Phone number in E.164 format |
| primary_contact_name | string Name of the primary contact |
object (AccountConfig) Account-level configuration settings | |
| default_outbound_did_id | string ID of the phone number to use as the default outbound caller ID. Send null to clear. |
| hold_music_clip_id | string or null ID of the audio clip played as hold music. Send null to clear (uses platform default). |
AddressInput (object) or null Billing/business address. When present, the address is geocoded via address validation. Send null to clear. Omit to leave unchanged. |
| id required | string Unique identifier |
string or null <email> Email address for the account (optional) | |
| name | string or null Company or organization name |
| phone | string or null Phone number in E.164 format |
| primary_contact_name | string or null Name of the primary contact |
required | object (AccountConfig) Account-level configuration settings |
| default_outbound_did_id | string or null ID of the phone number to use as the default outbound caller ID. When null, the first outbound-enabled number is used. |
| hold_music_clip_id | string or null ID of an audio clip on the account played in a loop to held callers (regular SIP hold, parking, queue wait). When null, callers hear the platform default hold music. |
| provisioning_base_url | string or null The full provisioning base URL for this account. Phones use this URL prefix for auto-provisioning configuration files. |
Address (object) or null The account's billing/business address, geocoded via address validation. Null if not set. | |
| created_at required | string <date-time> Timestamp when it was created |
| updated_at | string <date-time> Timestamp when it was last updated |
{- "email": "contact@example.com",
- "name": "Acme Corp",
- "phone": "+12125550100",
- "primary_contact_name": "Jane Doe",
- "config": {
- "region": "US",
- "extension_length": 4,
- "transcription_enabled": true,
- "recording_enabled": true,
- "timezone": "America/New_York",
- "max_phone_numbers": 25,
- "parking_timeout_seconds": 300,
- "e911_notification": {
- "emails": [
- "security@example.com",
- "frontdesk@example.com"
]
}
}, - "default_outbound_did_id": "string",
- "hold_music_clip_id": "string",
- "billing_address": {
- "address_number": "1600",
- "street": "Pennsylvania Avenue NW",
- "unit": "Suite 200",
- "city": "New York",
- "state": "NY",
- "postal_code": "10001",
- "country": "US"
}
}{- "id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
- "email": "contact@example.com",
- "name": "Acme Corp",
- "phone": "+12125550100",
- "primary_contact_name": "Jane Doe",
- "config": {
- "region": "US",
- "extension_length": 4,
- "transcription_enabled": true,
- "recording_enabled": true,
- "timezone": "America/New_York",
- "max_phone_numbers": 25,
- "parking_timeout_seconds": 300,
- "e911_notification": {
- "emails": [
- "security@example.com",
- "frontdesk@example.com"
]
}
}, - "default_outbound_did_id": "string",
- "hold_music_clip_id": "string",
- "billing_address": {
- "place_id": "string",
- "address_number": "string",
- "street": "string",
- "unit": "string",
- "city": "New York",
- "state": "NY",
- "postal_code": "10001",
- "country": "US",
- "latitude": 0.1,
- "longitude": 0.1,
- "formatted_address": "123 Main St, New York, NY 10001, US"
}, - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}Delete an account and all associated users, endpoints, and call logs. This operation is irreversible. Active calls will be terminated.
| account_id required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier |
curl -X DELETE \ https://api.dialstack.ai/v1/accounts/acct_01h2xcejqtf2nbrexx3vqjhp41 \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN'
{- "error": "Invalid request body",
- "code": "validation_error",
- "details": { }
}Account session management for embedded components. Sessions provide scoped authentication for frontend components. Requires a platform API key — session tokens cannot be used to create new sessions.
Creates a session with account-scoped access. Sessions expire after 1 hour. The session token is scoped to the specified components — it can only access API endpoints required by those components.
The account and components are specified in the request body.
| account required | string Account identifier |
required | object Components to enable for this session. At least one component must have |
| account_id required | string Account identifier for the created session |
| client_secret required | string (ClientSecret) JWT token for account-scoped authentication |
| expires_at required | string <date-time> (SessionExpiresAt) When the session expires |
{- "account": "acct_01h2xcejqtf2nbrexx3vqjhp41",
- "components": {
- "call_logs": {
- "enabled": true
}, - "voicemails": {
- "enabled": true
}
}
}{- "account_id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
- "client_secret": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhY2NvdW50X2lkIjoiYWNjdF8wMWgyeGNlanF0ZjJuYnJleHgzdnFqaHA0MSIsImp0aSI6IjAxaDJ4Y2VqcXRmMm5icmV4eDN2cWpocDQ2IiwiZXhwIjoxNzI2NzU3MjAwfQ.1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2",
- "expires_at": "2025-11-13T15:00:00Z"
}Mints a short-lived JWT scoped to a single DialStack user. The returned
client_secret is used by the WebRTC client SDK to authenticate to the
signalling WebSocket and /v1/me/* REST routes.
Sessions default to a 1-hour lifetime and may not exceed 24 hours. The user must already exist under an account owned by the calling platform.
| user required | string <= 255 characters Identifier of the DialStack user this token will authenticate as.
The user must already be provisioned via |
| ttl_seconds | integer [ 0 .. 86400 ] Requested token lifetime in seconds. Defaults to 3600 (1 hour) when omitted or zero. Values above 86400 (24 hours) are rejected. |
| user required | string Identifier of the user the session token authenticates as |
| account required | string Identifier of the account that owns the user |
| client_secret required | string (ClientSecret) JWT token for account-scoped authentication |
| expires_at required | string <date-time> (SessionExpiresAt) When the session expires |
{- "user": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "ttl_seconds": 3600
}{- "user": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "account": "acct_01h2xcejqtf2nbrexx3vqjhp41",
- "client_secret": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhY2NvdW50X2lkIjoiYWNjdF8wMWgyeGNlanF0ZjJuYnJleHgzdnFqaHA0MSIsImp0aSI6IjAxaDJ4Y2VqcXRmMm5icmV4eDN2cWpocDQ2IiwiZXhwIjoxNzI2NzU3MjAwfQ.1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t1u2",
- "expires_at": "2025-11-13T15:00:00Z"
}User (people) management.
Requires account context via DialStack-Account header or session token.
Create a new user within the account. Users represent people who have phone service. Each user can have multiple endpoints (devices).
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| name | string or null (EntityName) [ 1 .. 255 ] characters Display name |
string <email> Email address (optional) |
| id required | string Unique identifier |
| name | string or null [ 1 .. 255 ] characters Display name |
string or null <email> Email address (optional) | |
| account_role | string or null Enum: "account_admin" null The user's role within the account (null for regular users) |
| outbound_caller_id_did_id | string or null ID of the phone number to use as this user's outbound caller ID, overriding the account default. When null, the account default is used. |
| voicemail_pin | string or null Numeric PIN for remote voicemail access (4-10 digits). When null, no PIN is set. |
object (UserConfig) User-level configuration settings | |
object List of extensions assigned to this user. Only included when | |
| created_at | string <date-time> Timestamp when it was created |
| updated_at | string <date-time> Timestamp when it was last updated |
{- "name": "Dr. Alice Smith",
- "email": "alice@spineline.dev"
}{- "id": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "name": "Dr. Alice Smith",
- "email": "alice@spineline.dev",
- "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T10:00:00Z"
}List all users for the account. Results are returned in reverse chronological order (newest first).
Expandable fields: extensions — includes the list of extensions assigned to each user.
| limit | integer [ 1 .. 100 ] Default: 10 Example: limit=10 Number of objects to return. Defaults to 10. Maximum is 100. |
| search | string Filter users by name or email (case-insensitive partial match) |
| expand[] | Array of strings Items Value: "extensions" Related resources to include inline. Supported values: |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| object required | string (ListObject) Value: "list" String representing the object's type. Always "list" for list responses. |
| url required | string (ListUrl) The URL for accessing this list. |
| next_page_url required | string or null (NextPageUrl) URL to fetch the next page of results. If |
| previous_page_url required | string or null (PreviousPageUrl) URL to fetch the previous page of results. If |
required | Array of objects (User) |
curl -X GET \ 'https://api.dialstack.ai/v1/users?limit=10&search=SOME_STRING_VALUE&expand%5B%5D=SOME_ARRAY_VALUE' \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "object": "list",
- "url": "/v1/users",
- "next_page_url": null,
- "previous_page_url": null,
- "data": [
- {
- "id": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "name": "Dr. Alice Smith",
- "email": "alice@spineline.dev",
- "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T10:00:00Z"
}
]
}Retrieve a specific user by ID.
Expandable fields: extensions — includes the list of extensions assigned to this user.
| user_id required | string Example: user_01h2xcejqtf2nbrexx3vqjhp42 User identifier |
| expand[] | Array of strings Items Value: "extensions" Related resources to include inline. Supported values: |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| id required | string Unique identifier |
| name | string or null [ 1 .. 255 ] characters Display name |
string or null <email> Email address (optional) | |
| account_role | string or null Enum: "account_admin" null The user's role within the account (null for regular users) |
| outbound_caller_id_did_id | string or null ID of the phone number to use as this user's outbound caller ID, overriding the account default. When null, the account default is used. |
| voicemail_pin | string or null Numeric PIN for remote voicemail access (4-10 digits). When null, no PIN is set. |
object (UserConfig) User-level configuration settings | |
object List of extensions assigned to this user. Only included when | |
| created_at | string <date-time> Timestamp when it was created |
| updated_at | string <date-time> Timestamp when it was last updated |
curl -X GET \ 'https://api.dialstack.ai/v1/users/user_01h2xcejqtf2nbrexx3vqjhp42?expand%5B%5D=SOME_ARRAY_VALUE' \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "id": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "name": "Dr. Alice Smith",
- "email": "alice@spineline.dev",
- "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T10:00:00Z"
}Update user details (name, email, etc.)
| user_id required | string Example: user_01h2xcejqtf2nbrexx3vqjhp42 User identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| name | string or null (EntityName) [ 1 .. 255 ] characters Display name |
string <email> Email address (optional) | |
| outbound_caller_id_did_id | string ID of the phone number to use as this user's outbound caller ID, overriding the account default. Send null to clear. |
| voicemail_pin | string or null Numeric PIN for remote voicemail access (4-10 digits). Send null to clear. |
object User configuration. Only provided fields are updated; omitted fields are left unchanged. |
| id required | string Unique identifier |
| name | string or null [ 1 .. 255 ] characters Display name |
string or null <email> Email address (optional) | |
| account_role | string or null Enum: "account_admin" null The user's role within the account (null for regular users) |
| outbound_caller_id_did_id | string or null ID of the phone number to use as this user's outbound caller ID, overriding the account default. When null, the account default is used. |
| voicemail_pin | string or null Numeric PIN for remote voicemail access (4-10 digits). When null, no PIN is set. |
object (UserConfig) User-level configuration settings | |
object List of extensions assigned to this user. Only included when | |
| created_at | string <date-time> Timestamp when it was created |
| updated_at | string <date-time> Timestamp when it was last updated |
{- "name": "Spineline",
- "email": "bob@spineline.dev",
- "outbound_caller_id_did_id": "string",
- "voicemail_pin": "1234",
- "config": {
- "voicemail_notifications": {
- "enabled": false,
- "attach_audio": true,
- "include_summary": true,
- "include_transcript": true,
- "delete_after_email": false
}, - "find_me_follow_me": {
- "steps": [
- {
- "targets": [
- {
- "type": "external",
- "number": "+15551234567",
- "id": "string"
}
], - "timeout": 1
}
], - "fallback": "voicemail",
- "fallback_target_id": "string"
}
}
}{- "id": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "name": "Dr. Alice Smith",
- "email": "alice@spineline.dev",
- "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T10:00:00Z"
}Delete a user and all associated endpoints. This operation is irreversible. Active calls will be terminated.
| user_id required | string Example: user_01h2xcejqtf2nbrexx3vqjhp42 User identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
curl -X DELETE \ https://api.dialstack.ai/v1/users/user_01h2xcejqtf2nbrexx3vqjhp42 \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "error": "Invalid request body",
- "code": "validation_error",
- "details": { }
}User-scoped REST endpoints for softphone and user-facing applications. Returns data scoped to the authenticated user (own call history, voicemails, presence, device registration). Requires a user token.
Returns the authenticated user's profile, including their assigned extensions and registered devices.
| id | string User identifier |
| name | string User's display name |
string <email> User's email address | |
| account_id | string Account the user belongs to |
Array of objects User's assigned extension dial codes | |
| created_at | string <date-time> |
| updated_at | string <date-time> |
curl -X GET \ https://api.dialstack.ai/v1/me \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN'
{- "id": "string",
- "name": "string",
- "email": "user@example.com",
- "account_id": "string",
- "extensions": [
- {
- "number": "string",
- "status": "active"
}
], - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Returns call records where the authenticated user was a participant. Results are returned in reverse chronological order (newest first).
| limit | integer [ 1 .. 100 ] Default: 10 Example: limit=10 Number of objects to return. Defaults to 10. Maximum is 100. |
| direction | string Enum: "inbound" "outbound" Filter by call direction |
| from_date | string <date-time> Return calls on or after this date (ISO 8601) |
| to_date | string <date-time> Return calls before this date (ISO 8601) |
| object required | string (ListObject) Value: "list" String representing the object's type. Always "list" for list responses. |
| url required | string (ListUrl) The URL for accessing this list. |
| next_page_url required | string or null (NextPageUrl) URL to fetch the next page of results. If |
| previous_page_url required | string or null (PreviousPageUrl) URL to fetch the previous page of results. If |
required | Array of objects (CallLog) |
curl -X GET \ 'https://api.dialstack.ai/v1/me/calls?limit=10&direction=SOME_STRING_VALUE&from_date=SOME_STRING_VALUE&to_date=SOME_STRING_VALUE' \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN'
{- "object": "list",
- "url": "/v1/accounts",
- "next_page_url": "/v1/accounts?page=eyJzdGFydGluZ19hZnRlciI6ImFjY3RfMDFoMnhjZWpxdGYybmJyZXh4M3ZxamhwNDEiLCJsaW1pdCI6MTB9",
- "previous_page_url": "/v1/accounts?page=eyJlbmRpbmdfYmVmb3JlIjoiYWNjdF8wMWgyeGNlanF0ZjJuYnJleHgzdnFqaHA0MSIsImxpbWl0IjoxMH0",
- "data": [
- {
- "id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
- "user_id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
- "endpoint_id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
- "did_id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
- "direction": "inbound",
- "from_number": "+14155551234",
- "from_label": "Front Desk",
- "to_number": "+14155559876",
- "to_label": "Sales Queue",
- "started_at": "2025-10-18T14:30:00Z",
- "answered_at": "2025-10-18T14:30:05Z",
- "ended_at": "2025-10-18T14:35:30Z",
- "duration_seconds": 325,
- "status": "completed",
- "summary": "Customer called to reschedule appointment from Thursday to Friday due to work conflict.",
- "quality_metrics": [
- {
- "leg": "endpoint",
- "endpoint_id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
- "jitter_ms": 5.2,
- "jitter_min_ms": 1,
- "jitter_max_ms": 15.5,
- "jitter_stddev_ms": 2.3,
- "packet_loss_pct": 0.5,
- "rtt_ms": 45,
- "rtt_min_ms": 30,
- "rtt_max_ms": 80,
- "rtt_stddev_ms": 12.5,
- "rx_count": 10000,
- "tx_count": 10050,
- "mos": 4.2
}
]
}
]
}Returns the authenticated user's current presence status.
| user_id | string User identifier |
| status required | string Enum: "available" "on_call" "dnd" "away" "offline" Current presence status:
|
| status_text | string or null Optional custom status message |
| updated_at | string <date-time> When the presence status last changed |
curl -X GET \ https://api.dialstack.ai/v1/me/presence \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN'
{- "user_id": "string",
- "status": "available",
- "status_text": "string",
- "updated_at": "2019-08-24T14:15:22Z"
}Updates the authenticated user's presence status. Only available, dnd,
and away can be set manually. The on_call and offline statuses are
managed automatically by the system.
| status required | string Enum: "available" "dnd" "away" Desired presence status (cannot set |
| status_text | string or null Optional custom status message (max 100 characters) |
| user_id | string User identifier |
| status required | string Enum: "available" "on_call" "dnd" "away" "offline" Current presence status:
|
| status_text | string or null Optional custom status message |
| updated_at | string <date-time> When the presence status last changed |
{- "status": "available",
- "status_text": "string"
}{- "user_id": "string",
- "status": "available",
- "status_text": "string",
- "updated_at": "2019-08-24T14:15:22Z"
}Returns the authenticated user's registered emergency address for E911. Returns 404 if no address has been registered.
| street required | string Street address |
| street2 | string or null Suite, floor, apartment, or room number |
| city required | string |
| state required | string Two-letter state/province code |
| zip required | string |
| country required | string Two-letter country code (ISO 3166-1 alpha-2) |
| validated required | boolean Whether the address has been validated against the MSAG |
| updated_at | string <date-time> |
curl -X GET \ https://api.dialstack.ai/v1/me/emergency-address \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN'
{- "street": "123 Main St",
- "street2": "Suite 400",
- "city": "San Francisco",
- "state": "CA",
- "zip": "94105",
- "country": "US",
- "validated": true,
- "updated_at": "2019-08-24T14:15:22Z"
}Registers or updates the user's emergency address for E911. The address is validated against the MSAG (Master Street Address Guide) before saving. If validation fails, the response includes suggestions.
An emergency address is required before the user can place calls. Attempting to dial without a validated address returns an error on the signalling channel.
| street required | string Street address |
| street2 | string or null Suite, floor, apartment, or room number |
| city required | string |
| state required | string Two-letter state/province code |
| zip required | string |
| country required | string Two-letter country code (ISO 3166-1 alpha-2) |
| street required | string Street address |
| street2 | string or null Suite, floor, apartment, or room number |
| city required | string |
| state required | string Two-letter state/province code |
| zip required | string |
| country required | string Two-letter country code (ISO 3166-1 alpha-2) |
| validated required | boolean Whether the address has been validated against the MSAG |
| updated_at | string <date-time> |
{- "street": "string",
- "street2": "string",
- "city": "string",
- "state": "string",
- "zip": "string",
- "country": "string"
}{- "street": "123 Main St",
- "street2": "Suite 400",
- "city": "San Francisco",
- "state": "CA",
- "zip": "94105",
- "country": "US",
- "validated": true,
- "updated_at": "2019-08-24T14:15:22Z"
}Extension (dial code) management.
Extensions map short dial codes to routing targets.
Requires account context via DialStack-Account header or session token.
Creates a new extension mapping a dial code to a routing target.
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| number required | string [ 1 .. 32 ] characters The extension number (dial code) |
| target required | string <= 255 characters ID of the routing target |
| number required | string [ 1 .. 32 ] characters The extension number (dial code) |
| target required | string <= 255 characters ID of the routing target |
| status required | string Enum: "active" "inactive" Extension status |
| created_at required | string <date-time> When the extension was created |
| updated_at required | string <date-time> When the extension was last modified |
{- "number": "105",
- "target": "user_01h2xcejqtf2nbrexx3vqjhp42"
}{- "number": "105",
- "target": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "status": "active",
- "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T10:00:00Z"
}List all extensions for the account. Optionally filter by target to find extensions pointing to a specific routing target. Results are returned in reverse chronological order (newest first).
| target | string <= 255 characters Example: target=user_01h2xcejqtf2nbrexx3vqjhp42 Filter extensions by routing target ID |
| limit | integer [ 1 .. 100 ] Default: 10 Example: limit=10 Number of objects to return. Defaults to 10. Maximum is 100. |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| object required | string (ListObject) Value: "list" String representing the object's type. Always "list" for list responses. |
| url required | string (ListUrl) The URL for accessing this list. |
| next_page_url required | string or null (NextPageUrl) URL to fetch the next page of results. If |
| previous_page_url required | string or null (PreviousPageUrl) URL to fetch the previous page of results. If |
required | Array of objects (Extension) |
curl -X GET \ 'https://api.dialstack.ai/v1/extensions?target=user_01h2xcejqtf2nbrexx3vqjhp42&limit=10' \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "object": "list",
- "url": "/v1/extensions",
- "next_page_url": null,
- "previous_page_url": null,
- "data": [
- {
- "number": "105",
- "target": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "status": "active",
- "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T10:00:00Z"
}
]
}Retrieve an extension by its number (dial code).
| number required | string Example: 105 Extension number (dial code) |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| number required | string [ 1 .. 32 ] characters The extension number (dial code) |
| target required | string <= 255 characters ID of the routing target |
| status required | string Enum: "active" "inactive" Extension status |
| created_at required | string <date-time> When the extension was created |
| updated_at required | string <date-time> When the extension was last modified |
curl -X GET \ https://api.dialstack.ai/v1/extensions/105 \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "number": "105",
- "target": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "status": "active",
- "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T10:00:00Z"
}Update an existing extension. Only the target can be changed; to change the extension number, delete and recreate the extension.
| number required | string Example: 105 Extension number (dial code) |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| target | string <= 255 characters ID of the new routing target |
| number required | string [ 1 .. 32 ] characters The extension number (dial code) |
| target required | string <= 255 characters ID of the routing target |
| status required | string Enum: "active" "inactive" Extension status |
| created_at required | string <date-time> When the extension was created |
| updated_at required | string <date-time> When the extension was last modified |
{- "target": "user_01h2xcejqtf2nbrexx3vqjhp43"
}{- "number": "105",
- "target": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "status": "active",
- "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T10:00:00Z"
}Delete an extension by its number (dial code).
| number required | string Example: 105 Extension number (dial code) |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
curl -X DELETE \ https://api.dialstack.ai/v1/extensions/105 \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "error": "Invalid request body",
- "code": "validation_error",
- "details": { }
}Call initiation, history, and real-time monitoring.
Use POST /v1/calls to initiate click-to-call, GET /v1/calls to retrieve call history,
and POST /v1/calls/{call_id}/listeners to stream real-time audio from active calls.
Requires account context via DialStack-Account header or session token.
Initiates an outbound call to a destination by first establishing a connection with the specified user.
Call Flow:
The dial_string can be:
+15551234567)911)This is an asynchronous operation. A 202 Accepted response indicates the call
request was queued successfully, not that the call has completed or even started.
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| user_id required | string The user whose endpoints will ring first. When the user answers, the destination is dialed. |
| dial_string required | string The destination to dial after the user answers. Can be a phone number (E.164 or local format), an extension, or an emergency number. |
{- "user_id": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "dial_string": "+15551234567"
}{- "error": "Invalid request body",
- "code": "validation_error",
- "details": { }
}List call history for an account with optional filtering. Results are returned in reverse chronological order (newest first).
| limit | integer [ 1 .. 100 ] Default: 10 Example: limit=10 Number of objects to return. Defaults to 10. Maximum is 100. |
| user_id | string Filter by specific user |
| endpoint_id | string Filter by specific endpoint/device |
| direction | string Enum: "inbound" "outbound" "internal" Filter by call direction |
| from_number | string <= 20 characters Filter by caller's phone number (exact match) |
| to_number | string <= 20 characters Filter by recipient's phone number (exact match) |
| status | string Enum: "completed" "no-answer" "busy" "failed" "voicemail" Filter by call status |
| from_date | string <date-time> Return calls started on or after this date (ISO 8601) |
| to_date | string <date-time> Return calls started before this date (ISO 8601) |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| object required | string (ListObject) Value: "list" String representing the object's type. Always "list" for list responses. |
| url required | string (ListUrl) The URL for accessing this list. |
| next_page_url required | string or null (NextPageUrl) URL to fetch the next page of results. If |
| previous_page_url required | string or null (PreviousPageUrl) URL to fetch the previous page of results. If |
required | Array of objects (CallLog) |
curl -X GET \ 'https://api.dialstack.ai/v1/calls?limit=10&user_id=SOME_STRING_VALUE&endpoint_id=SOME_STRING_VALUE&direction=SOME_STRING_VALUE&from_number=SOME_STRING_VALUE&to_number=SOME_STRING_VALUE&status=SOME_STRING_VALUE&from_date=SOME_STRING_VALUE&to_date=SOME_STRING_VALUE' \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "object": "list",
- "url": "/v1/calls",
- "next_page_url": null,
- "previous_page_url": null,
- "data": [
- {
- "id": "call_01h2xcejqtf2nbrexx3vqjhp45",
- "user_id": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "endpoint_id": "ep_01h2xcejqtf2nbrexx3vqjhp43",
- "did_id": "did_01h2xcejqtf2nbrexx3vqjhp46",
- "direction": "inbound",
- "from_number": "+14155551234",
- "to_number": "+14155559876",
- "started_at": "2025-10-18T14:30:00Z",
- "answered_at": "2025-10-18T14:30:05Z",
- "ended_at": "2025-10-18T14:35:30Z",
- "duration_seconds": 325,
- "status": "completed"
}
]
}Retrieve a specific call log by ID.
| call_id required | string Example: call_01h2xcejqtf2nbrexx3vqjhp45 Call log identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| id required | string Unique identifier |
required | EntityId (string) or null The user associated with this call |
required | EntityId (string) or null The endpoint (device) that handled this call |
required | EntityId (string) or null The DID (phone number) used for this call |
| direction required | string Enum: "inbound" "outbound" "internal" Call direction (inbound from PSTN, outbound to PSTN, or internal extension-to-extension) |
| from_number required | string [ 0 .. 20 ] characters Caller's phone number or originating extension. May be empty when the originating identity could not be determined. |
| from_label required | string or null Display label for the caller, resolved from the extension's target name (user, dial plan, voice app, or ring group). Null if the number does not match an extension. |
| to_number required | string [ 0 .. 20 ] characters Destination as dialed — an E.164 phone number for PSTN destinations or an internal extension number for routes that terminate inside the account. May be empty when the destination could not be determined. |
| to_label required | string or null Display label for the recipient, resolved from the extension's target name (user, dial plan, voice app, or ring group). Null if the number does not match an extension. |
| started_at required | string <date-time> When the call was initiated |
| answered_at required | string or null <date-time> When the call was answered. Null for unanswered calls. |
| ended_at required | string or null <date-time> When the call ended. Null if the call is still in flight. |
| duration_seconds required | integer or null >= 0 Call duration in seconds (from answer to hangup). Null for unanswered calls. |
| status required | string Enum: "completed" "no-answer" "busy" "failed" "voicemail" Final call status |
| summary required | string or null AI-generated summary of the call. Null if call wasn't recorded or transcript not yet processed. |
| recording_url required | string or null <uri> Signed URL to download the call recording audio. Null if the call was not recorded. The URL expires after 10 minutes. |
required | Array of objects (QualityMetricLeg) RTP quality metrics per call leg. Each call may have multiple legs (e.g., PSTN + endpoint for inbound calls). Empty array for unanswered calls. |
curl -X GET \ https://api.dialstack.ai/v1/calls/call_01h2xcejqtf2nbrexx3vqjhp45 \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "id": "call_01h2xcejqtf2nbrexx3vqjhp45",
- "user_id": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "endpoint_id": "ep_01h2xcejqtf2nbrexx3vqjhp43",
- "did_id": "did_01h2xcejqtf2nbrexx3vqjhp46",
- "direction": "inbound",
- "from_number": "+14155551234",
- "to_number": "+14155559876",
- "started_at": "2025-10-18T14:30:00Z",
- "answered_at": "2025-10-18T14:30:05Z",
- "ended_at": "2025-10-18T14:35:30Z",
- "duration_seconds": 325,
- "status": "completed"
}Send actions to control an active call. This is the central API for all call control operations such as attaching audio streams or transferring calls.
Actions are processed sequentially. Each action may block processing or allow it to continue based on its outcome (see action descriptions for details).
Replacing actions: If the call is currently executing actions and you send a new update, the previous action list is completely replaced. Processing of the current action is interrupted immediately, and processing resumes with the first action in the new list.
Example - Attach AI voice and fallback to human:
{
"actions": [
{"type": "attach", "url": "wss://ai.example.com/voice"},
{"type": "transfer", "extension": "100"}
]
}
In this example, the AI handles the call via WebSocket. When the WebSocket disconnects, the call transfers to extension 100.
| call_id required | string Example: call_01h2xcejqtf2nbrexx3vqjhp45 Call log identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
required | Array of objects (CallAction) non-empty List of actions to execute on the call. Actions are processed sequentially. Each action may block processing or allow it to continue based on its outcome. Supported Actions: attachConnect bidirectional audio streaming to a WebSocket URL.
Processing behavior: This action blocks processing while the WebSocket connection is active. When the WebSocket disconnects (either side closes), processing resumes with the next action. See WebSocket API for the message protocol. transferBlind transfer the call to an extension number.
Processing behavior: If the transfer target answers or the caller hangs up, processing stops. If the transfer cannot be completed (no answer, busy, rejected), processing continues with the next action. | ||||||
Array (non-empty)
| |||||||
{- "actions": [
- {
- "type": "attach",
- "url": "wss://ai.platform.example.com/voice"
}
]
}{- "error": "Invalid request body",
- "code": "validation_error",
- "details": { }
}Retrieve the transcript for a specific call.
Transcription Status:
pending: The call has been recorded but transcription has not startedprocessing: Transcription is currently in progresscompleted: Transcription is complete and text is availablefailed: Transcription failed (text will be null)Note: Returns 404 if the call exists but has no recording, or if the call does not exist. Not all calls have recordings (depends on account configuration).
| call_id required | string Example: call_01h2xcejqtf2nbrexx3vqjhp45 Call log identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| call_id required | string Unique identifier |
| status required | string Enum: "pending" "processing" "completed" "failed" Current status of the transcription:
|
| text | string or null Full text transcript. Null if transcription is not completed. |
curl -X GET \ https://api.dialstack.ai/v1/calls/call_01h2xcejqtf2nbrexx3vqjhp45/transcript \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "call_id": "call_01h2xcejqtf2nbrexx3vqjhp45",
- "status": "completed",
- "text": "Hello, this is Dr. Smith calling..."
}Retrieve the recording for a specific call. Returns metadata and a signed download URL.
The download URL is valid for 10 minutes. After expiration, request a new URL by calling this endpoint again.
Note: Returns 404 if the call exists but has no recording, or if the call does not exist. Not all calls have recordings (depends on account configuration).
| call_id required | string Example: call_01h2xcejqtf2nbrexx3vqjhp45 Call log identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| call_id required | string Unique identifier |
| duration_seconds | integer or null >= 0 Duration of the recording in seconds. Null if not available. |
| file_size_bytes | integer or null >= 0 Size of the recording file in bytes. Null if not available. |
| download_url required | string <uri> Signed URL to download the recording audio file. Expires after 10 minutes. |
| expires_at required | string <date-time> When the download URL expires |
curl -X GET \ https://api.dialstack.ai/v1/calls/call_01h2xcejqtf2nbrexx3vqjhp45/recording \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "call_id": "call_01h2xcejqtf2nbrexx3vqjhp45",
- "duration_seconds": 185,
- "file_size_bytes": 2960000,
- "expires_at": "2026-03-05T15:40:00Z"
}Start streaming real-time audio from an active call to a WebSocket URL.
DialStack opens an outbound WebSocket connection to the specified URL and streams audio unidirectionally (DialStack to your server). The call is not affected — both parties remain unaware of the listener.
Use the channel parameter to select which audio to receive:
caller — audio from the party that initiated the callcallee — audio from the party that received the callboth — both channels, delivered as separate tagged messagesThe listener automatically stops when the call ends. You can also stop it
explicitly with DELETE /v1/calls/{call_id}/listeners/{listener_id}.
Returns 409 Conflict if the call is not in a state that supports listeners
(e.g., still ringing or already ended). Retry after the call is answered.
See the WebSocket API for the listener message protocol.
| call_id required | string Example: call_01h2xcejqtf2nbrexx3vqjhp45 Call log identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| url required | string <uri> Secure WebSocket URL where DialStack will stream audio. Must use
the |
| channel | string Default: "both" Enum: "caller" "callee" "both" Which audio channel(s) to stream:
|
| id required | string Unique identifier |
| call_id required | string The active call being listened to |
| url required | string <uri> WebSocket URL where audio is being streamed |
| channel required | string Enum: "caller" "callee" "both" Which audio channel(s) to stream:
|
| created_at required | string <date-time> Timestamp when it was created |
{- "url": "wss://your-server.example.com/audio",
- "channel": "both"
}{- "id": "lstn_01h2xcejqtf2nbrexx3vqjhp50",
- "call_id": "call_01h2xcejqtf2nbrexx3vqjhp45",
- "url": "wss://your-server.example.com/audio",
- "channel": "both",
- "created_at": "2026-04-02T14:30:00Z"
}List the listeners currently attached to a call. Listeners exist only for the duration of the call — once the call ends they no longer exist, and this endpoint returns an empty list. Call IDs that don't belong to the caller's account return 404.
| call_id required | string Example: call_01h2xcejqtf2nbrexx3vqjhp45 Call log identifier |
| limit | integer [ 1 .. 100 ] Default: 10 Example: limit=10 Number of objects to return. Defaults to 10. Maximum is 100. |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| object required | string (ListObject) Value: "list" String representing the object's type. Always "list" for list responses. |
| url required | string (ListUrl) The URL for accessing this list. |
| next_page_url required | string or null (NextPageUrl) URL to fetch the next page of results. If |
| previous_page_url required | string or null (PreviousPageUrl) URL to fetch the previous page of results. If |
required | Array of objects (Listener) |
curl -X GET \ 'https://api.dialstack.ai/v1/calls/call_01h2xcejqtf2nbrexx3vqjhp45/listeners?limit=10' \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "object": "list",
- "url": "/v1/accounts",
- "next_page_url": "/v1/accounts?page=eyJzdGFydGluZ19hZnRlciI6ImFjY3RfMDFoMnhjZWpxdGYybmJyZXh4M3ZxamhwNDEiLCJsaW1pdCI6MTB9",
- "previous_page_url": "/v1/accounts?page=eyJlbmRpbmdfYmVmb3JlIjoiYWNjdF8wMWgyeGNlanF0ZjJuYnJleHgzdnFqaHA0MSIsImxpbWl0IjoxMH0",
- "data": [
- {
- "id": "lstn_01h2xcejqtf2nbrexx3vqjhp50",
- "call_id": "call_01h2xcejqtf2nbrexx3vqjhp45",
- "url": "wss://your-server.example.com/audio",
- "channel": "both",
- "created_at": "2025-10-17T14:30:00Z"
}
]
}Retrieve a listener. Listeners exist only for the duration of the call; once the call ends the listener no longer exists and this endpoint returns 404.
| call_id required | string Example: call_01h2xcejqtf2nbrexx3vqjhp45 Call log identifier |
| listener_id required | string Example: lstn_01h2xcejqtf2nbrexx3vqjhp50 Listener identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| id required | string Unique identifier |
| call_id required | string The active call being listened to |
| url required | string <uri> WebSocket URL where audio is being streamed |
| channel required | string Enum: "caller" "callee" "both" Which audio channel(s) to stream:
|
| created_at required | string <date-time> Timestamp when it was created |
curl -X GET \ https://api.dialstack.ai/v1/calls/call_01h2xcejqtf2nbrexx3vqjhp45/listeners/lstn_01h2xcejqtf2nbrexx3vqjhp50 \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "id": "lstn_01h2xcejqtf2nbrexx3vqjhp50",
- "call_id": "call_01h2xcejqtf2nbrexx3vqjhp45",
- "url": "wss://your-server.example.com/audio",
- "channel": "both",
- "created_at": "2025-10-17T14:30:00Z"
}Stop streaming audio and close the WebSocket connection for this listener. The call is not affected. Listeners exist only for the duration of the call, so once the call has ended this endpoint returns 404.
| call_id required | string Example: call_01h2xcejqtf2nbrexx3vqjhp45 Call log identifier |
| listener_id required | string Example: lstn_01h2xcejqtf2nbrexx3vqjhp50 Listener identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
curl -X DELETE \ https://api.dialstack.ai/v1/calls/call_01h2xcejqtf2nbrexx3vqjhp45/listeners/lstn_01h2xcejqtf2nbrexx3vqjhp50 \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "error": "Invalid request body",
- "code": "validation_error",
- "details": { }
}Voicemail message management.
Requires account context via DialStack-Account header or session token.
List voicemails visible to the authenticated account, across both per-user mailboxes and shared voicemail boxes.
Results are returned in reverse chronological order (newest first).
Use owner (a user ID or shared voicemail box ID) to scope results
to a single owner.
| limit | integer [ 1 .. 100 ] Default: 10 Example: limit=10 Number of objects to return. Defaults to 10. Maximum is 100. |
| owner | string Filter to voicemails belonging to a specific owner (a user ID or a shared voicemail box ID). |
| is_read | boolean Filter by read status. |
| from_date | string <date-time> Return voicemails created on or after this date (ISO 8601). |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| object required | string (ListObject) Value: "list" String representing the object's type. Always "list" for list responses. |
| url required | string (ListUrl) The URL for accessing this list. |
| next_page_url required | string or null (NextPageUrl) URL to fetch the next page of results. If |
| previous_page_url required | string or null (PreviousPageUrl) URL to fetch the previous page of results. If |
required | Array of objects (Voicemail) |
curl -X GET \ 'https://api.dialstack.ai/v1/voicemails?limit=10&owner=SOME_STRING_VALUE&is_read=SOME_BOOLEAN_VALUE&from_date=SOME_STRING_VALUE' \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "object": "list",
- "url": "/v1/accounts",
- "next_page_url": "/v1/accounts?page=eyJzdGFydGluZ19hZnRlciI6ImFjY3RfMDFoMnhjZWpxdGYybmJyZXh4M3ZxamhwNDEiLCJsaW1pdCI6MTB9",
- "previous_page_url": "/v1/accounts?page=eyJlbmRpbmdfYmVmb3JlIjoiYWNjdF8wMWgyeGNlanF0ZjJuYnJleHgzdnFqaHA0MSIsImxpbWl0IjoxMH0",
- "data": [
- {
- "id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
- "owner": "string",
- "from_number": "+14155551234",
- "from_name": "John Smith",
- "duration_seconds": 42,
- "format": "mp3",
- "is_read": false,
- "created_at": "2025-10-17T14:30:00Z",
- "read_at": "2025-10-18T15:00:00Z",
- "summary": "John Smith called to reschedule his Thursday appointment to Friday."
}
]
}Retrieve a specific voicemail by ID, including the audio_url for
playback. Voicemail IDs are globally unique, so no owner context is
required in the URL.
| voicemail_id required | string Example: vm_01h2xcejqtf2nbrexx3vqjhp44 Voicemail identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| id required | string Unique identifier |
| owner required | string Unique identifier |
| from_number required | string <= 20 characters Caller's phone number |
| from_name | string or null <= 255 characters Caller's name (if available from caller ID) |
| duration_seconds required | integer >= 0 Length of the voicemail recording in seconds |
| format required | string <= 10 characters Audio format |
| audio_url required | string <uri> URL for downloading the audio recording |
| is_read required | boolean Whether the voicemail has been listened to |
| created_at required | string <date-time> Timestamp when it was created |
| read_at | string or null <date-time> When the voicemail was marked as read |
| summary | string or null AI-generated summary of the voicemail content. Null if transcription not yet processed. |
curl -X GET \ https://api.dialstack.ai/v1/voicemails/vm_01h2xcejqtf2nbrexx3vqjhp44 \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
- "owner": "string",
- "from_number": "+14155551234",
- "from_name": "John Smith",
- "duration_seconds": 42,
- "format": "mp3",
- "is_read": false,
- "created_at": "2025-10-17T14:30:00Z",
- "read_at": "2025-10-18T15:00:00Z",
- "summary": "John Smith called to reschedule his Thursday appointment to Friday."
}Update voicemail status (mark as read/unread).
| voicemail_id required | string Example: vm_01h2xcejqtf2nbrexx3vqjhp44 Voicemail identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| is_read | boolean Mark voicemail as read or unread |
| id required | string Unique identifier |
| owner required | string Unique identifier |
| from_number required | string <= 20 characters Caller's phone number |
| from_name | string or null <= 255 characters Caller's name (if available from caller ID) |
| duration_seconds required | integer >= 0 Length of the voicemail recording in seconds |
| format required | string <= 10 characters Audio format |
| audio_url required | string <uri> URL for downloading the audio recording |
| is_read required | boolean Whether the voicemail has been listened to |
| created_at required | string <date-time> Timestamp when it was created |
| read_at | string or null <date-time> When the voicemail was marked as read |
| summary | string or null AI-generated summary of the voicemail content. Null if transcription not yet processed. |
{- "is_read": true
}{- "id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
- "owner": "string",
- "from_number": "+14155551234",
- "from_name": "John Smith",
- "duration_seconds": 42,
- "format": "mp3",
- "is_read": false,
- "created_at": "2025-10-17T14:30:00Z",
- "read_at": "2025-10-18T15:00:00Z",
- "summary": "John Smith called to reschedule his Thursday appointment to Friday."
}Permanently delete a voicemail and its audio recording. This operation is irreversible.
| voicemail_id required | string Example: vm_01h2xcejqtf2nbrexx3vqjhp44 Voicemail identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
curl -X DELETE \ https://api.dialstack.ai/v1/voicemails/vm_01h2xcejqtf2nbrexx3vqjhp44 \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "error": "Invalid request body",
- "code": "validation_error",
- "details": { }
}Retrieve the transcript for a specific voicemail.
Transcription Status:
pending: The voicemail has been saved but transcription has not startedprocessing: Transcription is currently in progresscompleted: Transcription is complete and text is availablefailed: Transcription failed (text will be null)Voicemails are automatically transcribed after being saved.
| voicemail_id required | string Example: vm_01h2xcejqtf2nbrexx3vqjhp44 Voicemail identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| voicemail_id required | string Unique identifier |
| status required | string Enum: "pending" "processing" "completed" "failed" Current status of the transcription:
|
| text | string or null Full text transcript. Null if transcription is not completed. |
curl -X GET \ https://api.dialstack.ai/v1/voicemails/vm_01h2xcejqtf2nbrexx3vqjhp44/transcript \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "voicemail_id": "vm_01h2xcejqtf2nbrexx3vqjhp45",
- "status": "completed",
- "text": "Hi, this is John Smith calling about my appointment tomorrow..."
}Uploads (or replaces) a custom greeting for a user mailbox or a shared voicemail box.
Accepts a multipart form with a file field containing the audio.
The audio is validated and transcoded server-side to the storage
format (mono µ-law 8 kHz WAV).
Re-uploading for the same (owner, type) overwrites the existing
greeting.
| owner required | string ID of the mailbox owner — either a user or a shared voicemail box. |
| type required | string Value: "unavailable" The greeting variant to operate on. Today only |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| file required | string <binary> Audio file to upload. |
| owner required | string Unique identifier |
| greeting_type required | string Value: "unavailable" The greeting variant. Today only |
| format required | string Value: "wav" Audio format of the stored greeting. |
| duration_seconds required | number <float> >= 0 Length of the greeting audio in seconds. |
| size_bytes required | integer <int64> >= 0 Size of the stored greeting audio in bytes (post-transcode). |
| url required | string <uri> Short-lived signed URL (5 minutes) for downloading the greeting audio. |
| updated_at required | string <date-time> When the greeting was last uploaded or replaced. |
curl -X POST \ https://api.dialstack.ai/v1/voicemail_greetings/%7Bowner%7D/%7Btype%7D \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41' \ -H 'content-type: multipart/form-data' \ --form file=string
{- "owner": "string",
- "greeting_type": "unavailable",
- "format": "wav",
- "duration_seconds": 12.4,
- "size_bytes": 98560,
- "updated_at": "2019-08-24T14:15:22Z"
}Returns the current custom greeting for a mailbox owner, including a short-lived signed URL for audio playback.
| owner required | string ID of the mailbox owner — either a user or a shared voicemail box. |
| type required | string Value: "unavailable" The greeting variant to operate on. Today only |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| owner required | string Unique identifier |
| greeting_type required | string Value: "unavailable" The greeting variant. Today only |
| format required | string Value: "wav" Audio format of the stored greeting. |
| duration_seconds required | number <float> >= 0 Length of the greeting audio in seconds. |
| size_bytes required | integer <int64> >= 0 Size of the stored greeting audio in bytes (post-transcode). |
| url required | string <uri> Short-lived signed URL (5 minutes) for downloading the greeting audio. |
| updated_at required | string <date-time> When the greeting was last uploaded or replaced. |
curl -X GET \ https://api.dialstack.ai/v1/voicemail_greetings/%7Bowner%7D/%7Btype%7D \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "owner": "string",
- "greeting_type": "unavailable",
- "format": "wav",
- "duration_seconds": 12.4,
- "size_bytes": 98560,
- "updated_at": "2019-08-24T14:15:22Z"
}Removes the custom greeting for a mailbox owner. The mailbox reverts to the system-default prompts.
This operation is idempotent — returns 204 No Content whether or
not a greeting was previously set.
| owner required | string ID of the mailbox owner — either a user or a shared voicemail box. |
| type required | string Value: "unavailable" The greeting variant to operate on. Today only |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
curl -X DELETE \ https://api.dialstack.ai/v1/voicemail_greetings/%7Bowner%7D/%7Btype%7D \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "error": "Invalid request body",
- "code": "validation_error",
- "details": { }
}Real-time event streaming via Server-Sent Events (SSE).
Use this endpoint to receive live notifications about calls, voicemails, and other account activity.
Requires account context via DialStack-Account header or session token.
Establish a Server-Sent Events (SSE) connection to receive real-time notifications about account activity such as incoming calls.
Connection Behavior:
connected event is sent immediatelyEvent Format:
Events follow the SSE specification with event: and data: fields:
event: call.incoming
data: {"event":"call.incoming","account_id":"acct_...","from_number":"+14155551234","to_number":"+14155559876"}
Available Event Types:
Sent immediately when the SSE connection is established.
{"message": "Connected to event stream"}
Sent when an incoming call arrives for the account.
| Field | Type | Description |
|---|---|---|
event |
string | Always "call.incoming" |
account_id |
string | Account receiving the call |
call_id |
string | Call detail record identifier |
from_number |
string | Caller's phone number (E.164) |
from_name |
string | null | Caller's name from caller ID |
to_number |
string | Called phone number (E.164) |
from_user_id |
string | null | User who initiated the call, when known |
to_user_id |
string | null | User the call is destined for, when known |
Sent when an outbound call starts dialing.
| Field | Type | Description |
|---|---|---|
event |
string | Always "call.initiated" |
account_id |
string | Account initiating the call |
call_id |
string | Call detail record identifier |
from_number |
string | Outbound caller number (E.164) |
to_number |
string | Destination number (E.164) |
user_id |
string | User who initiated the call (alias for from_user_id) |
from_user_id |
string | null | User who initiated the call, when known |
to_user_id |
string | null | User the call is destined for, when known |
Sent once per (call, user) when the platform is about to ring a user's phone(s). Fires regardless of how the call was routed to the user — direct extension, ring group, ring-all-users, Find-Me/Follow-Me (including forwarding to an external number), dial plan Dial User node, voice app transfer, or a parked-call ring-back. The event indicates logical "we're ringing this user", not a SIP 180 Ringing signal.
A user with multiple endpoints (desk phone + mobile app) produces one event, not one per device.
No stop event is emitted — consumers that dismiss UI on ring stop (e.g. screen pop) should rely on
call.answered or call.end.
| Field | Type | Description |
|---|---|---|
event |
string | Always "call.ringing" |
account_id |
string | Account owning the user being rung |
call_id |
string | Call detail record identifier |
user_id |
string | User whose phone(s) are being rung |
from_number |
string | Caller's phone number (E.164) |
from_name |
string | null | Caller's name from caller ID |
to_number |
string | Called phone number (E.164) |
ringing_at |
string | ISO 8601 timestamp |
Sent when a call is answered.
| Field | Type | Description |
|---|---|---|
event |
string | Always "call.answered" |
account_id |
string | Account where the call was answered |
call_id |
string | Call detail record identifier |
from_number |
string | Caller's phone number (E.164) |
to_number |
string | Called phone number (E.164) |
direction |
string | "inbound" or "outbound" |
answered_at |
string | ISO 8601 timestamp |
from_user_id |
string | null | User who initiated the call, when known |
to_user_id |
string | null | User who answered, when applicable |
Sent when a call ends.
| Field | Type | Description |
|---|---|---|
event |
string | Always "call.end" |
account_id |
string | Account where the call ended |
call_id |
string | Call detail record identifier |
from_number |
string | Caller's phone number (E.164) |
to_number |
string | Called phone number (E.164) |
direction |
string | "inbound" or "outbound" |
status |
string | "completed", "no-answer", "busy", "failed", or "voicemail" |
duration_seconds |
integer | Call duration in seconds |
ended_at |
string | ISO 8601 timestamp |
from_user_id |
string | null | User who initiated the call, when known |
to_user_id |
string | null | User the call reached, when applicable |
Sent when a call is transferred.
| Field | Type | Description |
|---|---|---|
event |
string | Always "call.transfer" |
account_id |
string | Account where the transfer occurred |
call_id |
string | Call detail record identifier |
from_number |
string | Caller's phone number (E.164) |
to_number |
string | Original called number (E.164) |
transferred_to |
string | Transfer target (extension number) |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| Content-Type | string Example: "text/event-stream" |
| Cache-Control | string Example: "no-cache" |
| Connection | string Example: "keep-alive" |
Server-Sent Events stream. Each event has an event: type and data: payload.
curl -X GET \ https://api.dialstack.ai/v1/events \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
event: connected data: {"message":"Connected to event stream"}
WebRTC configuration for softphone applications. Provides ICE server credentials for establishing peer connections. The signalling protocol is documented in the WebRTC Signalling Protocol. Requires a user token.
Returns STUN and TURN server configurations for establishing WebRTC peer
connections. TURN credentials are time-limited — fetch fresh credentials
before the expires_at timestamp.
Call this before initiating or answering a call. The returned configuration
can be passed directly to RTCPeerConnection as iceServers.
required | Array of objects (IceServer) List of ICE server configurations for WebRTC peer connections |
| expires_at required | string <date-time> When the TURN credentials expire. Fetch new credentials before this time. |
curl -X GET \ https://api.dialstack.ai/v1/webrtc/ice-servers \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN'
{- "ice_servers": [
- {
- "urls": "stun:stun.dialstack.ai:3478"
}, - {
- "urls": [
- "turn:turn.dialstack.ai:443?transport=tcp",
- "turn:turn.dialstack.ai:443?transport=udp"
], - "username": "1712793600:user_01h2xcejqtf2nbrexx3vqjhp42",
- "credential": "aGVsbG8gd29ybGQ="
}
], - "expires_at": "2026-04-10T22:00:00Z"
}Visual call routing graph management.
Dial plans define how calls are routed through nodes (schedules, extensions).
Multiple extensions can share the same dial plan.
Requires account context via DialStack-Account header or session token.
Create a new visual call routing graph for the account.
See the DialPlanNode schema for the full list of node types and
their configuration options.
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| name required | string [ 1 .. 255 ] characters Display name for the dial plan |
| entry_node | string ID of the first node to execute (optional for draft dial plans) |
Array of objects (DialPlanNode) All nodes in the dial plan graph |
| id required | string Unique identifier for the dial plan |
| name required | string Display name for the dial plan |
| entry_node required | string ID of the first node to execute (the implicit Start node connects here) |
required | Array of objects (DialPlanNode) All nodes in the dial plan graph |
| created_at required | string <date-time> When the dial plan was created |
| updated_at required | string <date-time> When the dial plan was last modified |
object List of extensions assigned to this dial plan. Only included when |
{- "name": "Main Line Routing",
- "entry_node": "check_hours",
- "nodes": [
- {
- "id": "check_hours",
- "type": "schedule",
- "config": {
- "schedule_id": "sched_01h2xcejqtf2nbrexx3vqjhp50",
- "open": "reception",
- "closed": "voicemail"
}
}, - {
- "id": "reception",
- "type": "internal_dial",
- "config": {
- "target_id": "user_01h2xcejqtf2nbrexx3vqjhp45",
- "timeout": 30,
- "next": "voicemail"
}
}, - {
- "id": "voicemail",
- "type": "internal_dial",
- "config": {
- "target_id": "user_01h2xcejqtf2nbrexx3vqjhp46",
- "timeout": 60
}
}
]
}{- "id": "dp_01h2xcejqtf2nbrexx3vqjhp60",
- "name": "Main Line Routing",
- "entry_node": "check_hours",
- "nodes": [
- {
- "id": "check_hours",
- "type": "schedule",
- "config": {
- "schedule_id": "sched_01h2xcejqtf2nbrexx3vqjhp50",
- "open": "reception",
- "closed": "voicemail"
}
}, - {
- "id": "reception",
- "type": "internal_dial",
- "config": {
- "target_id": "user_01h2xcejqtf2nbrexx3vqjhp45",
- "timeout": 30,
- "next": "voicemail"
}
}, - {
- "id": "voicemail",
- "type": "internal_dial",
- "config": {
- "target_id": "user_01h2xcejqtf2nbrexx3vqjhp46",
- "timeout": 60
}
}
], - "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T10:00:00Z"
}List all dial plans for the account. Results are returned in reverse chronological order (newest first).
| limit | integer [ 1 .. 100 ] Default: 10 Example: limit=10 Number of objects to return. Defaults to 10. Maximum is 100. |
| expand[] | Array of strings Items Value: "extensions" Related resources to include inline. Supported values: |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| object required | string (ListObject) Value: "list" String representing the object's type. Always "list" for list responses. |
| url required | string (ListUrl) The URL for accessing this list. |
| next_page_url required | string or null (NextPageUrl) URL to fetch the next page of results. If |
| previous_page_url required | string or null (PreviousPageUrl) URL to fetch the previous page of results. If |
required | Array of objects (DialPlan) |
curl -X GET \ 'https://api.dialstack.ai/v1/dialplans?limit=10&expand%5B%5D=SOME_ARRAY_VALUE' \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "object": "list",
- "url": "/v1/accounts",
- "next_page_url": "/v1/accounts?page=eyJzdGFydGluZ19hZnRlciI6ImFjY3RfMDFoMnhjZWpxdGYybmJyZXh4M3ZxamhwNDEiLCJsaW1pdCI6MTB9",
- "previous_page_url": "/v1/accounts?page=eyJlbmRpbmdfYmVmb3JlIjoiYWNjdF8wMWgyeGNlanF0ZjJuYnJleHgzdnFqaHA0MSIsImxpbWl0IjoxMH0",
- "data": [
- {
- "id": "dp_01h2xcejqtf2nbrexx3vqjhp60",
- "name": "Main Line Routing",
- "entry_node": "check_hours",
- "nodes": [
- {
- "id": "check_hours",
- "type": "schedule",
- "position": {
- "x": 200,
- "y": 100
}, - "config": {
- "schedule_id": "sched_01h2xcejqtf2nbrexx3vqjhp50",
- "open": "reception",
- "closed": "voicemail"
}
}
], - "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T10:00:00Z",
- "extensions": {
- "object": "list",
- "data": [
- {
- "number": "105",
- "target": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "status": "active",
- "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T10:00:00Z"
}
]
}
}
]
}Retrieve a dial plan by ID.
| dial_plan_id required | string Example: dp_01h2xcejqtf2nbrexx3vqjhp60 The dial plan identifier |
| expand[] | Array of strings Items Value: "extensions" Related resources to include inline. Supported values: |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| id required | string Unique identifier for the dial plan |
| name required | string Display name for the dial plan |
| entry_node required | string ID of the first node to execute (the implicit Start node connects here) |
required | Array of objects (DialPlanNode) All nodes in the dial plan graph |
| created_at required | string <date-time> When the dial plan was created |
| updated_at required | string <date-time> When the dial plan was last modified |
object List of extensions assigned to this dial plan. Only included when |
curl -X GET \ 'https://api.dialstack.ai/v1/dialplans/dp_01h2xcejqtf2nbrexx3vqjhp60?expand%5B%5D=SOME_ARRAY_VALUE' \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "id": "dp_01h2xcejqtf2nbrexx3vqjhp60",
- "name": "Main Line Routing",
- "entry_node": "check_hours",
- "nodes": [
- {
- "id": "check_hours",
- "type": "schedule",
- "position": {
- "x": 200,
- "y": 100
}, - "config": {
- "schedule_id": "sched_01h2xcejqtf2nbrexx3vqjhp50",
- "open": "reception",
- "closed": "voicemail"
}
}
], - "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T10:00:00Z",
- "extensions": {
- "object": "list",
- "data": [
- {
- "number": "105",
- "target": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "status": "active",
- "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T10:00:00Z"
}
]
}
}Update an existing dial plan. All fields are optional; only provided fields will be updated.
When nodes is provided, it fully replaces all nodes (not a partial node update).
| dial_plan_id required | string Example: dp_01h2xcejqtf2nbrexx3vqjhp60 The dial plan identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| name | string [ 1 .. 255 ] characters Display name for the dial plan |
| entry_node | string ID of the first node to execute |
Array of objects (DialPlanNode) All nodes in the dial plan graph (full replacement) |
| id required | string Unique identifier for the dial plan |
| name required | string Display name for the dial plan |
| entry_node required | string ID of the first node to execute (the implicit Start node connects here) |
required | Array of objects (DialPlanNode) All nodes in the dial plan graph |
| created_at required | string <date-time> When the dial plan was created |
| updated_at required | string <date-time> When the dial plan was last modified |
object List of extensions assigned to this dial plan. Only included when |
{- "name": "Updated Main Line Routing"
}{- "id": "dp_01h2xcejqtf2nbrexx3vqjhp60",
- "name": "Main Line Routing",
- "entry_node": "check_hours",
- "nodes": [
- {
- "id": "check_hours",
- "type": "schedule",
- "position": {
- "x": 200,
- "y": 100
}, - "config": {
- "schedule_id": "sched_01h2xcejqtf2nbrexx3vqjhp50",
- "open": "reception",
- "closed": "voicemail"
}
}
], - "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T10:00:00Z",
- "extensions": {
- "object": "list",
- "data": [
- {
- "number": "105",
- "target": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "status": "active",
- "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T10:00:00Z"
}
]
}
}Delete a dial plan by ID.
Note: Deletion will fail if any extensions still reference this dial plan. You must first update or delete those extensions.
| dial_plan_id required | string Example: dp_01h2xcejqtf2nbrexx3vqjhp60 The dial plan identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
curl -X DELETE \ https://api.dialstack.ai/v1/dialplans/dp_01h2xcejqtf2nbrexx3vqjhp60 \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "error": "Invalid request body",
- "code": "validation_error",
- "details": { }
}Ring group management for parallel dialing (call forking).
Ring groups dial multiple members simultaneously; the first to answer wins.
Requires account context via DialStack-Account header or session token.
Creates a new ring group for parallel dialing.
When a call is routed to a ring group, all members ring simultaneously. The first member to answer wins; other ringing channels are cancelled.
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| name required | string [ 1 .. 255 ] characters Display name for the ring group |
| timeout_seconds | integer [ 5 .. 300 ] How long to ring members (defaults to 20) |
| ignore_forwarding | boolean Ignore SIP 302 redirects from devices |
| confirm_external | boolean Require external (phone number) members to press a key before being connected |
| timeout_action | string Enum: "ring_user" "voicemail" "queue" Action to take when the ring group times out:
|
| timeout_target | string ID of the timeout target — a user, shared voicemail box, or queue, paired with |
| id required | string Unique identifier |
| name required | string Display name |
| timeout_seconds required | integer [ 5 .. 300 ] How long to ring members before giving up (seconds) |
| ignore_forwarding required | boolean When true, ignores SIP 302 redirects (call forwarding) from devices |
| confirm_external required | boolean When true, requires external (phone number) members to press a key before being connected |
| timeout_action | string or null Enum: "ring_user" "voicemail" "queue" null Action to take when the ring group times out:
|
| timeout_target | string or null ID of the timeout target — a user, shared voicemail box, or queue, paired with |
object List of extensions assigned to this ring group. Only included when | |
required | Array of objects (RingGroupMember) List of members in this ring group |
| created_at required | string <date-time> (CreatedAt) Timestamp when it was created |
| updated_at required | string <date-time> (UpdatedAt) Timestamp when it was last updated |
{- "name": "Sales Team",
- "timeout_seconds": 30,
- "ignore_forwarding": false,
- "confirm_external": false,
- "timeout_action": "voicemail",
- "timeout_target": "user_01h2xcejqtf2nbrexx3vqjhp42"
}{- "id": "rg_01h2xcejqtf2nbrexx3vqjhp51",
- "name": "Sales Team",
- "timeout_seconds": 30,
- "ignore_forwarding": false,
- "confirm_external": false,
- "timeout_action": "voicemail",
- "timeout_target": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "extensions": {
- "object": "list",
- "data": [
- {
- "number": "105",
- "target": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "status": "active",
- "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T10:00:00Z"
}
]
}, - "members": [
- {
- "id": "rgm_01h2xcejqtf2nbrexx3vqjhp52",
- "ring_group_id": "string",
- "extension": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "phone_number": "+14155551234",
- "created_at": "2025-10-17T14:30:00Z"
}
], - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}Returns a paginated list of ring groups for the account.
| limit | integer [ 1 .. 100 ] Default: 10 Example: limit=10 Number of objects to return. Defaults to 10. Maximum is 100. |
| expand[] | Array of strings Items Value: "extensions" Related resources to include inline. Supported values: |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| object | string (ListObject) Value: "list" String representing the object's type. Always "list" for list responses. |
| url | string (ListUrl) The URL for accessing this list. |
| next_page_url | string or null (NextPageUrl) URL to fetch the next page of results. If |
| previous_page_url | string or null (PreviousPageUrl) URL to fetch the previous page of results. If |
Array of objects (RingGroup) |
curl -X GET \ 'https://api.dialstack.ai/v1/ring_groups?limit=10&expand%5B%5D=SOME_ARRAY_VALUE' \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "object": "list",
- "url": "/v1/accounts",
- "next_page_url": "/v1/accounts?page=eyJzdGFydGluZ19hZnRlciI6ImFjY3RfMDFoMnhjZWpxdGYybmJyZXh4M3ZxamhwNDEiLCJsaW1pdCI6MTB9",
- "previous_page_url": "/v1/accounts?page=eyJlbmRpbmdfYmVmb3JlIjoiYWNjdF8wMWgyeGNlanF0ZjJuYnJleHgzdnFqaHA0MSIsImxpbWl0IjoxMH0",
- "data": [
- {
- "id": "rg_01h2xcejqtf2nbrexx3vqjhp51",
- "name": "Sales Team",
- "timeout_seconds": 30,
- "ignore_forwarding": false,
- "confirm_external": false,
- "timeout_action": "voicemail",
- "timeout_target": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "extensions": {
- "object": "list",
- "data": [
- {
- "number": "105",
- "target": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "status": "active",
- "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T10:00:00Z"
}
]
}, - "members": [
- {
- "id": "rgm_01h2xcejqtf2nbrexx3vqjhp52",
- "ring_group_id": "string",
- "extension": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "phone_number": "+14155551234",
- "created_at": "2025-10-17T14:30:00Z"
}
], - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}
]
}Retrieves a ring group by ID, including its members.
| ring_group_id required | string Example: rg_01h2xcejqtf2nbrexx3vqjhp51 Ring group identifier |
| expand[] | Array of strings Items Value: "extensions" Related resources to include inline. Supported values: |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| id required | string Unique identifier |
| name required | string Display name |
| timeout_seconds required | integer [ 5 .. 300 ] How long to ring members before giving up (seconds) |
| ignore_forwarding required | boolean When true, ignores SIP 302 redirects (call forwarding) from devices |
| confirm_external required | boolean When true, requires external (phone number) members to press a key before being connected |
| timeout_action | string or null Enum: "ring_user" "voicemail" "queue" null Action to take when the ring group times out:
|
| timeout_target | string or null ID of the timeout target — a user, shared voicemail box, or queue, paired with |
object List of extensions assigned to this ring group. Only included when | |
required | Array of objects (RingGroupMember) List of members in this ring group |
| created_at required | string <date-time> (CreatedAt) Timestamp when it was created |
| updated_at required | string <date-time> (UpdatedAt) Timestamp when it was last updated |
curl -X GET \ 'https://api.dialstack.ai/v1/ring_groups/rg_01h2xcejqtf2nbrexx3vqjhp51?expand%5B%5D=SOME_ARRAY_VALUE' \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "id": "rg_01h2xcejqtf2nbrexx3vqjhp51",
- "name": "Sales Team",
- "timeout_seconds": 30,
- "ignore_forwarding": false,
- "confirm_external": false,
- "timeout_action": "voicemail",
- "timeout_target": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "extensions": {
- "object": "list",
- "data": [
- {
- "number": "105",
- "target": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "status": "active",
- "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T10:00:00Z"
}
]
}, - "members": [
- {
- "id": "rgm_01h2xcejqtf2nbrexx3vqjhp52",
- "ring_group_id": "string",
- "extension": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "phone_number": "+14155551234",
- "created_at": "2025-10-17T14:30:00Z"
}
], - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}Updates ring group settings. All fields are optional.
| ring_group_id required | string Example: rg_01h2xcejqtf2nbrexx3vqjhp51 Ring group identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| name | string [ 1 .. 255 ] characters New display name |
| timeout_seconds | integer [ 5 .. 300 ] New timeout value |
| ignore_forwarding | boolean New ignore_forwarding setting |
| confirm_external | boolean New confirm_external setting |
| timeout_action | string or null Enum: "ring_user" "voicemail" "queue" null Action to take when the ring group times out:
Send |
| timeout_target | string or null ID of the timeout target — a user, shared voicemail box, or queue, paired with |
| id required | string Unique identifier |
| name required | string Display name |
| timeout_seconds required | integer [ 5 .. 300 ] How long to ring members before giving up (seconds) |
| ignore_forwarding required | boolean When true, ignores SIP 302 redirects (call forwarding) from devices |
| confirm_external required | boolean When true, requires external (phone number) members to press a key before being connected |
| timeout_action | string or null Enum: "ring_user" "voicemail" "queue" null Action to take when the ring group times out:
|
| timeout_target | string or null ID of the timeout target — a user, shared voicemail box, or queue, paired with |
object List of extensions assigned to this ring group. Only included when | |
required | Array of objects (RingGroupMember) List of members in this ring group |
| created_at required | string <date-time> (CreatedAt) Timestamp when it was created |
| updated_at required | string <date-time> (UpdatedAt) Timestamp when it was last updated |
{- "name": "Support Team",
- "timeout_seconds": 45,
- "ignore_forwarding": true,
- "confirm_external": true,
- "timeout_action": "voicemail",
- "timeout_target": "user_01h2xcejqtf2nbrexx3vqjhp42"
}{- "id": "rg_01h2xcejqtf2nbrexx3vqjhp51",
- "name": "Sales Team",
- "timeout_seconds": 30,
- "ignore_forwarding": false,
- "confirm_external": false,
- "timeout_action": "voicemail",
- "timeout_target": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "extensions": {
- "object": "list",
- "data": [
- {
- "number": "105",
- "target": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "status": "active",
- "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T10:00:00Z"
}
]
}, - "members": [
- {
- "id": "rgm_01h2xcejqtf2nbrexx3vqjhp52",
- "ring_group_id": "string",
- "extension": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "phone_number": "+14155551234",
- "created_at": "2025-10-17T14:30:00Z"
}
], - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}Deletes a ring group. Cannot delete if used by an extension.
| ring_group_id required | string Example: rg_01h2xcejqtf2nbrexx3vqjhp51 Ring group identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
curl -X DELETE \ https://api.dialstack.ai/v1/ring_groups/rg_01h2xcejqtf2nbrexx3vqjhp51 \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "error": "Invalid request body",
- "code": "validation_error",
- "details": { }
}Adds a member to the ring group.
Exactly one of extension or phone_number must be provided:
extension: ID of a routing targetphone_number: Dial string (E.164, local number, extension, 911, etc.)| ring_group_id required | string Example: rg_01h2xcejqtf2nbrexx3vqjhp51 Ring group identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| extension | string ID of a routing target |
| phone_number | string Dial string (E.164, local number, extension, 911, etc.) |
| id required | string Unique identifier |
| ring_group_id required | string Unique identifier |
| extension | string or null ID of a routing target |
| phone_number | string or null Dial string (E.164, local number, extension, 911, etc.) |
| created_at required | string <date-time> (CreatedAt) Timestamp when it was created |
{- "extension": "user_01h2xcejqtf2nbrexx3vqjhp42"
}{- "id": "rgm_01h2xcejqtf2nbrexx3vqjhp52",
- "ring_group_id": "string",
- "extension": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "phone_number": "+14155551234",
- "created_at": "2025-10-17T14:30:00Z"
}Removes a member from the ring group.
| ring_group_id required | string Example: rg_01h2xcejqtf2nbrexx3vqjhp51 Ring group identifier |
| member_id required | string Example: rgm_01h2xcejqtf2nbrexx3vqjhp52 Ring group member identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
curl -X DELETE \ https://api.dialstack.ai/v1/ring_groups/rg_01h2xcejqtf2nbrexx3vqjhp51/members/rgm_01h2xcejqtf2nbrexx3vqjhp52 \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "error": "Invalid request body",
- "code": "validation_error",
- "details": { }
}Call queue configuration, member management, and per-user agent state.
Requires account context via DialStack-Account header or session token.
Creates a new call queue. The queue starts with no members; add agents
with POST /v1/queues/{queue_id}/members.
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| name required | string [ 1 .. 255 ] characters Display name for the queue. |
| strategy | string Enum: "ringall" "linear" "rrmemory" "leastrecent" "fewestcalls" "random" "wrandom" Dispatch strategy. Defaults to |
| timeout_seconds | integer [ 0 .. 3600 ] Default: 300 Caller wait limit before |
| wrap_up_seconds | integer [ 0 .. 600 ] Per-agent cool-down after each call. Defaults to |
QueueAnnouncementsConfigInput (object) or null Position-announcement config. Pass an object (with any subset of fields) to enable announcements; omit or pass null to disable. | |
QueueCallbackConfigInput (object) or null Press-1 callback config. Pass an object (with any subset of fields) to enable callbacks; omit or pass null to disable. | |
QueueTimeout (any) or null Fallback action when | |
| max_queue_length | integer >= 0 Maximum number of waiting callers. |
| join_empty | string (QueueEmptyPolicy) Enum: "strict" "no_agents_online" "no_agents_available" Policy used by
|
| leave_when_empty | string (QueueEmptyPolicy) Enum: "strict" "no_agents_online" "no_agents_available" Policy used by
|
| id required | string Unique identifier |
| name required | string Display name |
| strategy required | string (QueueStrategy) Enum: "ringall" "linear" "rrmemory" "leastrecent" "fewestcalls" "random" "wrandom" Dispatch strategy for selecting which agent to ring next.
|
| timeout_seconds required | integer [ 0 .. 3600 ] How long a caller waits before the |
| wrap_up_seconds required | integer [ 0 .. 600 ] Cool-down per agent after each call ends, during which the agent is
not eligible for dispatch. |
required | QueueAnnouncementsConfig (object) or null Position-announcement configuration; null when announcements are disabled. |
required | QueueCallbackConfig (object) or null Press-1 callback configuration; null when callbacks are disabled |
required | QueueTimeout (any) or null Fallback action when |
| max_queue_length required | integer >= 0 Maximum number of callers waiting at once. |
| join_empty required | string (QueueEmptyPolicy) Enum: "strict" "no_agents_online" "no_agents_available" Policy used by
|
| leave_when_empty required | string (QueueEmptyPolicy) Enum: "strict" "no_agents_online" "no_agents_available" Policy used by
|
required | object (EmbeddedQueueMembers) Sub-collection of queue members embedded on the parent queue.
Capped at 10 entries; use |
object Extensions assigned to this queue. Only included when | |
| created_at required | string <date-time> (CreatedAt) Timestamp when it was created |
| updated_at required | string <date-time> (UpdatedAt) Timestamp when it was last updated |
{- "name": "Support",
- "strategy": "ringall",
- "timeout_seconds": 120,
- "wrap_up_seconds": 15,
- "announcements": {
- "frequency_seconds": 30
}, - "max_queue_length": 50,
- "timeout": {
- "type": "voicemail",
- "voicemail": "svm_01h2xcejqtf2nbrexx3vqjhp60"
}
}{- "id": "qu_01h2xcejqtf2nbrexx3vqjhp61",
- "name": "Support",
- "strategy": "ringall",
- "timeout_seconds": 120,
- "wrap_up_seconds": 15,
- "announcements": {
- "frequency_seconds": 30
}, - "callback": {
- "offer_after_seconds": 60,
- "outbound_did_id": "did_01h2xcejqtf2nbrexx3vqjhp44"
}, - "timeout": {
- "type": "ring_user",
- "user": "user_01h2xcejqtf2nbrexx3vqjhp42"
}, - "max_queue_length": 50,
- "join_empty": "strict",
- "leave_when_empty": "strict",
- "members": {
- "object": "list",
- "url": "/v1/accounts",
- "next_page_url": "/v1/accounts?page=eyJzdGFydGluZ19hZnRlciI6ImFjY3RfMDFoMnhjZWpxdGYybmJyZXh4M3ZxamhwNDEiLCJsaW1pdCI6MTB9",
- "previous_page_url": "/v1/accounts?page=eyJlbmRpbmdfYmVmb3JlIjoiYWNjdF8wMWgyeGNlanF0ZjJuYnJleHgzdnFqaHA0MSIsImxpbWl0IjoxMH0",
- "data": [
- {
- "id": "qum_01h2xcejqtf2nbrexx3vqjhp62",
- "queue_id": "qu_01h2xcejqtf2nbrexx3vqjhp61",
- "user_id": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "penalty": 0,
- "position": 3,
- "created_at": "2025-10-17T14:30:00Z"
}
], - "total_count": 12
}, - "extensions": {
- "object": "list",
- "data": [
- {
- "number": "105",
- "target": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "status": "active",
- "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T10:00:00Z"
}
]
}, - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}Returns a paginated list of queues for the account.
| limit | integer [ 1 .. 100 ] Default: 10 Example: limit=10 Number of objects to return. Defaults to 10. Maximum is 100. |
| expand[] | Array of strings Items Value: "extensions" Related resources to include inline. Supported values: |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| object | string (ListObject) Value: "list" String representing the object's type. Always "list" for list responses. |
| url | string (ListUrl) The URL for accessing this list. |
| next_page_url | string or null (NextPageUrl) URL to fetch the next page of results. If |
| previous_page_url | string or null (PreviousPageUrl) URL to fetch the previous page of results. If |
Array of objects (Queue) |
curl -X GET \ 'https://api.dialstack.ai/v1/queues?limit=10&expand%5B%5D=SOME_ARRAY_VALUE' \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "object": "list",
- "url": "/v1/accounts",
- "next_page_url": "/v1/accounts?page=eyJzdGFydGluZ19hZnRlciI6ImFjY3RfMDFoMnhjZWpxdGYybmJyZXh4M3ZxamhwNDEiLCJsaW1pdCI6MTB9",
- "previous_page_url": "/v1/accounts?page=eyJlbmRpbmdfYmVmb3JlIjoiYWNjdF8wMWgyeGNlanF0ZjJuYnJleHgzdnFqaHA0MSIsImxpbWl0IjoxMH0",
- "data": [
- {
- "id": "qu_01h2xcejqtf2nbrexx3vqjhp61",
- "name": "Support",
- "strategy": "ringall",
- "timeout_seconds": 120,
- "wrap_up_seconds": 15,
- "announcements": {
- "frequency_seconds": 30
}, - "callback": {
- "offer_after_seconds": 60,
- "outbound_did_id": "did_01h2xcejqtf2nbrexx3vqjhp44"
}, - "timeout": {
- "type": "ring_user",
- "user": "user_01h2xcejqtf2nbrexx3vqjhp42"
}, - "max_queue_length": 50,
- "join_empty": "strict",
- "leave_when_empty": "strict",
- "members": {
- "object": "list",
- "url": "/v1/accounts",
- "next_page_url": "/v1/accounts?page=eyJzdGFydGluZ19hZnRlciI6ImFjY3RfMDFoMnhjZWpxdGYybmJyZXh4M3ZxamhwNDEiLCJsaW1pdCI6MTB9",
- "previous_page_url": "/v1/accounts?page=eyJlbmRpbmdfYmVmb3JlIjoiYWNjdF8wMWgyeGNlanF0ZjJuYnJleHgzdnFqaHA0MSIsImxpbWl0IjoxMH0",
- "data": [
- {
- "id": "qum_01h2xcejqtf2nbrexx3vqjhp62",
- "queue_id": "qu_01h2xcejqtf2nbrexx3vqjhp61",
- "user_id": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "penalty": 0,
- "position": 3,
- "created_at": "2025-10-17T14:30:00Z"
}
], - "total_count": 12
}, - "extensions": {
- "object": "list",
- "data": [
- {
- "number": "105",
- "target": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "status": "active",
- "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T10:00:00Z"
}
]
}, - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}
]
}Retrieves a queue by ID. The first 10 members are embedded inline under
members; page through the rest via members.next_page_url or
GET /v1/queues/{queue_id}/members.
| queue_id required | string Example: qu_01h2xcejqtf2nbrexx3vqjhp61 Call queue identifier |
| expand[] | Array of strings Items Value: "extensions" Related resources to include inline. Supported values: |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| id required | string Unique identifier |
| name required | string Display name |
| strategy required | string (QueueStrategy) Enum: "ringall" "linear" "rrmemory" "leastrecent" "fewestcalls" "random" "wrandom" Dispatch strategy for selecting which agent to ring next.
|
| timeout_seconds required | integer [ 0 .. 3600 ] How long a caller waits before the |
| wrap_up_seconds required | integer [ 0 .. 600 ] Cool-down per agent after each call ends, during which the agent is
not eligible for dispatch. |
required | QueueAnnouncementsConfig (object) or null Position-announcement configuration; null when announcements are disabled. |
required | QueueCallbackConfig (object) or null Press-1 callback configuration; null when callbacks are disabled |
required | QueueTimeout (any) or null Fallback action when |
| max_queue_length required | integer >= 0 Maximum number of callers waiting at once. |
| join_empty required | string (QueueEmptyPolicy) Enum: "strict" "no_agents_online" "no_agents_available" Policy used by
|
| leave_when_empty required | string (QueueEmptyPolicy) Enum: "strict" "no_agents_online" "no_agents_available" Policy used by
|
required | object (EmbeddedQueueMembers) Sub-collection of queue members embedded on the parent queue.
Capped at 10 entries; use |
object Extensions assigned to this queue. Only included when | |
| created_at required | string <date-time> (CreatedAt) Timestamp when it was created |
| updated_at required | string <date-time> (UpdatedAt) Timestamp when it was last updated |
curl -X GET \ 'https://api.dialstack.ai/v1/queues/qu_01h2xcejqtf2nbrexx3vqjhp61?expand%5B%5D=SOME_ARRAY_VALUE' \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "id": "qu_01h2xcejqtf2nbrexx3vqjhp61",
- "name": "Support",
- "strategy": "ringall",
- "timeout_seconds": 120,
- "wrap_up_seconds": 15,
- "announcements": {
- "frequency_seconds": 30
}, - "callback": {
- "offer_after_seconds": 60,
- "outbound_did_id": "did_01h2xcejqtf2nbrexx3vqjhp44"
}, - "timeout": {
- "type": "ring_user",
- "user": "user_01h2xcejqtf2nbrexx3vqjhp42"
}, - "max_queue_length": 50,
- "join_empty": "strict",
- "leave_when_empty": "strict",
- "members": {
- "object": "list",
- "url": "/v1/accounts",
- "next_page_url": "/v1/accounts?page=eyJzdGFydGluZ19hZnRlciI6ImFjY3RfMDFoMnhjZWpxdGYybmJyZXh4M3ZxamhwNDEiLCJsaW1pdCI6MTB9",
- "previous_page_url": "/v1/accounts?page=eyJlbmRpbmdfYmVmb3JlIjoiYWNjdF8wMWgyeGNlanF0ZjJuYnJleHgzdnFqaHA0MSIsImxpbWl0IjoxMH0",
- "data": [
- {
- "id": "qum_01h2xcejqtf2nbrexx3vqjhp62",
- "queue_id": "qu_01h2xcejqtf2nbrexx3vqjhp61",
- "user_id": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "penalty": 0,
- "position": 3,
- "created_at": "2025-10-17T14:30:00Z"
}
], - "total_count": 12
}, - "extensions": {
- "object": "list",
- "data": [
- {
- "number": "105",
- "target": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "status": "active",
- "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T10:00:00Z"
}
]
}, - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}Updates queue settings. All fields are optional.
Send timeout: null to clear the timeout configuration; omit the field
to leave it unchanged.
| queue_id required | string Example: qu_01h2xcejqtf2nbrexx3vqjhp61 Call queue identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| name | string [ 1 .. 255 ] characters |
| strategy | string (QueueStrategy) Enum: "ringall" "linear" "rrmemory" "leastrecent" "fewestcalls" "random" "wrandom" Dispatch strategy for selecting which agent to ring next.
|
| timeout_seconds | integer [ 0 .. 3600 ] |
| wrap_up_seconds | integer [ 0 .. 600 ] |
QueueAnnouncementsConfigInput (object) or null Position-announcement config. Pass null to disable; pass an object to enable/update. Omitted leaves the existing value untouched. | |
QueueCallbackConfigInput (object) or null Press-1 callback config. Pass null to disable; pass an object to enable/update. Omitted leaves the existing value untouched. | |
QueueTimeout (any) or null Send | |
| max_queue_length | integer >= 0 |
| join_empty | string (QueueEmptyPolicy) Enum: "strict" "no_agents_online" "no_agents_available" Policy used by
|
| leave_when_empty | string (QueueEmptyPolicy) Enum: "strict" "no_agents_online" "no_agents_available" Policy used by
|
| id required | string Unique identifier |
| name required | string Display name |
| strategy required | string (QueueStrategy) Enum: "ringall" "linear" "rrmemory" "leastrecent" "fewestcalls" "random" "wrandom" Dispatch strategy for selecting which agent to ring next.
|
| timeout_seconds required | integer [ 0 .. 3600 ] How long a caller waits before the |
| wrap_up_seconds required | integer [ 0 .. 600 ] Cool-down per agent after each call ends, during which the agent is
not eligible for dispatch. |
required | QueueAnnouncementsConfig (object) or null Position-announcement configuration; null when announcements are disabled. |
required | QueueCallbackConfig (object) or null Press-1 callback configuration; null when callbacks are disabled |
required | QueueTimeout (any) or null Fallback action when |
| max_queue_length required | integer >= 0 Maximum number of callers waiting at once. |
| join_empty required | string (QueueEmptyPolicy) Enum: "strict" "no_agents_online" "no_agents_available" Policy used by
|
| leave_when_empty required | string (QueueEmptyPolicy) Enum: "strict" "no_agents_online" "no_agents_available" Policy used by
|
required | object (EmbeddedQueueMembers) Sub-collection of queue members embedded on the parent queue.
Capped at 10 entries; use |
object Extensions assigned to this queue. Only included when | |
| created_at required | string <date-time> (CreatedAt) Timestamp when it was created |
| updated_at required | string <date-time> (UpdatedAt) Timestamp when it was last updated |
{- "timeout": null
}{- "id": "qu_01h2xcejqtf2nbrexx3vqjhp61",
- "name": "Support",
- "strategy": "ringall",
- "timeout_seconds": 120,
- "wrap_up_seconds": 15,
- "announcements": {
- "frequency_seconds": 30
}, - "callback": {
- "offer_after_seconds": 60,
- "outbound_did_id": "did_01h2xcejqtf2nbrexx3vqjhp44"
}, - "timeout": {
- "type": "ring_user",
- "user": "user_01h2xcejqtf2nbrexx3vqjhp42"
}, - "max_queue_length": 50,
- "join_empty": "strict",
- "leave_when_empty": "strict",
- "members": {
- "object": "list",
- "url": "/v1/accounts",
- "next_page_url": "/v1/accounts?page=eyJzdGFydGluZ19hZnRlciI6ImFjY3RfMDFoMnhjZWpxdGYybmJyZXh4M3ZxamhwNDEiLCJsaW1pdCI6MTB9",
- "previous_page_url": "/v1/accounts?page=eyJlbmRpbmdfYmVmb3JlIjoiYWNjdF8wMWgyeGNlanF0ZjJuYnJleHgzdnFqaHA0MSIsImxpbWl0IjoxMH0",
- "data": [
- {
- "id": "qum_01h2xcejqtf2nbrexx3vqjhp62",
- "queue_id": "qu_01h2xcejqtf2nbrexx3vqjhp61",
- "user_id": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "penalty": 0,
- "position": 3,
- "created_at": "2025-10-17T14:30:00Z"
}
], - "total_count": 12
}, - "extensions": {
- "object": "list",
- "data": [
- {
- "number": "105",
- "target": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "status": "active",
- "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T10:00:00Z"
}
]
}, - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}Deletes a queue and removes all of its members.
| queue_id required | string Example: qu_01h2xcejqtf2nbrexx3vqjhp61 Call queue identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
curl -X DELETE \ https://api.dialstack.ai/v1/queues/qu_01h2xcejqtf2nbrexx3vqjhp61 \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "error": "Invalid request body",
- "code": "validation_error",
- "details": { }
}Returns a paginated list of members on the queue.
| queue_id required | string Example: qu_01h2xcejqtf2nbrexx3vqjhp61 Call queue identifier |
| limit | integer [ 1 .. 100 ] Default: 10 Example: limit=10 Number of objects to return. Defaults to 10. Maximum is 100. |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| object | string (ListObject) Value: "list" String representing the object's type. Always "list" for list responses. |
| url | string (ListUrl) The URL for accessing this list. |
| next_page_url | string or null (NextPageUrl) URL to fetch the next page of results. If |
| previous_page_url | string or null (PreviousPageUrl) URL to fetch the previous page of results. If |
Array of objects (QueueMember) |
curl -X GET \ 'https://api.dialstack.ai/v1/queues/qu_01h2xcejqtf2nbrexx3vqjhp61/members?limit=10' \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "object": "list",
- "url": "/v1/accounts",
- "next_page_url": "/v1/accounts?page=eyJzdGFydGluZ19hZnRlciI6ImFjY3RfMDFoMnhjZWpxdGYybmJyZXh4M3ZxamhwNDEiLCJsaW1pdCI6MTB9",
- "previous_page_url": "/v1/accounts?page=eyJlbmRpbmdfYmVmb3JlIjoiYWNjdF8wMWgyeGNlanF0ZjJuYnJleHgzdnFqaHA0MSIsImxpbWl0IjoxMH0",
- "data": [
- {
- "id": "qum_01h2xcejqtf2nbrexx3vqjhp62",
- "queue_id": "qu_01h2xcejqtf2nbrexx3vqjhp61",
- "user_id": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "penalty": 0,
- "position": 3,
- "created_at": "2025-10-17T14:30:00Z"
}
]
}Adds a user agent to the queue. Each user can be a member of a queue
at most once; re-adding returns 409.
Auto-login side effect. On success, the user is also marked
logged in for queue dispatch (equivalent to dialing *45) so they
start receiving queue calls immediately — admins don't have to log
agents in separately. The auto-login is conservative:
Agents can still log themselves out with *45 or via the
POST /v1/users/{user_id}/queue-agent endpoint.
| queue_id required | string Example: qu_01h2xcejqtf2nbrexx3vqjhp61 Call queue identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| user_id required | string User TypeID ( |
| penalty | integer >= 0 Strategy hint. Defaults to |
| position | integer >= 1 1-based insertion position. Defaults to the end of the queue. |
| id required | string Unique identifier |
| queue_id required | string Unique identifier |
| user_id required | string Unique identifier |
| penalty required | integer >= 0 Strategy hint. Lower-penalty agents are preferred by |
| position required | integer >= 1 1-based ordering within the queue, used by |
| created_at required | string <date-time> (CreatedAt) Timestamp when it was created |
{- "user_id": "user_01h2xcejqtf2nbrexx3vqjhp42"
}{- "id": "qum_01h2xcejqtf2nbrexx3vqjhp62",
- "queue_id": "qu_01h2xcejqtf2nbrexx3vqjhp61",
- "user_id": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "penalty": 0,
- "position": 3,
- "created_at": "2025-10-17T14:30:00Z"
}Removes a member from the queue.
| queue_id required | string Example: qu_01h2xcejqtf2nbrexx3vqjhp61 Call queue identifier |
| member_id required | string Example: qum_01h2xcejqtf2nbrexx3vqjhp62 Queue member identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
curl -X DELETE \ https://api.dialstack.ai/v1/queues/qu_01h2xcejqtf2nbrexx3vqjhp61/members/qum_01h2xcejqtf2nbrexx3vqjhp62 \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "error": "Invalid request body",
- "code": "validation_error",
- "details": { }
}Returns the user's current queue-agent operational state. status
is derived from the underlying timestamps: paused_at present
renders as paused; logged_in_at absent renders as logged_out;
otherwise available.
Returns 404 if the user has never had agent state written. A user who logged out is not a 404 — the row is retained so historical attributes survive the logout/login cycle.
| user_id required | string Example: user_01h2xcejqtf2nbrexx3vqjhp42 User identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| user_id required | string The agent (user) this status belongs to |
| status required | string Enum: "available" "paused" "logged_out" Current availability state |
| paused_at | string <date-time> When the agent entered the |
| pause_reason | string Free-form reason for the current pause, if provided |
| logged_in_at | string <date-time> When the agent first logged in to the queue |
| in_call_since | string <date-time> When the agent's currently-active call started, if any |
| updated_at required | string <date-time> Timestamp when it was last updated |
curl -X GET \ https://api.dialstack.ai/v1/users/user_01h2xcejqtf2nbrexx3vqjhp42/queue-agent \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "user_id": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "status": "paused",
- "paused_at": "2019-08-24T14:15:22Z",
- "pause_reason": "break",
- "logged_in_at": "2019-08-24T14:15:22Z",
- "in_call_since": "2019-08-24T14:15:22Z",
- "updated_at": "2025-10-17T14:30:00Z"
}Sets a queue agent's availability state. The endpoint is idempotent: re-sending the current status is a 200 with no semantic change.
Transitioning to available (or paused) from a logged-out state
sets logged_in_at if it isn't already populated; subsequent flips
between available and paused preserve the original login time.
Transitioning to logged_out clears logged_in_at, paused_at,
and pause_reason but retains the row so historical attributes
survive the logout/login cycle.
reason is only valid when status is paused; sending it with
any other status returns 400.
| user_id required | string Example: user_01h2xcejqtf2nbrexx3vqjhp42 User identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| status required | string Enum: "available" "paused" "logged_out" Target availability state:
|
| reason | string <= 255 characters Optional free-form reason associated with a |
| user_id required | string The agent (user) this status belongs to |
| status required | string Enum: "available" "paused" "logged_out" Current availability state |
| paused_at | string <date-time> When the agent entered the |
| pause_reason | string Free-form reason for the current pause, if provided |
| logged_in_at | string <date-time> When the agent first logged in to the queue |
| in_call_since | string <date-time> When the agent's currently-active call started, if any |
| updated_at required | string <date-time> Timestamp when it was last updated |
{- "status": "paused",
- "reason": "break"
}{- "user_id": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "status": "paused",
- "paused_at": "2019-08-24T14:15:22Z",
- "pause_reason": "break",
- "logged_in_at": "2019-08-24T14:15:22Z",
- "in_call_since": "2019-08-24T14:15:22Z",
- "updated_at": "2025-10-17T14:30:00Z"
}Business hours schedule management.
Schedules define when the business is open based on weekly time ranges and holidays.
A temporary hold can override the schedule calculation.
Requires account context via DialStack-Account header or session token.
Create a new business hours schedule within the account. Schedules define when the business is open based on weekly time ranges and holidays.
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| name required | string [ 1 .. 255 ] characters Display name for the schedule |
| timezone | string IANA timezone for interpreting times (e.g., "America/New_York") |
required | Array of objects (TimeRange) Weekly time ranges when the schedule is considered "open" |
Array of objects (DateRange) Date ranges when the schedule is closed regardless of weekly ranges |
| id required | string Unique identifier |
| name required | string [ 1 .. 255 ] characters Display name for the schedule |
| timezone | string or null IANA timezone for interpreting times (e.g., "America/New_York"). If null, uses account default. |
required | Array of objects (TimeRange) Weekly time ranges when the schedule is considered "open" |
Array of objects (DateRange) Date ranges when the schedule is closed regardless of weekly ranges | |
ScheduleHold (object) or null Temporary override for the schedule | |
| created_at required | string <date-time> Timestamp when it was created |
| updated_at | string <date-time> Timestamp when it was last updated |
{- "name": "Business Hours",
- "timezone": "America/New_York",
- "ranges": [
- {
- "day": 1,
- "start": "09:00",
- "end": "17:00"
}, - {
- "day": 2,
- "start": "09:00",
- "end": "17:00"
}, - {
- "day": 3,
- "start": "09:00",
- "end": "17:00"
}, - {
- "day": 4,
- "start": "09:00",
- "end": "17:00"
}, - {
- "day": 5,
- "start": "09:00",
- "end": "17:00"
}
], - "holidays": [
- {
- "start": "2025-12-25",
- "end": "2025-12-25"
}
]
}{- "id": "sched_01h2xcejqtf2nbrexx3vqjhp50",
- "name": "Business Hours",
- "timezone": "America/New_York",
- "ranges": [
- {
- "day": 1,
- "start": "09:00",
- "end": "17:00"
}
], - "holidays": [ ],
- "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T10:00:00Z"
}List all schedules for the account. Results are returned in reverse chronological order (newest first).
| limit | integer [ 1 .. 100 ] Default: 10 Example: limit=10 Number of objects to return. Defaults to 10. Maximum is 100. |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| object required | string (ListObject) Value: "list" String representing the object's type. Always "list" for list responses. |
| url required | string (ListUrl) The URL for accessing this list. |
| next_page_url required | string or null (NextPageUrl) URL to fetch the next page of results. If |
| previous_page_url required | string or null (PreviousPageUrl) URL to fetch the previous page of results. If |
required | Array of objects (Schedule) |
curl -X GET \ 'https://api.dialstack.ai/v1/schedules?limit=10' \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "object": "list",
- "url": "/v1/schedules",
- "next_page_url": null,
- "previous_page_url": null,
- "data": [
- {
- "id": "sched_01h2xcejqtf2nbrexx3vqjhp50",
- "name": "Business Hours",
- "timezone": "America/New_York",
- "ranges": [
- {
- "day": 1,
- "start": "09:00",
- "end": "17:00"
}
], - "holidays": [ ],
- "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T10:00:00Z"
}
]
}Retrieve a specific schedule by ID.
| schedule_id required | string Example: sched_01h2xcejqtf2nbrexx3vqjhp50 Schedule identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| id required | string Unique identifier |
| name required | string [ 1 .. 255 ] characters Display name for the schedule |
| timezone | string or null IANA timezone for interpreting times (e.g., "America/New_York"). If null, uses account default. |
required | Array of objects (TimeRange) Weekly time ranges when the schedule is considered "open" |
Array of objects (DateRange) Date ranges when the schedule is closed regardless of weekly ranges | |
ScheduleHold (object) or null Temporary override for the schedule | |
| created_at required | string <date-time> Timestamp when it was created |
| updated_at | string <date-time> Timestamp when it was last updated |
curl -X GET \ https://api.dialstack.ai/v1/schedules/sched_01h2xcejqtf2nbrexx3vqjhp50 \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "id": "sched_01h2xcejqtf2nbrexx3vqjhp50",
- "name": "Business Hours",
- "timezone": "America/New_York",
- "ranges": [
- {
- "day": 1,
- "start": "09:00",
- "end": "17:00"
}, - {
- "day": 2,
- "start": "09:00",
- "end": "17:00"
}
], - "holidays": [
- {
- "start": "2025-12-25",
- "end": "2025-12-25"
}
], - "hold": {
- "value": false,
- "until": "2025-12-20T17:00:00"
}, - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}Update schedule details (name, timezone, ranges, or holidays). Only the fields provided will be updated.
| schedule_id required | string Example: sched_01h2xcejqtf2nbrexx3vqjhp50 Schedule identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| name | string [ 1 .. 255 ] characters Display name for the schedule |
| timezone | string IANA timezone for interpreting times |
Array of objects (TimeRange) Weekly time ranges when the schedule is considered "open" | |
Array of objects (DateRange) Date ranges when the schedule is closed regardless of weekly ranges |
| id required | string Unique identifier |
| name required | string [ 1 .. 255 ] characters Display name for the schedule |
| timezone | string or null IANA timezone for interpreting times (e.g., "America/New_York"). If null, uses account default. |
required | Array of objects (TimeRange) Weekly time ranges when the schedule is considered "open" |
Array of objects (DateRange) Date ranges when the schedule is closed regardless of weekly ranges | |
ScheduleHold (object) or null Temporary override for the schedule | |
| created_at required | string <date-time> Timestamp when it was created |
| updated_at | string <date-time> Timestamp when it was last updated |
{- "name": "New Business Hours"
}{- "id": "sched_01h2xcejqtf2nbrexx3vqjhp50",
- "name": "Business Hours",
- "timezone": "America/New_York",
- "ranges": [
- {
- "day": 1,
- "start": "09:00",
- "end": "17:00"
}, - {
- "day": 2,
- "start": "09:00",
- "end": "17:00"
}
], - "holidays": [
- {
- "start": "2025-12-25",
- "end": "2025-12-25"
}
], - "hold": {
- "value": false,
- "until": "2025-12-20T17:00:00"
}, - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}Delete a schedule. This operation is irreversible.
| schedule_id required | string Example: sched_01h2xcejqtf2nbrexx3vqjhp50 Schedule identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
curl -X DELETE \ https://api.dialstack.ai/v1/schedules/sched_01h2xcejqtf2nbrexx3vqjhp50 \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "error": "Invalid request body",
- "code": "validation_error",
- "details": { }
}Set a temporary hold on a schedule. The hold overrides the normal schedule calculation until the specified time.
Use value: true to force the schedule to be considered "open" regardless
of the time ranges, or value: false to force it to be considered "closed".
If until is not provided, it defaults to midnight (00:00:00) the next day
in the schedule's timezone.
| schedule_id required | string Example: sched_01h2xcejqtf2nbrexx3vqjhp50 Schedule identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| value required | boolean Override value (true=force open, false=force closed) |
| until | string <date-time-local> When the hold expires. Interpreted in the schedule's timezone. If not provided, defaults to midnight (00:00:00) the next day. |
| id required | string Unique identifier |
| name required | string [ 1 .. 255 ] characters Display name for the schedule |
| timezone | string or null IANA timezone for interpreting times (e.g., "America/New_York"). If null, uses account default. |
required | Array of objects (TimeRange) Weekly time ranges when the schedule is considered "open" |
Array of objects (DateRange) Date ranges when the schedule is closed regardless of weekly ranges | |
ScheduleHold (object) or null Temporary override for the schedule | |
| created_at required | string <date-time> Timestamp when it was created |
| updated_at | string <date-time> Timestamp when it was last updated |
{- "value": false,
- "until": "2025-12-20T17:00:00"
}{- "id": "sched_01h2xcejqtf2nbrexx3vqjhp50",
- "name": "Business Hours",
- "timezone": "America/New_York",
- "ranges": [
- {
- "day": 1,
- "start": "09:00",
- "end": "17:00"
}
], - "holidays": [ ],
- "hold": {
- "value": false,
- "until": "2025-12-20T17:00:00"
}, - "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T14:30:00Z"
}Clear the hold from a schedule, returning it to normal schedule-based calculation.
| schedule_id required | string Example: sched_01h2xcejqtf2nbrexx3vqjhp50 Schedule identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| id required | string Unique identifier |
| name required | string [ 1 .. 255 ] characters Display name for the schedule |
| timezone | string or null IANA timezone for interpreting times (e.g., "America/New_York"). If null, uses account default. |
required | Array of objects (TimeRange) Weekly time ranges when the schedule is considered "open" |
Array of objects (DateRange) Date ranges when the schedule is closed regardless of weekly ranges | |
ScheduleHold (object) or null Temporary override for the schedule | |
| created_at required | string <date-time> Timestamp when it was created |
| updated_at | string <date-time> Timestamp when it was last updated |
curl -X DELETE \ https://api.dialstack.ai/v1/schedules/sched_01h2xcejqtf2nbrexx3vqjhp50/hold \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "id": "sched_01h2xcejqtf2nbrexx3vqjhp50",
- "name": "Business Hours",
- "timezone": "America/New_York",
- "ranges": [
- {
- "day": 1,
- "start": "09:00",
- "end": "17:00"
}
], - "holidays": [ ],
- "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T14:35:00Z"
}Audio clip management for hold music, IVR prompts, and other audio playback.
Upload audio files which are validated and transcoded server-side.
Requires account context via DialStack-Account header or session token.
Uploads a new audio clip for use as hold music, IVR prompts, or other audio playback.
Accepts a multipart form with a file field (audio file) and a name field (display name).
The audio is validated and transcoded server-side. Maximum file size: 5 MB.
Supported input formats: WAV, MP3, AAC, Ogg Vorbis, Opus.
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| name required | string [ 1 .. 255 ] characters Display name for the audio clip (must be unique per account) |
| file required | string <binary> Audio file to upload |
| id required | string Unique identifier |
| name required | string Display name (unique per account) |
| url required | string Signed URL for downloading the audio file (expires after 5 minutes) |
| mime_type required | string MIME type of the stored audio file |
| duration_ms required | integer Duration of the audio clip in milliseconds |
| size_bytes required | integer <int64> Size of the stored audio file in bytes |
| source_sha256 | string or null SHA-256 hash of the original uploaded file (before transcoding) |
| created_at required | string <date-time> (CreatedAt) Timestamp when it was created |
| updated_at required | string <date-time> (UpdatedAt) Timestamp when it was last updated |
curl -X POST \ https://api.dialstack.ai/v1/audio_clips \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41' \ -H 'content-type: multipart/form-data' \ --form 'name=Hold Music' \ --form file=string
{- "id": "string",
- "name": "Hold Music",
- "mime_type": "audio/wav",
- "duration_ms": 30000,
- "size_bytes": 240000,
- "source_sha256": "113a95dbbfd24492fb4e527b58d64aece235d6a5057ea671dbf2fe980a9cf6a3",
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}Returns a paginated list of audio clips for the account.
| limit | integer [ 1 .. 100 ] Default: 10 Example: limit=10 Number of objects to return. Defaults to 10. Maximum is 100. |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| object | string (ListObject) Value: "list" String representing the object's type. Always "list" for list responses. |
| url | string (ListUrl) The URL for accessing this list. |
| next_page_url | string or null (NextPageUrl) URL to fetch the next page of results. If |
| previous_page_url | string or null (PreviousPageUrl) URL to fetch the previous page of results. If |
Array of objects (AudioClip) |
curl -X GET \ 'https://api.dialstack.ai/v1/audio_clips?limit=10' \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "object": "list",
- "url": "/v1/accounts",
- "next_page_url": "/v1/accounts?page=eyJzdGFydGluZ19hZnRlciI6ImFjY3RfMDFoMnhjZWpxdGYybmJyZXh4M3ZxamhwNDEiLCJsaW1pdCI6MTB9",
- "previous_page_url": "/v1/accounts?page=eyJlbmRpbmdfYmVmb3JlIjoiYWNjdF8wMWgyeGNlanF0ZjJuYnJleHgzdnFqaHA0MSIsImxpbWl0IjoxMH0",
- "data": [
- {
- "id": "string",
- "name": "Hold Music",
- "mime_type": "audio/wav",
- "duration_ms": 30000,
- "size_bytes": 240000,
- "source_sha256": "113a95dbbfd24492fb4e527b58d64aece235d6a5057ea671dbf2fe980a9cf6a3",
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}
]
}Retrieves an audio clip by ID. The response includes a signed URL for downloading the audio file.
| audio_clip_id required | string Audio clip identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| id required | string Unique identifier |
| name required | string Display name (unique per account) |
| url required | string Signed URL for downloading the audio file (expires after 5 minutes) |
| mime_type required | string MIME type of the stored audio file |
| duration_ms required | integer Duration of the audio clip in milliseconds |
| size_bytes required | integer <int64> Size of the stored audio file in bytes |
| source_sha256 | string or null SHA-256 hash of the original uploaded file (before transcoding) |
| created_at required | string <date-time> (CreatedAt) Timestamp when it was created |
| updated_at required | string <date-time> (UpdatedAt) Timestamp when it was last updated |
curl -X GET \ https://api.dialstack.ai/v1/audio_clips/%7Baudio_clip_id%7D \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "id": "string",
- "name": "Hold Music",
- "mime_type": "audio/wav",
- "duration_ms": 30000,
- "size_bytes": 240000,
- "source_sha256": "113a95dbbfd24492fb4e527b58d64aece235d6a5057ea671dbf2fe980a9cf6a3",
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}Updates an audio clip's display name.
| audio_clip_id required | string Audio clip identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| name | string [ 1 .. 255 ] characters New display name |
| id required | string Unique identifier |
| name required | string Display name (unique per account) |
| url required | string Signed URL for downloading the audio file (expires after 5 minutes) |
| mime_type required | string MIME type of the stored audio file |
| duration_ms required | integer Duration of the audio clip in milliseconds |
| size_bytes required | integer <int64> Size of the stored audio file in bytes |
| source_sha256 | string or null SHA-256 hash of the original uploaded file (before transcoding) |
| created_at required | string <date-time> (CreatedAt) Timestamp when it was created |
| updated_at required | string <date-time> (UpdatedAt) Timestamp when it was last updated |
{- "name": "Updated Hold Music"
}{- "id": "string",
- "name": "Hold Music",
- "mime_type": "audio/wav",
- "duration_ms": 30000,
- "size_bytes": 240000,
- "source_sha256": "113a95dbbfd24492fb4e527b58d64aece235d6a5057ea671dbf2fe980a9cf6a3",
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}Deletes an audio clip.
| audio_clip_id required | string Audio clip identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
curl -X DELETE \ https://api.dialstack.ai/v1/audio_clips/%7Baudio_clip_id%7D \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "error": "Invalid request body",
- "code": "validation_error",
- "details": { }
}Phone number (DID) management including search, ordering, and disconnect.
Requires account context via DialStack-Account header or session token.
For porting existing numbers from another carrier, see Number Porting.
List all phone numbers assigned to the account. Results are returned in reverse chronological order (newest first).
| limit | integer [ 1 .. 100 ] Default: 10 Example: limit=10 Number of objects to return. Defaults to 10. Maximum is 100. |
| status | string Enum: "active" "inactive" "pending" "released" Example: status=active Filter by phone number status |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| object required | string (ListObject) Value: "list" String representing the object's type. Always "list" for list responses. |
| url required | string (ListUrl) The URL for accessing this list. |
| next_page_url required | string or null (NextPageUrl) URL to fetch the next page of results. If |
| previous_page_url required | string or null (PreviousPageUrl) URL to fetch the previous page of results. If |
required | Array of objects (PhoneNumber) |
curl -X GET \ 'https://api.dialstack.ai/v1/phone-numbers?limit=10&status=active' \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "object": "list",
- "url": "/v1/phone-numbers",
- "next_page_url": null,
- "previous_page_url": null,
- "data": [
- {
- "id": "did_01h2xcejqtf2nbrexx3vqjhp46",
- "phone_number": "+14155551234",
- "status": "active",
- "outbound_enabled": true,
- "routing_target": null,
- "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T10:00:00Z"
}
]
}Retrieve a phone number by ID.
| phone_number_id required | string Example: did_01h2xcejqtf2nbrexx3vqjhp46 Phone number identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| id required | string Unique identifier |
| phone_number required | string <= 20 characters Phone number in E.164 format |
| status required | string Enum: "active" "inactive" "released" Current status of the phone number |
| outbound_enabled required | boolean Whether this phone number can be used for outbound calling |
| expires_at required | string or null <date-time> When the phone number is scheduled to be released back to the carrier. Set on temporary numbers issued during signup; null on permanent numbers. |
| disconnected_at required | string or null <date-time> When the phone number was released back to the carrier. Null while the number is in service. |
| caller_id_name | string or null <= 15 characters The caller ID name (CNAM) configured for this phone number, or null if not set |
| directory_listing_name | string or null The business name used for directory listing (411/white pages), or null if not set |
| directory_listing_type | string Enum: "listed" "non_listed" "non_published" "non_registered" How the number appears in directory services |
| directory_listing_location_id | string or null ID of the location whose address is published in the directory listing, or null |
| routing_target required | string or null ID of the target that inbound calls to this number are routed to, or null if no routing is configured |
| created_at required | string <date-time> Timestamp when it was created |
| updated_at required | string <date-time> Timestamp when it was last updated |
curl -X GET \ https://api.dialstack.ai/v1/phone-numbers/did_01h2xcejqtf2nbrexx3vqjhp46 \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
- "phone_number": "+14155551234",
- "status": "active",
- "outbound_enabled": true,
- "expires_at": null,
- "disconnected_at": null,
- "caller_id_name": "ACME Corp",
- "directory_listing_name": "Acme Corporation",
- "directory_listing_type": "listed",
- "directory_listing_location_id": null,
- "routing_target": null,
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}Update properties of a phone number.
| phone_number_id required | string Example: did_01h2xcejqtf2nbrexx3vqjhp46 Phone number identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| outbound_enabled | boolean Whether this phone number can be used for outbound calling |
| status | string Enum: "active" "inactive" Set to |
| expires_at | string or null <date-time> Set to |
| directory_listing_name | string Business name for the directory listing |
| directory_listing_type | string Enum: "listed" "non_listed" "non_published" "non_registered" How the number appears in directory services. Setting to a non-registered type removes any existing listing. Setting to listed, non_listed, or non_published submits a directory listing order. |
| directory_listing_location_id | string ID of the location whose address to use for the listing. Required when directory_listing_type is not non_registered. |
| caller_id_name | string <= 15 characters Caller ID (CNAM) display name. Max 15 ASCII characters per the CNAM standard. Submits an asynchronous order to the upstream provider. The phone number must be in |
| caller_id_visibility | string Default: "PUBLIC" Enum: "PUBLIC" "PRIVATE" Whether the caller ID name is publicly visible |
| id required | string Unique identifier |
| phone_number required | string <= 20 characters Phone number in E.164 format |
| status required | string Enum: "active" "inactive" "released" Current status of the phone number |
| outbound_enabled required | boolean Whether this phone number can be used for outbound calling |
| expires_at required | string or null <date-time> When the phone number is scheduled to be released back to the carrier. Set on temporary numbers issued during signup; null on permanent numbers. |
| disconnected_at required | string or null <date-time> When the phone number was released back to the carrier. Null while the number is in service. |
| caller_id_name | string or null <= 15 characters The caller ID name (CNAM) configured for this phone number, or null if not set |
| directory_listing_name | string or null The business name used for directory listing (411/white pages), or null if not set |
| directory_listing_type | string Enum: "listed" "non_listed" "non_published" "non_registered" How the number appears in directory services |
| directory_listing_location_id | string or null ID of the location whose address is published in the directory listing, or null |
| routing_target required | string or null ID of the target that inbound calls to this number are routed to, or null if no routing is configured |
| created_at required | string <date-time> Timestamp when it was created |
| updated_at required | string <date-time> Timestamp when it was last updated |
{- "outbound_enabled": false
}{- "id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
- "phone_number": "+14155551234",
- "status": "active",
- "outbound_enabled": true,
- "expires_at": null,
- "disconnected_at": null,
- "caller_id_name": "ACME Corp",
- "directory_listing_name": "Acme Corporation",
- "directory_listing_type": "listed",
- "directory_listing_location_id": null,
- "routing_target": null,
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}Search for phone numbers available for purchase.
At least one search filter is required: area_code, state, zip, npa_nxx, or city combined with state.
Filters can be combined to narrow results.
| area_code | string^\d{3}$ Example: area_code=919 Three-digit area code to search |
| city | string Example: city=Raleigh City name (requires |
| state | string^[A-Z]{2}$ Example: state=NC Two-letter state abbreviation (can be used alone or with |
| zip | string^\d{5}$ Example: zip=27601 Five-digit US ZIP code |
| npa_nxx | string^\d{6}$ Example: npa_nxx=919555 Six-digit NPA-NXX prefix (area code + exchange) |
| quantity | integer [ 1 .. 100 ] Default: 10 Number of results to return (1-100, default 10) |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
required | Array of objects (AvailablePhoneNumber) | ||||||||||
Array
| |||||||||||
curl -X GET \ 'https://api.dialstack.ai/v1/available-phone-numbers?area_code=919&city=Raleigh&state=NC&zip=27601&npa_nxx=919555&quantity=SOME_INTEGER_VALUE' \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "data": [
- {
- "phone_number": "+19195551234",
- "city": "RALEIGH",
- "state": "NC",
- "rate_center": "RALEIGH",
- "lata": "422"
}, - {
- "phone_number": "+19195555678",
- "city": "RALEIGH",
- "state": "NC",
- "rate_center": "RALEIGH",
- "lata": "422"
}
]
}Order one or more new phone numbers. Numbers must have been found via the
search endpoint (GET /v1/available-phone-numbers). This endpoint is for
acquiring new numbers only — it does not support porting existing numbers
from another provider.
The order is created in pending status and typically completes within
seconds. Poll the order via GET /v1/phone-number-orders/{order_id} or
configure a webhook to be notified when it reaches a terminal status
(complete, partial, or failed).
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| phone_numbers required | Array of strings [ 1 .. 100 ] items Phone numbers to order (E.164 format) |
| partial_allowed | boolean Default: false When true, the order may partially complete — available numbers are provisioned and unavailable ones are marked as failed. When false (default), the entire order fails if any number is unavailable. |
| id required | string Unique identifier |
| order_type required | string Enum: "purchase" "disconnect"
|
| status required | string Enum: "pending" "complete" "partial" "failed"
|
| phone_numbers required | Array of strings Phone numbers included in the order (E.164 format) |
| completed_numbers required | Array of strings Phone numbers that completed successfully |
| failed_numbers required | Array of strings Phone numbers that failed |
| error_message | string or null Error details if the order failed |
| created_at required | string <date-time> Timestamp when it was created |
| updated_at required | string <date-time> Timestamp when it was last updated |
{- "phone_numbers": [
- "+19195551234",
- "+19195555678"
]
}{- "id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
- "order_type": "purchase",
- "status": "pending",
- "phone_numbers": [
- "+19195551234",
- "+19195555678"
], - "completed_numbers": [
- "+19195551234"
], - "failed_numbers": [ ],
- "error_message": "string",
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}Returns a paginated list of phone number orders for the account. Includes both purchase and disconnect orders. Results are returned in reverse chronological order (newest first).
| limit | integer [ 1 .. 100 ] Default: 10 Example: limit=10 Number of objects to return. Defaults to 10. Maximum is 100. |
| status | string Enum: "pending" "complete" "partial" "failed" Filter by order status |
| order_type | string Enum: "order" "disconnect" Filter by order type |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| object required | string (ListObject) Value: "list" String representing the object's type. Always "list" for list responses. |
| url required | string (ListUrl) The URL for accessing this list. |
| next_page_url required | string or null (NextPageUrl) URL to fetch the next page of results. If |
| previous_page_url required | string or null (PreviousPageUrl) URL to fetch the previous page of results. If |
required | Array of objects (NumberOrder) |
curl -X GET \ 'https://api.dialstack.ai/v1/phone-number-orders?limit=10&status=SOME_STRING_VALUE&order_type=SOME_STRING_VALUE' \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "object": "list",
- "url": "/v1/accounts",
- "next_page_url": "/v1/accounts?page=eyJzdGFydGluZ19hZnRlciI6ImFjY3RfMDFoMnhjZWpxdGYybmJyZXh4M3ZxamhwNDEiLCJsaW1pdCI6MTB9",
- "previous_page_url": "/v1/accounts?page=eyJlbmRpbmdfYmVmb3JlIjoiYWNjdF8wMWgyeGNlanF0ZjJuYnJleHgzdnFqaHA0MSIsImxpbWl0IjoxMH0",
- "data": [
- {
- "id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
- "order_type": "purchase",
- "status": "pending",
- "phone_numbers": [
- "+19195551234",
- "+19195555678"
], - "completed_numbers": [
- "+19195551234"
], - "failed_numbers": [ ],
- "error_message": "string",
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}
]
}Retrieves a phone number order by ID. If the order is still pending, the status is refreshed from the provider before returning.
| order_id required | string Example: nord_01h2xcejqtf2nbrexx3vqjhp47 Phone number order identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| id required | string Unique identifier |
| order_type required | string Enum: "purchase" "disconnect"
|
| status required | string Enum: "pending" "complete" "partial" "failed"
|
| phone_numbers required | Array of strings Phone numbers included in the order (E.164 format) |
| completed_numbers required | Array of strings Phone numbers that completed successfully |
| failed_numbers required | Array of strings Phone numbers that failed |
| error_message | string or null Error details if the order failed |
| created_at required | string <date-time> Timestamp when it was created |
| updated_at required | string <date-time> Timestamp when it was last updated |
curl -X GET \ https://api.dialstack.ai/v1/phone-number-orders/nord_01h2xcejqtf2nbrexx3vqjhp47 \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
- "order_type": "purchase",
- "status": "pending",
- "phone_numbers": [
- "+19195551234",
- "+19195555678"
], - "completed_numbers": [
- "+19195551234"
], - "failed_numbers": [ ],
- "error_message": "string",
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}Release a phone number back to the provider. Creates a disconnect order
that transitions the phone number to released status on completion.
| phone_number_id required | string Example: did_01h2xcejqtf2nbrexx3vqjhp46 Phone number identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| id required | string Unique identifier |
| order_type required | string Enum: "purchase" "disconnect"
|
| status required | string Enum: "pending" "complete" "partial" "failed"
|
| phone_numbers required | Array of strings Phone numbers included in the order (E.164 format) |
| completed_numbers required | Array of strings Phone numbers that completed successfully |
| failed_numbers required | Array of strings Phone numbers that failed |
| error_message | string or null Error details if the order failed |
| created_at required | string <date-time> Timestamp when it was created |
| updated_at required | string <date-time> Timestamp when it was last updated |
curl -X POST \ https://api.dialstack.ai/v1/phone-numbers/did_01h2xcejqtf2nbrexx3vqjhp46/disconnect \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
- "order_type": "purchase",
- "status": "pending",
- "phone_numbers": [
- "+19195551234",
- "+19195555678"
], - "completed_numbers": [
- "+19195551234"
], - "failed_numbers": [ ],
- "error_message": "string",
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}Move a phone number to a different account.
On reassignment, the routing target is cleared and outbound calling is disabled.
The phone number must be in active or inactive status.
| phone_number_id required | string Example: did_01h2xcejqtf2nbrexx3vqjhp46 Phone number identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| target_account_id required | string ID of the account to reassign the phone number to |
| id required | string Unique identifier |
| phone_number required | string <= 20 characters Phone number in E.164 format |
| status required | string Enum: "active" "inactive" "released" Current status of the phone number |
| outbound_enabled required | boolean Whether this phone number can be used for outbound calling |
| expires_at required | string or null <date-time> When the phone number is scheduled to be released back to the carrier. Set on temporary numbers issued during signup; null on permanent numbers. |
| disconnected_at required | string or null <date-time> When the phone number was released back to the carrier. Null while the number is in service. |
| caller_id_name | string or null <= 15 characters The caller ID name (CNAM) configured for this phone number, or null if not set |
| directory_listing_name | string or null The business name used for directory listing (411/white pages), or null if not set |
| directory_listing_type | string Enum: "listed" "non_listed" "non_published" "non_registered" How the number appears in directory services |
| directory_listing_location_id | string or null ID of the location whose address is published in the directory listing, or null |
| routing_target required | string or null ID of the target that inbound calls to this number are routed to, or null if no routing is configured |
| created_at required | string <date-time> Timestamp when it was created |
| updated_at required | string <date-time> Timestamp when it was last updated |
{- "target_account_id": "acct_01h2xcejqtf2nbrexx3vqjhp47"
}{- "id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
- "phone_number": "+14155551234",
- "status": "active",
- "outbound_enabled": true,
- "expires_at": null,
- "disconnected_at": null,
- "caller_id_name": "ACME Corp",
- "directory_listing_name": "Acme Corporation",
- "directory_listing_type": "listed",
- "directory_listing_location_id": null,
- "routing_target": null,
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}Set or clear the routing target for a phone number. The routing target determines where inbound calls to this number are directed.
Send a target ID to route calls to that target, or null to clear
the current routing. Omitting the routing_target key returns the
current phone number state unchanged.
| phone_number_id required | string Example: did_01h2xcejqtf2nbrexx3vqjhp46 Phone number identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| routing_target | string or null ID of the target to route inbound calls to, or null to clear routing |
| id required | string Unique identifier |
| phone_number required | string <= 20 characters Phone number in E.164 format |
| status required | string Enum: "active" "inactive" "released" Current status of the phone number |
| outbound_enabled required | boolean Whether this phone number can be used for outbound calling |
| expires_at required | string or null <date-time> When the phone number is scheduled to be released back to the carrier. Set on temporary numbers issued during signup; null on permanent numbers. |
| disconnected_at required | string or null <date-time> When the phone number was released back to the carrier. Null while the number is in service. |
| caller_id_name | string or null <= 15 characters The caller ID name (CNAM) configured for this phone number, or null if not set |
| directory_listing_name | string or null The business name used for directory listing (411/white pages), or null if not set |
| directory_listing_type | string Enum: "listed" "non_listed" "non_published" "non_registered" How the number appears in directory services |
| directory_listing_location_id | string or null ID of the location whose address is published in the directory listing, or null |
| routing_target required | string or null ID of the target that inbound calls to this number are routed to, or null if no routing is configured |
| created_at required | string <date-time> Timestamp when it was created |
| updated_at required | string <date-time> Timestamp when it was last updated |
{- "routing_target": "user_01h2xcejqtf2nbrexx3vqjhp48"
}{- "id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
- "phone_number": "+14155551234",
- "status": "active",
- "outbound_enabled": true,
- "expires_at": null,
- "disconnected_at": null,
- "caller_id_name": "ACME Corp",
- "directory_listing_name": "Acme Corporation",
- "directory_listing_type": "listed",
- "directory_listing_location_id": null,
- "routing_target": null,
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}Number porting (port-in) management. Transfer existing phone numbers from another
carrier to DialStack. The eligibility check endpoint does not require the
DialStack-Account header.
Check whether phone numbers are eligible for porting to DialStack. Returns carrier information for portable numbers and rate center details for non-portable numbers.
This is a pre-purchase check and does not require an account context.
| phone_numbers required | Array of strings [ 1 .. 100 ] items US phone numbers to check (E.164 format, no toll-free) |
Array of objects (PortableNumber) Numbers that can be ported | |
Array of objects (NonPortableNumber) Numbers that cannot be ported |
{- "phone_numbers": [
- "+12025551234",
- "+14155559876"
]
}{- "portable_numbers": [
- {
- "phone_number": "+14155559876",
- "losing_carrier_name": "T-Mobile US-SVR-10X/2",
- "losing_carrier_spid": "6529",
- "is_wireless": true,
- "account_number_required": true
}
], - "non_portable_numbers": [
- {
- "phone_number": "+12025551234",
- "rate_center": "WASHINGT DC",
- "city": "Washington",
- "state": "DC"
}
]
}Create a new port order in draft status. After creating the draft, approve
the order with an electronic signature, then submit it to begin the porting process.
Phone numbers are validated and normalized to E.164 format. Toll-free numbers are not supported.
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| phone_numbers required | Array of strings [ 1 .. 100 ] items US phone numbers to port (E.164 format, no toll-free) |
required | object (PortSubscriber) Subscriber and authorization information for the port request |
| requested_foc_date required | string <date> Requested date for the port to complete (YYYY-MM-DD). Must be at least 5 business days and no more than 30 calendar days from today (excludes weekends and US federal holidays). |
| requested_foc_time | string Requested time for the port to complete, in HH:MM format (08:00-20:00 Eastern). Optional. |
| id required | string Unique identifier |
| status required | string Enum: "draft" "approved" "submitted" "exception" "foc" "complete" "cancelled" Current status of the port order |
required | object (PortOrderDetails) Details of the port order including phone numbers, subscriber information, and document metadata |
| submitted_at | string or null <date-time> When the order was submitted for processing |
| created_at required | string <date-time> Timestamp when it was created |
| updated_at required | string <date-time> Timestamp when it was last updated |
{- "phone_numbers": [
- "+12025551234"
], - "subscriber": {
- "btn": "+12025551234",
- "business_name": "Doe Enterprises",
- "approver_name": "John Doe",
- "address": {
- "house_number": "123",
- "street_name": "Main St",
- "city": "Anytown",
- "state": "VA",
- "zip": "22030"
}
}, - "requested_foc_date": "2026-03-01"
}{- "id": "por_01h2xcejqtf2nbrexx3vqjhp53",
- "status": "draft",
- "details": {
- "phone_numbers": [
- "+12025551234"
], - "subscriber": {
- "btn": "+12025551234",
- "business_name": "Doe Enterprises",
- "approver_name": "John Doe",
- "account_number": "123456789",
- "pin": "1234",
- "address": {
- "house_number": "123",
- "street_name": "Main St",
- "line2": "Suite 200",
- "city": "Anytown",
- "state": "VA",
- "zip": "22030"
}
}, - "requested_foc_date": "2026-03-01",
- "requested_foc_time": "10:00",
- "actual_foc_date": "2026-03-01T10:00:00Z",
- "losing_carrier": {
- "name": "Verizon",
- "spid": "1234",
- "port_type": "automated"
}, - "approval": {
- "signature": "Jane Smith",
- "ip": "203.0.113.42",
- "timestamp": "2026-02-15T14:02:00Z"
}, - "rejection": {
- "code": "address_mismatch",
- "message": "Service address mismatch"
}, - "loa": {
- "content_type": "application/pdf",
- "file_size": 123456
}, - "csr": {
- "content_type": "application/pdf",
- "file_size": 123456
}, - "bill_copy": {
- "content_type": "application/pdf",
- "file_size": 123456
}
}, - "submitted_at": "2026-02-15T14:30:00Z",
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}Returns a paginated list of port orders for the account. Results are returned in reverse chronological order (newest first). Optionally filter by status.
| limit | integer [ 1 .. 100 ] Default: 10 Example: limit=10 Number of objects to return. Defaults to 10. Maximum is 100. |
| status | string Enum: "draft" "approved" "submitted" "exception" "foc" "complete" "cancelled" Filter by port order status |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| object required | string (ListObject) Value: "list" String representing the object's type. Always "list" for list responses. |
| url required | string (ListUrl) The URL for accessing this list. |
| next_page_url required | string or null (NextPageUrl) URL to fetch the next page of results. If |
| previous_page_url required | string or null (PreviousPageUrl) URL to fetch the previous page of results. If |
required | Array of objects (PortOrder) |
curl -X GET \ 'https://api.dialstack.ai/v1/port-orders?limit=10&status=SOME_STRING_VALUE' \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "object": "list",
- "url": "/v1/accounts",
- "next_page_url": "/v1/accounts?page=eyJzdGFydGluZ19hZnRlciI6ImFjY3RfMDFoMnhjZWpxdGYybmJyZXh4M3ZxamhwNDEiLCJsaW1pdCI6MTB9",
- "previous_page_url": "/v1/accounts?page=eyJlbmRpbmdfYmVmb3JlIjoiYWNjdF8wMWgyeGNlanF0ZjJuYnJleHgzdnFqaHA0MSIsImxpbWl0IjoxMH0",
- "data": [
- {
- "id": "por_01h2xcejqtf2nbrexx3vqjhp53",
- "status": "draft",
- "details": {
- "phone_numbers": [
- "+12025551234"
], - "subscriber": {
- "btn": "+12025551234",
- "business_name": "Doe Enterprises",
- "approver_name": "John Doe",
- "account_number": "123456789",
- "pin": "1234",
- "address": {
- "house_number": "123",
- "street_name": "Main St",
- "line2": "Suite 200",
- "city": "Anytown",
- "state": "VA",
- "zip": "22030"
}
}, - "requested_foc_date": "2026-03-01",
- "requested_foc_time": "10:00",
- "actual_foc_date": "2026-03-01T10:00:00Z",
- "losing_carrier": {
- "name": "Verizon",
- "spid": "1234",
- "port_type": "automated"
}, - "approval": {
- "signature": "Jane Smith",
- "ip": "203.0.113.42",
- "timestamp": "2026-02-15T14:02:00Z"
}, - "rejection": {
- "code": "address_mismatch",
- "message": "Service address mismatch"
}, - "loa": {
- "content_type": "application/pdf",
- "file_size": 123456
}, - "csr": {
- "content_type": "application/pdf",
- "file_size": 123456
}, - "bill_copy": {
- "content_type": "application/pdf",
- "file_size": 123456
}
}, - "submitted_at": "2026-02-15T14:30:00Z",
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}
]
}Retrieve a port order by ID. If the order is in a non-terminal status
(submitted, exception, or foc), the status is automatically refreshed
from the carrier before returning.
| order_id required | string Example: por_01h2xcejqtf2nbrexx3vqjhp53 Port order identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| id required | string Unique identifier |
| status required | string Enum: "draft" "approved" "submitted" "exception" "foc" "complete" "cancelled" Current status of the port order |
required | object (PortOrderDetails) Details of the port order including phone numbers, subscriber information, and document metadata |
| submitted_at | string or null <date-time> When the order was submitted for processing |
| created_at required | string <date-time> Timestamp when it was created |
| updated_at required | string <date-time> Timestamp when it was last updated |
curl -X GET \ https://api.dialstack.ai/v1/port-orders/por_01h2xcejqtf2nbrexx3vqjhp53 \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "id": "por_01h2xcejqtf2nbrexx3vqjhp53",
- "status": "draft",
- "details": {
- "phone_numbers": [
- "+12025551234"
], - "subscriber": {
- "btn": "+12025551234",
- "business_name": "Doe Enterprises",
- "approver_name": "John Doe",
- "account_number": "123456789",
- "pin": "1234",
- "address": {
- "house_number": "123",
- "street_name": "Main St",
- "line2": "Suite 200",
- "city": "Anytown",
- "state": "VA",
- "zip": "22030"
}
}, - "requested_foc_date": "2026-03-01",
- "requested_foc_time": "10:00",
- "actual_foc_date": "2026-03-01T10:00:00Z",
- "losing_carrier": {
- "name": "Verizon",
- "spid": "1234",
- "port_type": "automated"
}, - "approval": {
- "signature": "Jane Smith",
- "ip": "203.0.113.42",
- "timestamp": "2026-02-15T14:02:00Z"
}, - "rejection": {
- "code": "address_mismatch",
- "message": "Service address mismatch"
}, - "loa": {
- "content_type": "application/pdf",
- "file_size": 123456
}, - "csr": {
- "content_type": "application/pdf",
- "file_size": 123456
}, - "bill_copy": {
- "content_type": "application/pdf",
- "file_size": 123456
}
}, - "submitted_at": "2026-02-15T14:30:00Z",
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}Update a port order that is in approved or exception status. Use this to correct
information that caused a rejection, then resubmit. All fields are optional —
only provided fields are updated. Updating an approved order clears the approval
and reverts the status to draft.
| order_id required | string Example: por_01h2xcejqtf2nbrexx3vqjhp53 Port order identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| phone_numbers | Array of strings [ 1 .. 100 ] items Updated phone numbers (E.164 format, no toll-free) |
object (PortSubscriber) Subscriber and authorization information for the port request | |
| requested_foc_date | string <date> Updated requested completion date (YYYY-MM-DD). Must be at least 5 business days and no more than 30 calendar days from today. |
| requested_foc_time | string Updated requested completion time in HH:MM format (08:00-20:00 Eastern) |
| resubmit | boolean Default: false When true and the order is in |
| id required | string Unique identifier |
| status required | string Enum: "draft" "approved" "submitted" "exception" "foc" "complete" "cancelled" Current status of the port order |
required | object (PortOrderDetails) Details of the port order including phone numbers, subscriber information, and document metadata |
| submitted_at | string or null <date-time> When the order was submitted for processing |
| created_at required | string <date-time> Timestamp when it was created |
| updated_at required | string <date-time> Timestamp when it was last updated |
{- "subscriber": {
- "btn": "+12025551234",
- "business_name": "Doe Enterprises",
- "approver_name": "John Doe",
- "address": {
- "house_number": "456",
- "street_name": "Oak Ave",
- "city": "Anytown",
- "state": "VA",
- "zip": "22030"
}
}
}{- "id": "por_01h2xcejqtf2nbrexx3vqjhp53",
- "status": "draft",
- "details": {
- "phone_numbers": [
- "+12025551234"
], - "subscriber": {
- "btn": "+12025551234",
- "business_name": "Doe Enterprises",
- "approver_name": "John Doe",
- "account_number": "123456789",
- "pin": "1234",
- "address": {
- "house_number": "123",
- "street_name": "Main St",
- "line2": "Suite 200",
- "city": "Anytown",
- "state": "VA",
- "zip": "22030"
}
}, - "requested_foc_date": "2026-03-01",
- "requested_foc_time": "10:00",
- "actual_foc_date": "2026-03-01T10:00:00Z",
- "losing_carrier": {
- "name": "Verizon",
- "spid": "1234",
- "port_type": "automated"
}, - "approval": {
- "signature": "Jane Smith",
- "ip": "203.0.113.42",
- "timestamp": "2026-02-15T14:02:00Z"
}, - "rejection": {
- "code": "address_mismatch",
- "message": "Service address mismatch"
}, - "loa": {
- "content_type": "application/pdf",
- "file_size": 123456
}, - "csr": {
- "content_type": "application/pdf",
- "file_size": 123456
}, - "bill_copy": {
- "content_type": "application/pdf",
- "file_size": 123456
}
}, - "submitted_at": "2026-02-15T14:30:00Z",
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}Submit an approved port order for processing. The order must first be approved by the customer.
On success, the order status transitions from approved to submitted.
The necessary authorization documents are generated and forwarded to the
carrier automatically.
| order_id required | string Example: por_01h2xcejqtf2nbrexx3vqjhp53 Port order identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| id required | string Unique identifier |
| status required | string Enum: "draft" "approved" "submitted" "exception" "foc" "complete" "cancelled" Current status of the port order |
required | object (PortOrderDetails) Details of the port order including phone numbers, subscriber information, and document metadata |
| submitted_at | string or null <date-time> When the order was submitted for processing |
| created_at required | string <date-time> Timestamp when it was created |
| updated_at required | string <date-time> Timestamp when it was last updated |
curl -X POST \ https://api.dialstack.ai/v1/port-orders/por_01h2xcejqtf2nbrexx3vqjhp53/submit \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "id": "por_01h2xcejqtf2nbrexx3vqjhp53",
- "status": "draft",
- "details": {
- "phone_numbers": [
- "+12025551234"
], - "subscriber": {
- "btn": "+12025551234",
- "business_name": "Doe Enterprises",
- "approver_name": "John Doe",
- "account_number": "123456789",
- "pin": "1234",
- "address": {
- "house_number": "123",
- "street_name": "Main St",
- "line2": "Suite 200",
- "city": "Anytown",
- "state": "VA",
- "zip": "22030"
}
}, - "requested_foc_date": "2026-03-01",
- "requested_foc_time": "10:00",
- "actual_foc_date": "2026-03-01T10:00:00Z",
- "losing_carrier": {
- "name": "Verizon",
- "spid": "1234",
- "port_type": "automated"
}, - "approval": {
- "signature": "Jane Smith",
- "ip": "203.0.113.42",
- "timestamp": "2026-02-15T14:02:00Z"
}, - "rejection": {
- "code": "address_mismatch",
- "message": "Service address mismatch"
}, - "loa": {
- "content_type": "application/pdf",
- "file_size": 123456
}, - "csr": {
- "content_type": "application/pdf",
- "file_size": 123456
}, - "bill_copy": {
- "content_type": "application/pdf",
- "file_size": 123456
}
}, - "submitted_at": "2026-02-15T14:30:00Z",
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}Cancel a port order. Draft and approved orders are cancelled locally. Submitted orders are also cancelled with the carrier.
Cannot cancel orders in terminal status (complete or cancelled).
| order_id required | string Example: por_01h2xcejqtf2nbrexx3vqjhp53 Port order identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| id required | string Unique identifier |
| status required | string Enum: "draft" "approved" "submitted" "exception" "foc" "complete" "cancelled" Current status of the port order |
required | object (PortOrderDetails) Details of the port order including phone numbers, subscriber information, and document metadata |
| submitted_at | string or null <date-time> When the order was submitted for processing |
| created_at required | string <date-time> Timestamp when it was created |
| updated_at required | string <date-time> Timestamp when it was last updated |
curl -X POST \ https://api.dialstack.ai/v1/port-orders/por_01h2xcejqtf2nbrexx3vqjhp53/cancel \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "id": "por_01h2xcejqtf2nbrexx3vqjhp53",
- "status": "draft",
- "details": {
- "phone_numbers": [
- "+12025551234"
], - "subscriber": {
- "btn": "+12025551234",
- "business_name": "Doe Enterprises",
- "approver_name": "John Doe",
- "account_number": "123456789",
- "pin": "1234",
- "address": {
- "house_number": "123",
- "street_name": "Main St",
- "line2": "Suite 200",
- "city": "Anytown",
- "state": "VA",
- "zip": "22030"
}
}, - "requested_foc_date": "2026-03-01",
- "requested_foc_time": "10:00",
- "actual_foc_date": "2026-03-01T10:00:00Z",
- "losing_carrier": {
- "name": "Verizon",
- "spid": "1234",
- "port_type": "automated"
}, - "approval": {
- "signature": "Jane Smith",
- "ip": "203.0.113.42",
- "timestamp": "2026-02-15T14:02:00Z"
}, - "rejection": {
- "code": "address_mismatch",
- "message": "Service address mismatch"
}, - "loa": {
- "content_type": "application/pdf",
- "file_size": 123456
}, - "csr": {
- "content_type": "application/pdf",
- "file_size": 123456
}, - "bill_copy": {
- "content_type": "application/pdf",
- "file_size": 123456
}
}, - "submitted_at": "2026-02-15T14:30:00Z",
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}Have the customer approve a port order by providing their electronic signature and IP address. This authorizes the number transfer and allows the order to be submitted.
The order must be in draft status and must have subscriber details.
On success, the order status transitions from draft to approved. If the order
details are updated after approval, the approval is cleared and the status reverts
to draft — the customer must approve again.
| order_id required | string Example: por_01h2xcejqtf2nbrexx3vqjhp53 Port order identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| signature required | string Electronic signature (the customer's typed name authorizing the port) |
| ip required | string IP address of the customer approving the order |
| id required | string Unique identifier |
| status required | string Enum: "draft" "approved" "submitted" "exception" "foc" "complete" "cancelled" Current status of the port order |
required | object (PortOrderDetails) Details of the port order including phone numbers, subscriber information, and document metadata |
| submitted_at | string or null <date-time> When the order was submitted for processing |
| created_at required | string <date-time> Timestamp when it was created |
| updated_at required | string <date-time> Timestamp when it was last updated |
{- "signature": "Jane Smith",
- "ip": "203.0.113.42"
}{- "id": "por_01h2xcejqtf2nbrexx3vqjhp53",
- "status": "draft",
- "details": {
- "phone_numbers": [
- "+12025551234"
], - "subscriber": {
- "btn": "+12025551234",
- "business_name": "Doe Enterprises",
- "approver_name": "John Doe",
- "account_number": "123456789",
- "pin": "1234",
- "address": {
- "house_number": "123",
- "street_name": "Main St",
- "line2": "Suite 200",
- "city": "Anytown",
- "state": "VA",
- "zip": "22030"
}
}, - "requested_foc_date": "2026-03-01",
- "requested_foc_time": "10:00",
- "actual_foc_date": "2026-03-01T10:00:00Z",
- "losing_carrier": {
- "name": "Verizon",
- "spid": "1234",
- "port_type": "automated"
}, - "approval": {
- "signature": "Jane Smith",
- "ip": "203.0.113.42",
- "timestamp": "2026-02-15T14:02:00Z"
}, - "rejection": {
- "code": "address_mismatch",
- "message": "Service address mismatch"
}, - "loa": {
- "content_type": "application/pdf",
- "file_size": 123456
}, - "csr": {
- "content_type": "application/pdf",
- "file_size": 123456
}, - "bill_copy": {
- "content_type": "application/pdf",
- "file_size": 123456
}
}, - "submitted_at": "2026-02-15T14:30:00Z",
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}Upload an optional Customer Service Record (CSR) document for a port order. A CSR can help resolve porting issues by providing carrier account details.
Accepted formats: PDF, PNG, JPG, TIFF. Maximum file size: 3 MB.
| order_id required | string Example: por_01h2xcejqtf2nbrexx3vqjhp53 Port order identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| file required | string <binary> CSR document file |
| message | string |
curl -X POST \ https://api.dialstack.ai/v1/port-orders/por_01h2xcejqtf2nbrexx3vqjhp53/csr \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41' \ -H 'content-type: multipart/form-data' \ --form file=string
{- "message": "csr uploaded successfully"
}Download the Customer Service Record (CSR) document for a port order.
| order_id required | string Example: por_01h2xcejqtf2nbrexx3vqjhp53 Port order identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
curl -X GET \ https://api.dialstack.ai/v1/port-orders/por_01h2xcejqtf2nbrexx3vqjhp53/csr \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "error": "Invalid request body",
- "code": "validation_error",
- "details": { }
}Upload an optional bill copy document for a port order. A bill copy can help resolve porting issues by providing carrier account details.
Accepted formats: PDF, PNG, JPG, TIFF. Maximum file size: 3 MB.
| order_id required | string Example: por_01h2xcejqtf2nbrexx3vqjhp53 Port order identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| file required | string <binary> Bill copy document file |
| message | string |
curl -X POST \ https://api.dialstack.ai/v1/port-orders/por_01h2xcejqtf2nbrexx3vqjhp53/bill-copy \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41' \ -H 'content-type: multipart/form-data' \ --form file=string
{- "message": "bill_copy uploaded successfully"
}Download the bill copy document for a port order.
| order_id required | string Example: por_01h2xcejqtf2nbrexx3vqjhp53 Port order identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
curl -X GET \ https://api.dialstack.ai/v1/port-orders/por_01h2xcejqtf2nbrexx3vqjhp53/bill-copy \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "error": "Invalid request body",
- "code": "validation_error",
- "details": { }
}Returns the audit trail of status changes for a port order, in reverse chronological order.
| order_id required | string Example: por_01h2xcejqtf2nbrexx3vqjhp53 Port order identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| object required | string (ListObject) Value: "list" String representing the object's type. Always "list" for list responses. |
required | Array of objects (PortOrderEvent) |
curl -X GET \ https://api.dialstack.ai/v1/port-orders/por_01h2xcejqtf2nbrexx3vqjhp53/events \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "object": "list",
- "data": [
- {
- "id": "poe_01h2xcejqtf2nbrexx3vqjhp54",
- "port_order_id": "por_01h2xcejqtf2nbrexx3vqjhp53",
- "old_status": "draft",
- "new_status": "draft",
- "bandwidth_status": "string",
- "message": "string",
- "reason_code": "string",
- "created_at": "2025-10-17T14:30:00Z"
}
]
}Business location management.
Locations represent physical offices or business premises with validated addresses.
Requires account context via DialStack-Account header or session token.
Create a new business location with a validated address.
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| name required | string <= 255 characters Display name of the location |
required | object (AddressInput) Address fields for creating or updating a location |
| primary_did_id | string ID of the primary phone number for this location |
| id required | string Unique identifier |
| name required | string <= 255 characters Display name of the location |
required | object (Address) A validated, normalized physical address (embedded value object) |
| primary_did_id | string or null The primary phone number assigned to this location |
| status required | string Enum: "active" "inactive" Operational status of the location |
| e911_status required | string Enum: "none" "pending" "binding" "provisioned" "failed" E911 provisioning status for this location. Managed by the provider; read-only. |
object (LocationConfig) Per-location configuration overrides | |
| created_at required | string <date-time> Timestamp when it was created |
| updated_at required | string <date-time> Timestamp when it was last updated |
{- "name": "Main Office",
- "address": {
- "street": "123 Main St",
- "city": "New York",
- "state": "NY",
- "postal_code": "10001",
- "country": "US"
}
}{- "id": "loc_01h2xcejqtf2nbrexx3vqjhp50",
- "name": "Main Office",
- "address": {
- "city": "New York",
- "state": "NY",
- "postal_code": "10001",
- "country": "US",
- "formatted_address": "123 Main St, New York, NY 10001, US"
}, - "status": "active",
- "e911_status": "none",
- "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T10:00:00Z"
}List all locations for the account. Results are returned in reverse chronological order (newest first).
| limit | integer [ 1 .. 100 ] Default: 10 Example: limit=10 Number of objects to return. Defaults to 10. Maximum is 100. |
| status | string Enum: "active" "inactive" Example: status=active Filter by location status |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| object required | string (ListObject) Value: "list" String representing the object's type. Always "list" for list responses. |
| url required | string (ListUrl) The URL for accessing this list. |
| next_page_url required | string or null (NextPageUrl) URL to fetch the next page of results. If |
| previous_page_url required | string or null (PreviousPageUrl) URL to fetch the previous page of results. If |
required | Array of objects (Location) |
curl -X GET \ 'https://api.dialstack.ai/v1/locations?limit=10&status=active' \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "object": "list",
- "url": "/v1/locations",
- "next_page_url": null,
- "previous_page_url": null,
- "data": [
- {
- "id": "loc_01h2xcejqtf2nbrexx3vqjhp50",
- "name": "Main Office",
- "address": {
- "city": "New York",
- "state": "NY",
- "postal_code": "10001",
- "country": "US",
- "formatted_address": "123 Main St, New York, NY 10001, US"
}, - "status": "active",
- "e911_status": "none",
- "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T10:00:00Z"
}
]
}Retrieve a specific location by ID.
| location_id required | string Example: loc_01h2xcejqtf2nbrexx3vqjhp50 Location identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| id required | string Unique identifier |
| name required | string <= 255 characters Display name of the location |
required | object (Address) A validated, normalized physical address (embedded value object) |
| primary_did_id | string or null The primary phone number assigned to this location |
| status required | string Enum: "active" "inactive" Operational status of the location |
| e911_status required | string Enum: "none" "pending" "binding" "provisioned" "failed" E911 provisioning status for this location. Managed by the provider; read-only. |
object (LocationConfig) Per-location configuration overrides | |
| created_at required | string <date-time> Timestamp when it was created |
| updated_at required | string <date-time> Timestamp when it was last updated |
curl -X GET \ https://api.dialstack.ai/v1/locations/loc_01h2xcejqtf2nbrexx3vqjhp50 \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
- "name": "Main Office",
- "address": {
- "place_id": "string",
- "address_number": "string",
- "street": "string",
- "unit": "string",
- "city": "New York",
- "state": "NY",
- "postal_code": "10001",
- "country": "US",
- "latitude": 0.1,
- "longitude": 0.1,
- "formatted_address": "123 Main St, New York, NY 10001, US"
}, - "primary_did_id": "string",
- "status": "active",
- "e911_status": "none",
- "config": {
- "e911_notification": {
- "emails": [
- "security@example.com",
- "frontdesk@example.com"
]
}
}, - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}Update location details (name, address, primary phone number, or status).
| location_id required | string Example: loc_01h2xcejqtf2nbrexx3vqjhp50 Location identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| name | string <= 255 characters Display name of the location |
object (AddressInput) Address fields for creating or updating a location | |
| primary_did_id | string ID of the primary phone number for this location |
| status | string Enum: "active" "inactive" Operational status of the location |
object (LocationConfig) Per-location configuration overrides |
| id required | string Unique identifier |
| name required | string <= 255 characters Display name of the location |
required | object (Address) A validated, normalized physical address (embedded value object) |
| primary_did_id | string or null The primary phone number assigned to this location |
| status required | string Enum: "active" "inactive" Operational status of the location |
| e911_status required | string Enum: "none" "pending" "binding" "provisioned" "failed" E911 provisioning status for this location. Managed by the provider; read-only. |
object (LocationConfig) Per-location configuration overrides | |
| created_at required | string <date-time> Timestamp when it was created |
| updated_at required | string <date-time> Timestamp when it was last updated |
{- "name": "Updated Office",
- "address": {
- "address_number": "1600",
- "street": "Pennsylvania Avenue NW",
- "unit": "Suite 200",
- "city": "New York",
- "state": "NY",
- "postal_code": "10001",
- "country": "US"
}, - "primary_did_id": "string",
- "status": "active",
- "config": {
- "e911_notification": {
- "emails": [
- "security@example.com",
- "frontdesk@example.com"
]
}
}
}{- "id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
- "name": "Main Office",
- "address": {
- "place_id": "string",
- "address_number": "string",
- "street": "string",
- "unit": "string",
- "city": "New York",
- "state": "NY",
- "postal_code": "10001",
- "country": "US",
- "latitude": 0.1,
- "longitude": 0.1,
- "formatted_address": "123 Main St, New York, NY 10001, US"
}, - "primary_did_id": "string",
- "status": "active",
- "e911_status": "none",
- "config": {
- "e911_notification": {
- "emails": [
- "security@example.com",
- "frontdesk@example.com"
]
}
}, - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}Delete a location and its associated address. This operation is irreversible.
| location_id required | string Example: loc_01h2xcejqtf2nbrexx3vqjhp50 Location identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
curl -X DELETE \ https://api.dialstack.ai/v1/locations/loc_01h2xcejqtf2nbrexx3vqjhp50 \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "error": "Invalid request body",
- "code": "validation_error",
- "details": { }
}Pre-check the location's address for E911 provisioning. Returns the address fields that will be used during provisioning. Full address validation occurs during the provision-e911 call.
| location_id required | string Example: loc_01h2xcejqtf2nbrexx3vqjhp50 Location identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| adjusted required | boolean Whether the address was adjusted during geocoding |
object The geocoded address used for E911 registration |
curl -X POST \ https://api.dialstack.ai/v1/locations/loc_01h2xcejqtf2nbrexx3vqjhp50/validate-e911 \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "adjusted": true,
- "address": {
- "house_number": "string",
- "street_name": "string",
- "pre_directional": "string",
- "street_suffix": "string",
- "post_directional": "string",
- "address_line_2": "string",
- "city": "string",
- "state_code": "string",
- "zip": "string",
- "plus_four": "string",
- "county": "string",
- "country": "string"
}
}Start E911 provisioning for a location.
The location must have a primary phone number assigned.
Provisioning is asynchronous; the e911_status field tracks progress.
| location_id required | string Example: loc_01h2xcejqtf2nbrexx3vqjhp50 Location identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| id required | string Unique identifier |
| name required | string <= 255 characters Display name of the location |
required | object (Address) A validated, normalized physical address (embedded value object) |
| primary_did_id | string or null The primary phone number assigned to this location |
| status required | string Enum: "active" "inactive" Operational status of the location |
| e911_status required | string Enum: "none" "pending" "binding" "provisioned" "failed" E911 provisioning status for this location. Managed by the provider; read-only. |
object (LocationConfig) Per-location configuration overrides | |
| created_at required | string <date-time> Timestamp when it was created |
| updated_at required | string <date-time> Timestamp when it was last updated |
curl -X POST \ https://api.dialstack.ai/v1/locations/loc_01h2xcejqtf2nbrexx3vqjhp50/provision-e911 \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
- "name": "Main Office",
- "address": {
- "place_id": "string",
- "address_number": "string",
- "street": "string",
- "unit": "string",
- "city": "New York",
- "state": "NY",
- "postal_code": "10001",
- "country": "US",
- "latitude": 0.1,
- "longitude": 0.1,
- "formatted_address": "123 Main St, New York, NY 10001, US"
}, - "primary_did_id": "string",
- "status": "active",
- "e911_status": "none",
- "config": {
- "e911_notification": {
- "emails": [
- "security@example.com",
- "frontdesk@example.com"
]
}
}, - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}AI-powered voice agent management.
AI agents provide automated call handling with customizable instructions and FAQ responses.
Each agent automatically manages a voice app and extension for call routing.
Requires account context via DialStack-Account header.
Create a new AI agent within the account. This automatically provisions a managed voice app and extension for call routing.
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| name required | string [ 1 .. 255 ] characters Display name for the AI agent |
| extension_number | string Extension number to assign for routing calls to this agent |
| persona_name | string or null <= 255 characters The name the AI agent uses to introduce itself on calls |
| greeting_name | string or null <= 255 characters The business name used in call greetings (e.g. "Thanks for calling [Greeting Name]"). When not set, the account name is used as a fallback. |
| instructions | string or null <= 10000 characters Custom instructions for the AI agent's behavior |
Array of objects (FAQItem) Pre-configured question-answer pairs | |
object (SchedulingConfig) Scheduling webhook configuration. Scheduling is on when webhook_url is provided, off when absent or empty. DialStack appends standard paths to the base URL for each operation. This is a replace-all object — send the complete configuration on every update. |
| id required | string Unique identifier |
| name required | string or null [ 1 .. 255 ] characters Display name |
| voice_app_id required | string The managed voice app used for call routing |
| persona_name | string or null <= 255 characters The name the AI agent uses to introduce itself on calls (e.g. "Tony"). Defaults to "the receptionist" if not set. |
| greeting_name | string or null <= 255 characters The business name used in call greetings (e.g. "Thanks for calling [Greeting Name]"). When not set, the account name is used as a fallback. |
| instructions | string or null <= 10000 characters Custom instructions for the AI agent's behavior |
required | Array of objects (FAQItem) Pre-configured question-answer pairs |
object (SchedulingConfig) Scheduling webhook configuration. Scheduling is on when webhook_url is provided, off when absent or empty. DialStack appends standard paths to the base URL for each operation. This is a replace-all object — send the complete configuration on every update. | |
| created_at required | string <date-time> (CreatedAt) Timestamp when it was created |
| updated_at required | string <date-time> (UpdatedAt) Timestamp when it was last updated |
{- "name": "Front Desk Receptionist",
- "extension_number": "200",
- "instructions": "You are the receptionist for Jones Family Dental.",
- "faq_responses": [
- {
- "question": "What are your hours?",
- "answer": "Monday through Friday, 9 AM to 5 PM."
}
]
}{- "id": "aia_01h2xcejqtf2nbrexx3vqjhp60",
- "name": "Front Desk Receptionist",
- "voice_app_id": "va_01h2xcejqtf2nbrexx3vqjhp49",
- "persona_name": "Tony",
- "greeting_name": "Jones Family Dental",
- "instructions": "You are the receptionist for Jones Family Dental. Be warm and professional.",
- "faq_responses": [
- {
- "question": "What are your business hours?",
- "answer": "We are open Monday through Friday, 9 AM to 5 PM."
}
], - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}List all AI agents for the account. Results are returned in reverse chronological order (newest first).
| limit | integer [ 1 .. 100 ] Default: 10 Example: limit=10 Number of objects to return. Defaults to 10. Maximum is 100. |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| object required | string (ListObject) Value: "list" String representing the object's type. Always "list" for list responses. |
| url required | string (ListUrl) The URL for accessing this list. |
| next_page_url required | string or null (NextPageUrl) URL to fetch the next page of results. If |
| previous_page_url required | string or null (PreviousPageUrl) URL to fetch the previous page of results. If |
required | Array of objects (AIAgent) |
curl -X GET \ 'https://api.dialstack.ai/v1/ai-agents?limit=10' \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "object": "list",
- "url": "/v1/accounts",
- "next_page_url": "/v1/accounts?page=eyJzdGFydGluZ19hZnRlciI6ImFjY3RfMDFoMnhjZWpxdGYybmJyZXh4M3ZxamhwNDEiLCJsaW1pdCI6MTB9",
- "previous_page_url": "/v1/accounts?page=eyJlbmRpbmdfYmVmb3JlIjoiYWNjdF8wMWgyeGNlanF0ZjJuYnJleHgzdnFqaHA0MSIsImxpbWl0IjoxMH0",
- "data": [
- {
- "id": "aia_01h2xcejqtf2nbrexx3vqjhp60",
- "name": "Front Desk Receptionist",
- "voice_app_id": "va_01h2xcejqtf2nbrexx3vqjhp49",
- "persona_name": "Tony",
- "greeting_name": "Jones Family Dental",
- "instructions": "You are the receptionist for Jones Family Dental. Be warm and professional.",
- "faq_responses": [
- {
- "question": "What are your business hours?",
- "answer": "We are open Monday through Friday, 9 AM to 5 PM."
}
], - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}
]
}Retrieve a specific AI agent by ID.
| ai_agent_id required | string Example: aia_01h2xcejqtf2nbrexx3vqjhp60 AI agent identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| id required | string Unique identifier |
| name required | string or null [ 1 .. 255 ] characters Display name |
| voice_app_id required | string The managed voice app used for call routing |
| persona_name | string or null <= 255 characters The name the AI agent uses to introduce itself on calls (e.g. "Tony"). Defaults to "the receptionist" if not set. |
| greeting_name | string or null <= 255 characters The business name used in call greetings (e.g. "Thanks for calling [Greeting Name]"). When not set, the account name is used as a fallback. |
| instructions | string or null <= 10000 characters Custom instructions for the AI agent's behavior |
required | Array of objects (FAQItem) Pre-configured question-answer pairs |
object (SchedulingConfig) Scheduling webhook configuration. Scheduling is on when webhook_url is provided, off when absent or empty. DialStack appends standard paths to the base URL for each operation. This is a replace-all object — send the complete configuration on every update. | |
| created_at required | string <date-time> (CreatedAt) Timestamp when it was created |
| updated_at required | string <date-time> (UpdatedAt) Timestamp when it was last updated |
curl -X GET \ https://api.dialstack.ai/v1/ai-agents/aia_01h2xcejqtf2nbrexx3vqjhp60 \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "id": "aia_01h2xcejqtf2nbrexx3vqjhp60",
- "name": "Front Desk Receptionist",
- "voice_app_id": "va_01h2xcejqtf2nbrexx3vqjhp49",
- "persona_name": "Tony",
- "greeting_name": "Jones Family Dental",
- "instructions": "You are the receptionist for Jones Family Dental. Be warm and professional.",
- "faq_responses": [
- {
- "question": "What are your business hours?",
- "answer": "We are open Monday through Friday, 9 AM to 5 PM."
}
], - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}Update AI agent details (name, instructions, or FAQ responses).
| ai_agent_id required | string Example: aia_01h2xcejqtf2nbrexx3vqjhp60 AI agent identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| name | string [ 1 .. 255 ] characters Display name for the AI agent |
| persona_name | string or null <= 255 characters The name the AI agent uses to introduce itself on calls |
| greeting_name | string or null <= 255 characters The business name used in call greetings (e.g. "Thanks for calling [Greeting Name]"). When not set, the account name is used as a fallback. |
| instructions | string or null <= 10000 characters Custom instructions for the AI agent's behavior |
Array of objects (FAQItem) Pre-configured question-answer pairs (replaces all existing items) | |
object (SchedulingConfig) Scheduling configuration. Replaces the entire scheduling object (not merged field-by-field). Omit entirely to leave unchanged. |
| id required | string Unique identifier |
| name required | string or null [ 1 .. 255 ] characters Display name |
| voice_app_id required | string The managed voice app used for call routing |
| persona_name | string or null <= 255 characters The name the AI agent uses to introduce itself on calls (e.g. "Tony"). Defaults to "the receptionist" if not set. |
| greeting_name | string or null <= 255 characters The business name used in call greetings (e.g. "Thanks for calling [Greeting Name]"). When not set, the account name is used as a fallback. |
| instructions | string or null <= 10000 characters Custom instructions for the AI agent's behavior |
required | Array of objects (FAQItem) Pre-configured question-answer pairs |
object (SchedulingConfig) Scheduling webhook configuration. Scheduling is on when webhook_url is provided, off when absent or empty. DialStack appends standard paths to the base URL for each operation. This is a replace-all object — send the complete configuration on every update. | |
| created_at required | string <date-time> (CreatedAt) Timestamp when it was created |
| updated_at required | string <date-time> (UpdatedAt) Timestamp when it was last updated |
{- "name": "Updated Receptionist",
- "persona_name": "Tony",
- "greeting_name": "Jones Family Dental",
- "instructions": "string",
- "faq_responses": [
- {
- "question": "What are your business hours?",
- "answer": "We are open Monday through Friday, 9 AM to 5 PM."
}
],
}{- "id": "aia_01h2xcejqtf2nbrexx3vqjhp60",
- "name": "Front Desk Receptionist",
- "voice_app_id": "va_01h2xcejqtf2nbrexx3vqjhp49",
- "persona_name": "Tony",
- "greeting_name": "Jones Family Dental",
- "instructions": "You are the receptionist for Jones Family Dental. Be warm and professional.",
- "faq_responses": [
- {
- "question": "What are your business hours?",
- "answer": "We are open Monday through Friday, 9 AM to 5 PM."
}
], - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}Delete an AI agent and its managed voice app and extension. This operation is irreversible.
| ai_agent_id required | string Example: aia_01h2xcejqtf2nbrexx3vqjhp60 AI agent identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
curl -X DELETE \ https://api.dialstack.ai/v1/ai-agents/aia_01h2xcejqtf2nbrexx3vqjhp60 \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "error": "Invalid request body",
- "code": "validation_error",
- "details": { }
}Voice app management for programmable voice applications.
Voice apps handle calls via HTTP webhook notification and optional WebSocket audio streaming.
Requires account context via DialStack-Account header.
Create a new voice app within the account. Voice apps handle calls via HTTP webhook notification and optional WebSocket audio streaming.
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| name required | string or null (EntityName) [ 1 .. 255 ] characters Display name |
| url required | string <uri> HTTPS webhook URL for call control notifications |
| id required | string Unique identifier |
| name required | string or null [ 1 .. 255 ] characters Display name |
| url required | string <uri> HTTPS webhook URL for call control notifications |
| status required | string Enum: "active" "inactive" Current status of the voice app |
| secret required | string Webhook signing secret for this voice app. Used to verify webhook signatures. |
| created_at required | string <date-time> Timestamp when it was created |
| updated_at | string <date-time> Timestamp when it was last updated |
object List of extensions assigned to this voice app. Only included when |
{- "name": "AI Receptionist",
}{- "id": "va_01h2xcejqtf2nbrexx3vqjhp49",
- "name": "AI Receptionist",
- "status": "active",
- "secret": "whsec_abc123def456...",
- "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T10:00:00Z"
}List all voice apps for the account. Results are returned in reverse chronological order (newest first).
| limit | integer [ 1 .. 100 ] Default: 10 Example: limit=10 Number of objects to return. Defaults to 10. Maximum is 100. |
| expand[] | Array of strings Items Value: "extensions" Related resources to include inline. Supported values: |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| object required | string (ListObject) Value: "list" String representing the object's type. Always "list" for list responses. |
| url required | string (ListUrl) The URL for accessing this list. |
| next_page_url required | string or null (NextPageUrl) URL to fetch the next page of results. If |
| previous_page_url required | string or null (PreviousPageUrl) URL to fetch the previous page of results. If |
required | Array of objects (VoiceApp) |
curl -X GET \ 'https://api.dialstack.ai/v1/voice-apps?limit=10&expand%5B%5D=SOME_ARRAY_VALUE' \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "object": "list",
- "url": "/v1/voice-apps",
- "next_page_url": null,
- "previous_page_url": null,
- "data": [
- {
- "id": "va_01h2xcejqtf2nbrexx3vqjhp49",
- "name": "AI Receptionist",
- "status": "active",
- "secret": "whsec_abc123def456...",
- "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T10:00:00Z"
}
]
}Retrieve a specific voice app by ID.
| voice_app_id required | string Example: va_01h2xcejqtf2nbrexx3vqjhp49 Voice app identifier |
| expand[] | Array of strings Items Value: "extensions" Related resources to include inline. Supported values: |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| id required | string Unique identifier |
| name required | string or null [ 1 .. 255 ] characters Display name |
| url required | string <uri> HTTPS webhook URL for call control notifications |
| status required | string Enum: "active" "inactive" Current status of the voice app |
| secret required | string Webhook signing secret for this voice app. Used to verify webhook signatures. |
| created_at required | string <date-time> Timestamp when it was created |
| updated_at | string <date-time> Timestamp when it was last updated |
object List of extensions assigned to this voice app. Only included when |
curl -X GET \ 'https://api.dialstack.ai/v1/voice-apps/va_01h2xcejqtf2nbrexx3vqjhp49?expand%5B%5D=SOME_ARRAY_VALUE' \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "id": "va_01h2xcejqtf2nbrexx3vqjhp49",
- "name": "AI Receptionist",
- "status": "active",
- "secret": "whsec_abc123def456...",
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z",
- "extensions": {
- "object": "list",
- "data": [
- {
- "number": "105",
- "target": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "status": "active",
- "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T10:00:00Z"
}
]
}
}Update voice app details (name, URL, or status).
| voice_app_id required | string Example: va_01h2xcejqtf2nbrexx3vqjhp49 Voice app identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| name | string or null (EntityName) [ 1 .. 255 ] characters Display name |
| url | string <uri> HTTPS webhook URL for call control notifications |
| status | string Enum: "active" "inactive" Voice app status |
| id required | string Unique identifier |
| name required | string or null [ 1 .. 255 ] characters Display name |
| url required | string <uri> HTTPS webhook URL for call control notifications |
| status required | string Enum: "active" "inactive" Current status of the voice app |
| secret required | string Webhook signing secret for this voice app. Used to verify webhook signatures. |
| created_at required | string <date-time> Timestamp when it was created |
| updated_at | string <date-time> Timestamp when it was last updated |
object List of extensions assigned to this voice app. Only included when |
{- "name": "Spineline",
- "status": "active"
}{- "id": "va_01h2xcejqtf2nbrexx3vqjhp49",
- "name": "AI Receptionist",
- "status": "active",
- "secret": "whsec_abc123def456...",
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z",
- "extensions": {
- "object": "list",
- "data": [
- {
- "number": "105",
- "target": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "status": "active",
- "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T10:00:00Z"
}
]
}
}Delete a voice app. Active calls to this voice app will be terminated. This operation is irreversible.
| voice_app_id required | string Example: va_01h2xcejqtf2nbrexx3vqjhp49 Voice app identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
curl -X DELETE \ https://api.dialstack.ai/v1/voice-apps/va_01h2xcejqtf2nbrexx3vqjhp49 \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "error": "Invalid request body",
- "code": "validation_error",
- "details": { }
}Generate a new webhook signing secret for the voice app. The old secret is immediately invalidated.
| voice_app_id required | string Example: va_01h2xcejqtf2nbrexx3vqjhp49 Voice app identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| id required | string Unique identifier |
| name required | string or null [ 1 .. 255 ] characters Display name |
| url required | string <uri> HTTPS webhook URL for call control notifications |
| status required | string Enum: "active" "inactive" Current status of the voice app |
| secret required | string Webhook signing secret for this voice app. Used to verify webhook signatures. |
| created_at required | string <date-time> Timestamp when it was created |
| updated_at | string <date-time> Timestamp when it was last updated |
object List of extensions assigned to this voice app. Only included when |
curl -X POST \ https://api.dialstack.ai/v1/voice-apps/va_01h2xcejqtf2nbrexx3vqjhp49/rotate_secret \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "id": "va_01h2xcejqtf2nbrexx3vqjhp49",
- "name": "AI Receptionist",
- "status": "active",
- "secret": "whsec_abc123def456...",
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z",
- "extensions": {
- "object": "list",
- "data": [
- {
- "number": "105",
- "target": "user_01h2xcejqtf2nbrexx3vqjhp42",
- "status": "active",
- "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T10:00:00Z"
}
]
}
}Unified device API for deskphones, DECT bases, and DECT handsets.
This is the recommended way to manage devices. Use /v1/devices to
create, list, get, and delete any device type, and /v1/devices/{id}/users
to assign and manage users on any device type.
The type-specific /v1/deskphones and /v1/dect-bases endpoints are
retained only for operations that have no unified equivalent yet
(updates, provisioning-events, listing handsets under a specific base).
Prefer /v1/devices everywhere else.
Requires account context via DialStack-Account header or session token.
Recommended way to create any device. Prefer this endpoint over
POST /v1/deskphones, POST /v1/dect-bases, and
POST /v1/dect-bases/{id}/handsets.
Supported types:
deskphone requires mac_addressdect_base requires mac_addressdect_handset requires ipei. base_id is optional —
omit to stock the handset as unpaired and pair it later.| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| type required | string Enum: "deskphone" "dect_base" "dect_handset" The kind of device to create |
| mac_address | string Hardware MAC address (required for deskphones and DECT bases) |
| model | string Device model (optional) |
| name | string Human-friendly label for the device (deskphone, DECT base, or DECT handset). |
object or null (DeviceSettings) Two-tier device settings with vendor-agnostic abstractions and vendor-specific overrides. All fields are optional — omitted fields inherit from the parent configuration layer (Global defaults → Platform → Account → Device). This schema evolves as new hardware capabilities are supported. The | |
| multicell_role | string Enum: "single" "data_master" "secondary" Multicell deployment role (DECT base only, defaults to single) |
| location_id | string Physical E911 location to assign at creation (deskphone or DECT base only). Can be set later via update. |
| base_id | string Parent DECT base identifier (DECT handset only). Optional —
omit to stock the handset as unpaired; pair it later by
updating the handset with a |
| ipei | string DECT handset IPEI (required for DECT handsets) |
| display_name | string Deprecated Deprecated alias of |
| id required | string Unique identifier |
| type required | string Enum: "deskphone" "dect_base" "dect_handset" The kind of device that was created |
{- "type": "deskphone",
- "mac_address": "00:04:13:aa:bb:cc",
- "model": "D785"
}{- "id": "string",
- "type": "deskphone"
}Recommended way to list devices. Prefer this endpoint over
GET /v1/deskphones and GET /v1/dect-bases.
Unified view of devices (deskphones, DECT base stations, and DECT handsets).
Use the optional type filter to return only one device type.
Use expand[]=users to include device/user assignment metadata.
Results are returned in reverse chronological order (newest first).
| type | string Enum: "deskphone" "dect_base" "dect_handset" Filter devices by type |
| limit | integer [ 1 .. 100 ] Default: 10 Example: limit=10 Number of objects to return. Defaults to 10. Maximum is 100. |
| expand[] | Array of strings Items Value: "users" Related resources to include inline. Supported values: |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| object required | string (ListObject) Value: "list" String representing the object's type. Always "list" for list responses. |
| url required | string (ListUrl) The URL for accessing this list. |
| next_page_url required | string or null (NextPageUrl) URL to fetch the next page of results. If |
| previous_page_url required | string or null (PreviousPageUrl) URL to fetch the previous page of results. If |
required | Array of objects (Device) |
curl -X GET \ 'https://api.dialstack.ai/v1/devices?type=SOME_STRING_VALUE&limit=10&expand%5B%5D=SOME_ARRAY_VALUE' \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "object": "list",
- "url": "/v1/accounts",
- "next_page_url": "/v1/accounts?page=eyJzdGFydGluZ19hZnRlciI6ImFjY3RfMDFoMnhjZWpxdGYybmJyZXh4M3ZxamhwNDEiLCJsaW1pdCI6MTB9",
- "previous_page_url": "/v1/accounts?page=eyJlbmRpbmdfYmVmb3JlIjoiYWNjdF8wMWgyeGNlanF0ZjJuYnJleHgzdnFqaHA0MSIsImxpbWl0IjoxMH0",
- "data": [
- {
- "id": "string",
- "type": "deskphone",
- "mac_address": "00:04:13:aa:bb:cc",
- "vendor": "snom",
- "model": "D785",
- "name": "string",
- "location_id": "string",
- "status": "pending-sync",
- "overrides": {
- "abstractions": {
- "audio": {
- "codecs": [
- "PCMU",
- "PCMA"
], - "vad_enabled": true,
- "echo_cancellation": true,
- "jitter_buffer": {
- "mode": "adaptive",
- "min_ms": 40,
- "max_ms": 200
}
}, - "display": {
- "time_format": "12h",
- "date_format": "M/D/Y",
- "backlight_timeout": 30,
- "backlight_level": "low"
}, - "regional": {
- "timezone": "America/New_York",
- "language": "en-US",
- "tone_scheme": "us"
}, - "network": {
- "vlan_id": 0,
- "qos_dscp_sip": 26,
- "qos_dscp_rtp": 46,
- "ntp_server": "string",
- "rtcp_enabled": true
}, - "features": {
- "dnd_enabled": true,
- "call_waiting_enabled": true,
- "call_forward_enabled": true,
- "auto_answer_enabled": true,
- "srtp_enabled": true
}, - "provisioning": {
- "resync_time": "02:00",
- "resync_mode": "config_and_firmware",
- "bootup_check_enabled": true
}
}, - "vendor_overrides": {
- "ntp_server": "time.nist.gov"
}
}, - "current_ip_address": "192.168.1.100",
- "last_provisioned_at": "2019-08-24T14:15:22Z",
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z",
- "primary_line_id": "string",
- "lines": [
- {
- "id": "dln_01h2xcejqtf2nbrexx3vqjhp55",
- "device_id": "dev_01h2xcejqtf2nbrexx3vqjhp50",
- "endpoint_id": "ep_01h2xcejqtf2nbrexx3vqjhp43",
- "line_number": 1,
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}
], - "multicell_role": "single",
- "max_handsets": 30,
- "firmware_version": "string",
- "handsets": [
- {
- "id": "string",
- "base_id": "string",
- "ipei": "0328A0000F",
- "status": "unpaired",
- "display_name": "string",
- "slot_number": 1,
- "model": "string",
- "firmware_version": "string",
- "registered_at": "2019-08-24T14:15:22Z",
- "extensions": [
- {
- "id": "string",
- "handset_id": "string",
- "endpoint_id": "string",
- "display_name": "string",
- "endpoint": {
- "id": "string",
- "user_id": "string",
- "name": "string",
- "status": "online",
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}, - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}
], - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}
], - "base_id": "string",
- "ipei": "string",
- "display_name": "string",
- "slot_number": 0,
- "registered_at": "2019-08-24T14:15:22Z",
- "extensions": [
- {
- "id": "string",
- "handset_id": "string",
- "endpoint_id": "string",
- "display_name": "string",
- "endpoint": {
- "id": "string",
- "user_id": "string",
- "name": "string",
- "status": "online",
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}, - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}
], - "assignments": [
- {
- "user_id": "01h2xcejqtf2nbrexx3vqjhp42",
- "device_id": "01h2xcejqtf2nbrexx3vqjhp50",
- "line_number": 1,
- "created_at": "2025-10-17T14:30:00Z"
}
]
}
]
}Recommended way to fetch any device. Prefer this endpoint over
GET /v1/deskphones/{id}, GET /v1/dect-bases/{id}, and
GET /v1/dect-bases/{id}/handsets/{handset_id}.
Unified view of a single device. Works for deskphones, DECT base stations, and DECT handsets.
| id required | string Device identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| id required | string Unique identifier |
| type required | string Enum: "deskphone" "dect_base" "dect_handset" The kind of device |
| mac_address required | string Hardware MAC address |
| vendor required | string Device vendor (auto-detected from MAC address) |
| model | string or null Device model |
| name | string or null Human-friendly label for the device. Set by admins on deskphones,
DECT bases, and DECT handsets; |
| location_id | string or null Physical E911 location for this device. Set on deskphones and
DECT bases; |
| status required | string Enum: "pending-sync" "provisioned" Current provisioning status |
object or null Device-specific settings overrides | |
| current_ip_address | string or null Last known IP address of the device |
| last_provisioned_at | string or null <date-time> When the device last fetched its configuration |
| created_at required | string <date-time> (CreatedAt) Timestamp when it was created |
| updated_at required | string <date-time> (UpdatedAt) Timestamp when it was last updated |
| primary_line_id | string or null Primary SIP line (deskphone only) |
Array of objects (DeviceLine) SIP line assignments (deskphone only) | |
| multicell_role | string or null Enum: "single" "data_master" "secondary" null Role in a multicell deployment (DECT base only) |
| max_handsets | integer or null Maximum number of handsets supported (DECT base only) |
| firmware_version | string or null Current firmware version (DECT bases and handsets) |
Array of objects (DECTHandset) Paired handsets (DECT base only) | |
| base_id | string or null Parent DECT base station (DECT handset only) |
| ipei | string or null DECT handset IPEI (DECT handset only) |
| display_name | string or null Optional display name (DECT handset only) |
| slot_number | integer or null Slot number on the base station (DECT handset only) |
| registered_at | string or null <date-time> When the handset registered with the base (DECT handset only) |
Array of objects (HandsetLine) SIP line assignments on this handset (DECT handset only) | |
Array of objects (DeviceUserAssignment) User assignments. Only included when |
curl -X GET \ https://api.dialstack.ai/v1/devices/%7Bid%7D \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "id": "string",
- "type": "deskphone",
- "mac_address": "00:04:13:aa:bb:cc",
- "vendor": "snom",
- "model": "D785",
- "name": "string",
- "location_id": "string",
- "status": "pending-sync",
- "overrides": {
- "abstractions": {
- "audio": {
- "codecs": [
- "PCMU",
- "PCMA"
], - "vad_enabled": true,
- "echo_cancellation": true,
- "jitter_buffer": {
- "mode": "adaptive",
- "min_ms": 40,
- "max_ms": 200
}
}, - "display": {
- "time_format": "12h",
- "date_format": "M/D/Y",
- "backlight_timeout": 30,
- "backlight_level": "low"
}, - "regional": {
- "timezone": "America/New_York",
- "language": "en-US",
- "tone_scheme": "us"
}, - "network": {
- "vlan_id": 0,
- "qos_dscp_sip": 26,
- "qos_dscp_rtp": 46,
- "ntp_server": "string",
- "rtcp_enabled": true
}, - "features": {
- "dnd_enabled": true,
- "call_waiting_enabled": true,
- "call_forward_enabled": true,
- "auto_answer_enabled": true,
- "srtp_enabled": true
}, - "provisioning": {
- "resync_time": "02:00",
- "resync_mode": "config_and_firmware",
- "bootup_check_enabled": true
}
}, - "vendor_overrides": {
- "ntp_server": "time.nist.gov"
}
}, - "current_ip_address": "192.168.1.100",
- "last_provisioned_at": "2019-08-24T14:15:22Z",
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z",
- "primary_line_id": "string",
- "lines": [
- {
- "id": "dln_01h2xcejqtf2nbrexx3vqjhp55",
- "device_id": "dev_01h2xcejqtf2nbrexx3vqjhp50",
- "endpoint_id": "ep_01h2xcejqtf2nbrexx3vqjhp43",
- "line_number": 1,
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}
], - "multicell_role": "single",
- "max_handsets": 30,
- "firmware_version": "string",
- "handsets": [
- {
- "id": "string",
- "base_id": "string",
- "ipei": "0328A0000F",
- "status": "unpaired",
- "display_name": "string",
- "slot_number": 1,
- "model": "string",
- "firmware_version": "string",
- "registered_at": "2019-08-24T14:15:22Z",
- "extensions": [
- {
- "id": "string",
- "handset_id": "string",
- "endpoint_id": "string",
- "display_name": "string",
- "endpoint": {
- "id": "string",
- "user_id": "string",
- "name": "string",
- "status": "online",
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}, - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}
], - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}
], - "base_id": "string",
- "ipei": "string",
- "display_name": "string",
- "slot_number": 0,
- "registered_at": "2019-08-24T14:15:22Z",
- "extensions": [
- {
- "id": "string",
- "handset_id": "string",
- "endpoint_id": "string",
- "display_name": "string",
- "endpoint": {
- "id": "string",
- "user_id": "string",
- "name": "string",
- "status": "online",
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}, - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}
], - "assignments": [
- {
- "user_id": "01h2xcejqtf2nbrexx3vqjhp42",
- "device_id": "01h2xcejqtf2nbrexx3vqjhp50",
- "line_number": 1,
- "created_at": "2025-10-17T14:30:00Z"
}
]
}Update a device by ID. Works for deskphones, DECT base stations, and DECT handsets.
DECT handset updates support name, ipei, and model.
| id required | string Device identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| model | string Device model |
| name | string or null Human-friendly label for the device (deskphone, DECT base, or
DECT handset). Send |
| status | string Enum: "pending-sync" "provisioned" Provisioning status for deskphones and DECT bases |
object or null (DeviceSettings) Two-tier device settings with vendor-agnostic abstractions and vendor-specific overrides. All fields are optional — omitted fields inherit from the parent configuration layer (Global defaults → Platform → Account → Device). This schema evolves as new hardware capabilities are supported. The | |
| ipei | string DECT handset IPEI |
| display_name | string Deprecated Deprecated alias of |
| location_id | string or null Physical E911 location (deskphone or DECT base only). Tri-state:
omit for no change, send a |
| base_id | string or null Paired DECT base (DECT handset only). Tri-state: omit for no
change, send a |
| id required | string Unique identifier |
| type required | string Enum: "deskphone" "dect_base" "dect_handset" The kind of device |
| mac_address required | string Hardware MAC address |
| vendor required | string Device vendor (auto-detected from MAC address) |
| model | string or null Device model |
| name | string or null Human-friendly label for the device. Set by admins on deskphones,
DECT bases, and DECT handsets; |
| location_id | string or null Physical E911 location for this device. Set on deskphones and
DECT bases; |
| status required | string Enum: "pending-sync" "provisioned" Current provisioning status |
object or null Device-specific settings overrides | |
| current_ip_address | string or null Last known IP address of the device |
| last_provisioned_at | string or null <date-time> When the device last fetched its configuration |
| created_at required | string <date-time> (CreatedAt) Timestamp when it was created |
| updated_at required | string <date-time> (UpdatedAt) Timestamp when it was last updated |
| primary_line_id | string or null Primary SIP line (deskphone only) |
Array of objects (DeviceLine) SIP line assignments (deskphone only) | |
| multicell_role | string or null Enum: "single" "data_master" "secondary" null Role in a multicell deployment (DECT base only) |
| max_handsets | integer or null Maximum number of handsets supported (DECT base only) |
| firmware_version | string or null Current firmware version (DECT bases and handsets) |
Array of objects (DECTHandset) Paired handsets (DECT base only) | |
| base_id | string or null Parent DECT base station (DECT handset only) |
| ipei | string or null DECT handset IPEI (DECT handset only) |
| display_name | string or null Optional display name (DECT handset only) |
| slot_number | integer or null Slot number on the base station (DECT handset only) |
| registered_at | string or null <date-time> When the handset registered with the base (DECT handset only) |
Array of objects (HandsetLine) SIP line assignments on this handset (DECT handset only) | |
Array of objects (DeviceUserAssignment) User assignments. Only included when |
{- "model": "string",
- "name": "string",
- "status": "pending-sync",
- "overrides": {
- "abstractions": {
- "audio": {
- "codecs": [
- "PCMU",
- "PCMA"
], - "vad_enabled": true,
- "echo_cancellation": true,
- "jitter_buffer": {
- "mode": "adaptive",
- "min_ms": 40,
- "max_ms": 200
}
}, - "display": {
- "time_format": "12h",
- "date_format": "M/D/Y",
- "backlight_timeout": 30,
- "backlight_level": "low"
}, - "regional": {
- "timezone": "America/New_York",
- "language": "en-US",
- "tone_scheme": "us"
}, - "network": {
- "vlan_id": 0,
- "qos_dscp_sip": 26,
- "qos_dscp_rtp": 46,
- "ntp_server": "string",
- "rtcp_enabled": true
}, - "features": {
- "dnd_enabled": true,
- "call_waiting_enabled": true,
- "call_forward_enabled": true,
- "auto_answer_enabled": true,
- "srtp_enabled": true
}, - "provisioning": {
- "resync_time": "02:00",
- "resync_mode": "config_and_firmware",
- "bootup_check_enabled": true
}
}, - "vendor_overrides": {
- "ntp_server": "time.nist.gov"
}
}, - "ipei": "string",
- "display_name": "string",
- "location_id": "string",
- "base_id": "string"
}{- "id": "string",
- "type": "deskphone",
- "mac_address": "00:04:13:aa:bb:cc",
- "vendor": "snom",
- "model": "D785",
- "name": "string",
- "location_id": "string",
- "status": "pending-sync",
- "overrides": {
- "abstractions": {
- "audio": {
- "codecs": [
- "PCMU",
- "PCMA"
], - "vad_enabled": true,
- "echo_cancellation": true,
- "jitter_buffer": {
- "mode": "adaptive",
- "min_ms": 40,
- "max_ms": 200
}
}, - "display": {
- "time_format": "12h",
- "date_format": "M/D/Y",
- "backlight_timeout": 30,
- "backlight_level": "low"
}, - "regional": {
- "timezone": "America/New_York",
- "language": "en-US",
- "tone_scheme": "us"
}, - "network": {
- "vlan_id": 0,
- "qos_dscp_sip": 26,
- "qos_dscp_rtp": 46,
- "ntp_server": "string",
- "rtcp_enabled": true
}, - "features": {
- "dnd_enabled": true,
- "call_waiting_enabled": true,
- "call_forward_enabled": true,
- "auto_answer_enabled": true,
- "srtp_enabled": true
}, - "provisioning": {
- "resync_time": "02:00",
- "resync_mode": "config_and_firmware",
- "bootup_check_enabled": true
}
}, - "vendor_overrides": {
- "ntp_server": "time.nist.gov"
}
}, - "current_ip_address": "192.168.1.100",
- "last_provisioned_at": "2019-08-24T14:15:22Z",
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z",
- "primary_line_id": "string",
- "lines": [
- {
- "id": "dln_01h2xcejqtf2nbrexx3vqjhp55",
- "device_id": "dev_01h2xcejqtf2nbrexx3vqjhp50",
- "endpoint_id": "ep_01h2xcejqtf2nbrexx3vqjhp43",
- "line_number": 1,
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}
], - "multicell_role": "single",
- "max_handsets": 30,
- "firmware_version": "string",
- "handsets": [
- {
- "id": "string",
- "base_id": "string",
- "ipei": "0328A0000F",
- "status": "unpaired",
- "display_name": "string",
- "slot_number": 1,
- "model": "string",
- "firmware_version": "string",
- "registered_at": "2019-08-24T14:15:22Z",
- "extensions": [
- {
- "id": "string",
- "handset_id": "string",
- "endpoint_id": "string",
- "display_name": "string",
- "endpoint": {
- "id": "string",
- "user_id": "string",
- "name": "string",
- "status": "online",
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}, - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}
], - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}
], - "base_id": "string",
- "ipei": "string",
- "display_name": "string",
- "slot_number": 0,
- "registered_at": "2019-08-24T14:15:22Z",
- "extensions": [
- {
- "id": "string",
- "handset_id": "string",
- "endpoint_id": "string",
- "display_name": "string",
- "endpoint": {
- "id": "string",
- "user_id": "string",
- "name": "string",
- "status": "online",
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}, - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}
], - "assignments": [
- {
- "user_id": "01h2xcejqtf2nbrexx3vqjhp42",
- "device_id": "01h2xcejqtf2nbrexx3vqjhp50",
- "line_number": 1,
- "created_at": "2025-10-17T14:30:00Z"
}
]
}Recommended way to delete any device. Prefer this endpoint over
DELETE /v1/deskphones/{id}, DELETE /v1/dect-bases/{id}, and
DELETE /v1/dect-bases/{id}/handsets/{handset_id}.
Delete any device by its ID. Works for deskphones, DECT base stations, and DECT handsets.
Deleting a deskphone removes all associated user assignments. Deleting a DECT base removes all its handsets and their user assignments.
| id required | string Device identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
curl -X DELETE \ https://api.dialstack.ai/v1/devices/%7Bid%7D \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "error": "Invalid request body",
- "code": "validation_error",
- "details": { }
}Tells the device to fetch and apply its latest configuration. Works for deskphones, DECT bases, and DECT handsets — on a DECT system, one request reloads configuration on every handset paired with the base.
With the default reboot: false, the device applies configuration
in place. Active calls continue and the device stays registered.
With reboot: true, the device reboots immediately — any active
call is dropped, and the device is offline for about 30–90 seconds.
Trigger check-sync when you actually change configuration, not on every admin-UI interaction. See the Device provisioning guide for the full list of side effects.
| id required | string Device identifier (deskphone, DECT base, or DECT handset) |
| reboot | boolean Default: false If true, the device reboots immediately after applying
config, interrupting any active call. Default |
| success required | boolean |
| lines_notified required | integer Number of lines that accepted the request. |
required | Array of objects Per-line outcome. |
{ }{- "success": true,
- "lines_notified": 1,
- "lines": [
- {
- "line_number": 1,
- "status": "delivered"
}
]
}Assigns a user to a device. SIP credentials and line configuration are created automatically.
Supported device types:
| id required | string Device identifier (deskphone, DECT handset, or DECT base) |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| user_id required | string The user to assign to the deskphone |
| user_id required | string Unique identifier |
| device_id required | string Unique identifier |
| line_number | integer [ 1 .. 24 ] Physical line key number assigned to this user |
| created_at required | string <date-time> (CreatedAt) Timestamp when it was created |
{- "user_id": "user_01h2xcejqtf2nbrexx3vqjhp42"
}{- "user_id": "01h2xcejqtf2nbrexx3vqjhp42",
- "device_id": "01h2xcejqtf2nbrexx3vqjhp50",
- "line_number": 1,
- "created_at": "2025-10-17T14:30:00Z"
}Returns all users currently assigned to the device. Devices support at most 24 users, so no pagination is needed.
| id required | string Device identifier (deskphone, DECT handset, or DECT base) |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| object required | string Value: "list" |
| url required | string |
| next_page_url | string or null |
| previous_page_url | string or null |
required | Array of objects (DeviceUserAssignment) |
curl -X GET \ https://api.dialstack.ai/v1/devices/%7Bid%7D/users \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "object": "list",
- "url": "string",
- "next_page_url": "string",
- "previous_page_url": "string",
- "data": [
- {
- "user_id": "01h2xcejqtf2nbrexx3vqjhp42",
- "device_id": "01h2xcejqtf2nbrexx3vqjhp50",
- "line_number": 1,
- "created_at": "2025-10-17T14:30:00Z"
}
]
}Removes the user's assignment from the device. The associated SIP credentials and line configuration are cleaned up automatically.
| id required | string Device identifier (deskphone, DECT handset, or DECT base) |
| user_id required | string Example: user_01h2xcejqtf2nbrexx3vqjhp42 User identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
curl -X DELETE \ https://api.dialstack.ai/v1/devices/%7Bid%7D/users/user_01h2xcejqtf2nbrexx3vqjhp42 \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "error": "Invalid request body",
- "code": "validation_error",
- "details": { }
}Deskphone-specific operations retained for the cases /v1/devices does
not cover yet (updates and provisioning events). For create, list, get,
and delete, use the unified Devices API — it is the
recommended approach for all new integrations.
Requires account context via DialStack-Account header or session token.
Deprecated: Use POST /v1/devices with type: deskphone instead.
Provision a new deskphone. The vendor is auto-detected from the MAC address.
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| mac_address required | string Hardware MAC address (vendor is auto-detected) |
| model | string Device model (optional) |
object or null (DeviceSettings) Two-tier device settings with vendor-agnostic abstractions and vendor-specific overrides. All fields are optional — omitted fields inherit from the parent configuration layer (Global defaults → Platform → Account → Device). This schema evolves as new hardware capabilities are supported. The |
| id required | string Unique identifier |
| mac_address required | string Hardware MAC address |
| vendor required | string Device vendor (auto-detected from MAC address) |
| model | string or null Device model |
| name | string or null Human-friendly label for the device. |
| location_id | string or null Physical E911 location for this deskphone. |
| status required | string Enum: "pending-sync" "provisioned" Current provisioning status |
object or null Device-specific settings overrides | |
| current_ip_address | string or null Last known IP address of the device |
| last_provisioned_at | string or null <date-time> When the device last fetched its configuration |
| created_at required | string <date-time> (CreatedAt) Timestamp when it was created |
| updated_at required | string <date-time> (UpdatedAt) Timestamp when it was last updated |
| primary_line_id | string or null Primary SIP line |
Array of objects (DeviceLine) SIP line assignments |
{- "mac_address": "00:04:13:aa:bb:cc",
- "model": "D785"
}{- "id": "string",
- "mac_address": "00:04:13:aa:bb:cc",
- "vendor": "snom",
- "model": "D785",
- "name": "string",
- "location_id": "string",
- "status": "pending-sync",
- "overrides": {
- "abstractions": {
- "audio": {
- "codecs": [
- "PCMU",
- "PCMA"
], - "vad_enabled": true,
- "echo_cancellation": true,
- "jitter_buffer": {
- "mode": "adaptive",
- "min_ms": 40,
- "max_ms": 200
}
}, - "display": {
- "time_format": "12h",
- "date_format": "M/D/Y",
- "backlight_timeout": 30,
- "backlight_level": "low"
}, - "regional": {
- "timezone": "America/New_York",
- "language": "en-US",
- "tone_scheme": "us"
}, - "network": {
- "vlan_id": 0,
- "qos_dscp_sip": 26,
- "qos_dscp_rtp": 46,
- "ntp_server": "string",
- "rtcp_enabled": true
}, - "features": {
- "dnd_enabled": true,
- "call_waiting_enabled": true,
- "call_forward_enabled": true,
- "auto_answer_enabled": true,
- "srtp_enabled": true
}, - "provisioning": {
- "resync_time": "02:00",
- "resync_mode": "config_and_firmware",
- "bootup_check_enabled": true
}
}, - "vendor_overrides": {
- "ntp_server": "time.nist.gov"
}
}, - "current_ip_address": "192.168.1.100",
- "last_provisioned_at": "2019-08-24T14:15:22Z",
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z",
- "primary_line_id": "string",
- "lines": [
- {
- "id": "dln_01h2xcejqtf2nbrexx3vqjhp55",
- "device_id": "dev_01h2xcejqtf2nbrexx3vqjhp50",
- "endpoint_id": "ep_01h2xcejqtf2nbrexx3vqjhp43",
- "line_number": 1,
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}
]
}Deprecated: Use GET /v1/devices?type=deskphone instead.
List all deskphones for the account. Results are returned in reverse chronological order (newest first).
| limit | integer [ 1 .. 100 ] Default: 10 Example: limit=10 Number of objects to return. Defaults to 10. Maximum is 100. |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| object required | string (ListObject) Value: "list" String representing the object's type. Always "list" for list responses. |
| url required | string (ListUrl) The URL for accessing this list. |
| next_page_url required | string or null (NextPageUrl) URL to fetch the next page of results. If |
| previous_page_url required | string or null (PreviousPageUrl) URL to fetch the previous page of results. If |
required | Array of objects (ProvisionedDevice) |
curl -X GET \ 'https://api.dialstack.ai/v1/deskphones?limit=10' \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "object": "list",
- "url": "/v1/accounts",
- "next_page_url": "/v1/accounts?page=eyJzdGFydGluZ19hZnRlciI6ImFjY3RfMDFoMnhjZWpxdGYybmJyZXh4M3ZxamhwNDEiLCJsaW1pdCI6MTB9",
- "previous_page_url": "/v1/accounts?page=eyJlbmRpbmdfYmVmb3JlIjoiYWNjdF8wMWgyeGNlanF0ZjJuYnJleHgzdnFqaHA0MSIsImxpbWl0IjoxMH0",
- "data": [
- {
- "id": "string",
- "mac_address": "00:04:13:aa:bb:cc",
- "vendor": "snom",
- "model": "D785",
- "name": "string",
- "location_id": "string",
- "status": "pending-sync",
- "overrides": {
- "abstractions": {
- "audio": {
- "codecs": [
- "PCMU",
- "PCMA"
], - "vad_enabled": true,
- "echo_cancellation": true,
- "jitter_buffer": {
- "mode": "adaptive",
- "min_ms": 40,
- "max_ms": 200
}
}, - "display": {
- "time_format": "12h",
- "date_format": "M/D/Y",
- "backlight_timeout": 30,
- "backlight_level": "low"
}, - "regional": {
- "timezone": "America/New_York",
- "language": "en-US",
- "tone_scheme": "us"
}, - "network": {
- "vlan_id": 0,
- "qos_dscp_sip": 26,
- "qos_dscp_rtp": 46,
- "ntp_server": "string",
- "rtcp_enabled": true
}, - "features": {
- "dnd_enabled": true,
- "call_waiting_enabled": true,
- "call_forward_enabled": true,
- "auto_answer_enabled": true,
- "srtp_enabled": true
}, - "provisioning": {
- "resync_time": "02:00",
- "resync_mode": "config_and_firmware",
- "bootup_check_enabled": true
}
}, - "vendor_overrides": {
- "ntp_server": "time.nist.gov"
}
}, - "current_ip_address": "192.168.1.100",
- "last_provisioned_at": "2019-08-24T14:15:22Z",
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z",
- "primary_line_id": "string",
- "lines": [
- {
- "id": "dln_01h2xcejqtf2nbrexx3vqjhp55",
- "device_id": "dev_01h2xcejqtf2nbrexx3vqjhp50",
- "endpoint_id": "ep_01h2xcejqtf2nbrexx3vqjhp43",
- "line_number": 1,
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}
]
}
]
}Deprecated: Use GET /v1/devices/{id} instead.
Retrieve a deskphone by its ID.
| id required | string Deskphone identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| id required | string Unique identifier |
| mac_address required | string Hardware MAC address |
| vendor required | string Device vendor (auto-detected from MAC address) |
| model | string or null Device model |
| name | string or null Human-friendly label for the device. |
| location_id | string or null Physical E911 location for this deskphone. |
| status required | string Enum: "pending-sync" "provisioned" Current provisioning status |
object or null Device-specific settings overrides | |
| current_ip_address | string or null Last known IP address of the device |
| last_provisioned_at | string or null <date-time> When the device last fetched its configuration |
| created_at required | string <date-time> (CreatedAt) Timestamp when it was created |
| updated_at required | string <date-time> (UpdatedAt) Timestamp when it was last updated |
| primary_line_id | string or null Primary SIP line |
Array of objects (DeviceLine) SIP line assignments |
curl -X GET \ https://api.dialstack.ai/v1/deskphones/%7Bid%7D \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "id": "string",
- "mac_address": "00:04:13:aa:bb:cc",
- "vendor": "snom",
- "model": "D785",
- "name": "string",
- "location_id": "string",
- "status": "pending-sync",
- "overrides": {
- "abstractions": {
- "audio": {
- "codecs": [
- "PCMU",
- "PCMA"
], - "vad_enabled": true,
- "echo_cancellation": true,
- "jitter_buffer": {
- "mode": "adaptive",
- "min_ms": 40,
- "max_ms": 200
}
}, - "display": {
- "time_format": "12h",
- "date_format": "M/D/Y",
- "backlight_timeout": 30,
- "backlight_level": "low"
}, - "regional": {
- "timezone": "America/New_York",
- "language": "en-US",
- "tone_scheme": "us"
}, - "network": {
- "vlan_id": 0,
- "qos_dscp_sip": 26,
- "qos_dscp_rtp": 46,
- "ntp_server": "string",
- "rtcp_enabled": true
}, - "features": {
- "dnd_enabled": true,
- "call_waiting_enabled": true,
- "call_forward_enabled": true,
- "auto_answer_enabled": true,
- "srtp_enabled": true
}, - "provisioning": {
- "resync_time": "02:00",
- "resync_mode": "config_and_firmware",
- "bootup_check_enabled": true
}
}, - "vendor_overrides": {
- "ntp_server": "time.nist.gov"
}
}, - "current_ip_address": "192.168.1.100",
- "last_provisioned_at": "2019-08-24T14:15:22Z",
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z",
- "primary_line_id": "string",
- "lines": [
- {
- "id": "dln_01h2xcejqtf2nbrexx3vqjhp55",
- "device_id": "dev_01h2xcejqtf2nbrexx3vqjhp50",
- "endpoint_id": "ep_01h2xcejqtf2nbrexx3vqjhp43",
- "line_number": 1,
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}
]
}Update a deskphone's properties. Only provided fields are changed.
| id required | string Deskphone identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| model | string Device model |
| status | string Enum: "pending-sync" "provisioned" Device status |
object or null (DeviceSettings) Two-tier device settings with vendor-agnostic abstractions and vendor-specific overrides. All fields are optional — omitted fields inherit from the parent configuration layer (Global defaults → Platform → Account → Device). This schema evolves as new hardware capabilities are supported. The |
| id required | string Unique identifier |
| mac_address required | string Hardware MAC address |
| vendor required | string Device vendor (auto-detected from MAC address) |
| model | string or null Device model |
| name | string or null Human-friendly label for the device. |
| location_id | string or null Physical E911 location for this deskphone. |
| status required | string Enum: "pending-sync" "provisioned" Current provisioning status |
object or null Device-specific settings overrides | |
| current_ip_address | string or null Last known IP address of the device |
| last_provisioned_at | string or null <date-time> When the device last fetched its configuration |
| created_at required | string <date-time> (CreatedAt) Timestamp when it was created |
| updated_at required | string <date-time> (UpdatedAt) Timestamp when it was last updated |
| primary_line_id | string or null Primary SIP line |
Array of objects (DeviceLine) SIP line assignments |
{- "model": "string",
- "status": "pending-sync",
- "overrides": {
- "abstractions": {
- "audio": {
- "codecs": [
- "PCMU",
- "PCMA"
], - "vad_enabled": true,
- "echo_cancellation": true,
- "jitter_buffer": {
- "mode": "adaptive",
- "min_ms": 40,
- "max_ms": 200
}
}, - "display": {
- "time_format": "12h",
- "date_format": "M/D/Y",
- "backlight_timeout": 30,
- "backlight_level": "low"
}, - "regional": {
- "timezone": "America/New_York",
- "language": "en-US",
- "tone_scheme": "us"
}, - "network": {
- "vlan_id": 0,
- "qos_dscp_sip": 26,
- "qos_dscp_rtp": 46,
- "ntp_server": "string",
- "rtcp_enabled": true
}, - "features": {
- "dnd_enabled": true,
- "call_waiting_enabled": true,
- "call_forward_enabled": true,
- "auto_answer_enabled": true,
- "srtp_enabled": true
}, - "provisioning": {
- "resync_time": "02:00",
- "resync_mode": "config_and_firmware",
- "bootup_check_enabled": true
}
}, - "vendor_overrides": {
- "ntp_server": "time.nist.gov"
}
}
}{- "id": "string",
- "mac_address": "00:04:13:aa:bb:cc",
- "vendor": "snom",
- "model": "D785",
- "name": "string",
- "location_id": "string",
- "status": "pending-sync",
- "overrides": {
- "abstractions": {
- "audio": {
- "codecs": [
- "PCMU",
- "PCMA"
], - "vad_enabled": true,
- "echo_cancellation": true,
- "jitter_buffer": {
- "mode": "adaptive",
- "min_ms": 40,
- "max_ms": 200
}
}, - "display": {
- "time_format": "12h",
- "date_format": "M/D/Y",
- "backlight_timeout": 30,
- "backlight_level": "low"
}, - "regional": {
- "timezone": "America/New_York",
- "language": "en-US",
- "tone_scheme": "us"
}, - "network": {
- "vlan_id": 0,
- "qos_dscp_sip": 26,
- "qos_dscp_rtp": 46,
- "ntp_server": "string",
- "rtcp_enabled": true
}, - "features": {
- "dnd_enabled": true,
- "call_waiting_enabled": true,
- "call_forward_enabled": true,
- "auto_answer_enabled": true,
- "srtp_enabled": true
}, - "provisioning": {
- "resync_time": "02:00",
- "resync_mode": "config_and_firmware",
- "bootup_check_enabled": true
}
}, - "vendor_overrides": {
- "ntp_server": "time.nist.gov"
}
}, - "current_ip_address": "192.168.1.100",
- "last_provisioned_at": "2019-08-24T14:15:22Z",
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z",
- "primary_line_id": "string",
- "lines": [
- {
- "id": "dln_01h2xcejqtf2nbrexx3vqjhp55",
- "device_id": "dev_01h2xcejqtf2nbrexx3vqjhp50",
- "endpoint_id": "ep_01h2xcejqtf2nbrexx3vqjhp43",
- "line_number": 1,
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}
]
}Deprecated: Use DELETE /v1/devices/{id} instead.
Delete a deskphone and all its associated lines.
| id required | string Deskphone identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
curl -X DELETE \ https://api.dialstack.ai/v1/deskphones/%7Bid%7D \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "error": "Invalid request body",
- "code": "validation_error",
- "details": { }
}List provisioning events for a deskphone. Returns a log of configuration fetches by the device.
| id required | string Deskphone identifier |
| limit | integer [ 1 .. 100 ] Default: 10 Example: limit=10 Number of objects to return. Defaults to 10. Maximum is 100. |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| object required | string (ListObject) Value: "list" String representing the object's type. Always "list" for list responses. |
| url required | string (ListUrl) The URL for accessing this list. |
| next_page_url required | string or null (NextPageUrl) URL to fetch the next page of results. If |
| previous_page_url required | string or null (PreviousPageUrl) URL to fetch the previous page of results. If |
required | Array of objects (ProvisioningEvent) |
curl -X GET \ 'https://api.dialstack.ai/v1/deskphones/%7Bid%7D/provisioning-events?limit=10' \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "object": "list",
- "url": "/v1/accounts",
- "next_page_url": "/v1/accounts?page=eyJzdGFydGluZ19hZnRlciI6ImFjY3RfMDFoMnhjZWpxdGYybmJyZXh4M3ZxamhwNDEiLCJsaW1pdCI6MTB9",
- "previous_page_url": "/v1/accounts?page=eyJlbmRpbmdfYmVmb3JlIjoiYWNjdF8wMWgyeGNlanF0ZjJuYnJleHgzdnFqaHA0MSIsImxpbWl0IjoxMH0",
- "data": [
- {
- "id": "string",
- "device_id": "string",
- "event_type": "config_fetch_success",
- "source_ip": "192.168.1.100",
- "user_agent": "snom D785/10.1.91",
- "details": { },
- "created_at": "2025-10-17T14:30:00Z"
}
]
}Deprecated: Use POST /v1/devices/{id}/users instead.
Assigns a SIP endpoint to the next available line key on the deskphone. The line number is automatically assigned as the lowest unused number (1-24). A deskphone supports a maximum of 24 lines. Each endpoint can only be assigned once per device.
| id required | string Deskphone identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| endpoint_id required | string ID of the SIP endpoint to assign to this line |
| id required | string Unique identifier |
| device_id required | string Unique identifier |
| endpoint_id required | string Unique identifier |
| line_number required | integer [ 1 .. 24 ] Physical line key number on the device |
| created_at required | string <date-time> (CreatedAt) Timestamp when it was created |
| updated_at required | string <date-time> (UpdatedAt) Timestamp when it was last updated |
{- "endpoint_id": "ep_01h2xcejqtf2nbrexx3vqjhp43"
}{- "id": "dln_01h2xcejqtf2nbrexx3vqjhp55",
- "device_id": "dev_01h2xcejqtf2nbrexx3vqjhp50",
- "endpoint_id": "ep_01h2xcejqtf2nbrexx3vqjhp43",
- "line_number": 1,
- "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T10:00:00Z"
}Deprecated: Use GET /v1/devices/{id}/users instead.
List all SIP line assignments for a deskphone. Returns lines ordered by line number.
| id required | string Deskphone identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
required | Array of objects (DeviceLine) | ||||||||||||
Array
| |||||||||||||
curl -X GET \ https://api.dialstack.ai/v1/deskphones/%7Bid%7D/lines \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "data": [
- {
- "id": "dln_01h2xcejqtf2nbrexx3vqjhp55",
- "device_id": "dev_01h2xcejqtf2nbrexx3vqjhp50",
- "endpoint_id": "ep_01h2xcejqtf2nbrexx3vqjhp43",
- "line_number": 1,
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}
]
}Deprecated: Use DELETE /v1/devices/{id}/users/{user_id} and POST /v1/devices/{id}/users instead.
Reassigns a deskphone line to a different SIP endpoint. The line number remains unchanged; only the endpoint is updated.
| id required | string Deskphone identifier |
| line_id required | string Example: dln_01h2xcejqtf2nbrexx3vqjhp55 Device line identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| endpoint_id required | string ID of the new SIP endpoint to assign to this line |
| id required | string Unique identifier |
| device_id required | string Unique identifier |
| endpoint_id required | string Unique identifier |
| line_number required | integer [ 1 .. 24 ] Physical line key number on the device |
| created_at required | string <date-time> (CreatedAt) Timestamp when it was created |
| updated_at required | string <date-time> (UpdatedAt) Timestamp when it was last updated |
{- "endpoint_id": "ep_01h2xcejqtf2nbrexx3vqjhp44"
}{- "id": "dln_01h2xcejqtf2nbrexx3vqjhp55",
- "device_id": "dev_01h2xcejqtf2nbrexx3vqjhp50",
- "endpoint_id": "ep_01h2xcejqtf2nbrexx3vqjhp43",
- "line_number": 1,
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}Deprecated: Use DELETE /v1/devices/{id}/users/{user_id} instead.
Removes a SIP line assignment from the deskphone.
| id required | string Deskphone identifier |
| line_id required | string Example: dln_01h2xcejqtf2nbrexx3vqjhp55 Device line identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
curl -X DELETE \ https://api.dialstack.ai/v1/deskphones/%7Bid%7D/lines/dln_01h2xcejqtf2nbrexx3vqjhp55 \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "error": "Invalid request body",
- "code": "validation_error",
- "details": { }
}DECT-specific operations retained for the cases /v1/devices does not
cover yet (updates and listing handsets under a specific base). For
create, list, get, and delete of bases and handsets, use the unified
Devices API — it is the recommended approach for all
new integrations.
Requires account context via DialStack-Account header or session token.
Deprecated: Use POST /v1/devices with type: dect_base instead.
Register a new DECT base station for provisioning. The vendor is automatically detected from the MAC address.
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| mac_address required | string Hardware MAC address (vendor is auto-detected) |
| model | string Base station model (optional, can be auto-detected) |
| multicell_role | string Enum: "single" "data_master" "secondary" Role in multicell deployment (defaults to single) |
object or null (DeviceSettings) Two-tier device settings with vendor-agnostic abstractions and vendor-specific overrides. All fields are optional — omitted fields inherit from the parent configuration layer (Global defaults → Platform → Account → Device). This schema evolves as new hardware capabilities are supported. The |
| id required | string Unique identifier |
| mac_address required | string Hardware MAC address |
| vendor required | string Device vendor (auto-detected from MAC address) |
| model | string or null Base station model |
| name | string or null Human-friendly label for the base. |
| status required | string Enum: "pending-sync" "provisioned" Current provisioning status |
| multicell_role required | string Enum: "single" "data_master" "secondary" Role in a multicell deployment:
|
| max_handsets required | integer Maximum number of handsets this base supports |
| firmware_version | string or null Current firmware version |
object or null Device-specific settings overrides | |
| current_ip_address | string or null Last known IP address of the base station |
| last_provisioned_at | string or null <date-time> When the base last fetched its configuration |
| location_id | string or null Physical location used as the emergency-services dispatch address when any handset on this base places a call. All handsets paired with this base share the same location. |
Array of objects (DECTHandset) Paired wireless handsets | |
| created_at required | string <date-time> (CreatedAt) Timestamp when it was created |
| updated_at required | string <date-time> (UpdatedAt) Timestamp when it was last updated |
{- "mac_address": "00:04:13:bb:cc:dd"
}{- "id": "dectb_01h2xcejqtf2nbrexx3vqjhp60",
- "mac_address": "00:04:13:bb:cc:dd",
- "vendor": "snom",
- "model": null,
- "status": "pending-sync",
- "multicell_role": "single",
- "max_handsets": 30,
- "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T10:00:00Z"
}Deprecated: Use GET /v1/devices?type=dect_base instead.
List all DECT base stations in the account.
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| object required | string (ListObject) Value: "list" String representing the object's type. Always "list" for list responses. |
| url required | string (ListUrl) The URL for accessing this list. |
| next_page_url required | string or null (NextPageUrl) URL to fetch the next page of results. If |
| previous_page_url required | string or null (PreviousPageUrl) URL to fetch the previous page of results. If |
required | Array of objects (DECTBase) |
curl -X GET \ https://api.dialstack.ai/v1/dect-bases \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "object": "list",
- "url": "/v1/accounts",
- "next_page_url": "/v1/accounts?page=eyJzdGFydGluZ19hZnRlciI6ImFjY3RfMDFoMnhjZWpxdGYybmJyZXh4M3ZxamhwNDEiLCJsaW1pdCI6MTB9",
- "previous_page_url": "/v1/accounts?page=eyJlbmRpbmdfYmVmb3JlIjoiYWNjdF8wMWgyeGNlanF0ZjJuYnJleHgzdnFqaHA0MSIsImxpbWl0IjoxMH0",
- "data": [
- {
- "id": "string",
- "mac_address": "00:04:13:bb:cc:dd",
- "vendor": "snom",
- "model": "M500",
- "name": "string",
- "status": "pending-sync",
- "multicell_role": "single",
- "max_handsets": 30,
- "firmware_version": "string",
- "overrides": {
- "abstractions": {
- "audio": {
- "codecs": [
- "PCMU",
- "PCMA"
], - "vad_enabled": true,
- "echo_cancellation": true,
- "jitter_buffer": {
- "mode": "adaptive",
- "min_ms": 40,
- "max_ms": 200
}
}, - "display": {
- "time_format": "12h",
- "date_format": "M/D/Y",
- "backlight_timeout": 30,
- "backlight_level": "low"
}, - "regional": {
- "timezone": "America/New_York",
- "language": "en-US",
- "tone_scheme": "us"
}, - "network": {
- "vlan_id": 0,
- "qos_dscp_sip": 26,
- "qos_dscp_rtp": 46,
- "ntp_server": "string",
- "rtcp_enabled": true
}, - "features": {
- "dnd_enabled": true,
- "call_waiting_enabled": true,
- "call_forward_enabled": true,
- "auto_answer_enabled": true,
- "srtp_enabled": true
}, - "provisioning": {
- "resync_time": "02:00",
- "resync_mode": "config_and_firmware",
- "bootup_check_enabled": true
}
}, - "vendor_overrides": {
- "ntp_server": "time.nist.gov"
}
}, - "current_ip_address": "192.168.1.101",
- "last_provisioned_at": "2019-08-24T14:15:22Z",
- "location_id": "string",
- "handsets": [
- {
- "id": "string",
- "base_id": "string",
- "ipei": "0328A0000F",
- "status": "unpaired",
- "display_name": "string",
- "slot_number": 1,
- "model": "string",
- "firmware_version": "string",
- "registered_at": "2019-08-24T14:15:22Z",
- "extensions": [
- {
- "id": "string",
- "handset_id": "string",
- "endpoint_id": "string",
- "display_name": "string",
- "endpoint": {
- "id": "string",
- "user_id": "string",
- "name": "string",
- "status": "online",
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}, - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}
], - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}
], - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}
]
}Deprecated: Use GET /v1/devices/{id} instead.
Retrieve a DECT base station by ID.
| id required | string DECT base station identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| id required | string Unique identifier |
| mac_address required | string Hardware MAC address |
| vendor required | string Device vendor (auto-detected from MAC address) |
| model | string or null Base station model |
| name | string or null Human-friendly label for the base. |
| status required | string Enum: "pending-sync" "provisioned" Current provisioning status |
| multicell_role required | string Enum: "single" "data_master" "secondary" Role in a multicell deployment:
|
| max_handsets required | integer Maximum number of handsets this base supports |
| firmware_version | string or null Current firmware version |
object or null Device-specific settings overrides | |
| current_ip_address | string or null Last known IP address of the base station |
| last_provisioned_at | string or null <date-time> When the base last fetched its configuration |
| location_id | string or null Physical location used as the emergency-services dispatch address when any handset on this base places a call. All handsets paired with this base share the same location. |
Array of objects (DECTHandset) Paired wireless handsets | |
| created_at required | string <date-time> (CreatedAt) Timestamp when it was created |
| updated_at required | string <date-time> (UpdatedAt) Timestamp when it was last updated |
curl -X GET \ https://api.dialstack.ai/v1/dect-bases/%7Bid%7D \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "id": "string",
- "mac_address": "00:04:13:bb:cc:dd",
- "vendor": "snom",
- "model": "M500",
- "name": "string",
- "status": "pending-sync",
- "multicell_role": "single",
- "max_handsets": 30,
- "firmware_version": "string",
- "overrides": {
- "abstractions": {
- "audio": {
- "codecs": [
- "PCMU",
- "PCMA"
], - "vad_enabled": true,
- "echo_cancellation": true,
- "jitter_buffer": {
- "mode": "adaptive",
- "min_ms": 40,
- "max_ms": 200
}
}, - "display": {
- "time_format": "12h",
- "date_format": "M/D/Y",
- "backlight_timeout": 30,
- "backlight_level": "low"
}, - "regional": {
- "timezone": "America/New_York",
- "language": "en-US",
- "tone_scheme": "us"
}, - "network": {
- "vlan_id": 0,
- "qos_dscp_sip": 26,
- "qos_dscp_rtp": 46,
- "ntp_server": "string",
- "rtcp_enabled": true
}, - "features": {
- "dnd_enabled": true,
- "call_waiting_enabled": true,
- "call_forward_enabled": true,
- "auto_answer_enabled": true,
- "srtp_enabled": true
}, - "provisioning": {
- "resync_time": "02:00",
- "resync_mode": "config_and_firmware",
- "bootup_check_enabled": true
}
}, - "vendor_overrides": {
- "ntp_server": "time.nist.gov"
}
}, - "current_ip_address": "192.168.1.101",
- "last_provisioned_at": "2019-08-24T14:15:22Z",
- "location_id": "string",
- "handsets": [
- {
- "id": "string",
- "base_id": "string",
- "ipei": "0328A0000F",
- "status": "unpaired",
- "display_name": "string",
- "slot_number": 1,
- "model": "string",
- "firmware_version": "string",
- "registered_at": "2019-08-24T14:15:22Z",
- "extensions": [
- {
- "id": "string",
- "handset_id": "string",
- "endpoint_id": "string",
- "display_name": "string",
- "endpoint": {
- "id": "string",
- "user_id": "string",
- "name": "string",
- "status": "online",
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}, - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}
], - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}
], - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}Update properties of a DECT base station.
| id required | string DECT base station identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| model | string Base station model |
| status | string Enum: "pending-sync" "provisioned" Device status |
| multicell_role | string Enum: "single" "data_master" "secondary" Role in multicell deployment |
object or null (DeviceSettings) Two-tier device settings with vendor-agnostic abstractions and vendor-specific overrides. All fields are optional — omitted fields inherit from the parent configuration layer (Global defaults → Platform → Account → Device). This schema evolves as new hardware capabilities are supported. The |
| id required | string Unique identifier |
| mac_address required | string Hardware MAC address |
| vendor required | string Device vendor (auto-detected from MAC address) |
| model | string or null Base station model |
| name | string or null Human-friendly label for the base. |
| status required | string Enum: "pending-sync" "provisioned" Current provisioning status |
| multicell_role required | string Enum: "single" "data_master" "secondary" Role in a multicell deployment:
|
| max_handsets required | integer Maximum number of handsets this base supports |
| firmware_version | string or null Current firmware version |
object or null Device-specific settings overrides | |
| current_ip_address | string or null Last known IP address of the base station |
| last_provisioned_at | string or null <date-time> When the base last fetched its configuration |
| location_id | string or null Physical location used as the emergency-services dispatch address when any handset on this base places a call. All handsets paired with this base share the same location. |
Array of objects (DECTHandset) Paired wireless handsets | |
| created_at required | string <date-time> (CreatedAt) Timestamp when it was created |
| updated_at required | string <date-time> (UpdatedAt) Timestamp when it was last updated |
{- "multicell_role": "data_master"
}{- "id": "string",
- "mac_address": "00:04:13:bb:cc:dd",
- "vendor": "snom",
- "model": "M500",
- "name": "string",
- "status": "pending-sync",
- "multicell_role": "single",
- "max_handsets": 30,
- "firmware_version": "string",
- "overrides": {
- "abstractions": {
- "audio": {
- "codecs": [
- "PCMU",
- "PCMA"
], - "vad_enabled": true,
- "echo_cancellation": true,
- "jitter_buffer": {
- "mode": "adaptive",
- "min_ms": 40,
- "max_ms": 200
}
}, - "display": {
- "time_format": "12h",
- "date_format": "M/D/Y",
- "backlight_timeout": 30,
- "backlight_level": "low"
}, - "regional": {
- "timezone": "America/New_York",
- "language": "en-US",
- "tone_scheme": "us"
}, - "network": {
- "vlan_id": 0,
- "qos_dscp_sip": 26,
- "qos_dscp_rtp": 46,
- "ntp_server": "string",
- "rtcp_enabled": true
}, - "features": {
- "dnd_enabled": true,
- "call_waiting_enabled": true,
- "call_forward_enabled": true,
- "auto_answer_enabled": true,
- "srtp_enabled": true
}, - "provisioning": {
- "resync_time": "02:00",
- "resync_mode": "config_and_firmware",
- "bootup_check_enabled": true
}
}, - "vendor_overrides": {
- "ntp_server": "time.nist.gov"
}
}, - "current_ip_address": "192.168.1.101",
- "last_provisioned_at": "2019-08-24T14:15:22Z",
- "location_id": "string",
- "handsets": [
- {
- "id": "string",
- "base_id": "string",
- "ipei": "0328A0000F",
- "status": "unpaired",
- "display_name": "string",
- "slot_number": 1,
- "model": "string",
- "firmware_version": "string",
- "registered_at": "2019-08-24T14:15:22Z",
- "extensions": [
- {
- "id": "string",
- "handset_id": "string",
- "endpoint_id": "string",
- "display_name": "string",
- "endpoint": {
- "id": "string",
- "user_id": "string",
- "name": "string",
- "status": "online",
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}, - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}
], - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}
], - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}Deprecated: Use DELETE /v1/devices/{id} instead.
Delete a DECT base station and all associated handsets and extensions.
| id required | string DECT base station identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
curl -X DELETE \ https://api.dialstack.ai/v1/dect-bases/%7Bid%7D \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "error": "Invalid request body",
- "code": "validation_error",
- "details": { }
}Deprecated: Use POST /v1/devices with type: dect_handset and
base_id set to the DECT base identifier instead.
Pair a new wireless handset with a DECT base station. The slot number is automatically assigned as the lowest available slot. IPEI (International Portable Equipment Identity) is a unique hardware identifier for wireless handsets, formatted as a hexadecimal string up to 20 characters.
| id required | string DECT base station identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| ipei required | string International Portable Equipment Identity |
| display_name | string Optional display name |
| model | string Handset model |
| id required | string Unique identifier |
| base_id | string or null Parent DECT base station. |
| ipei required | string International Portable Equipment Identity |
| status required | string Enum: "unpaired" "pending-sync" "registered" "provisioned" Current handset status |
| display_name | string or null Optional display name |
| slot_number required | integer Slot number on the base station |
| model | string or null Handset model |
| firmware_version | string or null Current firmware version |
| registered_at | string or null <date-time> When the handset was registered with the base |
Array of objects (HandsetLine) SIP line assignments on this handset | |
| created_at required | string <date-time> (CreatedAt) Timestamp when it was created |
| updated_at required | string <date-time> (UpdatedAt) Timestamp when it was last updated |
{- "ipei": "0328A0000F",
- "display_name": "Front Desk"
}{- "id": "decth_01h2xcejqtf2nbrexx3vqjhp70",
- "base_id": "dectb_01h2xcejqtf2nbrexx3vqjhp60",
- "ipei": "0328A0000F",
- "status": "pending-sync",
- "display_name": "Front Desk",
- "slot_number": 1,
- "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T10:00:00Z"
}List all wireless handsets paired with a DECT base station.
| id required | string DECT base station identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| object required | string (ListObject) Value: "list" String representing the object's type. Always "list" for list responses. |
| url required | string (ListUrl) The URL for accessing this list. |
| next_page_url required | string or null (NextPageUrl) URL to fetch the next page of results. If |
| previous_page_url required | string or null (PreviousPageUrl) URL to fetch the previous page of results. If |
required | Array of objects (DECTHandset) |
curl -X GET \ https://api.dialstack.ai/v1/dect-bases/%7Bid%7D/handsets \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "object": "list",
- "url": "/v1/accounts",
- "next_page_url": "/v1/accounts?page=eyJzdGFydGluZ19hZnRlciI6ImFjY3RfMDFoMnhjZWpxdGYybmJyZXh4M3ZxamhwNDEiLCJsaW1pdCI6MTB9",
- "previous_page_url": "/v1/accounts?page=eyJlbmRpbmdfYmVmb3JlIjoiYWNjdF8wMWgyeGNlanF0ZjJuYnJleHgzdnFqaHA0MSIsImxpbWl0IjoxMH0",
- "data": [
- {
- "id": "string",
- "base_id": "string",
- "ipei": "0328A0000F",
- "status": "unpaired",
- "display_name": "string",
- "slot_number": 1,
- "model": "string",
- "firmware_version": "string",
- "registered_at": "2019-08-24T14:15:22Z",
- "extensions": [
- {
- "id": "string",
- "handset_id": "string",
- "endpoint_id": "string",
- "display_name": "string",
- "endpoint": {
- "id": "string",
- "user_id": "string",
- "name": "string",
- "status": "online",
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}, - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}
], - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}
]
}Deprecated: Use GET /v1/devices/{id} with the handset ID instead.
Retrieve a specific handset.
| id required | string DECT base station identifier |
| handset_id required | string Handset identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| id required | string Unique identifier |
| base_id | string or null Parent DECT base station. |
| ipei required | string International Portable Equipment Identity |
| status required | string Enum: "unpaired" "pending-sync" "registered" "provisioned" Current handset status |
| display_name | string or null Optional display name |
| slot_number required | integer Slot number on the base station |
| model | string or null Handset model |
| firmware_version | string or null Current firmware version |
| registered_at | string or null <date-time> When the handset was registered with the base |
Array of objects (HandsetLine) SIP line assignments on this handset | |
| created_at required | string <date-time> (CreatedAt) Timestamp when it was created |
| updated_at required | string <date-time> (UpdatedAt) Timestamp when it was last updated |
curl -X GET \ https://api.dialstack.ai/v1/dect-bases/%7Bid%7D/handsets/%7Bhandset_id%7D \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "id": "string",
- "base_id": "string",
- "ipei": "0328A0000F",
- "status": "unpaired",
- "display_name": "string",
- "slot_number": 1,
- "model": "string",
- "firmware_version": "string",
- "registered_at": "2019-08-24T14:15:22Z",
- "extensions": [
- {
- "id": "string",
- "handset_id": "string",
- "endpoint_id": "string",
- "display_name": "string",
- "endpoint": {
- "id": "string",
- "user_id": "string",
- "name": "string",
- "status": "online",
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}, - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}
], - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}Update handset properties such as IPEI or display name.
| id required | string DECT base station identifier |
| handset_id required | string Handset identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| ipei | string International Portable Equipment Identity |
| display_name | string Display name |
| id required | string Unique identifier |
| base_id | string or null Parent DECT base station. |
| ipei required | string International Portable Equipment Identity |
| status required | string Enum: "unpaired" "pending-sync" "registered" "provisioned" Current handset status |
| display_name | string or null Optional display name |
| slot_number required | integer Slot number on the base station |
| model | string or null Handset model |
| firmware_version | string or null Current firmware version |
| registered_at | string or null <date-time> When the handset was registered with the base |
Array of objects (HandsetLine) SIP line assignments on this handset | |
| created_at required | string <date-time> (CreatedAt) Timestamp when it was created |
| updated_at required | string <date-time> (UpdatedAt) Timestamp when it was last updated |
{- "display_name": "Warehouse"
}{- "id": "string",
- "base_id": "string",
- "ipei": "0328A0000F",
- "status": "unpaired",
- "display_name": "string",
- "slot_number": 1,
- "model": "string",
- "firmware_version": "string",
- "registered_at": "2019-08-24T14:15:22Z",
- "extensions": [
- {
- "id": "string",
- "handset_id": "string",
- "endpoint_id": "string",
- "display_name": "string",
- "endpoint": {
- "id": "string",
- "user_id": "string",
- "name": "string",
- "status": "online",
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}, - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}
], - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}Deprecated: Use DELETE /v1/devices/{id} with the handset ID instead.
Remove a handset from a DECT base station. All extensions on the handset are also removed.
| id required | string DECT base station identifier |
| handset_id required | string Handset identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
curl -X DELETE \ https://api.dialstack.ai/v1/dect-bases/%7Bid%7D/handsets/%7Bhandset_id%7D \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "error": "Invalid request body",
- "code": "validation_error",
- "details": { }
}Deprecated: Use POST /v1/devices/{id}/users with the handset ID instead.
Assign a SIP endpoint to a DECT handset as an extension (SIP line).
| id required | string DECT base station identifier |
| handset_id required | string Handset identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| endpoint_id required | string ID of the SIP endpoint to assign |
| display_name | string Optional display name override |
| id required | string Unique identifier |
| handset_id required | string Unique identifier |
| endpoint_id required | string Unique identifier |
| display_name | string or null Optional display name override |
object or null The associated SIP endpoint (included on list responses) | |
| created_at required | string <date-time> (CreatedAt) Timestamp when it was created |
| updated_at required | string <date-time> (UpdatedAt) Timestamp when it was last updated |
{- "endpoint_id": "ep_01h2xcejqtf2nbrexx3vqjhp43"
}{- "id": "decte_01h2xcejqtf2nbrexx3vqjhp80",
- "handset_id": "decth_01h2xcejqtf2nbrexx3vqjhp70",
- "endpoint_id": "ep_01h2xcejqtf2nbrexx3vqjhp43",
- "display_name": null,
- "created_at": "2025-10-18T10:00:00Z",
- "updated_at": "2025-10-18T10:00:00Z"
}Deprecated: Use GET /v1/devices/{id}/users with the handset ID instead.
List all SIP line assignments on a DECT handset.
| id required | string DECT base station identifier |
| handset_id required | string Handset identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| object required | string (ListObject) Value: "list" String representing the object's type. Always "list" for list responses. |
| url required | string (ListUrl) The URL for accessing this list. |
| next_page_url required | string or null (NextPageUrl) URL to fetch the next page of results. If |
| previous_page_url required | string or null (PreviousPageUrl) URL to fetch the previous page of results. If |
required | Array of objects (HandsetLine) |
curl -X GET \ https://api.dialstack.ai/v1/dect-bases/%7Bid%7D/handsets/%7Bhandset_id%7D/extensions \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "object": "list",
- "url": "/v1/accounts",
- "next_page_url": "/v1/accounts?page=eyJzdGFydGluZ19hZnRlciI6ImFjY3RfMDFoMnhjZWpxdGYybmJyZXh4M3ZxamhwNDEiLCJsaW1pdCI6MTB9",
- "previous_page_url": "/v1/accounts?page=eyJlbmRpbmdfYmVmb3JlIjoiYWNjdF8wMWgyeGNlanF0ZjJuYnJleHgzdnFqaHA0MSIsImxpbWl0IjoxMH0",
- "data": [
- {
- "id": "string",
- "handset_id": "string",
- "endpoint_id": "string",
- "display_name": "string",
- "endpoint": {
- "id": "string",
- "user_id": "string",
- "name": "string",
- "status": "online",
- "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}, - "created_at": "2025-10-17T14:30:00Z",
- "updated_at": "2025-10-17T14:30:00Z"
}
]
}Deprecated: Use DELETE /v1/devices/{id}/users/{user_id} with the handset ID instead.
Remove a SIP line assignment from a DECT handset.
| id required | string DECT base station identifier |
| handset_id required | string Handset identifier |
| extension_id required | string Extension identifier |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
curl -X DELETE \ https://api.dialstack.ai/v1/dect-bases/%7Bid%7D/handsets/%7Bhandset_id%7D/extensions/%7Bextension_id%7D \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "error": "Invalid request body",
- "code": "validation_error",
- "details": { }
}Hardware order management.
Orders contain line items representing hardware selections (model + quantity).
Requires account context via DialStack-Account header or session token.
Creates a new hardware order in draft status with the given items. Each item references a hardware catalog entry with a quantity.
required | Array of objects non-empty | ||||
Array (non-empty)
| |||||
| id | string Hardware order ID |
| status | string Enum: "draft" "submitted" "fulfilled" "cancelled" Order lifecycle status |
Array of objects (HardwareOrderItem) Line items in the order | |
| created_at | string <date-time> |
| updated_at | string <date-time> |
{- "items": [
- {
- "hardware_catalog_id": "string",
- "quantity": 1
}
]
}{- "id": "string",
- "status": "draft",
- "items": [
- {
- "id": "string",
- "hardware_catalog_id": "string",
- "quantity": 1,
- "hardware_catalog": {
- "id": "string",
- "manufacturer": "SNOM",
- "model": "M500",
- "sku": "string",
- "device_type": "deskphone",
- "active": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}, - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Returns all hardware orders for the account, including embedded items.
| object | string |
| url | string |
Array of objects (HardwareOrder) |
curl -X GET \ https://api.dialstack.ai/v1/hardware-orders \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN'
{- "object": "list",
- "url": "/v1/hardware-orders",
- "data": [
- {
- "id": "string",
- "status": "draft",
- "items": [
- {
- "id": "string",
- "hardware_catalog_id": "string",
- "quantity": 1,
- "hardware_catalog": {
- "id": "string",
- "manufacturer": "SNOM",
- "model": "M500",
- "sku": "string",
- "device_type": "deskphone",
- "active": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}, - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
]
}Returns a hardware order by ID, including embedded items.
| order_id required | string |
| id | string Hardware order ID |
| status | string Enum: "draft" "submitted" "fulfilled" "cancelled" Order lifecycle status |
Array of objects (HardwareOrderItem) Line items in the order | |
| created_at | string <date-time> |
| updated_at | string <date-time> |
curl -X GET \ https://api.dialstack.ai/v1/hardware-orders/%7Border_id%7D \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN'
{- "id": "string",
- "status": "draft",
- "items": [
- {
- "id": "string",
- "hardware_catalog_id": "string",
- "quantity": 1,
- "hardware_catalog": {
- "id": "string",
- "manufacturer": "SNOM",
- "model": "M500",
- "sku": "string",
- "device_type": "deskphone",
- "active": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}, - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Replaces all items on a draft order. The order must be in draft status. Sends the complete desired state of items — existing items are replaced atomically.
| order_id required | string |
required | Array of objects non-empty | ||||
Array (non-empty)
| |||||
| id | string Hardware order ID |
| status | string Enum: "draft" "submitted" "fulfilled" "cancelled" Order lifecycle status |
Array of objects (HardwareOrderItem) Line items in the order | |
| created_at | string <date-time> |
| updated_at | string <date-time> |
{- "items": [
- {
- "hardware_catalog_id": "string",
- "quantity": 1
}
]
}{- "id": "string",
- "status": "draft",
- "items": [
- {
- "id": "string",
- "hardware_catalog_id": "string",
- "quantity": 1,
- "hardware_catalog": {
- "id": "string",
- "manufacturer": "SNOM",
- "model": "M500",
- "sku": "string",
- "device_type": "deskphone",
- "active": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}, - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Hardware catalog listing. Returns available hardware items for selection during onboarding. Does not require account context.
Returns the list of active hardware items available for selection during onboarding. This endpoint does not require account context.
| object | string |
| url | string |
Array of objects (HardwareCatalogItem) |
curl -X GET \ https://api.dialstack.ai/v1/catalog \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN'
{- "object": "list",
- "url": "/v1/catalog",
- "data": [
- {
- "id": "string",
- "manufacturer": "SNOM",
- "model": "M500",
- "sku": "string",
- "device_type": "deskphone",
- "active": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
]
}List audit log entries for an account with optional filtering. Results are returned in reverse chronological order (newest first).
| limit | integer [ 1 .. 100 ] Default: 10 Example: limit=10 Number of objects to return. Defaults to 10. Maximum is 100. |
| event | string Filter by event type (e.g., |
| resource | string Filter by resource ID (exact match) |
| actor | string Filter by actor ID (exact match) |
| outcome | string Enum: "success" "failure" "denied" Filter by outcome |
| ip_address | string Filter by IP address |
| created_after | string <date-time> Filter events created at or after this time (ISO 8601) |
| created_before | string <date-time> Filter events created at or before this time (ISO 8601) |
| DialStack-Account required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 Account identifier for API key authentication. Not required when using session tokens (account is derived from JWT). |
| object required | string (ListObject) Value: "list" String representing the object's type. Always "list" for list responses. |
| url required | string (ListUrl) The URL for accessing this list. |
| next_page_url required | string or null (NextPageUrl) URL to fetch the next page of results. If |
| previous_page_url required | string or null (PreviousPageUrl) URL to fetch the previous page of results. If |
required | Array of objects (AuditLogEntry) |
curl -X GET \ 'https://api.dialstack.ai/v1/audit-logs?limit=10&event=SOME_STRING_VALUE&resource=SOME_STRING_VALUE&actor=SOME_STRING_VALUE&outcome=SOME_STRING_VALUE&ip_address=SOME_STRING_VALUE&created_after=SOME_STRING_VALUE&created_before=SOME_STRING_VALUE' \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN' \ -H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41'
{- "object": "list",
- "url": "/v1/accounts",
- "next_page_url": "/v1/accounts?page=eyJzdGFydGluZ19hZnRlciI6ImFjY3RfMDFoMnhjZWpxdGYybmJyZXh4M3ZxamhwNDEiLCJsaW1pdCI6MTB9",
- "previous_page_url": "/v1/accounts?page=eyJlbmRpbmdfYmVmb3JlIjoiYWNjdF8wMWgyeGNlanF0ZjJuYnJleHgzdnFqaHA0MSIsImxpbWl0IjoxMH0",
- "data": [
- {
- "id": "string",
- "actor": "string",
- "event": "string",
- "resource": "string",
- "outcome": "success",
- "ip_address": "string",
- "timestamp": "2019-08-24T14:15:22Z"
}
]
}Call quality metrics and device registration health.
Aggregate MOS/packet-loss summaries, worst-call lookups, and live device
registration state for monitoring and troubleshooting.
Requires account context via DialStack-Account header or session token.
Returns aggregated call quality metrics for the account, including KPI averages (MOS, jitter, packet loss) and a time-bucketed series. MOS is computed using the ITU-T G.107 E-model.
| from required | string <date-time> Start of time range (RFC 3339) |
| to required | string <date-time> End of time range (RFC 3339) |
| granularity required | string Enum: "hourly" "daily" Time bucket granularity |
object | |
Array of objects |
curl -X GET \ 'https://api.dialstack.ai/v1/quality/summary?from=SOME_STRING_VALUE&to=SOME_STRING_VALUE&granularity=SOME_STRING_VALUE' \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN'
{- "kpi": {
- "avg_mos": 0,
- "avg_jitter_ms": 0,
- "avg_packet_loss_pct": 0,
- "total_calls": 0
}, - "time_series": [
- {
- "bucket": "2019-08-24T14:15:22Z",
- "avg_mos": 0,
- "call_count": 0
}
]
}Returns the calls with the lowest MOS scores in the given time range, sorted by MOS ascending (worst first). Limited to 90-day range.
| from required | string <date-time> Start of time range (RFC 3339) |
| to required | string <date-time> End of time range (RFC 3339) |
| limit | integer <= 50 Default: 10 Maximum number of calls to return (default 10, max 50) |
Array of objects | |||||||||||||||||||
Array
| |||||||||||||||||||
curl -X GET \ 'https://api.dialstack.ai/v1/quality/worst-calls?from=SOME_STRING_VALUE&to=SOME_STRING_VALUE&limit=SOME_INTEGER_VALUE' \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN'
{- "calls": [
- {
- "id": "string",
- "started_at": "2019-08-24T14:15:22Z",
- "direction": "inbound",
- "from_number": "string",
- "to_number": "string",
- "duration_seconds": 0,
- "mos": 0,
- "jitter_ms": 0,
- "packet_loss_pct": 0
}
]
}Returns the registration status of all endpoints in the account, including whether each device is currently online or offline and its public IP address when available.
Array of objects | |||||||||
Array
| |||||||||
curl -X GET \ https://api.dialstack.ai/v1/quality/device-registrations \ -H 'Authorization: Bearer REPLACE_BEARER_TOKEN'
{- "devices": [
- {
- "id": "string",
- "name": "string",
- "status": "online",
- "public_ip": "string"
}
]
}