# DialStack Documentation
> Business Voice for Vertical SaaS
This file contains all documentation content in a single document following the llmstxt.org standard.
## Account Settings
The Account Settings page shows your account's configuration and activity. Navigate to it by clicking **Settings** in the sidebar.
## Account Information
The left sidebar displays your account details. Text fields like name and email can be edited directly — Save and Cancel buttons appear when you make changes. Toggles and dropdowns save automatically. To update the billing address, click **Edit** on the address card to open a dialog.
## Locations
The Locations card shows physical office locations associated with your account. Each location can have an E911 address for emergency calling. See the [Locations guide](locations) for details.
## Audit Logs
Click **Audit Logs** to expand the card. It provides a chronological record of all API operations performed on your account — who did what, when, and from where.
Each row shows the **timestamp**, **event** (e.g., `user.create`), **resource** affected, **actor** who performed the action, **outcome** (success, failure, or denied), and **IP address**.
### Filtering
Each column has a filter directly below its header. Type or select a value to narrow results:
- **Time** — pick a start and end date to filter by time range.
- **Event** — open the picker to check specific event types. Use the **Reads** and **Writes** buttons to quickly toggle all read or write operations.
- **Resource** and **Actor** — type a prefix to match (e.g., `user` to find all user resources).
- **Outcome** — select success, failure, or denied from the dropdown.
- **IP Address** — type a full or partial IP address.
Click **Clear Filters** to reset all active filters.
### Copying entries
Hover over any row and click the copy icon to copy the full audit log entry as JSON to your clipboard.
---
## Audio Clips
Audio clips are reusable audio files that can be attached to IVR menus and other telephony features. Upload a greeting, an on-hold message, or a menu prompt once, then reference it wherever you need it.
## Viewing Audio Clips
Navigate to **Audio Clips** from the sidebar. The table shows all audio clips for the selected account, including an inline audio player, duration, file size, and creation date.
From the list, you can:
- Use the inline player to preview a clip.
- Use the **pencil** icon to rename a clip.
- Use the **trash** icon to delete a clip.
## Uploading a Clip
1. Click **Upload Audio Clip** in the top-right corner.
2. Enter a **Name** for the clip (e.g., "Main Greeting" or "After-Hours Message").
3. Provide the audio using one of two methods:
- **Upload** — Drag and drop a file or click to browse. Accepted formats: WAV, MP3, OGG, WebM.
- **Record** — Click **Start recording** to capture audio directly from your microphone. Click **Stop** when finished, preview the recording, then click **Use recording** to confirm or **Discard** to try again.
4. Click **Upload**.
**Limits:** Files must be 5 MB or smaller. The system automatically transcodes uploads to a format optimized for telephony playback. Clip names must be unique within an account.
## Renaming a Clip
To rename a clip, click the **pencil** icon in the list table, enter the new name, and click **Save**.
## Deleting a Clip
To delete a clip, click the **trash** icon in the list table and confirm. If the clip is currently referenced by a dial plan menu node, you must remove it from all menus before it can be deleted. This action cannot be undone.
---
## Call Logs
The Call Logs page displays a chronological list of all calls for the selected account, including inbound, outbound, and internal calls.
## Call List
The table shows:
- **Date/Time** — When the call started
- **Direction** — Inbound, outbound, or internal
- **From / To** — Phone numbers with labels when available
- **Duration** — Talk time (does not include ring time)
- **Status** — Completed, no answer, busy, failed, or voicemail
- **Quality** — MOS score (worst across call legs)
Click any row to open the call detail page.
## Call Detail
The detail page shows comprehensive information about a single call. The fields shown depend on the call direction.
### Call Information
**Inbound calls** show:
- **Number Dialed** — Which of your phone numbers the caller dialed (useful for tracking marketing lines or brands)
- **Caller** — The external phone number that called
- **Routed To** — The extension or person the call was routed to
**Outbound calls** show:
- **Called By** — The user or extension that placed the call
- **Destination** — The external phone number that was dialed
- **Caller ID** — Which of your phone numbers was used as the outgoing caller ID
**Internal calls** show the originating and receiving extensions.
All calls include start, answer, and end timestamps, plus the talk duration.
### Recording
When a recording is available, an audio player lets you listen to the call directly in the browser. Use the **Download** button to save the audio file.
### AI Summary
For calls with transcripts, an AI-generated summary provides a quick overview of what was discussed.
### Quality Metrics
Per-leg quality metrics (PSTN and endpoint) are displayed when available:
- **MOS** — Mean Opinion Score (1.0–4.5). Green indicates good quality (3.5+), yellow is fair (2.5–3.5), and red indicates poor quality.
- **Jitter** — Variation in packet arrival time, in milliseconds.
- **Packet Loss** — Percentage of packets lost during the call.
- **Round-Trip Time** — Network latency in milliseconds.
---
## Dashboard
The dashboard is your home screen after signing in to the admin portal. It provides quick access to the most common management tasks.
## Navigating the Dashboard
After signing in, select an account from the account picker in the top navigation bar. Once an account is selected, the dashboard displays navigation cards for:
- **Users** — Jump to user management to create, edit, or remove users.
## Account Picker
The account picker appears in the top bar. If you have access to multiple accounts, use the search field to quickly find the one you need. Your selected account persists across page navigations until you switch to a different one.
---
## Managing Devices
The Devices page lets you manage DECT wireless base stations, deskphones, and their associated handsets. DECT devices provide wireless phone connectivity, while deskphones are PoE wired or WiFi desk phones.
## Viewing Devices
Navigate to **Devices** from the sidebar. The devices table shows all devices (DECT base stations and deskphones) registered to the selected account, including their type, MAC address, vendor, model, status, and creation date.
## Provisioning
Provisioning lets supported phones configure themselves automatically instead of being set up by hand. Once a phone is added to the account, it pulls down SIP credentials, line assignments, and other settings as soon as it boots — no per-device data entry and the same baseline configuration across every phone on the account. This makes rollouts faster, keeps configuration consistent, and means a replacement phone can be swapped in without a manual rebuild.
## Adding a Device
1. Click **Add Device** in the top-right corner.
2. Choose the type of device you want to add:
- **DECT Base** — Wireless system with a base station and cordless handset units
- **Deskphone** — PoE wired or WiFi desk phones
3. Enter the **MAC Address** of the device (format: `00:04:13:XX:XX:XX`).
4. Optionally enter the **Model** (e.g., "M500" for DECT or "D785" for deskphones).
5. Click the submit button to register the device.
## Expanding Device Details
Click on any device row to expand it and see type-specific details:
- **DECT base stations** — Expand to see the handsets table with slot, IPEI, display name, status, and SIP line assignments.
- **Deskphones** — Expand to see configured lines with their line number and assigned user.
## Managing Handsets
Each DECT base station supports multiple wireless handsets. To manage handsets:
1. Click on a DECT base station row to expand it.
2. The handsets table shows all registered handsets with their slot, IPEI, display name, and status.
### Adding a Handset
1. Click **Add Handset** on the base station detail page.
2. Enter the handset's **IPEI** (International Portable Equipment Identity).
3. Enter a **Display Name** (e.g., "Reception Handset").
4. Click **Add Handset**.
### Assigning an Endpoint to a Handset
To connect a handset to a user's phone line:
1. In the handset row, click **Assign endpoint**.
2. Select the endpoint from the available list.
3. The handset will now ring when calls come in on that endpoint's line.
---
## Dial Plans
Dial plans let you build visual call routing flows using a drag-and-drop editor. Each dial plan defines how incoming calls are routed through a sequence of steps — such as ringing users, checking schedules, or forwarding to voicemail.
## Viewing Dial Plans
Navigate to **Dial Plans** from the sidebar. Dial plans are displayed in a **card view** by default, showing a visual preview of each routing flow along with its name and extension number.
Use the toggle in the top-right corner to switch between **card view** and **table view**. Both views support pagination and allow you to delete a dial plan or click through to its detail page.
## Creating a Dial Plan
1. Click **New Dial Plan** in the top-right corner.
2. Enter a **Name** for the dial plan.
3. Click **Create**.
You'll be redirected to the dial plan editor where you can build your routing flow.
## Editing a Dial Plan
Click on any dial plan card or table row to open its detail page with the visual editor.
### The Editor
The editor has three areas:
- **Node Library** (left) — Drag nodes onto the canvas to add routing steps.
- **Canvas** (center) — The visual flow diagram. Connect nodes by dragging from one node's handle to another.
- **Config Panel** (right) — Appears when you select a node or connection. Configure the selected element here.
### Node Types
The editor palette has six node types:
- **Schedule** — Routes calls based on a [schedule](./schedules.md). Has **Open** and **Closed** exits; the call follows whichever path matches the current time (holidays follow the Closed path).
- **Internal Extension** — Rings an internal target by extension: a user, [ring group](./ring-groups.md), or another dial plan. Exposes a **No Answer** exit after the configured timeout. (Targeting another dial plan lets you reuse common flows across entry points.)
- **External Number** — Rings an external phone number with a configurable timeout. Has a **No Answer** exit.
- **Ring All Users** — Rings every user in the account simultaneously. Has a **No Answer** exit.
- **Voice App** — Routes the call to a [voice app](./voice-apps.md) (e.g. an AI agent or BYO voice app).
- **Voicemail** — Sends the caller straight to a [shared voicemail box](./shared-voicemails.md). Terminal — no exits.
### Building a Flow
1. Drag a node from the library onto the canvas.
2. Connect the **Start** node to your first step by dragging from the Start node's handle.
3. Select a node to configure it in the side panel (e.g., pick a schedule or dial target).
4. Connect node exits to subsequent steps.
5. Click **Save** when done.
You can save partial flows and come back to finish them later.
## Renaming a Dial Plan
Click the dial plan name at the top of the detail page to edit it inline. Press **Enter** or click away to save.
## Extension Number
Each dial plan can have an extension number assigned. Edit it from the field next to the name on the detail page.
---
## Account Administration
As an account administrator, you can manage the day-to-day operations of your account. This section covers:
- [Dashboard](./dashboard) — Overview of your account
### Directory
- [Users](./users) — Create and manage users and their SIP endpoints
- [Devices](./devices) — Manage DECT base stations and handsets
### Telephony
- [Phone Numbers](./phone-numbers) — View numbers, order new ones, and port existing numbers
- [Port Orders](./port-orders) — Transfer phone numbers from other carriers
- [Dial Plans](./dial-plans) — Design call-routing trees that decide where inbound calls go (menus, hours, forwarding)
- [Ring Groups](./ring-groups) — Ring several users at once or in sequence under a single destination
- [Shared Voicemails](./shared-voicemails) — Team mailboxes that multiple users can monitor and manage
- [Schedules](./schedules) — Define business hours and holidays that dial plans can branch on
- [Voice Apps](./voice-apps) — Higher-level call experiences (queues, IVRs, announcements) that dial plans can hand off to
### Analytics
- [Call Logs](./call-logs) — Searchable history of every inbound and outbound call on the account
- [Quality](./quality) — Monitor call quality metrics (MOS, jitter, packet loss) across the account
### Settings
- [Locations](./locations) — Manage physical office locations
---
## Locations
Locations represent the physical office sites for your account. They are used for E911 emergency service addressing and general organizational purposes.
## Viewing Locations
Navigate to **Locations** from the sidebar. The locations list shows all registered locations with their name, address, primary phone number, and E911 status.
### E911 Status
Each location displays an E911 status badge:
- **Provisioned** — E911 is active and the location's address is registered for emergency services
- **Pending** / **Binding** — E911 provisioning is in progress
- **Failed** — E911 provisioning encountered an error. Use the **Retry E911** action to try again.
- **None** — E911 has not yet been provisioned for this location
E911 is provisioned automatically when a location has both a primary phone number and a valid address. If provisioning fails, an admin can retry it from the row actions menu.
## Adding a Location
1. Click the **Add Location** button.
2. Enter a **Location Name** (e.g., "Main Office", "Branch - Downtown").
3. Start typing the address in the **Address** field. The autocomplete will suggest matching addresses.
4. Select an address from the suggestions, or click **Enter it manually** to fill in the fields yourself.
5. Click **Add Location**.
## Editing a Location
1. Click on a location to open the edit form.
2. Update the location name or address as needed.
3. Click **Save Changes**.
## Deleting a Location
1. Open the location's edit view.
2. Click **Delete**.
3. Confirm the deletion.
:::warning
Deleting a location is permanent. Make sure no active services depend on this location before removing it.
:::
## Address Format
Locations require a complete US street address:
- **House/Building Number** — The street number
- **Street Name** — The street name
- **Suite/Unit** (optional) — Apartment, suite, or unit number
- **City**
- **State** — Two-letter state code
- **ZIP Code** — Five-digit postal code
---
## Ordering New Numbers
Use this wizard to search for available phone numbers and add them to your account.
## How It Works
1. Navigate to **Phone Numbers** → **Add Numbers** → **Order New Numbers**.
2. Search by area code or ZIP code to browse available numbers.
3. Select the numbers you want from the results.
4. Click **Order** to add them to your account.
Ordered numbers are available immediately and appear on the Phone Numbers page.
## Limits
Each account has a cap on the total number of active phone numbers it can hold (25 by default, configurable per account). An order that would push the account over its cap is rejected. If you need to hold more numbers than the default, ask your platform administrator to raise the cap before placing a large order.
Ordered numbers are activated as soon as the order completes — there is no multi-day wait for a new purchase. Porting numbers from another carrier is a separate process with its own timeline; see [Port Existing Numbers](./port-orders).
## Tips
- You can select multiple numbers from a single search before ordering.
- If you need numbers in a specific area code, search by area code for the fastest results.
- To transfer numbers you already own from another carrier, use [Port Existing Numbers](./port-orders) instead.
---
## Phone Numbers
The Phone Numbers page shows all phone numbers assigned to your account. From here you can order new numbers or initiate a port to transfer existing numbers from another carrier.
## Viewing Phone Numbers
Navigate to **Phone Numbers** from the sidebar. The table displays all numbers with their assignment status and associated port order (if applicable).
## Adding Phone Numbers
Click the **Add Numbers** button to see two options:
### Order New Numbers
Search available phone numbers from inventory and order them for your account.
1. Click **Add Numbers** → **Order New Numbers**.
2. Browse or search for available numbers.
3. Select the numbers you want and complete the order.
### Port Existing Numbers
Transfer phone numbers you already own from another carrier to .
1. Click **Add Numbers** → **Port Existing Numbers**.
2. This launches the port order wizard. See [Port Orders](./port-orders) for the full process.
## Directory Listing
The **Directory Listing** card on the Settings page lets you register one of your phone numbers in national directory databases, 411 directory assistance, and online business directories. Only one number per account can have an active listing. Temporary numbers are not eligible.
### Why directory listing matters
A registered directory listing feeds your business information into the national directory database, which in turn distributes it to online business directories, mapping services, and data aggregators that people use every day to find local businesses. Having consistent, accurate information in this network helps customers find you and builds confidence that your business is established and legitimate.
Directory registration also affects how your outbound calls are perceived. Carriers and call-screening apps cross-reference calls against directory databases. A number with a verified business listing is far less likely to be flagged as spam, which means your calls are more likely to be answered. For a small business that relies on calling customers back — appointment confirmations, follow-ups, estimates — this directly impacts your ability to reach people.
### Setting up a listing
1. Navigate to **Settings**.
2. In the **Directory Listing** card, select the number you want to list from the dropdown.
3. Choose a listing type:
- **Listed** — your business name, address, and phone number are published in directory databases, available via 411, and distributed to online directories.
- **Non-Listed** — stored in the directory database for caller verification but not published in directories. Still available via 411.
- **Non-Published** — stored for caller verification only. Not available via 411, printed, or online directories.
4. Enter your **business name** (max 200 characters).
5. Optionally select a **location** to include your address in the listing.
6. Click **Save**. The update is submitted to the carrier and may take a short time to process.
To change which number is listed, select a different number from the dropdown. The old listing will be removed automatically. To remove the listing entirely, select **None**.
## Phone Number Details
Click any active phone number in the list to open its detail page. From here you can view and manage the number's settings.
### Temporary Numbers
If the number is temporary, an informational banner appears at the top of the detail page explaining that the number is not permanently assigned and showing when it will expire.
### E911
If the phone number is associated with a location that has E911 configured, an **E911** card appears showing the current provisioning status and the linked location name. This is display-only — E911 configuration is managed through the Locations page.
### Inbound
The **Inbound** card controls where incoming calls to this number are directed. Use the routing target picker to route calls to a user, ring group, dial plan, or voice app. The change takes effect immediately.
### Outbound
The **Outbound** card controls outbound calling settings for the number.
- **Outbound Calling** — toggle whether users can place outbound calls using this number as their caller ID.
- **Caller ID Name** — the name displayed to the called party on outbound calls (also known as CNAM). Maximum 15 characters; letters, digits, spaces, and `& , . ' - ( )` are allowed. Edit the field and confirm the change in the dialog that appears. Only one caller ID change can be pending per phone number at a time — once submitted, no further updates will be accepted for that number until the carrier finishes processing (up to 72 hours).
:::note
Caller ID can only be updated for active phone numbers.
:::
### Cancelling a Number
To permanently cancel a phone number, open the detail page and click **Cancel Number** at the bottom. A confirmation dialog will appear before the number is cancelled.
:::warning
Cancelling a number is permanent. The number will stop receiving and making calls and cannot be recovered.
:::
## Port Order Status
If a phone number has an associated port order, clicking the row navigates you to the port order detail page where you can track the transfer progress.
---
## Port Orders
Number porting lets you transfer existing phone numbers from your current carrier to . The process involves creating a port order, providing subscriber details, and scheduling the transfer.
## Port Order Workflow
A port order moves through these stages:
1. **Draft** — Enter phone numbers, subscriber info, service address, and schedule.
2. **Approved** — Review and electronically sign the authorization.
3. **Submitted** — The order is sent to the carrier for processing.
4. **Scheduled** — The carrier confirms a scheduled transfer date.
5. **Complete** — Numbers are successfully transferred.
If the carrier rejects the order, it enters an **Exception** state where you can edit and resubmit.
## Creating a Port Order
1. Navigate to **Phone Numbers** → **Add Numbers** → **Port Existing Numbers**.
2. Enter the phone numbers you want to port. The system checks each number's eligibility and identifies the current carrier.
3. If numbers belong to different carriers, the system automatically splits them into separate port orders.
4. Click **Create Port Order** to save a draft.
## Completing the Draft
The port order form has four sections:
### Numbers
The phone numbers to transfer. You can add or remove numbers while the order is in draft.
### Port Details
- **Business Telephone Number (BTN)** — The main number on your current carrier account.
- **Business Name** — Must match your current carrier's records exactly.
- **Authorized Contact** — The person authorized to request the transfer.
- **Account Number** and **PIN** (optional) — Your current carrier account credentials.
### Service Address
Enter the service address exactly as it appears on your current carrier's records. Address mismatches are the most common reason for port rejections.
### Timing & Documents
- **Port Date** — The earliest date you can request is 5 business days out, and the latest is 30 calendar days out. In practice, the carrier typically confirms a date further out than the earliest allowed (see [Timeline](#timeline) below).
- **Port Time** — Between 8:00 AM and 8:00 PM Eastern.
- **CSR Upload** (recommended) — Upload a Customer Service Record from your current carrier. The CSR lists the account's authoritative subscriber details and dramatically reduces the risk of rejection.
- **Bill Copy Upload** (recommended) — Upload a recent bill from your current carrier. A bill is a useful fallback when a CSR isn't available and can help resolve carrier disputes about account details.
## Approving a Port Order
After completing all sections:
1. Review the summary on the Review page.
2. Type your full name as an electronic signature.
3. Check the authorization box.
4. Click **Approve & Sign**.
## Timeline
Number porting is a carrier-to-carrier process, and the overall timeline is set by the industry — not by . What to expect:
- **Typical duration:** 10–15 business days from submission to completion for most standard ports. Larger orders or ports with missing details can take longer.
- **Requested vs. confirmed date:** The date you pick on the port order is a _request_, not a guarantee. Your current carrier (the "losing carrier") may come back with a different date. We'll communicate the confirmed date as soon as we receive it, with enough lead time for you to prepare.
- **Rejections extend the timeline.** If any detail on the order doesn't match the losing carrier's records — business name, service address, account number, authorized contact — they will reject the port. Each rejection resets the clock: you correct the information, we resubmit, and the carrier begins review again. Uploading a recent CSR or bill up front is the single best way to avoid this.
## Tracking Progress
Once submitted, the port order detail page shows the current status timeline. You'll be notified when the carrier provides updates. No action is needed during the processing stage unless the carrier rejects the order.
## Handling Rejections
If a carrier rejects the port order:
1. The order enters **Exception** status with a rejection reason (e.g., address mismatch, invalid account number).
2. Click **Edit & Resubmit** to correct the information.
3. Resubmit the order to the carrier.
---
## Call Quality
The Quality dashboard shows aggregated call quality metrics for your account, helping you identify and troubleshoot degraded calls.
## What is MOS?
Call quality on this page is reported primarily through **MOS — Mean Opinion Score**. MOS is the industry-standard rating for voice quality, expressed on a 1 to 5 scale where higher is better:
| MOS | Perceived quality |
| --------- | --------------------------------------------- |
| 4.3 – 5.0 | Excellent — indistinguishable from in-person |
| 4.0 – 4.3 | Good — minor issues, callers unlikely to care |
| 3.5 – 4.0 | Fair — occasional glitches noticeable |
| 3.0 – 3.5 | Poor — callers likely to complain |
| Below 3.0 | Unacceptable — conversation is difficult |
MOS is computed from measurable factors like jitter, packet loss, and latency, so you can use it as a single headline number without interpreting each underlying metric.
## KPI Cards
At the top of the page, four cards summarize key metrics for the selected time period:
- **Avg. MOS** — Mean Opinion Score averaged across all answered calls. Scores above 4.0 are good, 3.5–4.0 are fair, and below 3.5 indicate quality issues.
- **Avg. Jitter** — Average jitter in milliseconds. Lower values indicate more consistent audio delivery.
- **Avg. Packet Loss** — Average percentage of packets lost during calls.
- **Total Calls** — Number of answered calls with quality data in the selected period.
## MOS Over Time
The area chart displays how MOS trends over the selected time window. A dashed red line marks the 3.5 quality threshold — calls below this line may have noticeable audio issues.
## Lowest Quality Calls
A table lists the worst-quality calls sorted by MOS (lowest first). Each row shows the call time, direction, caller, recipient, duration, MOS score, jitter, and packet loss. Use this to identify specific calls that experienced quality degradation.
## Time Range
Toggle between two views:
- **Last 24 Hours** — Hourly buckets for the past day.
- **Last 7 Days** — Daily buckets for the past week.
---
## Ring Groups
Ring groups let you route incoming calls to multiple destinations simultaneously. When a call reaches a ring group, all members ring at the same time until someone answers or the timeout expires.
## Viewing Ring Groups
Navigate to **Ring Groups** from the sidebar. The table shows all ring groups for the selected account, including their name, extension number, and member count.
## Creating a Ring Group
1. Click **Add Ring Group** in the top-right corner.
2. Enter a **Name** for the ring group (e.g., "Sales Team" or "Support").
3. Click **Create**.
## Ring Group Details
Click on any ring group row to open its detail page. The detail page has two sections:
### Settings
- **Timeout** — How long (in seconds) all members ring before the call is considered unanswered. Must be between 5 and 300 seconds.
- **Ignore Forwarding** — When enabled, call forwarding rules set on individual members are bypassed. The ring group rings the member's endpoint directly.
- **Confirm Pick-Up (External)** — When enabled, external phone number members must press "1" before being connected to the caller. This prevents calls from being answered by an external voicemail system instead of a real person. While the external member hears the confirmation prompt, the ring group **keeps ringing all other members**; whoever answers first (an internal member picking up, or the external member pressing 1) wins, and the remaining members are dropped.
- **Timeout Behavior** — What happens when no member answers within the timeout. Options are: **None** (the call hangs up), **Ring user** (ring a specific user), or **Voicemail** (send to a user's voicemail or a [shared voicemail box](./shared-voicemails.md)).
- **Timeout Target** — The user or shared voicemail box to route to when no member answers. This field appears when Timeout Behavior is set to Ring user or Voicemail.
### Members
Members are the destinations that ring when the group receives a call. A member can be either an **extension** (a user, dial plan, voice app, or another ring group) or an **external phone number**.
#### Adding a Member
1. Click **Add Member**.
2. Choose the member type:
- **Extension** — Search for and select a user, dial plan, voice app, or ring group from your account.
- **Phone Number** — Enter an external phone number. The number is validated and formatted as you type.
3. Click **Add**.
#### Removing a Member
Hover over a member row and click the trash icon to remove it from the ring group.
## Renaming a Ring Group
Click the ring group name at the top of the detail page to edit it inline. Press **Enter** or click away to save.
## Deleting a Ring Group
Ring groups can be deleted from the account detail page under the Ring Groups section.
---
## Schedules
Schedules define when your business is open or closed. They are used by dial plans to route calls differently during business hours, after hours, and on holidays.
## Viewing Schedules
Navigate to **Schedules** from the sidebar. The table shows all schedules for the selected account, including their name, timezone, and number of time ranges.
## Creating a Schedule
1. Click **Add Schedule** in the top-right corner.
2. Enter a **Name** for the schedule (e.g., "Business Hours").
3. Optionally select a **Timezone**. If not set, the account's default timezone is used.
4. Click **Add Schedule**.
You can add weekly time ranges and holidays after creating the schedule.
## Schedule Details
Click on any schedule row to open its detail page. The header shows the schedule name (editable), timezone selector, current local time, and an open/closed badge.
### Override Banner
When a manual override is active, a colored banner appears at the top of the page showing whether the schedule is forced open (green) or forced closed (amber). The banner displays a live countdown until the override expires and provides a **Cancel** button.
### Weekly Hours
Define when the business is open using the day selector and time picker.
- **Day pills**: Click the day buttons (Mon–Sun) to select one or more days. Use the **Weekdays** or **Weekend** quick-select links below.
- **Time picker**: When at least one day is selected, set the start and end times and click **Add Range**.
- **Visual grid**: A 7-column (Mon–Sun) × 24-row (hours) grid shows which hours are covered. Hover over filled cells to see the exact time ranges.
- **Grouped list**: Ranges are grouped by identical times (e.g., "Mon–Fri: 09:00 – 17:00") for easy scanning.
- **Empty state**: If no ranges are set, click **Set weekday hours (Mon–Fri 9–5)** to quickly create standard business hours.
### Holidays
Define dates when the business is closed regardless of weekly hours.
- **Add manually**: Use the date pickers at the bottom to select start and end dates, then click **Add**.
- **Import holidays**: Click **Import** to open a dialog with US and Canadian statutory holidays for the current and next year. Check the holidays you want and click **Import Selected**.
- **Proximity badges**: Upcoming holidays show "Today", "Tomorrow", or "In X days" badges. Past holidays appear dimmed at the bottom.
### Manual Override
Temporarily override the schedule to force it open or closed.
1. Click **Force Open** (green) or **Force Closed** (red).
2. Choose a duration preset: **1 hour**, **End of day**, **Tomorrow 9 AM**, or **Custom...** for a specific date and time.
3. When active, the override banner at the top shows the status and countdown. Click **Cancel** on the banner to remove the override.
## Using Schedules in Dial Plans
Schedules are referenced by dial plan **schedule nodes**. A schedule node checks whether the schedule is currently open, closed, or on holiday, and routes the call to a different path for each case. See the dial plans documentation for details.
---
## Shared Voicemail Boxes
Shared voicemail boxes are voicemail boxes that are not tied to any individual user. They provide a single destination where callers can leave messages for an entire department, team, or function.
## When to Use a Shared Voicemail Box
Shared voicemail boxes are useful when messages should be accessible to a group rather than a single person:
- **Departments** — A "Sales" or "Support" voicemail box that the whole team monitors.
- **After-hours** — A general mailbox for calls that arrive outside business hours.
- **Overflow** — A fallback destination when a ring group times out and no one is available.
## Viewing Shared Voicemail Boxes
Navigate to **Shared Voicemails** from the sidebar. The table shows all shared voicemail boxes for the selected account, including their name, extension number, and email address.
From the list, you can:
- Click a row to open the detail page.
- Use the **eraser** icon to clear all voicemail messages in a box.
- Use the **trash** icon to delete a box entirely.
## Creating a Shared Voicemail Box
1. Click **Add Shared Voicemail** in the top-right corner.
2. Enter a **Name** for the voicemail box (e.g., "Sales Voicemail" or "After-Hours").
3. Click **Create**.
## Shared Voicemail Box Settings
Click on any shared voicemail box row to open its detail page. All settings are saved automatically when you change them.
- **Extension** _(optional)_ — An extension number to make the shared voicemail box directly dialable from within your phone system.
- **PIN** _(optional)_ — A numeric PIN (4–10 digits) for remote voicemail access.
- **Email** _(optional)_ — An email address that receives new voicemail notifications. When set, the toggles below control what is included in each notification.
- **Include AI Summary** — Include an AI-generated summary of the voicemail message. Enabled by default.
- **Include Full Transcript** — Include the full text transcript of the voicemail message. Enabled by default.
- **Attach Voicemail Audio** — Attach the voicemail recording as an MP3 file. Enabled by default.
- **Delete After Email** — When enabled, voicemail messages are automatically deleted after the email notification is sent. This option is only available when **Attach Voicemail Audio** is enabled. Useful when the team manages voicemails entirely through email and does not need to keep them in the system.
:::note
**Storage limit:** Each shared voicemail box can store up to 99 messages. When the limit is reached, the oldest message is automatically deleted to make room for new ones. To retain all messages long-term, enable **Delete After Email** with an email address so messages are delivered before being removed.
:::
## Using with Ring Groups
Shared voicemail boxes can be configured as the timeout destination for a ring group. When no ring group member answers within the timeout period, the call is sent to the shared voicemail box.
To set this up, open the ring group's detail page and set **Timeout Behavior** to **Voicemail**, then select the target shared voicemail box from the picker. See [Ring Groups](./ring-groups.md) for more details.
## Renaming a Shared Voicemail Box
Click the shared voicemail box name at the top of the detail page to edit it inline. Press **Enter** or click away to save.
## Clearing Voicemail Messages
To delete all voicemail messages in a box without deleting the box itself, click the **eraser** icon in the list table and confirm. This permanently removes all messages and cannot be undone.
## Deleting a Shared Voicemail Box
To delete a shared voicemail box and all its messages, click the **trash** icon in the list table and confirm. This action cannot be undone.
---
## Managing Users
Users represent the people in your organization who make and receive calls.
## Roles
Every user in the account has one of two roles:
- **Member** — can sign in, place and receive calls on their assigned devices, check their own voicemail, and update their own profile. Members cannot manage other users or account-wide settings.
- **Admin** — everything a Member can do, plus managing users, devices, phone numbers, dial plans, ring groups, voice apps, schedules, and other account settings.
You can promote a Member to Admin (or demote an Admin back to Member) from the user's detail page.
## Viewing Users
Navigate to **Users** from the sidebar. The users table shows all users in the selected account with their name, email, and creation date. Use the search bar to filter by name or email.
## Creating a User
1. Click the **New User** button in the top-right corner.
2. Fill in the user's **Name** and **Email** address.
3. Click **Create User**.
The user will be created and appear in the users table.
## Editing a User
1. Click on a user row in the table to open their detail page.
2. Edit the **Name**, **Email**, or **Extension** field directly.
3. Click the checkmark to save, or press **Enter**. Press **Escape** to cancel.
## Outbound Caller ID
Each user can have a custom outbound caller ID that overrides the account default. When a user makes an outbound call, the system uses their override number instead of the account's default.
To set a user's outbound caller ID:
1. Open the user's detail page.
2. In the **Outbound Caller ID** dropdown, select a phone number.
3. The change is saved automatically.
Select **Account Default** to remove the override and use the account-level default instead.
## Voicemail
The **Voicemail** card on the user detail page lets you configure voicemail settings.
### PIN
Set a numeric PIN (4-10 digits) for remote voicemail access. When a PIN is set, the user can dial in and enter their PIN to check voicemails. Leave empty to disable PIN-based access.
### Email Notifications
Users can receive email notifications when they get a new voicemail. To configure:
1. In the **Voicemail** card, toggle **Enable notifications**.
2. Optionally adjust the following settings:
- **Include AI Summary** — adds a brief AI-generated summary to the email.
- **Include Transcript** — includes the full voicemail transcript.
- **Attach Audio** — attaches the voicemail audio file (MP3).
- **Delete After Email** — automatically deletes the voicemail after the email is sent (requires Attach Audio to be enabled, since the audio file is removed from the system).
:::info
The user must have an email address configured. Notification emails are sent to the user's email address.
:::
When **Include AI Summary** or **Include Transcript** is enabled, the email is sent after transcription completes rather than immediately.
## Find Me / Follow Me
The **Find Me / Follow Me** card on the user detail page lets you configure how inbound calls to this user are routed.
Each **step** rings all its targets simultaneously for a configurable timeout. Steps are tried in order — if no one answers in a step, the next step begins.
### Target types
Each step can include one or more targets:
- **Internal extension** — rings a user's devices (can be the current user or another user).
- **External number** — dials a phone number.
### Fallback
After all steps are exhausted without an answer, the configured fallback action runs:
- **Go to voicemail** — sends the caller to this user's voicemail box.
- **Hang up** — disconnects the call.
- **Route to...** — routes to a specific target (user, ring group, voice app, dial plan, or shared voicemail).
### Example
A typical setup:
1. **Step 1** (20s): Ring user's devices.
2. **Step 2** (30s): Ring the user's cell phone.
3. **Fallback**: Go to voicemail.
## User Devices
The user detail page shows any DECT devices assigned to the user. To manage devices, visit the **Devices** page.
## Deleting a User
1. Open the user's detail page.
2. Click **Delete user**.
3. Confirm the deletion in the dialog.
:::warning
Deleting a user is permanent and cannot be undone.
:::
---
## Voice Apps
Voice apps are automated call-handling applications that can answer calls, interact with callers, and perform actions on your behalf. Currently, supports **AI Agent** voice apps — intelligent agents that use natural language to converse with callers.
## Viewing Voice Apps
Navigate to **Voice Apps** from the sidebar. The table shows all voice apps for the selected account, including their name, type, and extension number.
## Creating an AI Agent
1. Click **Add Voice App** in the top-right corner.
2. Enter a **Name** for the agent (e.g., "Front Desk" or "Appointment Bot").
3. Assign an **Extension Number** so the agent can receive calls.
4. Click **Create**.
## AI Agent Configuration
Click on any voice app row to open its detail page. The following settings are available:
### General
- **Persona Name** — An optional display name the agent uses when introducing itself to callers.
- **Greeting Name** — An optional name used in the agent's initial greeting (e.g., "Hi, this is \[greeting name\], how can I help you?").
- **Instructions** — Free-text instructions that guide the agent's behavior and tone during calls. Use this to define the agent's personality, knowledge boundaries, and conversation style.
### FAQ
The FAQ section lets you define question-and-answer pairs the agent can reference during calls. Each entry has a **Question** and an **Answer** field. The agent uses these to provide consistent, accurate responses to common inquiries.
- Click **Add FAQ** to add a new pair.
- Click the trash icon on any row to remove it.
### Scheduling
The scheduling section connects your AI agent to an external scheduling system so it can look up customers, check availability, and book appointments on behalf of callers.
#### Webhook URL
Provide a webhook URL to enable scheduling. Clear the URL to disable it. The URL must use HTTPS. This is the base URL of your scheduling system's webhook endpoint. DialStack automatically appends the following paths for each operation:
- `/customers/lookup` — identifies the caller by phone number
- `/availability/search` — fetches available time slots
- `/bookings` — confirms and creates an appointment
When a caller asks to schedule, the agent uses these endpoints in sequence: it looks up the customer, retrieves available slots, presents options, and books the selected time.
## Renaming a Voice App
Click the voice app name at the top of the detail page to edit it inline. Press **Enter** or click away to save.
## Deleting a Voice App
Voice apps can be deleted from the account detail page under the Voice Apps section.
---
## Admin Guide
Welcome to the Admin Guide. This guide covers everything you need to know about managing your voice platform.
## Getting Started
The admin portal lets you manage users, devices, phone numbers, and locations for your organization. What you can access depends on your role:
- **Account Administrators** can manage users, devices, phone numbers, and locations within their assigned accounts.
- **Platform Administrators** have all account admin capabilities plus platform-wide settings, branding, and multi-account management.
Select a topic from the sidebar to get started.
## Call routing
Incoming calls are routed through a combination of:
- **[Dial Plans](./account-admin/dial-plans.md)** — visual flows that branch on schedules, dial users or groups, and fall back to voicemail or voice apps.
- **[Ring Groups](./account-admin/ring-groups.md)** — ring multiple destinations (users, dial plans, voice apps, or external numbers) at once.
- **[Schedules](./account-admin/schedules.md)** — business hours and holidays, referenced by Schedule nodes in dial plans.
- **[Voice Apps](./account-admin/voice-apps.md)** — AI agents and custom voice applications used as dial-plan or ring-group targets.
---
## Branding
Customize the look and feel of your admin portal with your own branding. Changes apply to all users who access your platform.
## Platform Name
Set the display name that appears throughout the admin portal. This replaces the default "DialStack" branding with your organization's name.
## Logo
Upload your organization's logo. Supported formats are PNG, JPEG, SVG, and WebP (max 2MB). The logo appears in the sidebar and login pages.
To upload a logo:
1. Click the upload area or drag and drop a file.
2. Wait for the upload to complete.
3. The new logo appears immediately.
## Theme Colors
Customize the color scheme for both light and dark modes. Each theme supports the following colors:
| Color | Purpose |
| ---------------------- | ---------------------------------------- |
| **Primary** | Buttons, links, and interactive elements |
| **Primary Foreground** | Text on primary-colored buttons |
| **Background** | Page and sidebar backgrounds |
| **Foreground** | Main text and headings |
| **Card** | Card and panel backgrounds |
| **Muted** | Subtle backgrounds and disabled states |
| **Muted Foreground** | Secondary text, labels, and placeholders |
| **Accent** | Hover states and highlighted elements |
| **Border** | Borders, dividers, and input outlines |
### Adding a Custom Theme
1. Click **Add Custom Light Theme** to create a light mode theme.
2. Adjust the color values using hex codes (e.g., `#6B2CFF`).
3. Optionally click **Add Custom Dark Theme** for a dark mode variant.
4. Use the **Preview** section to see how your changes look.
5. Click **Save** to apply.
:::note
A light theme is required before you can add a dark theme.
:::
## Custom Fonts
Choose custom fonts from Google Fonts for headings and body text:
- **Heading Font** — Used for h1-h6 headings and titles
- **Body Font** — Used for paragraphs, labels, and general text
Select a font from the dropdown or search by name. Choose **Use default** to revert to the default Poppins font.
## Reset to Defaults
Click **Reset to Defaults** to remove all custom branding and revert to the default appearance.
---
## Platform Administration
As a platform administrator, you have all the capabilities of an account administrator plus access to platform-wide settings. This page is the entry point for features exclusive to platform admins — the rest of this section goes deeper into each topic. The order below mirrors how the pages are grouped in the portal: configuration first, then people, then the accounts on the platform.
### Platform configuration
- [Platform Settings](./platform-settings) — Handle, status, API keys, and Webhook Secret
- [Branding](./branding) — Customize your platform's appearance
- [Messaging Partners](./messaging-partners) — Approve third-party messaging providers for your platform's numbers
### People
- [Manage Platform Admins](./manage-platform-admins) — Add or remove platform administrators
### Accounts
- [Manage Accounts](./manage-accounts) — Create and manage accounts within your platform
- [Onboarding Dashboard](./onboarding-dashboard) — Track onboarding progress across accounts
---
## Manage Accounts
Accounts represent individual organizations or business units within your platform. Each account has its own users, devices, phone numbers, and settings.
## Viewing Accounts
Platform admins can see all accounts via the **Accounts** section on the platform detail page. The list shows each account's name, email, region, timezone, and creation date.
## Creating an Account
1. Navigate to **Accounts** and click **New Account**.
2. Fill in the required fields:
- **Name** — A display name for the account (e.g., "Acme Inc.")
- **Email** — Contact email for the account
- **Account Mode** — Choose **Live** or **Sandbox**
- **Timezone** — Select the account's timezone
3. Optionally configure:
- **Extension Length** — Number of digits for extensions (3-6)
- **Transcription Enabled** — Enable call transcription for this account
- **Recording Enabled** — Enable call recording for this account
- **Billing Address** — The account's billing address
4. Click **Create Account**. You will be redirected to the new account's detail page.
## Live vs. Sandbox accounts
Every account runs in one of two modes — **Live** or **Sandbox** — and the mode is locked at creation.
- **Live accounts** connect to the real telephone network. Calls place and ring real phones, text messages go to real handsets, and everything is billable.
- **Sandbox accounts** are completely isolated from the real world. They exist so you can explore the platform, build integrations, or run demos without affecting a live customer and without a phone bill.
Nothing you do in a sandbox — placing a call, ordering a number, sending a message — touches real carriers or real phones. Sandbox actions do **not** affect live accounts, and live accounts do not see sandbox activity.
### Sandbox phone numbers are not dialable
Phone numbers in a sandbox account are synthetic. They follow the reserved format `+1AAA555‑01XX` (North American 555-01XX range), which the telephone industry reserves for fictional use. Two quick ways to recognize a sandbox number:
- The seven digits after the area code begin with `555` (not a real exchange).
- The line portion is in the `0100–0199` range.
Calling a sandbox number from a real phone will not reach — the call will fail at the originating carrier. Sandbox numbers can only be used within the sandbox itself.
## Editing an Account
1. Navigate to the account detail page from the **Accounts** list.
2. Click the **Edit** button in the Account Information card.
3. Update any editable fields.
4. Click **Save Changes**.
## Default Outbound Caller ID
The **Default Outbound Number** setting controls which phone number appears as the caller ID on outbound calls from this account. By default, the system uses the first available outbound-enabled number.
To set a default:
1. Open the account settings page.
2. In the **Default Outbound Number** dropdown, select a phone number.
3. The change is saved automatically.
Individual users can override this default from their user detail page. See [Managing Users](/admin-guide/account-admin/users#outbound-caller-id) for details.
## Deleting an Account
1. Open the account settings page.
2. Click **Delete account**.
3. Confirm the deletion.
:::warning
Deleting an account is permanent and removes all associated users, devices, phone numbers, and data.
:::
## Switching Between Accounts
Use the account picker in the top navigation bar to switch between accounts. All account-scoped pages (Users, Devices, Phone Numbers, Locations) automatically reflect the selected account.
---
## Manage Platform Admins
Platform administrators have full access to manage all accounts, settings, and branding within a platform.
## Viewing Platform Admins
Navigate to your platform detail page. The **Platform Administrators** section lists all current admins with their email, name, role, and creation date.
## Adding a Platform Admin
1. Click **Add Admin** in the Platform Administrators section.
2. Enter the new admin's **Email** address.
3. Enter their **Name**.
4. Click **Add Administrator**.
The new admin will receive an email invitation to set up their account. Once they sign in, they'll have full platform admin access.
## Removing a Platform Admin
1. In the Platform Administrators list, find the admin you want to remove.
2. Click the delete action.
3. Confirm the removal.
:::note
You cannot remove the last platform admin. At least one administrator must remain.
:::
---
## Messaging Partners
When a customer wants to send or receive text messages on a phone number hosted by using a third-party messaging provider (for example, another CPaaS), that provider sends a **messaging transfer request** to the carrier. The carrier passes the request to , and we approve or deny it.
The **Messaging Partners** card on the Platform page lets you configure how those transfer requests are handled for numbers on your platform.
## Auto-approve transfers
When **Auto-approve transfers** is enabled, messaging transfer requests from any of your **Approved Network Identifiers** are approved automatically — no manual step required. Requests from providers not on the list are still reviewed as they come in.
Leave this toggle off if you want to review every transfer request by hand.
## Approved Network Identifiers
Each messaging provider is identified by a **Network Identifier (NNID)** — a short string assigned by the carrier (for example, `twilio-nnid`).
Add an NNID for each third-party provider whose transfer requests you trust. To add one:
1. Open the platform page.
2. In the **Messaging Partners** card, type the NNID into the input box.
3. Click **Add**.
4. Click **Save NNIDs** to persist the list.
To remove an NNID, click the remove button next to it and save again.
:::info
NNIDs apply at the platform level. Every account and every number on the platform shares the same approved list.
:::
---
## Onboarding Dashboard
The Onboarding Dashboard gives admins a unified view of onboarding health — both at the platform level and for individual accounts.
## Why onboarding matters
Every feature on assumes the onboarding steps have been completed: numbers can only route calls once they're assigned, users can only place calls once devices are provisioned, and call quality data only starts flowing once real traffic is running. An account that stalls partway through onboarding isn't broken — it simply isn't using the platform yet, and the customer is paying for something they haven't unlocked.
That's what makes this dashboard useful day-to-day:
- **Catch stuck accounts early.** An account sitting on the same step for days is a leading indicator of a customer who will churn or open a support ticket. Reach out before they do.
- **Prioritize outreach.** The in-progress breakdown tells you where customers get stuck most often — if most accounts stall on Numbers, the fix is in porting or area-code coverage; if they stall on Hardware, it's shipping or provisioning.
- **Measure platform health.** The percentage of accounts that have completed onboarding is a concrete retention and activation metric — not a vanity number.
Treat any account stuck in **In Progress** or sitting in **Not Started** as an action item, not a statistic.
## Accessing the Dashboard
From the **Accounts** page, click the **Onboarding Dashboard** button in the top-right corner.
## Platform Admin View
As a platform admin, the dashboard shows:
### Platform Setup Checklist
A checklist with a circular progress indicator showing how far along your platform setup is:
- **Branding & Theme** — has your platform's branding been configured?
- **Account Created** — has at least one account been created?
- **Account Admin Assigned** — has an account admin user been assigned?
The circular progress ring reflects the percentage of accounts that have completed onboarding.
### Account Stats
Four summary cards show:
| Card | Description |
| -------------- | --------------------------------------------- |
| Total Accounts | Total number of accounts on the platform |
| Completed | Accounts that finished the onboarding flow |
| In Progress | Accounts currently working through onboarding |
| Not Started | Accounts that haven't begun onboarding |
### In-Progress Step Breakdown
A bar chart showing how in-progress accounts are distributed across the three onboarding steps:
- **Account Setup** — configuring basic account details
- **Numbers** — assigning phone numbers
- **Hardware** — provisioning devices
This chart only appears when there are accounts in progress.
### Accounts Table
A full list of all accounts with their onboarding status, current step, and completion date.
---
## Platform Settings
The platform settings page shows your platform configuration, including status and API keys.
## Viewing Platform Information
Navigate to your platform from the sidebar (the platform name appears in the navigation for platform admins). The platform detail page shows:
- **Handle** — Your platform's unique identifier
- **Status** — Whether the platform is Active, Suspended, or Cancelled
- **Publishable Key** — The public API key used in client-side SDK integrations
- **Created** — When the platform was created
## API Keys
Your platform has two types of API keys, each with a live and a test variant:
- **Publishable Key** — Safe to include in client-side code. Used to initialize the SDK.
- **Secret Key** — Must be kept confidential. Used for server-to-server API calls. This key is only shown once, at platform creation or when you rotate keys.
Click the copy icon next to any key to copy it to your clipboard.
## Webhook Secret
The **Webhook Secret** is separate from the Secret Key. It is used to sign webhook deliveries so your receiving endpoint can verify that a webhook actually came from and hasn't been tampered with. It is _not_ an API key and cannot be used to call the API.
In short:
- **Secret Key** — authenticates _your_ calls to our API.
- **Webhook Secret** — lets you authenticate _our_ calls to your webhook endpoint.
---
## Activity Logging
Write every call, voicemail, and recording into your system of record.
This is a **pattern built on [Webhook Events](./webhook-events)**, not a separate API — webhooks are the right transport because they give you durable retries, signed payloads, and stable event IDs. The pattern is the same regardless of your stack: receive → dedupe → write.
## The four primary event types
These four cover the minimum needed to reconstruct a call log. `call.end` carries everything you need to write the row — direction, timestamps, duration, status, caller/callee — so you don't need `call.start` for logging. Subscribe to `call.start` or `call.incoming` additionally if you want a pre-answer row (e.g. to show ringing calls in a live dashboard).
| Event | When it fires | What to persist |
| ----------------------------------------------------------------------- | ----------------------------------------------------- | ---------------------------------------------------------------- |
| `call.end` | Call completes (answered, no-answer, busy, or failed) | A row in your call log — timestamps, duration, direction, status |
| `voicemail.new` | A voicemail is left | A row in your voicemail log with the audio URL and caller info |
| `recording.available` | A call recording finishes | The recording URL, attached to the existing call log row |
| `recording.transcription.complete` / `voicemail.transcription.complete` | Transcripts become ready | The transcript text, attached to the call or voicemail row |
See [Webhook Events](./webhook-events) for every field in every payload.
## Minimal handler
```ts
// POST /webhooks/dialstack
app.post('/webhooks/dialstack', express.raw({ type: 'application/json' }), async (req, res) => {
verifySignature(req); // see webhook-events.md
const event = JSON.parse(req.body);
// Dedupe by event.id — DialStack may deliver the same event more than once.
if (await db.processedEvents.exists(event.id)) {
return res.status(200).end();
}
await db.processedEvents.insert({ id: event.id });
switch (event.type) {
case 'call.end':
await db.calls.upsert({
call_id: event.data.call_id,
account_id: event.account_id,
direction: event.data.direction,
from: event.data.from_number,
to: event.data.to_number,
user_id: event.data.user_id,
status: event.data.status,
started_at: event.data.started_at,
answered_at: event.data.answered_at,
ended_at: event.data.ended_at,
duration_seconds: event.data.duration_seconds,
});
break;
case 'recording.available':
await db.calls.update(event.data.call_id, {
recording_url: event.data.url,
});
break;
case 'recording.transcription.complete':
await db.calls.update(event.data.call_id, {
transcript: event.data.transcript,
});
break;
case 'voicemail.new':
await db.voicemails.insert({
voicemail_id: event.data.voicemail_id,
account_id: event.account_id,
from: event.data.from_number,
audio_url: event.data.url,
received_at: event.created_at,
});
break;
case 'voicemail.transcription.complete':
await db.voicemails.update(event.data.voicemail_id, {
transcript: event.data.transcript,
});
break;
}
res.status(200).end();
});
```
Respond `200` fast. If any persist step is slow, queue it (SQS, BullMQ) and let the webhook return immediately — DialStack will treat anything slower than a few seconds as a failure and retry.
## Retry behavior
DialStack retries non-`2xx` responses with exponential backoff. That means:
- **Dedupe on `event.id`.** Every event carries a stable ID. A retry of the same event reuses that ID, so if you key your writes on it (or record the IDs you've already processed), retries won't produce duplicate rows.
- **Accept out-of-order delivery.** `recording.available` can arrive after `recording.transcription.complete` if the transcript came from an earlier attempt. Persist what you have, enrich what comes later.
- **Short timeouts.** DialStack's own timeout is tight; don't make upstream calls on the webhook path.
## Enrichment window
`call.end` fires immediately when the call ends. Recordings and transcripts arrive later:
- `recording.available` — seconds to a minute after `call.end`.
- `*.transcription.complete` — typically under a minute for short calls; longer for long calls.
Your UI should show the call row immediately on `call.end` and progressively enrich it as the other events arrive.
## See also
- [Webhook Events](./webhook-events) — full event surface + signature verification.
- [Screen Pop](./screen-pop) — the other half of the event loop: react to calls as they ring.
- [Appointment Webhooks](./appointment-webhooks) — request/response webhooks for AI Scheduling.
---
## Appointment Webhooks
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
# Appointment Webhooks
Receive appointment availability searches and booking requests from DialStack.
## Overview
When DialStack's voice AI searches for availability or creates a booking, your platform can receive webhook notifications to handle these requests. Webhooks are optional — if not configured, the voice AI will receive an error.
## How It Works
```
┌─────────────┐ ┌───────────┐ ┌──────────────┐
│ DialStack │ │ DialStack │ │ Your Platform│
│ Voice AI │ │ API │ │ │
└──────┬──────┘ └─────┬─────┘ └──────┬───────┘
│ │ │
│ 1. Search/Book │ │
│────────────────────▶│ │
│ │ │
│ │ 2. Webhook POST │
│ │────────────────────▶│
│ │ │
│ │ 3. JSON Response │
│ │◀────────────────────│
│ │ │
│ 4. Pass-through │ │
│◀────────────────────│ │
```
1. Voice AI sends request to DialStack
2. DialStack relays to your platform's webhook URL
3. Your platform processes and responds
4. DialStack passes the response back to the voice AI
## Configuration
Configure webhooks on your platform record:
- **webhook_url**: Base URL for webhook endpoints (e.g., `https://api.yourplatform.com/dialstack`)
- **webhook_secret**: Shared secret for signature verification
DialStack will append the endpoint path to your base URL:
- `{webhook_url}/availability/search`
- `{webhook_url}/bookings`
## Webhook Endpoints
### Search Availability
Receive availability search requests.
**Endpoint:** `POST {webhook_url}/availability/search`
**Request Headers:**
```
Content-Type: application/json
X-DialStack-Signature: t=1697634600,v1=5257a869e7ecebeda32affa62cdca3fa51cad7e77a0e56ff536d0ce8e108d8bd
X-DialStack-Account-Id: acct_01h2xcejqtf2nbrexx3vqjhp41
```
**Request Body:**
```json
{
"account_id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
"query": {
"filter": {
"start_at_range": {
"start_at": "2024-01-15T09:00:00Z",
"end_at": "2024-01-15T17:00:00Z"
}
}
}
}
```
**Expected Response (200 OK):**
```json
{
"availabilities": [
{
"start_at": "2024-01-15T10:00:00Z",
"duration_minutes": 30
}
]
}
```
### Create Booking
Receive booking creation requests.
**Endpoint:** `POST {webhook_url}/bookings`
**Request Headers:**
```
Content-Type: application/json
X-DialStack-Signature: t=1697634600,v1=5257a869e7ecebeda32affa62cdca3fa51cad7e77a0e56ff536d0ce8e108d8bd
X-DialStack-Account-Id: acct_01h2xcejqtf2nbrexx3vqjhp41
```
**Request Body:**
```json
{
"account_id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
"idempotency_key": "booking-req-123456",
"booking": {
"start_at": "2024-01-15T10:00:00Z",
"duration_minutes": 30,
"customer": {
"phone": "+15551234567",
"name": "John Doe",
"email": "john@example.com"
},
"notes": "Initial consultation - referred by AI assistant"
}
}
```
**Expected Response (200 OK):**
```json
{
"booking": {
"id": "bkg_01h2xcejqtf2nbrexx3vqjhp41",
"status": "confirmed",
"start_at": "2024-01-15T10:00:00Z",
"end_at": "2024-01-15T10:30:00Z",
"location": {
"name": "Main Office",
"address": "123 Main St, City, ST 12345"
}
}
}
```
## Signature Verification
All webhook requests include a signature header for verification. Always verify signatures to ensure requests are from DialStack.
### Header Format
```
X-DialStack-Signature: t=,v1=
```
- `t`: Unix timestamp (seconds) when the request was signed
- `v1`: HMAC-SHA256 signature (hex-encoded)
### Verification Algorithm
The signature is computed as:
```
signature = HMAC-SHA256(webhook_secret, timestamp + "." + request_body)
```
### Implementation Examples
```javascript
import crypto from 'crypto';
function verifySignature(payload, signatureHeader, secret) {
// Parse the signature header
const parts = signatureHeader.split(',');
const timestamp = parts[0].replace('t=', '');
const signature = parts[1].replace('v1=', '');
// Check timestamp (reject if older than 5 minutes)
const now = Math.floor(Date.now() / 1000);
if (now - parseInt(timestamp) > 300) {
throw new Error('Signature timestamp too old');
}
// Compute expected signature
const signedPayload = `${timestamp}.${payload}`;
const expected = crypto.createHmac('sha256', secret).update(signedPayload).digest('hex');
// Compare signatures (timing-safe)
if (!crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected))) {
throw new Error('Invalid signature');
}
return true;
}
// Express.js example
app.post(
'/dialstack/availability/search',
express.raw({ type: 'application/json' }),
(req, res) => {
try {
verifySignature(
req.body.toString(),
req.headers['x-dialstack-signature'],
process.env.DIALSTACK_WEBHOOK_SECRET
);
} catch (error) {
return res.status(401).json({ error: { code: 'invalid_signature', message: error.message } });
}
// Process the request...
}
);
```
```python
import hmac
import hashlib
import time
def verify_signature(payload: bytes, signature_header: str, secret: str) -> bool:
# Parse the signature header
parts = signature_header.split(',')
timestamp = parts[0].replace('t=', '')
signature = parts[1].replace('v1=', '')
# Check timestamp (reject if older than 5 minutes)
now = int(time.time())
if now - int(timestamp) > 300:
raise ValueError('Signature timestamp too old')
# Compute expected signature
signed_payload = f"{timestamp}.{payload.decode('utf-8')}"
expected = hmac.new(
secret.encode('utf-8'),
signed_payload.encode('utf-8'),
hashlib.sha256
).hexdigest()
# Compare signatures (timing-safe)
if not hmac.compare_digest(signature, expected):
raise ValueError('Invalid signature')
return True
# Flask example
@app.route('/dialstack/availability/search', methods=['POST'])
def availability_search():
try:
verify_signature(
request.data,
request.headers.get('X-DialStack-Signature'),
os.environ['DIALSTACK_WEBHOOK_SECRET']
)
except ValueError as e:
return jsonify({'error': {'code': 'invalid_signature', 'message': str(e)}}), 401
# Process the request...
```
```go
package main
import (
"crypto/hmac"
"crypto/sha256"
"encoding/hex"
"errors"
"strconv"
"strings"
"time"
)
func verifySignature(payload []byte, signatureHeader, secret string) error {
// Parse the signature header
parts := strings.Split(signatureHeader, ",")
timestamp := strings.TrimPrefix(parts[0], "t=")
signature := strings.TrimPrefix(parts[1], "v1=")
// Check timestamp (reject if older than 5 minutes)
ts, _ := strconv.ParseInt(timestamp, 10, 64)
if time.Now().Unix()-ts > 300 {
return errors.New("signature timestamp too old")
}
// Compute expected signature
signedPayload := timestamp + "." + string(payload)
h := hmac.New(sha256.New, []byte(secret))
h.Write([]byte(signedPayload))
expected := hex.EncodeToString(h.Sum(nil))
// Compare signatures (timing-safe)
if !hmac.Equal([]byte(signature), []byte(expected)) {
return errors.New("invalid signature")
}
return nil
}
```
## Error Handling
Return appropriate HTTP status codes and error responses:
| Status | When to Use |
| ------ | ------------------------------- |
| 200 | Request processed successfully |
| 400 | Invalid request format |
| 409 | Slot unavailable (for bookings) |
| 500 | Internal server error |
**Error Response Format:**
```json
{
"error": {
"code": "slot_unavailable",
"message": "The requested time slot is no longer available"
}
}
```
## Idempotency
Booking requests include an `idempotency_key` field. Use this to prevent duplicate bookings:
1. Store the idempotency key when processing a booking
2. If the same key is received again, return the original booking response
3. Keys can be safely expired after 24 hours
## Timeouts
- DialStack waits up to **30 seconds** for your webhook response
- If your webhook times out, the voice AI receives a 504 Gateway Timeout error
- Design your endpoints to respond quickly; defer heavy processing if needed
## Testing
### Local Development
Use a tool like [ngrok](https://ngrok.com/) to expose your local server:
```bash
ngrok http 3000
```
Then configure your platform's webhook URL to the ngrok URL:
```
https://abc123.ngrok.io/dialstack
```
### Manual Testing
Test your webhook endpoint with cURL:
```bash
# Generate a test signature
TIMESTAMP=$(date +%s)
PAYLOAD='{"account_id":"acct_test","query":{"filter":{}}}'
SECRET="your_webhook_secret"
SIGNATURE=$(echo -n "${TIMESTAMP}.${PAYLOAD}" | openssl dgst -sha256 -hmac "${SECRET}" | cut -d' ' -f2)
# Send test request
curl -X POST http://localhost:3000/dialstack/availability/search \
-H "Content-Type: application/json" \
-H "X-DialStack-Signature: t=${TIMESTAMP},v1=${SIGNATURE}" \
-H "X-DialStack-Account-Id: acct_test" \
-d "${PAYLOAD}"
```
---
## Architecture overview
A one-page mental model of how DialStack fits together. Read this once and the rest of the docs will make more sense.
## Tenancy model
DialStack is multi-tenant from the ground up. Every resource lives inside this hierarchy:
```mermaid
%%{init: {"flowchart": {"curve": "linear", "nodeSpacing": 100, "rankSpacing": 80}}}%%
flowchart TD
P[Platform] --> A1[Account A]
P --> A2[Account B]
A1 --> U1[User]
A1 --> U2[User]
U1 --> S1[Softphonebrowser or mobile]
U1 --> H1[Physical devicedesk phone]
U2 --> S2[Softphonebrowser or mobile]
```
- **Platform** — your SaaS product. One per partner.
- **Account** — one of your customers (a clinic, a dealership, a contractor).
- **User** — a person at that customer with phone service.
- **Softphone / physical device** — what rings. A user can have any number of softphone sessions (browser + mobile) plus at most one physical device (a desk phone or a DECT handset). All registered endpoints ring in parallel; first to answer wins.
Your API key is scoped to your Platform. Every request includes a `DialStack-Account` header to pick which customer you're acting on (or carries the account in a JWT claim; see [Authentication](#authentication-at-a-glance) below).
## The account resource graph
Inside an account, resources form a small, opinionated graph. Inbound calls arrive on a **phone number** or an **extension**, both of which route to routing targets (e.g., a user, a ring group, a dial plan, or a voice app).
```mermaid
flowchart LR
PN[Phone Numberinbound PSTN] --> T{routing_target}
EXT[Extensioninternal dial code] --> T
T --> U[User]
T --> RG[Ring Group]
T --> DP[Dial Plan]
T --> VA[Voice App]
T -.-> More[...]
DP -->|schedule node| SCH[Schedule]
DP -->|ring_all_users node| U
DP -->|internal_dial node| RG
DP -->|internal_dial node| VA
DP -->|external_dial node| EXTN[External number]
DP -.-> MoreNodes[...]
RG --> U
U --> SP[Softphonesbrowser · mobile]
U --> PD[Physical devicedesk phone or DECT · at most one]
VA --> AIA[AI Agent]
```
- **Phone numbers** are the PSTN entry point. Each has a `routing_target` — the ID of the user, ring group, dial plan, or voice app that inbound calls to that number hit.
- **Extensions** are short internal dial codes (e.g., dial `200` to reach reception). They route to the same routing targets as phone numbers; they're a parallel surface, not a hop on the way.
- **Dial plans** are the branching logic — e.g., schedule-based routing, ring-all, external transfer, dial, or voice-app handoff.
- **Ring groups** parallel-dial users.
- **Voice apps** are programmable call handlers (REST webhook + optional audio WebSocket); [AI Agents](/api#tag/AI-Agents) are a DialStack-managed Voice App with a pre-built receptionist persona.
- **Users** can register any number of **softphones** (browser, mobile) plus at most one **physical device** (desk phone or DECT handset). All registered endpoints ring in parallel.
## Call flow
You interact with DialStack through four surfaces: the REST API, Webhooks, SSE (Server-Sent Events), and WebSockets. Everything else is managed for you.
```mermaid
sequenceDiagram
participant PSTN
participant DS as DialStack
participant App as Your backend
participant Browser as User browser (SSE)
participant Endpoint as User endpoint
PSTN->>DS: Inbound call
Note over DS,Browser: Events dispatched concurrently
DS-->>App: POST /webhooks (call.incoming)
DS-->>Browser: event: call.incoming
Browser->>Browser: Screen pop (CRM lookup)
DS->>Endpoint: Ring all of user's endpoints
Endpoint->>DS: Answer
Note over DS,Browser: Events dispatched concurrently
DS-->>App: POST /webhooks (call.answered)
DS-->>Browser: event: call.answered
Note over PSTN,Endpoint: Media flows PSTN ↔ DialStack ↔ Endpoint
Endpoint->>DS: Hang up
Note over DS,Browser: Events dispatched concurrently
DS-->>App: POST /webhooks (call.end + CDR)
DS-->>Browser: event: call.end
```
Key properties:
- **Webhooks are fire-and-forget.** Respond with an HTTP `200` OK quickly (before executing long-running logic); you cannot return data to influence the call. React in your own systems.
- **SSE (Server-Sent Events) is account-scoped** and safe to consume in browsers with a session token — ideal for Screen Pop.
- **Media is relayed by DialStack.** Your app never touches audio unless you explicitly `attach` a WebSocket (e.g., for BYO VoiceAI or Listeners).
## The four surfaces
| Surface | Direction | Use for |
| ---------------------- | ------------------------- | ------------------------------------------------------------------------------------------- |
| **REST API** | You → DialStack | Provisioning, config, triggering calls, reading history. Auth: Bearer token. |
| **Webhooks** | DialStack → your backend | Durable event delivery with retries and signed payloads. Platform-scoped. |
| **SSE** (`/v1/events`) | DialStack → your frontend | Real-time browser notifications. Account-scoped via session token. |
| **WebSockets** | Bidirectional | `attach` for bidirectional audio (Voice App Control mode); Listeners API for one-way audio. |
Full docs: [REST](/api), [Webhooks](/guides/webhook-events), [SSE](/guides/events), [WebSocket API](/websocket-api).
## Authentication at a glance
| Token | Who uses it | Scope | TTL |
| ------------------------------------ | ---------------------------- | ------------------------------------------------------------------ | ----------------------------------- |
| **Platform API key** (`sk_live_...`) | Your backend | Your entire platform; needs `DialStack-Account` header per request | Never |
| **Session token** (JWT) | Your frontend via the SDK | One account; claims carry the account | 1 hour, auto-refresh |
| **User token** (JWT) | A specific end user's device | One user in one account | Short, refresh via `/v1/auth/token` |
All three use `Authorization: Bearer `. Full flow: [Authentication guide](/authentication).
## What DialStack hosts vs. what you host
### What DialStack hosts and manages
- PSTN / SIP edges, carrier interconnects
- Call routing engine, dial plan execution
- WebRTC media relay, TURN
- Voicemail, recording, transcription
- AI Agents (native receptionist)
- White Label admin portal
- Regulatory and tax/fee compliance
### What you build and host
- Your signup flow, account sync, user lifecycle
- Webhook handler for activity logging / Screen Pop
- Your frontend (Embedded tier) or nothing (White Label tier)
- (BYO VoiceAI only) an audio-bridge WebSocket server
- (AI Scheduling) availability + booking HTTP endpoints
Nothing about calls, carrier relationships, or media transport is your responsibility. You own the business logic and the data you care about.
## Identifiers
All DialStack IDs are opaque strings of at most 255 characters. Treat them as opaque; persist them exactly as returned.
Every webhook event carries an `id` field. That's the idempotency key for consumers — DialStack may deliver the same event more than once, so dedupe by `event.id` before writing.
## What's next
- [Quickstart](/quickstart) — provision your first account, user, and phone number.
- [Webhook events](/guides/webhook-events) — the firehose of everything that happens on a call.
- [Dial plans](/guides/dial-plans) — route calls where you want them.
- [Integration tiers](/integration-tiers/white-label) — pick between White Label, Embedded, and Direct API.
---
## Authentication
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
# Authentication
DialStack supports three authentication methods for different use cases.
| Method | Format | Scope | Use case |
| ------------------ | ------------------ | -------------- | ------------------------------------------------------- |
| **API keys** | `sk_live_*` prefix | Platform-wide | Server-to-server integrations (provisioning, analytics) |
| **Session tokens** | JWT | Single account | Embedded UI components (call logs, voicemails) |
| **User tokens** | JWT | Single user | Softphones and user-facing apps (WebRTC, call history) |
## API Keys
Your secret API key is used for all server-side API requests.
```bash
curl https://api.dialstack.ai/v1/accounts \
-H "Authorization: Bearer sk_live_YOUR_SECRET_KEY"
```
:::danger[Keep It Secret]
Never expose your secret key in client-side code, public repositories, or browser applications. Store it securely in environment variables on your server.
:::
### Account Context
Most endpoints require an account context. Include the `DialStack-Account` header:
```bash
curl https://api.dialstack.ai/v1/users \
-H "Authorization: Bearer sk_live_YOUR_KEY" \
-H "DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41"
```
### Getting Your API Keys
API keys are provided during platform onboarding. Contact support@dialstack.ai if you need access.
## Session Tokens
For embedded voice components in your frontend, create a session using the Account Session API. Sessions are account-scoped and expire after 1 hour.
```javascript
import { DialStack } from '@dialstack/sdk/server';
const dialstack = new DialStack(process.env.DIALSTACK_API_KEY);
const session = await dialstack.accountSessions.create({
account: 'acct_01h2xcejqtf2nbrexx3vqjhp41',
components: {
call_logs: { enabled: true },
voicemails: { enabled: true },
},
});
// Pass session.client_secret to your frontend
```
The account is automatically derived from the JWT claims — no `DialStack-Account` header needed.
## User Tokens
:::info[Coming soon]
User authentication (including the `/v1/auth/token` endpoint and user-token-based access) is currently undergoing implementation and will be available shortly. The surface documented below reflects the target design; specifics may change before release.
:::
For client-side applications where end users interact directly (softphones, call history, voicemail). User tokens are scoped to a single user within an account.
:::tip[When to use which]
Use **API keys** when your backend is making requests on behalf of your platform. Use **session tokens** for embedded UI components. Use **user tokens** when the end user's device connects to DialStack directly (WebRTC softphone, mobile app).
:::
### How User Tokens Work
```
┌──────────────┐ ┌──────────────────┐ ┌───────────────┐
│ Your App │ │ Your Backend │ │ DialStack │
│ (browser / │ │ │ │ │
│ mobile) │ │ │ │ │
└──────┬───────┘ └────────┬─────────┘ └───────┬───────┘
│ 1. User logs in │ │
│─────────────────────>│ │
│ │ 2. POST /v1/auth/token
│ │──────────────────────>│
│ │ │
│ │ 3. { user_token } │
│ │<──────────────────────│
│ 4. Return token │ │
│<─────────────────────│ │
│ │ │
│ 5. Connect to /v1/webrtc with token │
│─────────────────────────────────────────────>│
```
1. The user logs into **your** application using your own authentication
2. Your backend calls `POST /v1/auth/token` with the user's identity
3. DialStack returns a user token (JWT)
4. Your backend passes the token to the client
5. The client uses the token to connect to the WebRTC signalling channel and access user-scoped REST endpoints
### Platform Setup
Configure token exchange for your platform during onboarding. This lets your backend exchange your own JWTs for DialStack user tokens — your users authenticate once with your app and get seamless access to DialStack calling with no additional login prompt.
Configuration requires:
- **JWKS URL** — where DialStack fetches your public keys to verify your JWTs
- **Issuer** — the `iss` claim value in your JWTs
- **Audience** — the `aud` claim value DialStack expects (typically `dialstack`)
- **User ID claim** — which JWT claim maps to the DialStack user (typically `sub`)
Contact your DialStack account team to configure these settings.
### Mapping Users
Set the `external_id` field when creating users to match the user's identifier in your system:
```javascript
const user = await dialstack.users.create(
{
name: 'Jane Doe',
email: 'jane@example.com',
external_id: 'your-system-user-id-123',
},
{ dialstackAccount: 'acct_01h2xcejqtf2nbrexx3vqjhp41' }
);
```
### Obtaining a User Token
```javascript
const { token, expires_at, user } = await dialstack.auth.createToken({
grant_type: 'token_exchange',
subject_token: platformJwt, // Your platform's JWT for this user
subject_token_type: 'urn:ietf:params:oauth:token-type:jwt',
account_id: 'acct_01h2xcejqtf2nbrexx3vqjhp41',
});
```
```bash
curl -X POST https://api.dialstack.ai/v1/auth/token \
-H "Authorization: Bearer sk_live_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"grant_type": "token_exchange",
"subject_token": "eyJhbGciOiJSUzI1NiIs...",
"subject_token_type": "urn:ietf:params:oauth:token-type:jwt",
"account_id": "acct_01h2xcejqtf2nbrexx3vqjhp41"
}'
```
Response:
```json
{
"token": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9...",
"token_type": "bearer",
"expires_at": "2026-04-10T22:00:00Z",
"expires_in": 3600,
"user": {
"id": "user_01h2xcejqtf2nbrexx3vqjhp42",
"name": "Jane Doe",
"email": "jane@example.com",
"account_id": "acct_01h2xcejqtf2nbrexx3vqjhp41"
}
}
```
### Token Lifecycle
User tokens expire after **1 hour**. Refresh proactively (e.g., 5 minutes before expiry) to avoid interrupting active WebRTC sessions.
```javascript
const { token, expires_at } = await dialstack.auth.refreshToken({
token: currentUserToken,
});
```
Revoke a token when the user logs out:
```bash
curl -X POST https://api.dialstack.ai/v1/auth/revoke \
-H "Authorization: Bearer sk_live_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "token": "eyJhbGciOiJFZERTQSIs..." }'
```
Revoking a token disconnects any active WebRTC session using that token.
### Scoped Access
User tokens grant access to a limited set of endpoints:
| Endpoint | Method | Description |
| -------------------------------- | ----------------- | ----------------------------------- |
| `/v1/webrtc` | WebSocket | Signalling channel for WebRTC calls |
| `/v1/webrtc/ice-servers` | GET | TURN/STUN server credentials |
| `/v1/me` | GET | Authenticated user's profile |
| `/v1/me/calls` | GET | User's own call history |
| `/v1/voicemails` | GET | User's voicemails |
| `/v1/voicemails/{id}` | GET, POST, DELETE | Single voicemail |
| `/v1/voicemails/{id}/transcript` | GET | Voicemail transcript |
| `/v1/me/presence` | GET, PUT | User's presence status |
| `/v1/me/emergency-address` | GET, PUT | E911 emergency address |
User tokens cannot access platform-level endpoints (accounts, phone numbers, dial plans, etc.). Those require API keys. Session tokens and user tokens are both JWTs but **not interchangeable** — using the wrong token type returns `403 Forbidden`.
## Error Responses
### 401 Unauthorized
```json
{
"error": "Invalid API key",
"code": "authentication_failed"
}
```
**Common causes:**
- Missing `Authorization` header
- Invalid or expired API key / token
- Wrong key format
### 403 Forbidden
```json
{
"error": "You don't have permission to access this resource",
"code": "forbidden"
}
```
**Common causes:**
- Trying to access another platform's resources
- Using a user token on a platform-level endpoint
- Using a session token on a user-scoped endpoint
## Best Practices
- Store API keys in environment variables, never in client-side code
- Use secrets management tools (AWS Secrets Manager, HashiCorp Vault)
- Refresh user tokens proactively before expiry
- Revoke user tokens on logout
## Next Steps
- [Quickstart Guide](/quickstart) — Build your first integration
- [WebRTC Guide](/webrtc) — Build a softphone with user tokens
- [API Reference](/api) — Full API documentation
---
## Click-to-Call
Click-to-call enables your application to initiate phone calls on behalf of users. When triggered, the system first calls the user's registered devices, then connects them to the destination number.
## Overview
Click-to-call allows you to:
- **Add "Call" buttons** next to customer phone numbers in your application
- **Enable one-click dialing** from CRM records, support tickets, or contact lists
- **Track call activity** through the call logs API
## How It Works
When you initiate a click-to-call:
1. **First leg**: All of the user's registered devices (desk phones, softphones) ring simultaneously
2. **Answer**: The user picks up any of their devices
3. **Second leg**: The system dials the destination number
4. **Bridge**: Both calls are connected together
This "call-first" approach ensures the user is ready before the customer's phone rings, providing a professional experience.
## Initiating a Call
### Using the API
Make a POST request to `/v1/calls` with the user ID and dial string:
```bash
curl -X POST https://api.dialstack.ai/v1/calls \
-H "Authorization: Bearer sk_live_YOUR_SECRET_KEY" \
-H "DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41" \
-H "Content-Type: application/json" \
-d '{
"user_id": "user_01h2xcejqtf2nbrexx3vqjhp42",
"dial_string": "+15551234567"
}'
```
The API returns `202 Accepted` immediately. The call is processed asynchronously.
### Using the SDK
```javascript
import { loadDialStack } from '@dialstack/sdk';
const dialstack = await loadDialStack('pk_test_...', {
fetchClientSecret: async () => {
const response = await fetch('/api/dialstack/session');
return response.json();
},
});
// Initiate a call
await dialstack.calls.create({
userId: 'user_01h2xcejqtf2nbrexx3vqjhp42',
dialString: '+15551234567',
});
```
## Request Parameters
| Field | Type | Required | Description |
| ------------- | ------ | -------- | -------------------------------------- |
| `user_id` | string | Yes | The user whose devices will ring first |
| `dial_string` | string | Yes | The number to dial (see formats below) |
### Dial String Formats
The `dial_string` parameter accepts several formats:
| Format | Example | Description |
| --------- | -------------- | ---------------------------------- |
| E.164 | `+15551234567` | International format (recommended) |
| Local | `5551234567` | Normalized based on account region |
| Extension | `1001` | Internal extension dialing |
| Emergency | `911` | Emergency services |
## Server-Side Implementation
Here's how to implement a click-to-call endpoint in your backend:
### Node.js / Express
```javascript
import express from 'express';
const app = express();
app.use(express.json());
// Your platform's API key
const DIALSTACK_API_KEY = process.env.DIALSTACK_API_KEY;
app.post('/api/call', async (req, res) => {
const { userId, phoneNumber, accountId } = req.body;
try {
const response = await fetch('https://api.dialstack.ai/v1/calls', {
method: 'POST',
headers: {
Authorization: `Bearer ${DIALSTACK_API_KEY}`,
'DialStack-Account': accountId,
'Content-Type': 'application/json',
},
body: JSON.stringify({
user_id: userId,
dial_string: phoneNumber,
}),
});
if (response.status === 202) {
res.json({ success: true, message: 'Call initiated' });
} else {
const error = await response.json();
res.status(response.status).json(error);
}
} catch (error) {
res.status(500).json({ error: 'Failed to initiate call' });
}
});
```
### Python / Flask
```python
from flask import Flask, request, jsonify
import requests
import os
app = Flask(__name__)
DIALSTACK_API_KEY = os.environ.get('DIALSTACK_API_KEY')
@app.route('/api/call', methods=['POST'])
def initiate_call():
data = request.json
response = requests.post(
'https://api.dialstack.ai/v1/calls',
headers={
'Authorization': f'Bearer {DIALSTACK_API_KEY}',
'DialStack-Account': data['account_id'],
'Content-Type': 'application/json'
},
json={
'user_id': data['user_id'],
'dial_string': data['phone_number']
}
)
if response.status_code == 202:
return jsonify({'success': True, 'message': 'Call initiated'})
else:
return jsonify(response.json()), response.status_code
```
## Frontend Integration
Add click-to-call buttons to your UI:
```jsx
function CustomerCard({ customer, currentUser, accountId }) {
const [calling, setCalling] = useState(false);
async function handleCall() {
setCalling(true);
try {
const response = await fetch('/api/call', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
userId: currentUser.dialstackUserId,
phoneNumber: customer.phone,
accountId: accountId,
}),
});
if (response.ok) {
// Show "Calling..." indicator
showNotification('Calling ' + customer.name);
}
} finally {
setCalling(false);
}
}
return (
{customer.name}
{customer.phone}
);
}
```
## Error Handling
| Status | Error | Description |
| ------ | ------------------------- | ---------------------------------- |
| 400 | `user_id is required` | Missing user_id in request |
| 400 | `dial_string is required` | Missing dial_string in request |
| 400 | `Invalid user_id format` | user_id is not a valid TypeID |
| 401 | `Unauthorized` | Invalid or missing API key/session |
| 404 | `User not found` | User doesn't exist in the account |
## Best Practices
### DO
- Validate phone numbers before sending to the API
- Show a loading state while the call is being initiated
- Use E.164 format for phone numbers when possible
- Log call attempts for troubleshooting
### DON'T
- Don't expose your platform API key in client-side code
- Don't allow arbitrary dial strings from user input without validation
- Don't retry failed calls automatically (let the user decide)
## Monitoring Calls
After initiating a call, you can track its progress:
- Use the [Real-Time Events](./events) API to receive call status updates
- Query the [Call Logs](/api#tag/Calls/operation/listCallLogs) API to retrieve call history
## Related Resources
- [API Reference](/api#tag/Calls/operation/createCall) - Complete API documentation
- [Real-Time Events](./events) - Receive call status updates
- [Authentication](/authentication) - Authentication guide
---
## Device Provisioning
Manage physical phones through the API — add devices by MAC address, assign users, customize settings, and monitor provisioning status.
## Device Types
Two categories of devices can be provisioned:
- **Deskphones** — standalone desk phones with programmable keys, assigned directly to users
- **DECT systems** — a base station with paired wireless handsets, where each handset is assigned to a user
Both types follow the same provisioning flow: add the device, assign users, and the phone retrieves its configuration from the provisioning server.
:::info[Billing is per user, not per device]
The typical deployment is 1:1 user-to-device, but you can assign multiple users to a single device (shared reception phone, multi-line executive desk setup, etc.) or the same user to multiple devices. DialStack bills for each **user** provisioned on the system, regardless of how users and devices are paired.
:::
## How Provisioning Works
1. **Add the device** — create a device via the API with its MAC address and type. The vendor is automatically detected from the MAC.
2. **Assign users** — assign users to the device so it can make and receive calls.
3. **Device fetches config** — when the phone powers on (or is triggered via check-sync), it contacts the provisioning server and receives its configuration.
4. **Status updates** — the device status transitions from `pending-sync` to `provisioned` after its first successful configuration fetch.
### Settings Inheritance
Device configuration follows a layered inheritance model:
```
Global defaults → Platform config → Account config → Device overrides
```
Each layer can override settings from the layer above. Omitted fields inherit from the parent, so you only need to specify what you want to change.
## Prerequisites
- An API key with account access
- The MAC address of the physical device
- At least one user to assign to the device
## Provisioning a Deskphone
### Step 1: Create the deskphone
Register the device with its MAC address:
```bash
curl -X POST https://api.dialstack.ai/v1/devices \
-H "Authorization: Bearer sk_live_YOUR_SECRET_KEY" \
-H "DialStack-Account: YOUR_ACCOUNT_ID" \
-H "Content-Type: application/json" \
-d '{
"type": "deskphone",
"mac_address": "00:04:13:aa:bb:cc"
}'
```
```json
{
"id": "YOUR_DEVICE_ID",
"type": "deskphone"
}
```
The vendor is detected automatically based on the MAC address prefix (OUI). The model is detected when the device first contacts the provisioning server. Use `GET /v1/devices/YOUR_DEVICE_ID` to retrieve the full device details.
### Step 2: Assign a user
```bash
curl -X POST https://api.dialstack.ai/v1/devices/YOUR_DEVICE_ID/users \
-H "Authorization: Bearer sk_live_YOUR_SECRET_KEY" \
-H "DialStack-Account: YOUR_ACCOUNT_ID" \
-H "Content-Type: application/json" \
-d '{
"user_id": "YOUR_USER_ID"
}'
```
```json
{
"user_id": "YOUR_USER_ID",
"device_id": "YOUR_DEVICE_ID",
"created_at": "2025-10-18T10:01:00Z"
}
```
Each user assignment consumes one **line appearance** on the phone — an individually-registered SIP account, shown as a distinct "line" on the phone's display and selectable by a line key. DialStack caps deskphones at 24 line appearances, but the practical limit is what the phone model itself supports (ranges from 2 lines on entry-level handsets to 16+ on high-end executive phones). Assignments beyond the phone's hardware capacity will be accepted by the API but not all will appear on the device. Consult the phone vendor's datasheet for the supported line count.
### Step 3: Trigger configuration reload
If the phone is already powered on, send a check-sync to have it reload its configuration:
```bash
curl -X POST https://api.dialstack.ai/v1/devices/YOUR_DEVICE_ID/status/check-sync \
-H "Authorization: Bearer sk_live_YOUR_SECRET_KEY" \
-H "DialStack-Account: YOUR_ACCOUNT_ID"
```
```json
{
"success": true,
"lines_notified": 1,
"lines": [
{
"line_number": 1,
"status": "delivered"
}
]
}
```
A `200` response means at least one line accepted the request. Each entry
in `lines` carries a 1-indexed `line_number` and a `status` — one of
`delivered`, `not_registered`, `unreachable`, or `error`.
:::caution[What check-sync does (and doesn't do)]
Trigger check-sync when you actually change configuration, not on every
admin-UI interaction.
With `reboot: false` (the default):
- The phone applies new configuration in place. Active calls continue and
the phone stays registered.
- If the new configuration changes the phone's SIP server or credentials,
the phone briefly re-registers (typically under 5 seconds).
- Some phones (for example Yealink, Cisco MPP) **defer** applying new
configuration while a call is in progress. A `200 OK` means the request
was accepted — not necessarily applied yet.
- A few settings (firmware, certain network parameters) still require a
reboot, which the phone will perform on its next idle window.
- For DECT, the request reaches the base no matter which ID you target
(base or handset), and every handset paired with the base reloads.
With `reboot: true`:
- The phone **reboots immediately**, dropping any active call.
- Roughly 30–90 seconds offline.
- Only use for recovery or for changes that explicitly require a reboot.
:::
If the device could not be reached, the API returns `409 Conflict` with a
`reason` field:
- `not_registered` — the device has no active registration. It may be
powered off, unable to reach the SIP server, or has never registered.
- `unreachable` — the device didn't respond in time. It is likely offline
or has lost its connection.
### Step 4: Verify provisioning
```bash
curl https://api.dialstack.ai/v1/devices/YOUR_DEVICE_ID \
-H "Authorization: Bearer sk_live_YOUR_SECRET_KEY" \
-H "DialStack-Account: YOUR_ACCOUNT_ID"
```
After the device fetches its configuration, `status` changes to `provisioned` and `last_provisioned_at` is populated.
## Provisioning a DECT System
DECT systems have a two-level hierarchy: **base station** → **handsets**. Each handset is then assigned to one or more users.
### Step 1: Create the DECT base
```bash
curl -X POST https://api.dialstack.ai/v1/devices \
-H "Authorization: Bearer sk_live_YOUR_SECRET_KEY" \
-H "DialStack-Account: YOUR_ACCOUNT_ID" \
-H "Content-Type: application/json" \
-d '{
"type": "dect_base",
"mac_address": "00:04:13:bb:cc:dd"
}'
```
```json
{
"id": "YOUR_BASE_ID",
"type": "dect_base"
}
```
### Step 2: Add a handset
Each handset is identified by its IPEI (a unique hardware identifier for wireless handsets, formatted as a hexadecimal string). Handsets are created as devices linked to their parent base.
```bash
curl -X POST https://api.dialstack.ai/v1/devices \
-H "Authorization: Bearer sk_live_YOUR_SECRET_KEY" \
-H "DialStack-Account: YOUR_ACCOUNT_ID" \
-H "Content-Type: application/json" \
-d '{
"type": "dect_handset",
"base_id": "YOUR_BASE_ID",
"ipei": "0328A0000F",
"display_name": "Front Desk"
}'
```
```json
{
"id": "YOUR_HANDSET_ID",
"type": "dect_handset"
}
```
### Step 3: Assign a user to the handset
Users are assigned to individual handsets, not to the base station directly.
```bash
curl -X POST https://api.dialstack.ai/v1/devices/YOUR_HANDSET_ID/users \
-H "Authorization: Bearer sk_live_YOUR_SECRET_KEY" \
-H "DialStack-Account: YOUR_ACCOUNT_ID" \
-H "Content-Type: application/json" \
-d '{
"user_id": "YOUR_USER_ID"
}'
```
```json
{
"user_id": "YOUR_USER_ID",
"device_id": "YOUR_HANDSET_ID",
"created_at": "2025-10-18T10:03:00Z"
}
```
## Customizing Device Settings
Use the `overrides` field to customize device behavior. Settings use a two-tier structure:
- **`abstractions`** — vendor-agnostic settings that are translated to vendor-specific parameters automatically
- **`vendor_overrides`** — raw vendor-specific key-value pairs for parameters not covered by abstractions
```bash
curl -X POST https://api.dialstack.ai/v1/deskphones/YOUR_DEVICE_ID \
-H "Authorization: Bearer sk_live_YOUR_SECRET_KEY" \
-H "DialStack-Account: YOUR_ACCOUNT_ID" \
-H "Content-Type: application/json" \
-d '{
"overrides": {
"abstractions": {
"audio": {
"codecs": ["PCMU", "PCMA"],
"echo_cancellation": true
},
"display": {
"time_format": "24h",
"backlight_level": "medium"
},
"line_keys": [
{
"position": 1,
"type": "blf",
"label": "Reception",
"value": "100"
},
{
"position": 2,
"type": "speed_dial",
"label": "Support",
"value": "+15551234567"
},
{
"position": 3,
"type": "voicemail",
"label": "Voicemail",
"value": "*97"
}
]
}
}
}'
```
:::note
The `abstractions` schema is actively expanding as new hardware capabilities are added. Use `vendor_overrides` for vendor-specific parameters not yet available as abstractions.
:::
### Available Line Key Types
Line key types are **abstractions** — DialStack translates each to the vendor-specific parameter at provisioning time. All supported vendors understand these concepts, but individual phone models may not implement every type (for example, some low-end handsets don't expose a `record_toggle` key). If a model doesn't support a given type, the key is silently omitted from that device's configuration. Consult the phone vendor's datasheet to confirm support.
| Type | Description |
| --------------- | -------------------------------------------------- |
| `blf` | Busy Lamp Field — monitors another user's presence |
| `speed_dial` | Dials a preconfigured number |
| `dtmf` | Sends a DTMF sequence |
| `line` | Line appearance |
| `voicemail` | One-touch voicemail access |
| `url` | Triggers an HTTP request |
| `multicast` | Multicast RTP paging |
| `conference` | Conference initiation |
| `transfer` | Call transfer |
| `forward` | Call forwarding activation |
| `park` | Call park/retrieve |
| `intercom` | Intercom auto-answer call |
| `dnd` | Do Not Disturb toggle |
| `record_toggle` | Call recording toggle |
## Multicell DECT Deployments
For larger spaces requiring multiple base stations, use multicell roles to coordinate them:
- **`data_master`** — the primary base that distributes configuration to other bases
- **`secondary`** — subordinate bases that receive configuration from the data master
```bash
curl -X POST https://api.dialstack.ai/v1/devices \
-H "Authorization: Bearer sk_live_YOUR_SECRET_KEY" \
-H "DialStack-Account: YOUR_ACCOUNT_ID" \
-H "Content-Type: application/json" \
-d '{
"type": "dect_base",
"mac_address": "00:04:13:bb:cc:ee",
"multicell_role": "secondary"
}'
```
## Managing Devices
### Unified Device View
List all devices (deskphones and DECT bases) in a single request:
```bash
curl "https://api.dialstack.ai/v1/devices?type=deskphone" \
-H "Authorization: Bearer sk_live_YOUR_SECRET_KEY" \
-H "DialStack-Account: YOUR_ACCOUNT_ID"
```
The `type` parameter is optional — omit it to list all device types.
### Listing Users on a Device
```bash
curl https://api.dialstack.ai/v1/devices/YOUR_DEVICE_ID/users \
-H "Authorization: Bearer sk_live_YOUR_SECRET_KEY" \
-H "DialStack-Account: YOUR_ACCOUNT_ID"
```
### Removing a User from a Device
```bash
curl -X DELETE https://api.dialstack.ai/v1/devices/YOUR_DEVICE_ID/users/YOUR_USER_ID \
-H "Authorization: Bearer sk_live_YOUR_SECRET_KEY" \
-H "DialStack-Account: YOUR_ACCOUNT_ID"
```
### Deleting a Device
```bash
curl -X DELETE https://api.dialstack.ai/v1/devices/YOUR_DEVICE_ID \
-H "Authorization: Bearer sk_live_YOUR_SECRET_KEY" \
-H "DialStack-Account: YOUR_ACCOUNT_ID"
```
Deleting a device removes all associated user assignments. Deleting a DECT base also removes all its handsets.
---
## Dial Plans(Guides)
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
# Dial Plans
Build visual call routing flows with dial plans.
## Overview
A dial plan defines how incoming calls are routed through a series of steps, represented as a flowchart. Each step in the flowchart is called a **node**. Nodes check conditions (like business hours) or ring extensions, then route to the next step based on the outcome.
Think of it like a flowchart you'd draw on a whiteboard:
```
┌───────────┐
│ Start │
└─────┬─────┘
│
▼
┌─────────────┐ open ┌───────────────┐
│ Check Hours │────────────▶│ Reception │
│ [Schedule] │ │ [InternalDial]│
└──────┬──────┘ └───────┬───────┘
│ │
│ closed timeout
│ │
└───────────┬────────────────┘
│
▼
┌───────────┐
│ Voicemail │
└───────────┘
```
In this example:
1. Every call starts at the "Check Hours" schedule node
2. If the schedule is open, the call rings the reception extension
3. If reception doesn't answer (timeout), or if the schedule is closed, the call routes to voicemail
## Node Types
### Schedule Node
Routes calls based on whether a [schedule](/api#tag/Schedules) is currently open, closed, or on holiday.
**Exits:**
- `open` — Schedule is currently within business hours
- `closed` — Schedule is outside business hours
- `holiday` — Current date falls within a holiday range
### Internal Dial Node
Dials a user or nested dial plan and routes based on the outcome.
**Configuration:**
- `target_id` — ID of the user, ring group, or dial plan to dial
- `timeout` — How long to ring before giving up (0-300 seconds, default 30)
**Exits:**
- `next` — Ring timed out or user was busy (call continues to next node)
- _(answered)_ — If answered, the dial plan ends and the call is connected
## Creating a Dial Plan
```javascript
const dialPlan = await dialstack.dialPlans.create(
{
name: 'Main Line Routing',
entry_node: 'check_hours',
nodes: [
{
id: 'check_hours',
type: 'schedule',
config: {
schedule_id: 'sched_01h2xcejqtf2nbrexx3vqjhp50',
open: 'reception',
closed: 'voicemail',
holiday: 'voicemail',
},
},
{
id: 'reception',
type: 'internal_dial',
config: {
target_id: 'user_01h2xcejqtf2nbrexx3vqjhp45',
timeout: 30,
next: 'voicemail',
},
},
{
id: 'voicemail',
type: 'internal_dial',
config: {
target_id: 'user_01h2xcejqtf2nbrexx3vqjhp99',
},
},
],
},
{ dialstackAccount: 'acct_01h2xcejqtf2nbrexx3vqjhp41' }
);
```
```bash
curl -X POST https://api.dialstack.ai/v1/dial_plans \
-H "Authorization: Bearer sk_live_YOUR_API_KEY" \
-H "DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41" \
-H "Content-Type: application/json" \
-d '{
"name": "Main Line Routing",
"entry_node": "check_hours",
"nodes": [
{
"id": "check_hours",
"type": "schedule",
"config": {
"schedule_id": "sched_01h2xcejqtf2nbrexx3vqjhp50",
"open": "reception",
"closed": "voicemail",
"holiday": "voicemail"
}
},
{
"id": "reception",
"type": "internal_dial",
"config": {
"target_id": "user_01h2xcejqtf2nbrexx3vqjhp45",
"timeout": 30,
"next": "voicemail"
}
},
{
"id": "voicemail",
"type": "internal_dial",
"config": {
"target_id": "user_01h2xcejqtf2nbrexx3vqjhp99"
}
}
]
}'
```
## Key Concepts
### Entry Node
The `entry_node` specifies which node executes first. Think of it as where the "Start" arrow points in your flowchart.
### Exit Targets
Each node type has specific exits that route to other nodes. Set an exit to `null` (or omit it) to terminate the call at that point.
### Node IDs
Node IDs are strings you define (like `"check_hours"` or `"reception"`). They must be unique within a dial plan and are used to wire nodes together.
### Visual Position
Nodes can include optional `position` coordinates (`x`, `y`) for rendering in a visual editor. If omitted, nodes are auto-positioned.
## Examples
### After-Hours Voicemail
Route calls to voicemail when closed:
```
Start → Check Hours [Schedule] → (open) → Ring Group [Internal Dial]
→ (closed/holiday) → Voicemail
```
```json
{
"name": "After-Hours Voicemail",
"entry_node": "check_hours",
"nodes": [
{
"id": "check_hours",
"type": "schedule",
"config": {
"schedule_id": "sched_...",
"open": "ring_group",
"closed": "voicemail",
"holiday": "voicemail"
}
},
{
"id": "ring_group",
"type": "internal_dial",
"config": {
"target_id": "user_...",
"next": "voicemail"
}
},
{
"id": "voicemail",
"type": "internal_dial",
"config": {
"target_id": "user_..."
}
}
]
}
```
### Multi-Level Routing
Chain multiple schedule checks:
```
Start → Check Emergency [Schedule] → (open) → Emergency Line [Internal Dial]
→ (closed/holiday) → Check Hours [Schedule] → (open) → Reception [Internal Dial]
→ (closed/holiday) → Voicemail
```
```json
{
"name": "Multi-Level Routing",
"entry_node": "check_emergency",
"nodes": [
{
"id": "check_emergency",
"type": "schedule",
"config": {
"schedule_id": "sched_emergency_...",
"open": "emergency_line",
"closed": "check_hours",
"holiday": "check_hours"
}
},
{
"id": "emergency_line",
"type": "internal_dial",
"config": {
"target_id": "user_emergency_..."
}
},
{
"id": "check_hours",
"type": "schedule",
"config": {
"schedule_id": "sched_business_...",
"open": "reception",
"closed": "voicemail",
"holiday": "voicemail"
}
},
{
"id": "reception",
"type": "internal_dial",
"config": {
"target_id": "user_reception_...",
"next": "voicemail"
}
},
{
"id": "voicemail",
"type": "internal_dial",
"config": {
"target_id": "user_voicemail_..."
}
}
]
}
```
### Fallback Chain
Try multiple users before voicemail:
```
Start → Reception [Internal Dial] → (timeout 30s) → Manager [Internal Dial] → (timeout 20s) → Voicemail
```
```json
{
"name": "Fallback Chain",
"entry_node": "reception",
"nodes": [
{
"id": "reception",
"type": "internal_dial",
"config": {
"target_id": "user_reception_...",
"timeout": 30,
"next": "manager"
}
},
{
"id": "manager",
"type": "internal_dial",
"config": {
"target_id": "user_manager_...",
"timeout": 20,
"next": "voicemail"
}
},
{
"id": "voicemail",
"type": "internal_dial",
"config": {
"target_id": "user_voicemail_..."
}
}
]
}
```
## API Reference
- [Dial Plans](/api#tag/Dial-Plans) — Create, update, and delete dial plans
- [Schedules](/api#tag/Schedules) — Define business hours for schedule nodes
---
## Error Codes
Every non-2xx response from the DialStack REST API shares the same shape:
```json
{
"error": "Human-readable message describing what went wrong.",
"code": "machine_readable_code",
"details": { "field_name": "reason" }
}
```
`error` is always present. `code` is present on errors that have a stable
machine-readable identifier (listed below). `details` is optional and carries
field-level validation context when applicable.
:::info
Branch on `code`, not on `error`. The `error` string may be rephrased
without notice; `code` values are stable and versioned. When no `code`
is present, fall back to the HTTP status.
:::
## HTTP status codes
| Status | Meaning | Retry? |
| ------ | ------------------------------------------------------------------ | ------------------------------- |
| `400` | Malformed request — invalid JSON, missing required fields. | No — fix the request. |
| `401` | Missing or invalid API key (`Authorization: Bearer ...`). | No — rotate / check the key. |
| `403` | Valid key, but no access to this account or resource. | No — check `DialStack-Account`. |
| `404` | Resource does not exist on this account. | No. |
| `409` | Conflict — e.g., duplicate handle, already assigned. | No. |
| `422` | Validation error — payload is well-formed but semantically wrong. | No — fix the payload. |
| `429` | Rate limit exceeded. `Retry-After` header tells you when to retry. | Yes, after `Retry-After`. |
| `5xx` | Server error. Transient unless documented otherwise. | Yes, with exponential backoff. |
## Stable error codes
The following `code` values are stable and safe to branch on. Codes not listed
here are either legacy or platform-internal; do not rely on them.
| Code | HTTP | Meaning |
| ------------------------------ | ----- | --------------------------------------------------------------------------- |
| `validation_error` | `400` | The request body failed validation. See `details` for field-level reasons. |
| `invalid_pagination` | `400` | The pagination cursor is malformed or expired. Restart from the first page. |
| `invalid_sandbox_phone_number` | `400` | The supplied phone number is not a valid sandbox number for this platform. |
| `sandbox_feature_unsupported` | `400` | The requested feature is not available in sandbox mode for this platform. |
### Device provisioning
| Code | HTTP | Meaning |
| ----------------------- | ----- | ------------------------------------------------------------ |
| `unsupported_vendor` | `400` | The phone vendor/model is not supported for provisioning. |
| `invalid_configuration` | `400` | The provisioning request is missing required device fields. |
| `credentials_not_found` | `404` | No SIP credentials exist for this endpoint. |
| `generation_failed` | `500` | The provisioning file could not be generated. Safe to retry. |
## Handling errors
- **Treat missing `code` as an unstable error.** Log the `error` string for
debugging, but make a business decision off HTTP status alone.
- **Do not parse the `error` string.** It is subject to i18n and rephrasing.
- **On `429`, respect `Retry-After`.** Typical values are small (≤ 60s).
- **On `5xx`, use exponential backoff.** Start at 1s, double up to ~60s,
cap at ~5 attempts. Every DialStack mutation is keyed by an operation ID
so retries are safe — idempotency is built into the API.
---
## Real-Time Events
DialStack provides real-time event streaming via Server-Sent Events (SSE), enabling your application to receive instant notifications about incoming calls and other account activity.
Real-Time Events is the **browser transport** for call events. For the **backend transport**, see [Webhook Events](./webhook-events). For common patterns built on top, see [Screen Pop](./screen-pop) and [Activity Logging](./activity-logging).
## Overview
Real-time events allow you to:
- **Show screen pops** when calls arrive (caller ID, customer info)
- **Update UI instantly** without polling the API
- **Build responsive applications** that react to call activity in real-time
:::tip[Looking for server-side webhooks?]
For backend integrations (CRM sync, analytics, workflow automation), see [Webhook Events](./webhook-events) for HTTP POST delivery with signature verification.
:::
## How It Works
DialStack uses Server-Sent Events (SSE), a standard web technology for streaming events from server to client:
1. Your client opens a persistent HTTP connection to `/v1/events`
2. DialStack pushes events to your client as they occur
3. The connection stays open until your client disconnects
SSE is supported in all modern browsers and has built-in reconnection handling.
## Connecting to the Event Stream
### Using the DialStack SDK (Recommended)
The simplest way to receive events is using the DialStack SDK, which handles authentication and reconnection automatically:
```javascript
import { loadDialStack } from '@dialstack/sdk';
// Initialize the SDK
const dialstack = await loadDialStack('pk_test_...', {
fetchClientSecret: async () => {
const response = await fetch('/api/dialstack/session');
return response.json();
},
});
// Subscribe to call events
dialstack.on('call.incoming', (event) => {
console.log('Incoming call from:', event.from_number);
showScreenPop(event);
});
dialstack.on('call.answered', (event) => {
console.log('Call answered:', event.call_id);
});
dialstack.on('call.end', (event) => {
console.log('Call ended:', event.call_id, event.status);
});
// Later, unsubscribe when done
dialstack.off('call.incoming');
```
The SDK uses `fetch` with proper `Authorization` headers internally and handles reconnection with exponential backoff.
### Using fetch with ReadableStream
For direct API access without the SDK, use `fetch` with a readable stream:
```javascript
async function connectToEvents(clientSecret) {
const response = await fetch('https://api.dialstack.ai/v1/events', {
headers: {
Authorization: `Bearer ${clientSecret}`,
Accept: 'text/event-stream',
},
});
const reader = response.body.getReader();
const decoder = new TextDecoder();
while (true) {
const { value, done } = await reader.read();
if (done) break;
const text = decoder.decode(value);
const lines = text.split('\n');
for (const line of lines) {
if (line.startsWith('event: ')) {
const eventType = line.slice(7);
// Handle event type
} else if (line.startsWith('data: ')) {
const data = JSON.parse(line.slice(6));
// Handle event data
}
}
}
}
```
## Event Types
### `connected`
Sent immediately when the connection is established. Use this to confirm the stream is working.
```json
{
"message": "Connected to event stream"
}
```
### `call.incoming`
Sent when an incoming call arrives for the account. This is the primary event for implementing screen pops.
```json
{
"event": "call.incoming",
"account_id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
"from_number": "+14155551234",
"from_name": "John Smith",
"to_number": "+14155559876"
}
```
| Field | Type | Description |
| ------------- | -------------- | ------------------------------------------- |
| `event` | string | Always `"call.incoming"` |
| `account_id` | string | Account receiving the call |
| `from_number` | string | Caller's phone number (E.164 format) |
| `from_name` | string \| null | Caller's name from caller ID (if available) |
| `to_number` | string | Called phone number (E.164 format) |
### `call.initiated`
Sent when an outbound call starts dialing.
```json
{
"event": "call.initiated",
"account_id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45",
"from_number": "+14155559876",
"to_number": "+14155551234",
"user_id": "user_01h2xcejqtf2nbrexx3vqjhp42"
}
```
### `call.answered`
Sent when a call is answered.
```json
{
"event": "call.answered",
"account_id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45",
"from_number": "+14155551234",
"to_number": "+14155559876",
"direction": "inbound",
"answered_at": "2026-01-15T14:30:05Z"
}
```
### `call.end`
Sent when a call ends. The `status` field indicates the outcome.
```json
{
"event": "call.end",
"account_id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45",
"from_number": "+14155551234",
"to_number": "+14155559876",
"direction": "inbound",
"status": "completed",
"duration_seconds": 325,
"ended_at": "2026-01-15T14:35:30Z"
}
```
### `call.transfer`
Sent when a call is transferred.
```json
{
"event": "call.transfer",
"account_id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45",
"from_number": "+14155551234",
"to_number": "+14155559876",
"transferred_to": "1001"
}
```
## Screen Pop Example
Here's a complete example of implementing a screen pop when calls arrive using the SDK:
```javascript
import { loadDialStack } from '@dialstack/sdk';
class ScreenPopManager {
constructor() {
this.dialstack = null;
}
async connect() {
// Initialize the SDK
this.dialstack = await loadDialStack('pk_test_...', {
fetchClientSecret: async () => {
const response = await fetch('/api/dialstack/session');
return response.json();
},
});
// Subscribe to incoming calls
this.dialstack.on('call.incoming', (call) => {
this.handleIncomingCall(call);
});
}
async handleIncomingCall(call) {
// Look up customer by phone number
const customer = await this.lookupCustomer(call.from_number);
// Show the screen pop
this.showPopup({
title: call.from_name || 'Unknown Caller',
phone: call.from_number,
customer: customer,
});
}
async lookupCustomer(phoneNumber) {
// Query your database for customer info
const response = await fetch(`/api/customers?phone=${phoneNumber}`);
return response.json();
}
showPopup(data) {
// Display the screen pop UI
const popup = document.createElement('div');
popup.className = 'screen-pop';
popup.innerHTML = `
Incoming Call
${data.title}
${data.phone}
${data.customer ? `Customer: ${data.customer.name}` : ''}
`;
document.body.appendChild(popup);
}
disconnect() {
if (this.dialstack) {
this.dialstack.logout();
this.dialstack = null;
}
}
}
// Usage
const screenPop = new ScreenPopManager();
screenPop.connect();
```
## Connection Management
### Automatic Reconnection
The DialStack SDK automatically handles reconnection with exponential backoff when the connection drops. No additional configuration is needed.
### Session Expiry
Account sessions expire after 1 hour by default. The SDK's `fetchClientSecret` callback is called to refresh the session automatically. Ensure your callback fetches a fresh session from your server:
```javascript
const dialstack = await loadDialStack('pk_test_...', {
fetchClientSecret: async () => {
// This is called on init and when the session needs refreshing
const response = await fetch('/api/dialstack/session');
const { client_secret, expires_at } = await response.json();
return { clientSecret: client_secret, expiresAt: expires_at };
},
});
```
## Best Practices
### DO
- Use the DialStack SDK for automatic reconnection and session management
- Subscribe to events when your application loads
- Look up additional customer data when calls arrive for richer screen pops
- Call `dialstack.logout()` when the user logs out or navigates away
### DON'T
- Don't poll the API instead of using events (inefficient and delayed)
- Don't create multiple SDK instances for the same account
- Don't store the client_secret long-term (it expires after 1 hour)
## Related Resources
- [API Reference](/api) - Complete API documentation
- [Authentication](/authentication) - Authentication guide
- [Sessions](/sdks/server/sessions) - Creating account sessions
---
## Guides
Comprehensive guides to help you integrate and configure DialStack.
Working with AI tools? See [`/llms.txt`](pathname:///llms.txt) for an agent-friendly index
and [`/llms-full.txt`](pathname:///llms-full.txt) for the full-corpus markdown dump.
## Available Guides
- [Quickstart](/quickstart) - Get your first phone system running in 5 minutes
- [Authentication](/authentication) - API keys and security
- [Click-to-Call](./click-to-call) - Initiate outbound calls from your application
- [Real-Time Events](./events) - Receive instant notifications for incoming calls and screen pops
- [Webhook Events](./webhook-events) - Receive call, recording, and voicemail notifications via HTTP webhooks
- [Number Porting](./number-porting) - Transfer existing phone numbers from another carrier
- [Pagination](./pagination) - Use URL-based pagination for list endpoints
- [Voice Apps](./voice-apps) - Build programmable voice applications with AI and real-time audio
- [Dial Plans](./dial-plans) - Build visual call routing flows with flowchart-style logic
- [Ring Groups](./ring-groups) - Route calls to multiple destinations simultaneously
- [Device Provisioning](./device-provisioning) - Provision and manage deskphones and DECT wireless systems
---
## New Numbers
Search live carrier inventory and order new phone numbers onto an account. Use this flow when you need a fresh number (new location, new line, overflow capacity). To bring an existing number in from another carrier, use [Number Porting](./number-porting) instead.
## Overview
Ordering a new number is a three-step flow:
1. **Search** — find available numbers using filters (area code, state, city + state, ZIP, or the six-digit prefix).
2. **Order** — submit one or more numbers from the search results.
3. **Track** — the order typically completes within seconds; poll the order ID or wait for a terminal status.
```
search → order (pending) → complete
→ partial (some numbers unavailable — only with partial_allowed)
→ failed (no numbers acquired)
```
## Step 1: Search Available Numbers
```bash
curl "https://api.dialstack.ai/v1/available-phone-numbers?area_code=919&quantity=10" \
-H "Authorization: Bearer sk_live_YOUR_KEY" \
-H "DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41"
```
At least one filter is required. Supported filters:
| Query param | Format | Notes |
| ----------- | ----------------------------- | -------------------------- |
| `area_code` | 3 digits | |
| `state` | 2-letter uppercase (`NC`) | |
| `city` | Free text | Requires `state` |
| `zip` | 5 digits | |
| `npa_nxx` | 6 digits (area code + prefix) | |
| `quantity` | 1–100, default 10 | Caps the number of results |
Filters may be combined to narrow results.
**Response:**
```json
{
"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"
}
]
}
```
Search results come from live carrier inventory — they are **not reserved**. Another buyer can take the number between your search and your order, so place the order promptly and handle the `409 Conflict` case if a number is no longer available at order time.
## Step 2: Place the Order
```bash
curl -X POST https://api.dialstack.ai/v1/phone-number-orders \
-H "Authorization: Bearer sk_live_YOUR_KEY" \
-H "DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41" \
-H "Content-Type: application/json" \
-d '{
"phone_numbers": ["+19195551234", "+19195555678"]
}'
```
Up to 100 numbers per order. Numbers must be US non-toll-free; the API rejects toll-free numbers and non-US numbers at validation.
By default the entire order fails if any single number can't be acquired. Pass `"partial_allowed": true` to accept whatever subset the carrier is able to fill:
```json
{
"phone_numbers": ["+19195551234", "+19195555678"],
"partial_allowed": true
}
```
**Response (201 Created):**
```json
{
"id": "YOUR_ORDER_ID",
"order_type": "purchase",
"status": "pending",
"phone_numbers": ["+19195551234", "+19195555678"],
"completed_numbers": [],
"failed_numbers": [],
"error_message": null,
"created_at": "2026-04-21T14:00:00Z",
"updated_at": "2026-04-21T14:00:00Z"
}
```
## Step 3: Track the Order
Orders typically reach a terminal status within seconds. Fetching a pending order refreshes its status from the upstream provider:
```bash
curl https://api.dialstack.ai/v1/phone-number-orders/YOUR_ORDER_ID \
-H "Authorization: Bearer sk_live_YOUR_KEY" \
-H "DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41"
```
You can also list all orders on the account, optionally filtered by status or type (`purchase` / `disconnect`):
```bash
curl "https://api.dialstack.ai/v1/phone-number-orders?status=complete&order_type=purchase" \
-H "Authorization: Bearer sk_live_YOUR_KEY" \
-H "DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41"
```
### Status Reference
| Status | Description |
| ---------- | -------------------------------------------------------------------------------------- |
| `pending` | Submitted; awaiting upstream confirmation |
| `complete` | All requested numbers were acquired and are active on the account |
| `partial` | Some numbers acquired, others unavailable (only possible with `partial_allowed: true`) |
| `failed` | No numbers were acquired |
On a terminal status, `completed_numbers` lists the E.164 numbers that were acquired and `failed_numbers` lists those that couldn't be. Numbers in `completed_numbers` appear under `GET /v1/phone-numbers` immediately and can be [routed](/api#tag/Phone-Numbers) to an extension, dial plan, voice app, or ring group.
## Related Resources
- [API Reference — Phone Numbers](/api#tag/Phone-Numbers) — Complete endpoint documentation
- [Number Porting](./number-porting) — Transfer existing numbers from another carrier
---
## Number Porting
Number porting lets you transfer existing phone numbers from another carrier to DialStack. This guide walks through the full port-in workflow: checking eligibility, creating a port order, approving the order, and tracking it through completion.
## Overview
Porting follows a draft-based workflow:
1. **Check eligibility** — verify numbers can be ported
2. **Create a draft** — provide subscriber details and your requested date and time
3. **Approve** — customer approves the port order with their electronic signature
4. **Submit** — send the order to the carrier for processing
5. **Track status** — monitor until the port completes
```
draft → approved → submitted → foc (scheduled) → complete
→ exception → (fix + resubmit) → submitted
```
## Prerequisites
- DialStack API key (`sk_live_*`)
- Phone numbers currently active with another US carrier
- Subscriber details matching the losing carrier's records (name, service address, account number, and PIN as listed on the current carrier's records)
## Step 1: Check Eligibility
Before creating a port order, verify that the numbers can be ported. This endpoint is platform-scoped — no `DialStack-Account` header is needed.
```bash
curl -X POST https://api.dialstack.ai/v1/port-in-eligibility \
-H "Authorization: Bearer sk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"phone_numbers": ["+12025551234", "+12025555678"]
}'
```
**Response:**
```json
{
"portable_numbers": [
{
"phone_number": "+12025551234",
"losing_carrier_name": "Verizon Wireless",
"losing_carrier_spid": "6006",
"is_wireless": true,
"account_number_required": true
}
],
"non_portable_numbers": [
{
"phone_number": "+12025555678",
"rate_center": "WASHINGT DC",
"city": "Washington",
"state": "DC"
}
]
}
```
Only numbers listed in `portable_numbers` can be included in a port order. Check `account_number_required` — when `true`, you'll need to include the subscriber's `account_number` and `pin` in the port order.
## Step 2: Create a Draft Port Order
Create a draft with the subscriber details, phone numbers, and your requested porting date and time. You can control exactly when your numbers transfer by setting `requested_foc_date` and optionally `requested_foc_time` (Eastern Time, between 08:00 and 20:00). The date must be at least **5 business days** and no more than **30 calendar days** from today.
Once the carrier confirms the order, the port will complete at the date and time you requested — so you can plan your cutover with confidence.
```bash
curl -X POST https://api.dialstack.ai/v1/port-orders \
-H "Authorization: Bearer sk_live_YOUR_KEY" \
-H "DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41" \
-H "Content-Type: application/json" \
-d '{
"phone_numbers": ["+12025551234"],
"subscriber": {
"btn": "+12025551234",
"business_name": "Smith Consulting",
"approver_name": "Jane Smith",
"account_number": "123456789",
"pin": "1234",
"address": {
"house_number": "123",
"street_name": "Main St",
"city": "Washington",
"state": "DC",
"zip": "20001"
}
},
"requested_foc_date": "2026-03-15",
"requested_foc_time": "10:00"
}'
```
**Response:**
```json
{
"id": "port_01jkx...",
"status": "draft",
"details": {
"phone_numbers": ["+12025551234"],
"subscriber": {
"btn": "+12025551234",
"business_name": "Smith Consulting",
"approver_name": "Jane Smith",
"account_number": "123456789",
"pin": "1234",
"address": {
"house_number": "123",
"street_name": "Main St",
"city": "Washington",
"state": "DC",
"zip": "20001"
}
},
"requested_foc_date": "2026-03-15",
"requested_foc_time": "10:00"
},
"submitted_at": null,
"created_at": "2026-02-11T14:00:00Z",
"updated_at": "2026-02-11T14:00:00Z"
}
```
:::info[Subscriber Details]
All subscriber fields must match the records on file with the losing carrier. Mismatches are the most common reason for port rejections.
- **BTN** (Billing Telephone Number) — the main number on the account
- **Approver name** — the name of the person authorized to approve the port
- **Service address** — split into `house_number` and `street_name` to match the carrier's format
- **Account number** and **PIN** — required for wireless ports (check `account_number_required` in the eligibility response)
:::
## Step 3: Approve the Port Order
Have the customer approve the port order by providing their electronic signature and IP address. This authorizes the transfer of their phone numbers.
```bash
curl -X POST https://api.dialstack.ai/v1/port-orders/port_01jkx.../approve \
-H "Authorization: Bearer sk_live_YOUR_KEY" \
-H "DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41" \
-H "Content-Type: application/json" \
-d '{
"signature": "Jane Smith",
"ip": "203.0.113.42"
}'
```
**Response:**
```json
{
"id": "port_01jkx...",
"status": "approved",
"details": {
"phone_numbers": ["+12025551234"],
"subscriber": { "...": "..." },
"approval": {
"signature": "Jane Smith",
"ip": "203.0.113.42",
"timestamp": "2026-02-11T14:02:00Z"
},
"requested_foc_date": "2026-03-15",
"requested_foc_time": "10:00"
},
"submitted_at": null,
"created_at": "2026-02-11T14:00:00Z",
"updated_at": "2026-02-11T14:02:00Z"
}
```
The 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.
## Step 4: Submit the Order
Once the order is approved, submit it to begin the porting process:
```bash
curl -X POST https://api.dialstack.ai/v1/port-orders/port_01jkx.../submit \
-H "Authorization: Bearer sk_live_YOUR_KEY" \
-H "DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41"
```
**Response:**
```json
{
"id": "port_01jkx...",
"status": "submitted",
"details": { "...": "..." },
"submitted_at": "2026-02-11T14:05:00Z",
"created_at": "2026-02-11T14:00:00Z",
"updated_at": "2026-02-11T14:05:00Z"
}
```
The status transitions from `approved` to `submitted`. The necessary authorization documents are generated and forwarded to the carrier automatically.
## Step 5: Track the Order
Poll the order to check its status. Non-terminal orders are automatically refreshed from the carrier:
```bash
curl https://api.dialstack.ai/v1/port-orders/port_01jkx... \
-H "Authorization: Bearer sk_live_YOUR_KEY" \
-H "DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41"
```
You can also list all port orders, optionally filtering by status:
```bash
curl "https://api.dialstack.ai/v1/port-orders?status=submitted" \
-H "Authorization: Bearer sk_live_YOUR_KEY" \
-H "DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41"
```
### Status Reference
| Status | Description |
| ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `draft` | Order created, not yet approved |
| `approved` | Customer has approved the order, ready to submit |
| `submitted` | Sent to the carrier, awaiting processing |
| `exception` | Rejected by the carrier — can be corrected and resubmitted |
| `foc` | Scheduled — the carrier has confirmed a completion date and time (in telecom, this confirmation is called a Firm Order Commitment, abbreviated FOC). Your numbers will port at the confirmed date and time. |
| `complete` | Numbers successfully ported and active in DialStack |
| `cancelled` | Order was cancelled |
### Viewing the Audit Trail
Every status change is recorded. View the full history:
```bash
curl https://api.dialstack.ai/v1/port-orders/port_01jkx.../events \
-H "Authorization: Bearer sk_live_YOUR_KEY" \
-H "DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41"
```
## Handling Rejections
If the carrier rejects the port (status becomes `exception`), the rejection details appear in the order:
```json
{
"status": "exception",
"details": {
"rejection": {
"code": "address_mismatch",
"message": "Service address mismatch"
}
}
}
```
To fix and resubmit, update the order with corrected information:
```bash
curl -X POST https://api.dialstack.ai/v1/port-orders/port_01jkx... \
-H "Authorization: Bearer sk_live_YOUR_KEY" \
-H "DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41" \
-H "Content-Type: application/json" \
-d '{
"subscriber": {
"btn": "+12025551234",
"business_name": "Smith Consulting",
"approver_name": "Jane Smith",
"address": {
"house_number": "456",
"street_name": "Oak Ave",
"city": "Washington",
"state": "DC",
"zip": "20002"
}
}
}'
```
## Cancelling an Order
Cancel a port order that hasn't reached a terminal state:
```bash
curl -X POST https://api.dialstack.ai/v1/port-orders/port_01jkx.../cancel \
-H "Authorization: Bearer sk_live_YOUR_KEY" \
-H "DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41"
```
Orders in `complete` or `cancelled` status cannot be cancelled.
## Common Rejection Reasons
| Code | Reason | How to Fix |
| ------------------------ | ------------------------ | -------------------------------------------------------------------------------------------------------------------------------- |
| `address_mismatch` | Service address mismatch | Update the address to match the losing carrier's records |
| `account_number_invalid` | Account number required | Contact the losing carrier for your account number |
| `name_mismatch` | Approver name mismatch | Use the exact name on file with the losing carrier |
| `business_name_mismatch` | Business name mismatch | Use the business name from the carrier's Customer Service Record (CSR), which may differ from the name on the bill |
| `btn_mismatch` | BTN mismatch | Verify the billing telephone number with the losing carrier |
| `pin_required` | PIN required | Contact the losing carrier to get the PIN or passcode for the account, then include it in the `pin` field |
| `pin_invalid` | PIN invalid | The PIN provided doesn't match the carrier's records — contact the losing carrier to verify the correct PIN and update the order |
## Error Handling
| Status | Error | Description |
| ------ | -------------------- | ----------------------------------------------------- |
| 400 | Validation errors | Invalid phone numbers, bad date format, etc. |
| 404 | Port order not found | Order doesn't exist or belongs to a different account |
| 409 | Invalid state | Operation not allowed in the order's current status |
| 422 | Approval required | Must approve the order before submitting |
## Related Resources
- [API Reference — Number Porting](/api#tag/Number-Porting) — Complete endpoint documentation
- [Phone Numbers](/api#tag/Phone-Numbers) — Managing active phone numbers
---
## Pagination
DialStack uses URL-based pagination for all list endpoints, providing efficient and consistent pagination across the API.
## Overview
URL-based pagination uses opaque page tokens embedded in URLs to navigate through large datasets. This approach:
- **Simplifies client code** (no need to extract IDs or manage cursors)
- **Performs better** at scale (no need to scan and skip records)
- **Handles real-time data** correctly (new items don't shift pages)
- **Provides stable results** (consistent ordering)
## List Response Format
All list endpoints return a consistent response structure:
```json
{
"object": "list",
"url": "/v1/accounts",
"next_page_url": "/v1/accounts?page=abc123",
"previous_page_url": null,
"data": [...]
}
```
| Field | Type | Description |
| ------------------- | -------------- | ---------------------------------------------------------- |
| `object` | string | Always `"list"` |
| `url` | string | The API endpoint for this list |
| `next_page_url` | string \| null | URL to fetch the next page, or `null` if no more items |
| `previous_page_url` | string \| null | URL to fetch the previous page, or `null` if on first page |
| `data` | array | The actual list of items |
## Pagination Parameters
### `limit`
Controls the number of items to return (default: 10, max: 100).
```bash
curl https://api.dialstack.ai/v1/call-logs?limit=50
```
:::note
The pagination system uses opaque page tokens embedded in URLs. Always use the complete URLs provided in `next_page_url` and `previous_page_url` from the API response. Do not construct URLs manually.
:::
## Pagination Example
Here's a complete example of paginating through call logs:
```javascript
const DialStack = require('@dialstack/sdk');
const dialstack = new DialStack('your-api-key');
async function listAllCallLogs() {
const allCallLogs = [];
let nextPageUrl = null;
// Fetch first page
let response = await dialstack.callLogs.list({ limit: 100 });
allCallLogs.push(...response.data);
nextPageUrl = response.next_page_url;
// Fetch remaining pages
while (nextPageUrl) {
// The SDK accepts the full URL and extracts the path
response = await dialstack.request('GET', nextPageUrl);
allCallLogs.push(...response.data);
nextPageUrl = response.next_page_url;
}
return allCallLogs;
}
```
## Auto-Pagination with SDK
The DialStack SDK provides automatic pagination using async iterators:
```javascript
// Automatically iterate through all pages
for await (const callLog of dialstack.callLogs.list().autoPagingEach()) {
console.log(callLog.id);
}
// Or collect all items into an array
const allCallLogs = await dialstack.callLogs.list().autoPagingToArray({
limit: 1000, // Maximum items to collect
});
```
The SDK handles all pagination automatically:
- Follows `next_page_url` from each response
- Stops when no more pages are available
- Handles errors and retries
## Backward Pagination
To paginate backward (e.g., for a "Previous Page" button):
```javascript
// Get the first page
const page1 = await dialstack.callLogs.list({ limit: 20 });
// Later, when user clicks "Next"
const page2 = await dialstack.request('GET', page1.next_page_url);
// When user clicks "Previous" from page 2
const backToPage1 = await dialstack.request('GET', page2.previous_page_url);
// Results are returned in the correct order (newest first)
```
## Using with Web Components
Our web components and React components handle pagination automatically. You don't need to manage page tokens or URLs manually:
```html
```
```jsx
{
/* React Component - pagination handled internally */
}
;
```
The components automatically:
- Load the initial page
- Fetch more items when scrolling or clicking "Load More"
- Handle page URLs internally
- Show loading indicators during pagination
- Support both forward and backward navigation
## Ordering
All list endpoints return items in descending order by creation time (newest first). This ordering is stable and efficient for pagination.
For endpoints with custom sorting (like call logs sorted by start time), the ordering is clearly documented in the API reference.
## Best Practices
### ✅ DO
- Use reasonable page sizes (10-100 items)
- Follow the URLs from `next_page_url` and `previous_page_url`
- Check `next_page_url` for `null` before requesting the next page
- Use web components or SDK auto-pagination for automatic handling
### ❌ DON'T
- Don't try to construct page tokens yourself (they're opaque)
- Don't manually build URLs with page parameters
- Don't exceed the maximum limit of 100 items
- Don't rely on page token format (it may change)
- Don't store page URLs long-term (they may expire)
## Related Resources
- [API Reference](/api) - Complete API documentation
- [Web Components](/sdks/web-components) - Auto-pagination components
- [React Components](/sdks/react) - React-specific components
---
## Quickstart Guide
Get your first phone system running in 5 minutes.
## Prerequisites
- DialStack API key (`sk_live_*`)
- `curl` or any HTTP client
## Step 1: Create an Account
Accounts represent your customers' organizations (e.g., "Jones Chiropractic").
```bash
curl -X POST https://api.dialstack.ai/v1/accounts \
-H "Authorization: Bearer sk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"email": "contact@joneschiro.com"
}'
```
**Response:**
```json
{
"id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
"email": "contact@joneschiro.com",
"created_at": "2025-10-18T10:00:00Z",
"updated_at": "2025-10-18T10:00:00Z"
}
```
Save the `id` as your account ID for the next steps.
## Step 2: Create a User
Users represent people who will have phone service.
```bash
curl -X POST https://api.dialstack.ai/v1/users \
-H "Authorization: Bearer sk_live_YOUR_KEY" \
-H "DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41" \
-H "Content-Type: application/json" \
-d '{
"name": "Dr. Alice Smith",
"email": "alice@joneschiro.com"
}'
```
**Response:**
```json
{
"id": "user_01h2xcejqtf2nbrexx3vqjhp42",
"name": "Dr. Alice Smith",
"email": "alice@joneschiro.com",
"created_at": "2025-10-17T14:30:00Z",
"updated_at": "2025-10-17T14:30:00Z"
}
```
Save the `user_id` for the next step.
## Step 3: Assign a Phone Number
Assign a phone number to the user so they can make and receive calls. See the [Phone Numbers guide](/api) for ordering and assignment.
## Step 4: Make a Test Call
Once a phone number is assigned, you can:
- Provision a desk phone via the admin panel (devices are auto-configured for the user)
- Build a softphone using the [WebRTC API](/webrtc) for browser or mobile calling
- Use [click-to-call](/guides/click-to-call) to initiate calls from your backend
## Next Steps
- [Authentication Guide](/authentication) - Learn about API keys and security
- [API Reference](/api) - Full API documentation
## Need Help?
- **Email**: api@dialstack.ai
- **GitHub Issues**: [github.com/dialstack/dialstack/issues](https://github.com/dialstack/dialstack/issues)
---
## Ring Groups(Guides)
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
# Ring Groups
Route calls to multiple destinations simultaneously.
## Overview
A ring group dials multiple members in parallel — all phones ring at once, and the first person to answer wins. Other ringing channels are automatically cancelled.
Use cases:
- **Sales teams** — Route inbound leads to all sales reps simultaneously
- **Support queues** — Ring all available agents at once
- **Failover routing** — Include external phone numbers as backup
```
┌─────────────┐
│ Incoming │
│ Call │
└──────┬──────┘
│
▼
┌─────────────┐
│ Ring Group │
│ "Sales Team"│
└──────┬──────┘
│
┌────────────┼────────────┐
│ │ │
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│ Alice │ │ Bob │ │ +1 415 │
│ (user) │ │ (user) │ │ 555-1234│
└────┬────┘ └────┬────┘ └────┬────┘
│ │ │
└────────────┼────────────┘
│
▼
First answer wins
```
## Creating a Ring Group
```javascript
const ringGroup = await dialstack.ringGroups.create(
{
name: 'Sales Team',
timeout_seconds: 30,
ignore_forwarding: false,
},
{ dialstackAccount: 'acct_01h2xcejqtf2nbrexx3vqjhp41' }
);
console.log(ringGroup.id); // rg_01h2xcejqtf2nbrexx3vqjhp51
```
```bash
curl -X POST https://api.dialstack.ai/v1/ring_groups \
-H "Authorization: Bearer sk_live_YOUR_API_KEY" \
-H "DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41" \
-H "Content-Type: application/json" \
-d '{
"name": "Sales Team",
"timeout_seconds": 30,
"ignore_forwarding": false
}'
```
## Adding Members
Members can be either extensions (users, dial plans, voice apps) or phone numbers.
### Extension Members
Add a user to ring when the group is called:
```javascript
await dialstack.ringGroups.addMember(
'rg_01h2xcejqtf2nbrexx3vqjhp51',
{ extension: 'user_01h2xcejqtf2nbrexx3vqjhp42' },
{ dialstackAccount: 'acct_01h2xcejqtf2nbrexx3vqjhp41' }
);
```
```bash
curl -X POST https://api.dialstack.ai/v1/ring_groups/rg_01h2xcejqtf2nbrexx3vqjhp51/members \
-H "Authorization: Bearer sk_live_YOUR_API_KEY" \
-H "DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41" \
-H "Content-Type: application/json" \
-d '{"extension": "user_01h2xcejqtf2nbrexx3vqjhp42"}'
```
### Phone Number Members
Add an external phone number as a member:
```javascript
await dialstack.ringGroups.addMember(
'rg_01h2xcejqtf2nbrexx3vqjhp51',
{ phone_number: '+14155551234' },
{ dialstackAccount: 'acct_01h2xcejqtf2nbrexx3vqjhp41' }
);
```
```bash
curl -X POST https://api.dialstack.ai/v1/ring_groups/rg_01h2xcejqtf2nbrexx3vqjhp51/members \
-H "Authorization: Bearer sk_live_YOUR_API_KEY" \
-H "DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41" \
-H "Content-Type: application/json" \
-d '{"phone_number": "+14155551234"}'
```
## Settings
### Timeout
The `timeout_seconds` setting (5-300, default 20) controls how long members ring before the call is considered unanswered.
```javascript
await dialstack.ringGroups.update(
'rg_01h2xcejqtf2nbrexx3vqjhp51',
{ timeout_seconds: 45 },
{ dialstackAccount: 'acct_01h2xcejqtf2nbrexx3vqjhp41' }
);
```
### Ignore Forwarding
When `ignore_forwarding` is `true`, SIP 302 redirects (call forwarding) from devices are ignored. The device is treated as busy instead of following the forward. This is useful when:
- Devices have call forwarding configured but you want the ring group to control routing
- You want to prevent calls from being forwarded outside the ring group
```javascript
await dialstack.ringGroups.update(
'rg_01h2xcejqtf2nbrexx3vqjhp51',
{ ignore_forwarding: true },
{ dialstackAccount: 'acct_01h2xcejqtf2nbrexx3vqjhp41' }
);
```
### Confirm External
When `confirm_external` is `true`, external phone number members must press 1 before being connected to the caller. This prevents external voicemail systems from picking up the call instead of a real person. Only phone number members are affected — extension members ring normally.
```javascript
await dialstack.ringGroups.update(
'rg_01h2xcejqtf2nbrexx3vqjhp51',
{ confirm_external: true },
{ dialstackAccount: 'acct_01h2xcejqtf2nbrexx3vqjhp41' }
);
```
### Timeout Action
The `timeout_action` and `timeout_target` settings control what happens when no member answers within `timeout_seconds`. Without these, the call simply ends when the timeout expires.
Two actions are available:
- `"ring_user"` — Ring a specific user after the timeout
- `"voicemail"` — Send the call to a specific user's voicemail
Both `timeout_action` and `timeout_target` must be set together. The `timeout_target` is the ID of the user to ring or send to voicemail.
```javascript
// Send to voicemail after timeout
await dialstack.ringGroups.update(
'rg_01h2xcejqtf2nbrexx3vqjhp51',
{
timeout_action: 'voicemail',
timeout_target: 'user_01h2xcejqtf2nbrexx3vqjhp42',
},
{ dialstackAccount: 'acct_01h2xcejqtf2nbrexx3vqjhp41' }
);
```
```bash
curl -X PATCH https://api.dialstack.ai/v1/ring_groups/rg_01h2xcejqtf2nbrexx3vqjhp51 \
-H "Authorization: Bearer sk_live_YOUR_API_KEY" \
-H "DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41" \
-H "Content-Type: application/json" \
-d '{
"timeout_action": "voicemail",
"timeout_target": "user_01h2xcejqtf2nbrexx3vqjhp42"
}'
```
To clear the timeout behavior, set both fields to `null`:
```javascript
await dialstack.ringGroups.update(
'rg_01h2xcejqtf2nbrexx3vqjhp51',
{ timeout_action: null, timeout_target: null },
{ dialstackAccount: 'acct_01h2xcejqtf2nbrexx3vqjhp41' }
);
```
## Routing to a Ring Group
To route calls to a ring group, create an extension that targets it:
```javascript
// Create extension 200 that routes to the ring group
await dialstack.extensions.create(
{
number: '200',
target: 'rg_01h2xcejqtf2nbrexx3vqjhp51',
},
{ dialstackAccount: 'acct_01h2xcejqtf2nbrexx3vqjhp41' }
);
```
```bash
curl -X POST https://api.dialstack.ai/v1/extensions \
-H "Authorization: Bearer sk_live_YOUR_API_KEY" \
-H "DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41" \
-H "Content-Type: application/json" \
-d '{
"number": "200",
"target": "rg_01h2xcejqtf2nbrexx3vqjhp51"
}'
```
Then assign that extension to a phone number, or use it in a dial plan.
## Using in Dial Plans
Ring groups can be used as targets in dial plan internal dial nodes:
```json
{
"id": "sales",
"type": "internal_dial",
"config": {
"target_id": "rg_01h2xcejqtf2nbrexx3vqjhp51",
"timeout": 30,
"next": "voicemail"
}
}
```
If no one answers within the timeout, the dial plan continues to the next node.
## Example: Sales Team
Complete example creating a sales team ring group:
```javascript
// Account context for all operations
const acct = { dialstackAccount: 'acct_01h2xcejqtf2nbrexx3vqjhp41' };
// 1. Create the ring group (confirm_external prevents external voicemail pickup)
const ringGroup = await dialstack.ringGroups.create(
{ name: 'Sales Team', timeout_seconds: 30, confirm_external: true },
acct
);
// 2. Add team members
await dialstack.ringGroups.addMember(ringGroup.id, { extension: 'user_alice_...' }, acct);
await dialstack.ringGroups.addMember(ringGroup.id, { extension: 'user_bob_...' }, acct);
// 3. Add external cell phone as backup
await dialstack.ringGroups.addMember(ringGroup.id, { phone_number: '+14155551234' }, acct);
// 4. Create extension to route calls to the ring group
await dialstack.extensions.create({ number: '200', target: ringGroup.id }, acct);
// 5. Assign to a phone number
await dialstack.phoneNumbers.update('pn_main_line_...', { extension: '200' }, acct);
```
## Loop Prevention
Ring groups can contain extensions that target other ring groups or dial plans, enabling complex routing scenarios. However, circular references are prohibited to prevent infinite loops.
### Prohibited Configurations
**Direct loop** — A ring group cannot contain itself as a member:
```
RG1 → ext_a → RG1 ❌ Direct loop
```
**Indirect loop** — Ring groups cannot form a circular chain:
```
RG1 → ext_a → RG2 → ext_b → RG1 ❌ Indirect loop
```
### Error Responses
When a loop is detected, the API returns a `422 Unprocessable Entity` status:
```json
{
"error": "ring group cannot contain itself as a member"
}
```
For indirect loops, the error shows the circular path:
```json
{
"error": "rg_01xxx → dp_02yyy → rg_01xxx"
}
```
### Allowed Configurations
**Multiple members targeting the same ring group** — Parallel references are allowed:
```
RG1 → ext_a → RG2
RG1 → ext_b → RG2 ✓ Same target, no loop
```
**Chains without cycles** — Linear chains are allowed:
```
RG1 → ext_a → RG2 → ext_b → RG3 ✓ No circular reference
```
**Mixed chains** — Ring groups and dial plans can reference each other as long as there's no cycle:
```
RG1 → ext_a (dial plan) → DP1 → internal_dial → RG2 ✓ No circular reference
```
### Depth Limit
Routing nesting is limited to a maximum depth of 20 levels. Configurations exceeding this limit are rejected to prevent performance issues:
```json
{
"error": "routing nesting exceeds maximum depth of 20"
}
```
In practice, most deployments use 2-3 levels of nesting at most.
## API Reference
- [Ring Groups](/api#tag/Ring-Groups) — Create, update, and manage ring groups
- [Extensions](/api#tag/Extensions) — Assign ring groups to extension numbers
- [Dial Plans](/api#tag/Dial-Plans) — Use ring groups in call routing flows
---
## Screen Pop
Open the customer record in your app on the very first ring — before anyone says hello.
Two event surfaces can drive a Screen Pop; pick the one that matches your architecture.
## Option 1: frontend via Server-Sent Events (simplest for embedded integrations)
If the customer record already lives in a browser tab, let the browser itself subscribe to DialStack events and react. No backend round-trip.
DialStack pushes real-time events to the browser over [Server-Sent Events](https://developer.mozilla.org/docs/Web/API/Server-sent_events) (SSE) — a long-lived HTTP connection that streams events one-way from server to client. It's simpler than WebSockets and reconnects automatically.
Use the SDK to open an SSE stream with a session token:
```tsx
import { loadDialStack } from '@dialstack/sdk';
const dialstack = await loadDialStack('pk_live_YOUR_KEY', {
fetchClientSecret: async () => {
const res = await fetch('/api/dialstack/session');
return res.json();
},
});
dialstack.on('call.incoming', async (event) => {
const customer = await lookupByPhone(event.from_number);
if (customer) openCustomerRecord(customer.id);
});
```
Latency: sub-second from the first ring to the record opening. Connection stays alive as long as the browser tab is open. SSE reconnects automatically.
See [Real-Time Events](./events) for the full SSE API, authentication, and reconnection behavior.
## Option 2: backend webhook → your own realtime channel
If the customer lookup requires your backend (to cross a firewall, join a DB, call a CRM), handle the Screen Pop server-side and push to the frontend over your own channel:
```ts
// POST /webhooks/dialstack — configured as your platform's webhook_url
app.post('/webhooks/dialstack', express.raw({ type: 'application/json' }), async (req, res) => {
verifySignature(req); // see webhook-events.md
const event = JSON.parse(req.body);
if (event.type === 'call.incoming') {
const customer = await db.customers.findOne({ phone: event.data.from_number });
if (customer) {
// push to the user's open session via YOUR realtime channel
pusher.trigger(`user-${event.data.user_id}`, 'screen-pop', {
customerId: customer.id,
callId: event.data.call_id,
});
}
}
res.status(200).end();
});
```
Webhooks are **fire-and-forget** — respond `200` quickly. Don't do the customer lookup on the webhook's critical path if it can be slow; queue it.
## What makes a good Screen Pop
- **Speed over completeness.** Pop the record in < 500ms. Enrich later.
- **Degrade gracefully.** Unknown caller? Show the unknown-caller state, don't hide the Screen Pop entirely.
- **Idempotent.** The same `event.id` can be delivered more than once. De-dupe by `event.id`.
- **No blocking UI.** If lookup fails, log it and continue — never block the ring.
## Where the data comes from
The `call.incoming` event carries:
| Field | Type | Use for |
| ------------- | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
| `from_number` | string | Match to a customer record (E.164) |
| `from_name` | string \| null | Fall-back display name when you have no match |
| `to_number` | string | Which of your numbers was dialed (useful for multi-location routing) |
| `user_id` | string \| null | The user the call is routed to (when known) |
| `call_id` | string | Stable call identifier — use to attach the opened record to your activity log, and later to fetch call details, recording, or transcript via the API |
See [Webhook Events](./webhook-events) for the full `call.incoming` payload, envelope, and signature verification.
## See also
- [Real-Time Events (SSE)](./events) — account-scoped event stream for frontends.
- [Webhook Events](./webhook-events) — platform-scoped webhook firehose.
- [Activity Logging](./activity-logging) — the other half of the event loop: write the call to your system of record.
---
## Voice Apps(Guides)
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
# Voice Apps
Build programmable voice applications with webhooks and real-time audio streaming.
## Overview
Voice apps let you handle calls programmatically. DialStack notifies your server via webhook, and you decide what happens next. Voice apps support two modes:
**Call Control** — Your server takes ownership of the call. Connect bidirectional audio for AI voice assistants, transfer calls to extensions, or build IVR systems.
**Call Listening** — Stream real-time audio from calls without affecting them. Use this for live monitoring, real-time transcription, or analytics.
Both modes start with a webhook notification to your server. The webhook's `event` field tells you which mode triggered it.
## Installation
Install the DialStack SDK for Node.js:
```bash
npm install @dialstack/sdk
```
Initialize the client with your API key:
```javascript
import { DialStack } from '@dialstack/sdk/server';
const dialstack = new DialStack(process.env.DIALSTACK_API_KEY);
```
## Creating a Voice App
```javascript
const voiceApp = await dialstack.voiceApps.create(
{ name: 'AI Receptionist', url: 'https://your-server.example.com/voice/webhook' },
{ dialstackAccount: 'acct_01h2xcejqtf2nbrexx3vqjhp41' }
);
```
```bash
curl -X POST https://api.dialstack.ai/v1/voice-apps \
-H "Authorization: Bearer sk_live_YOUR_API_KEY" \
-H "DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41" \
-H "Content-Type: application/json" \
-d '{
"name": "AI Receptionist",
"url": "https://your-server.example.com/voice/webhook"
}'
```
Response:
```json
{
"id": "va_01h2xcejqtf2nbrexx3vqjhp49",
"name": "AI Receptionist",
"url": "https://your-server.example.com/voice/webhook",
"status": "active",
"secret": "whsec_abc123def456...",
"created_at": "2025-10-18T10:00:00Z",
"updated_at": "2025-10-18T10:00:00Z"
}
```
**Important:** Save the `secret` value - you'll need it to verify webhook signatures.
## Webhook Notifications
When a call reaches your voice app, DialStack sends an HTTP POST to your webhook URL. The same voice app can receive both event types — the `event` field tells you which one.
### Webhook Events
| Event | Description | Trigger |
| --------------- | ------------------------------------------------------------------ | ---------------------------------------------------------------- |
| `call.received` | A call has been routed to this voice app for handling | Voice app is the call destination (extension or dial plan) |
| `call.notify` | A call is passing through a Voice App (Notify) node in a dial plan | Voice App (Notify) node in a dial plan references this voice app |
For `call.received`, your server takes control of the call — use the Update Call API to attach audio, transfer, etc.
For `call.notify`, the call continues routing normally — use the Listeners API to stream audio if desired.
### Webhook Payload
```http
POST /voice/webhook HTTP/1.1
Host: your-server.example.com
Content-Type: application/json
X-DialStack-Signature: t=1697634600,v1=5257a869e7ecebeda32affa62cdca3fa51cad7e77a0e56ff536d0ce8e108d8bd
{
"event": "call.received",
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45",
"account_id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
"voice_app_id": "va_01h2xcejqtf2nbrexx3vqjhp49",
"from_number": "+14155551234",
"from_name": "John Smith",
"to_number": "+14155559876"
}
```
Both `call.received` and `call.notify` use the same payload shape. The `event` field is the only difference.
### Verifying Signatures
Verify webhook signatures using the voice app's `secret` to ensure requests are from DialStack:
```javascript
const event = dialstack.webhooks.constructEvent(
req.rawBody,
req.headers['x-dialstack-signature'],
process.env.VOICE_APP_SECRET
);
// event contains: event, call_id, account_id, voice_app_id, from_number, from_name, to_number
```
```javascript
const crypto = require('crypto');
function verifySignature(payload, signature, secret) {
const [tPart, v1Part] = signature.split(',');
const timestamp = tPart.split('=')[1];
const expectedSig = v1Part.split('=')[1];
// Reject old timestamps (replay protection)
const age = Date.now() / 1000 - parseInt(timestamp);
if (age > 300) {
// 5 minutes
return false;
}
// Compute expected signature
const signedPayload = `${timestamp}.${payload}`;
const computedSig = crypto.createHmac('sha256', secret).update(signedPayload).digest('hex');
// Constant-time comparison
return crypto.timingSafeEqual(Buffer.from(expectedSig), Buffer.from(computedSig));
}
```
### Webhook Response
Return `200 OK` to acknowledge receipt. The response body is ignored.
```javascript
app.post('/voice/webhook', (req, res) => {
const { event, call_id } = req.body;
// Acknowledge immediately
res.sendStatus(200);
// Handle based on event type
if (event === 'call.received') {
handleCallControl(call_id);
} else if (event === 'call.notify') {
handleCallNotify(call_id);
}
});
```
## Voice App Dial Plan Nodes
Voice apps can be used in dial plans in two modes, selected by the `mode` field on the `voice_app` node:
- **Control mode** — shipping today. Appears as the **Voice App** node in the editor.
- **Notify mode** — planned (see [Coming soon](#voice-app-notify) below). In the target design, the editor will split these into two distinct palette entries (**Voice App (Control)** and **Voice App (Notify)**); today there is a single Voice App node that operates in control mode.
### Voice App (Control)
Routes the call to the voice app. Your server receives a `call.received` webhook and takes ownership of the call — attaching audio, transferring, etc.
```json
{
"id": "ai_receptionist",
"type": "voice_app",
"config": {
"voice_app_id": "va_01h2xcejqtf2nbrexx3vqjhp49",
"mode": "control",
"next": "voicemail"
}
}
```
### Voice App (Notify)
:::info[Coming soon]
Voice App (Notify) mode is currently undergoing implementation and will be available shortly. The surface documented below reflects the target design; specifics may change before release.
:::
Sends a fire-and-forget notification to the voice app as the call passes through, without interrupting call routing. This is useful for triggering external actions (real-time transcription, call analytics, CRM logging) alongside normal call handling.
```
┌──────────┐ ┌──────────────┐ ┌──────────┐ ┌─────────┐
│ Schedule │────▶│ Voice App │────▶│ Dial │────▶│Voicemail│
│ Node │ │ (Notify) │ │ User │ │ │
└──────────┘ └──────┬───────┘ └──────────┘ └─────────┘
│
│ POST (fire-and-forget)
▼
┌─────────────┐
│ Your Server │
└─────────────┘
```
The Voice App (Notify) node:
- Sends an HTTP POST to the voice app's URL with `"event": "call.notify"`
- Immediately continues to the next node — it does **not** wait for a response
- Does **not** answer or interrupt the call
- Uses the same signature verification as `call.received` webhooks
```json
{
"id": "notify_transcription",
"type": "voice_app",
"config": {
"voice_app_id": "va_01h2xcejqtf2nbrexx3vqjhp49",
"mode": "notify",
"next": "dial_reception"
}
}
```
## Call Control
When your voice app receives a `call.received` webhook, your server takes ownership of the call and controls it via the Update Call API.
```
┌─────────┐ ┌───────────┐ ┌─────────────┐
│ Caller │ │ DialStack │ │ Your Server │
└────┬────┘ └─────┬─────┘ └──────┬──────┘
│ │ │
│ 1. Call arrives │ │
│────────────────────────▶│ │
│ │ │
│ │ 2. Webhook POST │
│ │─────────────────────────▶│
│ │ │
│ │ 3. POST /v1/calls/{id} │
│ │◀─────────────────────────│
│ │ (attach audio) │
│ │ │
│ 4. Bidirectional audio │ │
│◀───────────────────────▶│◀────────────────────────▶│
│ (WebSocket) │ (WebSocket) │
│ │ │
```
### Actions
Use the Update Call API to send actions. Actions are processed sequentially.
#### Attach Audio Stream
Connect bidirectional audio to your WebSocket server (see [WebSocket API](/websocket-api) for the message protocol):
```javascript
await dialstack.calls.update(
callId,
{ actions: [{ type: 'attach', url: 'wss://your-server.example.com/voice/stream' }] },
{ dialstackAccount: accountId }
);
```
```bash
curl -X POST https://api.dialstack.ai/v1/calls/call_01h2xcejqtf2nbrexx3vqjhp45 \
-H "Authorization: Bearer sk_live_YOUR_API_KEY" \
-H "DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41" \
-H "Content-Type: application/json" \
-d '{
"actions": [
{"type": "attach", "url": "wss://your-server.example.com/voice/stream"}
]
}'
```
The `attach` action blocks until the WebSocket disconnects, then processing continues with the next action.
#### Transfer to Extension
Transfer the caller to an extension:
```javascript
await dialstack.calls.update(
callId,
{ actions: [{ type: 'transfer', extension: '100' }] },
{ dialstackAccount: accountId }
);
```
```bash
curl -X POST https://api.dialstack.ai/v1/calls/call_01h2xcejqtf2nbrexx3vqjhp45 \
-H "Authorization: Bearer sk_live_YOUR_API_KEY" \
-H "DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41" \
-H "Content-Type: application/json" \
-d '{
"actions": [
{"type": "transfer", "extension": "100"}
]
}'
```
If the transfer target answers or the caller hangs up, processing stops. If the transfer fails (no answer, busy), processing continues with the next action.
#### Combining Actions
Chain actions for fallback behavior:
```json
{
"actions": [
{ "type": "attach", "url": "wss://ai.example.com/voice" },
{ "type": "transfer", "extension": "100" }
]
}
```
This connects to your AI voice assistant first. When the WebSocket disconnects (e.g., AI hands off), the call transfers to extension 100.
#### Replacing Actions
Sending a new update replaces all pending actions immediately. The current action is interrupted, and processing starts from the first action in the new list.
```javascript
// AI decides to transfer the call
await dialstack.calls.update(
callId,
{ actions: [{ type: 'transfer', extension: '100' }] },
{ dialstackAccount: accountId }
);
```
```javascript
// AI decides to transfer the call
await fetch(`https://api.dialstack.ai/v1/calls/${callId}`, {
method: 'POST',
headers: {
Authorization: `Bearer ${apiKey}`,
'DialStack-Account': accountId,
'Content-Type': 'application/json',
},
body: JSON.stringify({
actions: [{ type: 'transfer', extension: '100' }],
}),
});
```
### WebSocket Audio Streaming
When DialStack executes an `attach` action, it connects to your WebSocket URL and streams audio bidirectionally. For the complete protocol specification, see the [WebSocket API](/websocket-api) reference.
#### Audio Format
| Property | Value |
| ----------- | ------------------------------- |
| Encoding | μ-law (G.711) |
| Sample rate | 8000 Hz |
| Channels | 1 (mono) |
| Chunk size | ~20ms (160 bytes before base64) |
| Bandwidth | ~8 KB/second |
#### Messages from DialStack
**Begin** — Sent when connection is established:
```json
{
"event": "begin",
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45",
"account_id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
"audio_format": {
"encoding": "audio/x-mulaw",
"sample_rate": 8000,
"channels": 1
}
}
```
**Audio** — Caller's audio (sent continuously):
```json
{
"event": "audio",
"timestamp": 1234,
"payload": "base64-encoded-mulaw-audio"
}
```
#### Messages to DialStack
**Audio** — Audio to play to the caller:
```json
{
"event": "audio",
"payload": "base64-encoded-mulaw-audio"
}
```
#### Ending the Session
Either side can close the WebSocket to end the audio session. When closed, DialStack continues processing with the next action (if any).
#### Using MediaStream (SDK)
The SDK provides a `MediaStream` class that handles WebSocket message parsing and provides a clean event-based API:
```javascript
import { MediaStream } from '@dialstack/sdk/server';
import { WebSocketServer } from 'ws';
const wss = new WebSocketServer({ port: 8080 });
wss.on('connection', (ws) => {
const stream = new MediaStream(ws);
stream.on('begin', (event) => {
console.log('Call started:', event.call_id);
console.log('Audio format:', event.audio_format);
// Send greeting audio
stream.sendAudio(greetingAudioBase64);
});
stream.on('audio', (event) => {
// event.payload contains base64-encoded μ-law audio
// event.timestamp contains the audio timestamp
// Process with your AI pipeline and respond
const responseAudio = processAudio(event.payload);
stream.sendAudio(responseAudio);
// Or send raw Buffer (auto base64-encoded)
stream.sendAudioBuffer(audioBuffer);
});
stream.on('close', (event) => {
console.log('Call ended:', event.code, event.reason);
});
stream.on('error', (event) => {
console.error('Stream error:', event.error);
});
});
```
### Complete Example: AI Voice Assistant
```javascript
import express from 'express';
import { WebSocketServer } from 'ws';
import { DialStack, MediaStream } from '@dialstack/sdk/server';
const app = express();
app.use(
express.json({
verify: (req, res, buf) => {
req.rawBody = buf;
},
})
);
const dialstack = new DialStack(process.env.DIALSTACK_API_KEY);
const VOICE_APP_SECRET = process.env.VOICE_APP_SECRET;
// Webhook endpoint
app.post('/voice/webhook', async (req, res) => {
let event;
try {
event = dialstack.webhooks.constructEvent(
req.rawBody,
req.headers['x-dialstack-signature'],
VOICE_APP_SECRET
);
} catch (err) {
return res.sendStatus(401);
}
const { call_id, account_id, from_number, from_name } = event;
console.log(`Incoming call from ${from_name || from_number}`);
res.sendStatus(200);
// Attach audio stream with fallback transfer
await dialstack.calls.update(
call_id,
{
actions: [
{ type: 'attach', url: 'wss://your-server.example.com/voice/stream' },
{ type: 'transfer', extension: '100' },
],
},
{ dialstackAccount: account_id }
);
});
// WebSocket server for audio streaming
const wss = new WebSocketServer({ noServer: true });
wss.on('connection', (ws) => {
const stream = new MediaStream(ws);
stream.on('begin', (event) => {
console.log(`Audio stream started for call ${stream.callId}`);
stream.sendAudio(generateGreetingAudio());
});
stream.on('audio', (event) => {
const audioBuffer = Buffer.from(event.payload, 'base64');
processAudioWithAI(audioBuffer, (responseAudio) => {
stream.sendAudio(responseAudio);
});
});
stream.on('close', () => {
console.log(`Audio stream ended for call ${stream.callId}`);
});
});
const server = app.listen(3000);
server.on('upgrade', (request, socket, head) => {
if (request.url === '/voice/stream') {
wss.handleUpgrade(request, socket, head, (ws) => {
wss.emit('connection', ws, request);
});
} else {
socket.destroy();
}
});
```
```javascript
const express = require('express');
const WebSocket = require('ws');
const crypto = require('crypto');
const app = express();
app.use(
express.json({
verify: (req, res, buf) => {
req.rawBody = buf;
},
})
);
const API_KEY = process.env.DIALSTACK_API_KEY;
const VOICE_APP_SECRET = process.env.VOICE_APP_SECRET;
const ACCOUNT_ID = process.env.DIALSTACK_ACCOUNT_ID;
// Webhook endpoint
app.post('/voice/webhook', async (req, res) => {
const signature = req.headers['x-dialstack-signature'];
if (!verifySignature(req.rawBody.toString(), signature, VOICE_APP_SECRET)) {
return res.sendStatus(401);
}
const { call_id, from_number, from_name } = req.body;
console.log(`Incoming call from ${from_name || from_number}`);
res.sendStatus(200);
await fetch(`https://api.dialstack.ai/v1/calls/${call_id}`, {
method: 'POST',
headers: {
Authorization: `Bearer ${API_KEY}`,
'DialStack-Account': ACCOUNT_ID,
'Content-Type': 'application/json',
},
body: JSON.stringify({
actions: [
{ type: 'attach', url: 'wss://your-server.example.com/voice/stream' },
{ type: 'transfer', extension: '100' },
],
}),
});
});
// WebSocket server for audio streaming
const wss = new WebSocket.Server({ noServer: true });
wss.on('connection', (ws) => {
let callId;
ws.on('message', (data) => {
const message = JSON.parse(data);
switch (message.event) {
case 'begin':
callId = message.call_id;
console.log(`Audio stream started for call ${callId}`);
ws.send(JSON.stringify({ event: 'audio', payload: generateGreetingAudio() }));
break;
case 'audio':
const audioBuffer = Buffer.from(message.payload, 'base64');
processAudioWithAI(audioBuffer, (responseAudio) => {
ws.send(JSON.stringify({ event: 'audio', payload: responseAudio }));
});
break;
}
});
ws.on('close', () => {
console.log(`Audio stream ended for call ${callId}`);
});
});
const server = app.listen(3000);
server.on('upgrade', (request, socket, head) => {
if (request.url === '/voice/stream') {
wss.handleUpgrade(request, socket, head, (ws) => {
wss.emit('connection', ws, request);
});
} else {
socket.destroy();
}
});
function verifySignature(payload, signature, secret) {
const [tPart, v1Part] = signature.split(',');
const timestamp = tPart.split('=')[1];
const expectedSig = v1Part.split('=')[1];
const age = Date.now() / 1000 - parseInt(timestamp);
if (age > 300) return false;
const signedPayload = `${timestamp}.${payload}`;
const computedSig = crypto.createHmac('sha256', secret).update(signedPayload).digest('hex');
return crypto.timingSafeEqual(Buffer.from(expectedSig), Buffer.from(computedSig));
}
```
## Listeners
:::info[Coming soon]
The Listeners API is currently undergoing implementation and will be available shortly. The surface documented below reflects the target design; specifics may change before release.
:::
When your voice app receives a `call.notify` webhook, you can create a listener to stream real-time audio from the call. Audio flows one way only — from DialStack to your server; the listener is passive and does not inject audio or alter the call. Neither party hears a tone or indication that a listener is attached, so **you are responsible for obtaining appropriate consent** from the parties on the call in accordance with applicable law (recording-consent requirements vary by jurisdiction).
```
┌────────┐ ┌───────────┐ ┌─────────────┐
│ Caller │ │ DialStack │ │ Your Server │
└───┬────┘ └─────┬─────┘ └──────┬──────┘
│ │ │
│ Normal two-party call │ │
│◀─────────────────────────▶│ │
│ │ │
│ │ 1. Webhook (call.notify) │
│ │──────────────────────────▶│
│ │ │
│ │ 2. POST /v1/calls/{id}/ │
│ │ listeners │
│ │◀──────────────────────────│
│ │ │
│ Call continues normally │ 3. Audio (one-way WSS) │
│◀─────────────────────────▶│──────────────────────────▶│
│ │ │
```
1. A Voice App (Notify) node notifies your server that a call has started
2. Your server creates a listener on that call
3. DialStack opens a WebSocket to your server and streams audio
### Creating a Listener
```javascript
const listener = await dialstack.calls.createListener(
callId,
{
url: 'wss://your-server.example.com/audio',
channel: 'both',
metadata: { agent_id: 'user_123', queue: 'support' },
},
{ dialstackAccount: accountId }
);
```
```bash
curl -X POST https://api.dialstack.ai/v1/calls/call_01h2xcejqtf2nbrexx3vqjhp45/listeners \
-H "Authorization: Bearer sk_live_YOUR_API_KEY" \
-H "DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41" \
-H "Content-Type: application/json" \
-d '{
"url": "wss://your-server.example.com/audio",
"channel": "both",
"metadata": {"agent_id": "user_123", "queue": "support"}
}'
```
### Channel Selection
| Channel | Audio received |
| -------- | ---------------------------------------------------- |
| `caller` | Audio from the party that initiated the call |
| `callee` | Audio from the party that received the call |
| `both` | Both channels, delivered as separate tagged messages |
### Stopping a Listener
Listeners stop automatically when the call ends. To stop early:
```javascript
await dialstack.calls.deleteListener(callId, listenerId, {
dialstackAccount: accountId,
});
```
```bash
curl -X DELETE https://api.dialstack.ai/v1/calls/call_.../listeners/lstn_... \
-H "Authorization: Bearer sk_live_YOUR_API_KEY" \
-H "DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41"
```
### Listener WebSocket Protocol
The listener WebSocket protocol extends the voice app protocol with channel tagging and an end message. See the [WebSocket API](/websocket-api) for the full specification.
**Begin** — Sent when connection is established:
```json
{
"event": "begin",
"listener_id": "lstn_01h2xcejqtf2nbrexx3vqjhp50",
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45",
"account_id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
"channel": "both",
"metadata": { "agent_id": "user_123", "queue": "support" },
"audio_format": {
"encoding": "audio/x-mulaw",
"sample_rate": 8000,
"channels": 1
}
}
```
The `listener_id` field distinguishes listener sessions from voice app sessions, allowing the same server to handle both.
**Audio** — Call audio, tagged by channel:
```json
{
"event": "audio",
"channel": "caller",
"timestamp": 1234,
"payload": "base64-encoded-mulaw-audio"
}
```
**End** — Sent when the listener stops:
```json
{
"event": "end",
"listener_id": "lstn_01h2xcejqtf2nbrexx3vqjhp50",
"reason": "call_ended"
}
```
Reasons: `call_ended`, `deleted` (stopped via API), `error`.
### Complete Example: Real-Time Transcription
```javascript
import express from 'express';
import { WebSocketServer } from 'ws';
import { DialStack } from '@dialstack/sdk/server';
const app = express();
app.use(
express.json({
verify: (req, res, buf) => {
req.rawBody = buf;
},
})
);
const dialstack = new DialStack(process.env.DIALSTACK_API_KEY);
const VOICE_APP_SECRET = process.env.VOICE_APP_SECRET;
// Webhook endpoint — receives call.notify from Voice App (Notify) dial plan node
app.post('/voice/webhook', async (req, res) => {
let event;
try {
event = dialstack.webhooks.constructEvent(
req.rawBody,
req.headers['x-dialstack-signature'],
VOICE_APP_SECRET
);
} catch (err) {
return res.sendStatus(401);
}
res.sendStatus(200);
if (event.event === 'call.notify') {
// Create a listener to stream audio for transcription
await dialstack.calls.createListener(
event.call_id,
{
url: 'wss://your-server.example.com/audio',
channel: 'both',
metadata: { from: event.from_number, to: event.to_number },
},
{ dialstackAccount: event.account_id }
);
}
});
// WebSocket server for receiving listener audio
const wss = new WebSocketServer({ noServer: true });
wss.on('connection', (ws) => {
let listenerId;
ws.on('message', (data) => {
const message = JSON.parse(data);
switch (message.event) {
case 'begin':
listenerId = message.listener_id;
console.log(`Listening to call ${message.call_id} (${message.channel})`);
break;
case 'audio':
// Send to your speech-to-text service
transcribe(message.payload, message.channel);
break;
case 'end':
console.log(`Listener ${listenerId} stopped: ${message.reason}`);
break;
}
});
});
const server = app.listen(3000);
server.on('upgrade', (request, socket, head) => {
if (request.url === '/audio') {
wss.handleUpgrade(request, socket, head, (ws) => {
wss.emit('connection', ws, request);
});
} else {
socket.destroy();
}
});
```
## API Reference
- [Voice Apps](/api#tag/Voice-Apps) — Create and manage voice apps
- [Update Call](/api#tag/Calls/operation/updateCall) — Control active calls with actions
- [Listeners](/api#tag/Calls/operation/createListener) — Stream real-time audio from active calls
- [WebSocket API](/websocket-api) — Audio streaming protocol (voice apps and listeners)
---
## BYO VoiceAI
DialStack is agent-agnostic. Bring your own AI stack and plug it into the call. Two integration patterns cover every BYO scenario.
## Two patterns
| Pattern | What your AI does | Primitive |
| -------------------- | ---------------------------------------------------------------------------------- | ----------------------------------------------- |
| **BYO Receptionist** | Answers the call, talks with the caller, decides what happens next | **Voice App (Control)** mode + `attach` action |
| **BYO Observer** | Listens to the call for transcription / coaching / analytics, doesn't interrupt it | **Voice App (Notify)** mode + **Listeners API** |
Full Voice App semantics: [Voice Apps](/guides/voice-apps).
## Pattern 1: BYO Receptionist (bidirectional)
The AI answers the call and talks with the caller. You run the prompt, the tools, and the transcription; DialStack handles telephony.
### Flow
```mermaid
sequenceDiagram
participant Caller
participant DS as DialStack
participant You as Your server
participant AI as Your AI (WS)
Caller->>DS: Incoming call hits a Voice App (Control) node
DS->>You: Webhook: call.received
You->>DS: POST /v1/calls/:id { actions: [{ type: 'attach', url: 'wss://ai.example.com/stream' }] }
DS->>AI: Opens WebSocket — caller audio frames
AI->>DS: Agent audio frames
Note over Caller,AI: Bidirectional conversation
AI-->>DS: (optional) close socket or send transfer via a new actions update
You->>DS: POST /v1/calls/:id { actions: [{ type: 'transfer', extension: '100' }] }
DS->>Caller: Transfer to human
```
### Create the Voice App
```bash
curl -X POST https://api.dialstack.ai/v1/voice-apps \
-H 'Authorization: Bearer sk_live_YOUR_KEY' \
-H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41' \
-H 'Content-Type: application/json' \
-d '{
"name": "BYO Receptionist",
"url": "https://your-server.example.com/voice/webhook"
}'
```
### Handle the webhook and attach audio
```ts
// POST /voice/webhook
app.post('/voice/webhook', express.raw({ type: 'application/json' }), async (req, res) => {
verifySignature(req); // see voice-apps.md
const event = JSON.parse(req.body);
if (event.event === 'call.received') {
// Open the WebSocket for this call
await ds.calls.update(
event.call.id,
{
actions: [{ type: 'attach', url: 'wss://your-server.example.com/voice/stream' }],
},
{ dialstackAccount: event.account_id }
);
}
res.status(200).end();
});
```
### The audio WebSocket
Your service accepts a WebSocket at the URL you passed to `attach`. DialStack streams caller audio as μ-law 8 kHz frames (~20 ms each, base64-encoded JSON messages). You send agent audio back in the same format on the same socket. Full protocol — framing, control messages, error handling: [WebSocket API](/websocket-api).
### Worked example: ElevenLabs Conversational AI
A bridge server sits between the two WebSockets and handles audio transcoding. Sketch:
```ts
import WebSocket from 'ws';
// DialStack opens this socket when your webhook responds with `attach`.
wss.on('connection', async (dsSocket) => {
// 1. Open the ElevenLabs Conversational AI WebSocket.
const elSocket = new WebSocket(
`wss://api.elevenlabs.io/v1/convai/conversation?agent_id=${process.env.ELEVENLABS_AGENT_ID}`,
{ headers: { 'xi-api-key': process.env.XI_API_KEY } }
);
// 2. Caller audio → ElevenLabs: μ-law 8 kHz → PCM 16 kHz.
dsSocket.on('message', (raw) => {
const msg = JSON.parse(raw.toString());
if (msg.type !== 'audio') return;
const mulaw = Buffer.from(msg.payload, 'base64');
const pcm16 = upsample8kTo16k(mulawToPcm(mulaw));
elSocket.send(JSON.stringify({ user_audio_chunk: pcm16.toString('base64') }));
});
// 3. ElevenLabs audio → caller: PCM 16 kHz → μ-law 8 kHz.
elSocket.on('message', (raw) => {
const msg = JSON.parse(raw.toString());
if (msg.type !== 'audio') return;
const pcm16 = Buffer.from(msg.audio_event.audio_base_64, 'base64');
const mulaw = pcmToMulaw(downsample16kTo8k(pcm16));
dsSocket.send(JSON.stringify({ type: 'audio', payload: mulaw.toString('base64') }));
});
dsSocket.on('close', () => elSocket.close());
elSocket.on('close', () => dsSocket.close());
});
```
Transcoding helpers (`mulawToPcm`, `pcmToMulaw`, `upsample8kTo16k`, `downsample16kTo8k`) are short — under 50 lines of DSP. Any Node audio library (e.g., `alawmulaw`, `node-libsamplerate`) will do.
ElevenLabs tool-use webhooks (for database lookups, appointment booking, etc.) are plain HTTPS endpoints configured on the agent — unrelated to the DialStack WebSocket. Configure them once when you create the agent via ElevenLabs' REST API.
The same shape works for OpenAI Realtime, Vapi, Retell, or a self-hosted model — swap the outbound WebSocket and the frame format.
### Routing
Drop a Voice App (Control) node into any dial plan:
```ts
{
id: 'ai_reception',
type: 'internal_dial',
config: { target_id: 'va_01h2xcejqtf2nbrexx3vqjhp49' }, // your voice app ID
}
```
## Pattern 2: BYO Observer (one-way)
:::info[Coming soon]
The BYO Observer pattern depends on Voice App (Notify) mode and the Listeners API, both currently undergoing implementation. Pattern 1 (BYO Receptionist) is unaffected.
:::
The AI listens to calls for real-time transcription, coaching, or analytics. It never talks to the caller and doesn't affect call routing.
### Flow
```mermaid
sequenceDiagram
participant Caller
participant DS as DialStack
participant You as Your server
participant AI as Your AI (WS)
Caller->>DS: Call passes through a Voice App (Notify) node
DS->>You: Webhook: call.notify (fire-and-forget)
You->>DS: POST /v1/calls/:id/listeners { url: 'wss://ai.example.com/listen' }
DS->>AI: Opens WebSocket — caller audio frames (one-way)
Note over Caller,DS: Call continues routing normally to its real destination
```
### Create the listener
```ts
if (event.event === 'call.notify') {
await ds.calls.createListener(
event.call.id,
{ url: 'wss://your-server.example.com/voice/listen' },
{ dialstackAccount: event.account_id }
);
}
```
Both parties on the call are unaware that a listener is attached. Listeners stop automatically when the call ends.
### Routing
Use a Voice App (Notify) node alongside the real routing:
```ts
{
id: 'transcribe',
type: 'internal_dial',
config: { target_id: 'va_notify_id', mode: 'notify' },
}
```
## Choosing between them
- **Your AI should talk** → Pattern 1 (Control mode + `attach`).
- **Your AI should listen** → Pattern 2 (Notify mode + Listeners API).
- **Both** → a dial plan can route through a Notify node first (transcription) and then to a Control node (AI agent). Or the Control-mode AI can itself open a sidecar listener.
## Compared to DialStack-managed AI Agents
DialStack ships a first-party AI receptionist via [AI Scheduling](/guides/voiceai-scheduling) / the [AI Agents API](/api#tag/AI-Agents). Reach for BYO when:
- You already run an AI stack your team knows.
- You need a specific model, voice, or data-control guarantee.
- You want full control over the prompt, tools, and transcripts.
## See also
- [Voice Apps](/guides/voice-apps) — full Voice App documentation including actions (`attach`, `transfer`, combined/sequenced).
- [Dial Plans](/guides/dial-plans) — how Voice App nodes slot into call routing.
- [WebSocket API](/websocket-api) — media-streaming protocol for both `attach` and Listeners.
- [AI Scheduling](/guides/voiceai-scheduling) — the native alternative, when you don't need to bring your own.
---
## AI Scheduling
Let callers book appointments over the phone without talking to a human. DialStack handles the voice conversation — greeting, slot negotiation, callback collection — and calls your system to read availability and write the booking.
AI Scheduling is powered by the [AI Agents API](/api#tag/AI-Agents). Each AI agent auto-provisions a voice app and an extension, has a configurable persona and FAQ, and optionally hands off call handling to your scheduling endpoints.
## What you build
Three HTTPS endpoints under a base URL you give us:
| Path | Purpose |
| --------------------------------- | ------------------------------------------------------------------------------------------------------------- |
| `POST {base}/customers/lookup` | Match the caller's phone number to an existing customer record (optional — used to personalize the greeting). |
| `POST {base}/availability/search` | Return open slots for a requested date. |
| `POST {base}/bookings` | Create a booking for the slot the caller picked. |
DialStack relays each request synchronously: your response shape is what the AI presents to the caller. Full request / response payload definitions: [Appointment Webhooks](/guides/appointment-webhooks).
## Create the agent
Configure the agent once via `POST /v1/ai-agents`. Point `scheduling.webhook_url` at the base URL that hosts the three paths above.
```bash
curl -X POST https://api.dialstack.ai/v1/ai-agents \
-H 'Authorization: Bearer sk_live_YOUR_KEY' \
-H 'DialStack-Account: acct_01h2xcejqtf2nbrexx3vqjhp41' \
-H 'Content-Type: application/json' \
-d '{
"name": "Front Desk Receptionist",
"extension_number": "200",
"persona_name": "Tony",
"greeting_name": "Jones Family Dental",
"instructions": "You are the receptionist. Be warm and professional. Offer to book an appointment if the caller does not specify a reason.",
"faq_responses": [
{ "question": "What are your business hours?", "answer": "We are open Monday through Friday, 9 AM to 5 PM." },
{ "question": "Do you take walk-ins?", "answer": "Walk-ins are welcome, but appointments are prioritized." }
],
"scheduling": {
"webhook_url": "https://api.clinic.io/dialstack"
}
}'
```
The response includes `id` (`aia_...`) and `voice_app_id` — the voice app is managed automatically. Extension `200` now routes callers to the agent.
## How a booking call plays out
```mermaid
sequenceDiagram
participant Caller
participant DS as DialStack
participant You as Your API
Caller->>DS: Dials your number (reaches extension 200)
DS->>You: POST /customers/lookup { phone: "+14155551234" }
You-->>DS: { customer_id: "c_42", name: "Alex Kim" }
DS->>Caller: "Hi Alex, thanks for calling Jones Family Dental. This is Tony. How can I help?"
Caller->>DS: "I need an appointment next Tuesday afternoon."
DS->>You: POST /availability/search { date: "2026-04-28", window: "afternoon" }
You-->>DS: { slots: ["13:00", "14:30", "16:00"] }
DS->>Caller: "I have 1 PM, 2:30 PM, or 4 PM available — which works?"
Caller->>DS: "2:30 works."
DS->>You: POST /bookings { customer_id: "c_42", slot: "2026-04-28T14:30:00Z" }
You-->>DS: { booking_id: "b_7f3", confirmation_sent: true }
DS->>Caller: "Booked. You'll get a confirmation text shortly."
```
The AI handles disambiguation ("which Tuesday?"), date math, and re-prompting. You only see the clean, resolved request.
## Route calls to the agent
Drop the agent into any [dial plan](/guides/dial-plans) via its auto-managed extension — point an `internal_dial` node at the agent's voice app:
```ts
{
id: 'ai_receptionist',
type: 'internal_dial',
config: { target_id: 'va_01h2xcejqtf2nbrexx3vqjhp49' }, // from voice_app_id
}
```
Typical patterns:
- **After-hours fallback** — schedule node → `ring_all_users` during business hours, `internal_dial` to the agent when closed.
- **Overflow** — `ring_all_users` with a short timeout, `next` pointing at the agent when no one picks up.
- **Direct line** — an inbound number routed straight at the agent for a 24/7 booking line.
The landing hero shows all three patterns in one dial plan.
## Customizing the agent at call time
Agent config (persona, instructions, FAQs, scheduling URL) can be updated via `POST /v1/ai-agents/{id}`. Changes take effect on the next call.
Per-call overrides (account-specific context, time-sensitive promotions) are applied on your side when the AI calls `/customers/lookup` — the response shape carries arbitrary metadata that the agent uses in the conversation.
## See also
- [Appointment Webhooks](/guides/appointment-webhooks) — exact payload shapes for the three endpoints.
- [Voice Apps](/guides/voice-apps) — the primitive AI Agents are built on.
- [Dial Plans](/guides/dial-plans) — how to route calls to the agent.
- [BYO VoiceAI](/guides/voiceai-byo) — if you want to run the conversation yourself instead of using DialStack's AI.
- [AI Agents API](/api#tag/AI-Agents) — full REST surface.
---
## Webhook Events
Receive real-time notifications about calls, recordings, voicemails, and transcriptions via HTTP webhooks.
Webhook Events is the **backend transport** for call events. For the **browser transport**, see [Real-Time Events (SSE)](./events). For common patterns built on top, see [Screen Pop](./screen-pop) and [Activity Logging](./activity-logging).
## Overview
Webhook events are push notifications that DialStack sends to your server as things happen in the system. Unlike [appointment webhooks](./appointment-webhooks) (which are request/response), event webhooks are fire-and-forget notifications — return `200` to acknowledge receipt.
Webhook events are **platform-scoped**: configure a single webhook URL on your platform, and DialStack delivers events for all accounts on that platform.
For frontend real-time notifications (account-scoped), see [Real-Time Events (SSE)](./events).
## Configuration
To receive webhook events, configure a `webhook_url` on your platform via the platform management API. DialStack automatically generates and manages the `webhook_secret` used for [signature verification](#signature-verification).
All events for all accounts on the platform are delivered to this single URL.
## Event Types
| Event | Description |
| ---------------------------------- | --------------------------------- |
| `call.initiated` | Outbound call started |
| `call.incoming` | Inbound call received |
| `call.ringing` | A user's phones are about to ring |
| `call.answered` | Call answered |
| `call.end` | Call ended |
| `call.transfer` | Call transferred |
| `voicemail.new` | New voicemail received |
| `recording.available` | Call recording ready for download |
| `recording.transcription.complete` | Call transcript ready |
| `recording.summary.complete` | AI call summary ready |
| `voicemail.transcription.complete` | Voicemail transcript ready |
## Event Envelope
All webhook events share this envelope structure:
```json
{
"id": "evt_01jqr5k8m3n4p6q7r8s9t0u1v2",
"type": "call.end",
"created_at": "2026-01-15T14:35:30Z",
"account_id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
"data": {}
}
```
| Field | Type | Description |
| ------------ | ------ | ------------------------------------------------------- |
| `id` | string | Unique event identifier. Use for idempotent processing. |
| `type` | string | Event type (see table above). |
| `created_at` | string | ISO 8601 timestamp when the event was created. |
| `account_id` | string | Account where the event occurred. |
| `data` | object | Event-specific payload (see below). |
## Event Payloads
### `call.initiated`
Sent when an outbound call starts dialing.
```json
{
"id": "evt_01jqr5k8m3n4p6q7r8s9t0u1v2",
"type": "call.initiated",
"created_at": "2026-01-15T14:30:00Z",
"account_id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
"data": {
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45",
"direction": "outbound",
"from_number": "+14155559876",
"to_number": "+14155551234",
"user_id": "user_01h2xcejqtf2nbrexx3vqjhp42",
"started_at": "2026-01-15T14:30:00Z"
}
}
```
### `call.incoming`
Sent when an inbound call is received.
```json
{
"id": "evt_01jqr5k8m3n4p6q7r8s9t0u1v3",
"type": "call.incoming",
"created_at": "2026-01-15T14:30:00Z",
"account_id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
"data": {
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45",
"direction": "inbound",
"from_number": "+14155551234",
"from_name": "John Smith",
"to_number": "+14155559876",
"user_id": "user_01h2xcejqtf2nbrexx3vqjhp42",
"started_at": "2026-01-15T14:30:00Z"
}
}
```
| Field | Type | Description |
| ------------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `call_id` | string | Call identifier |
| `direction` | string | Always `"inbound"` |
| `from_number` | string | Caller's phone number (E.164) |
| `from_name` | string \| null | Caller's display name |
| `to_number` | string | Called phone number (E.164) |
| `user_id` | string \| null | User the call is routed to. Only set when the called number targets a single user directly; omitted when the call routes to a ring group, voice app, dial plan, or any other destination where a specific user is not known at this stage. |
| `started_at` | string | ISO 8601 timestamp |
### `call.ringing`
Sent when a user's phones are about to ring. Fired once per (call, user) — a user with multiple phones (desk + mobile) produces a single event, not one per device. For a ring group or ring-all-users call, one event is emitted per user being rung, all sharing the same `call_id`. `user_id` always identifies the user whose phones are ringing, never the caller.
Not emitted for the initiating user's own phone ringing during a click-to-call (leg A).
```json
{
"id": "evt_01jqr5k8m3n4p6q7r8s9t0u1v8",
"type": "call.ringing",
"created_at": "2026-01-15T14:30:01Z",
"account_id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
"data": {
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45",
"user_id": "user_01h2xcejqtf2nbrexx3vqjhp42",
"from_number": "+14155551234",
"from_name": "John Smith",
"to_number": "+14155559876",
"ringing_at": "2026-01-15T14:30:01Z"
}
}
```
| Field | Type | Description |
| ------------- | -------------- | -------------------------------------- |
| `call_id` | string | Call identifier |
| `user_id` | string | User whose phones are about to ring |
| `from_number` | string | Caller's phone number (E.164) |
| `from_name` | string \| null | Caller's display name |
| `to_number` | string | Called phone number (E.164) |
| `ringing_at` | string | ISO 8601 timestamp when the ring began |
### `call.answered`
Sent when a call is answered.
```json
{
"id": "evt_01jqr5k8m3n4p6q7r8s9t0u1v4",
"type": "call.answered",
"created_at": "2026-01-15T14:30:05Z",
"account_id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
"data": {
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45",
"direction": "inbound",
"from_number": "+14155551234",
"from_name": "John Smith",
"to_number": "+14155559876",
"user_id": "user_01h2xcejqtf2nbrexx3vqjhp42",
"started_at": "2026-01-15T14:30:00Z",
"answered_at": "2026-01-15T14:30:05Z"
}
}
```
### `call.end`
Sent when a call ends.
```json
{
"id": "evt_01jqr5k8m3n4p6q7r8s9t0u1v5",
"type": "call.end",
"created_at": "2026-01-15T14:35:30Z",
"account_id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
"data": {
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45",
"direction": "inbound",
"from_number": "+14155551234",
"from_name": "John Smith",
"to_number": "+14155559876",
"user_id": "user_01h2xcejqtf2nbrexx3vqjhp42",
"started_at": "2026-01-15T14:30:00Z",
"answered_at": "2026-01-15T14:30:05Z",
"ended_at": "2026-01-15T14:35:30Z",
"duration_seconds": 325,
"status": "completed"
}
}
```
| `status` value | Description |
| -------------- | -------------------------------------------- |
| `completed` | Call was answered and ended normally |
| `no-answer` | Call rang but was not answered |
| `busy` | Callee was busy or rejected the call |
| `failed` | Call failed due to a network or system error |
| `voicemail` | Call went to voicemail |
| `direction` value | Description |
| ----------------- | -------------------------------------- |
| `inbound` | Call from PSTN to a DID |
| `outbound` | Call from an endpoint to PSTN |
| `internal` | Extension-to-extension or feature code |
`user_id` is populated with the user most closely associated with the call (the caller for `outbound`, the answerer for `inbound` and `internal`) and is omitted when no single user was involved — for example, an unanswered inbound ring group call or a call handled entirely by a voice app.
### `call.transfer`
Sent when a call is transferred.
```json
{
"id": "evt_01jqr5k8m3n4p6q7r8s9t0u1v6",
"type": "call.transfer",
"created_at": "2026-01-15T14:32:00Z",
"account_id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
"data": {
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45",
"direction": "inbound",
"from_number": "+14155551234",
"to_number": "+14155559876",
"transferred_to": "1001",
"transferred_by": "user_01h2xcejqtf2nbrexx3vqjhp42",
"transferred_at": "2026-01-15T14:32:00Z"
}
}
```
### `voicemail.new`
Sent when a new voicemail is received. Use [`GET /v1/voicemails/{voicemail_id}`](/api#tag/Voicemails/operation/getVoicemail) to retrieve the full voicemail details and audio.
```json
{
"id": "evt_01jqr5k8m3n4p6q7r8s9t0u1v7",
"type": "voicemail.new",
"created_at": "2026-01-15T14:36:00Z",
"account_id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
"data": {
"voicemail_id": "vm_01h2xcejqtf2nbrexx3vqjhp46",
"user_id": "user_01h2xcejqtf2nbrexx3vqjhp42",
"from_number": "+14155551234",
"from_name": "John Smith",
"duration_seconds": 42,
"created_at": "2026-01-15T14:36:00Z"
}
}
```
`user_id` is included when the voicemail belongs to a single user's mailbox and is omitted when it belongs to a shared voicemail box.
### `recording.available`
Sent when a call recording is ready for download. Use [`GET /v1/calls/{call_id}/recording`](/api#tag/Calls/operation/getCallRecording) to download the audio file.
```json
{
"id": "evt_01jqr5k8m3n4p6q7r8s9t0u1v8",
"type": "recording.available",
"created_at": "2026-01-15T14:35:35Z",
"account_id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
"data": {
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45",
"duration_seconds": 325
}
}
```
### `recording.transcription.complete`
Sent when a call transcription is ready. Use [`GET /v1/calls/{call_id}/transcript`](/api#tag/Calls/operation/getCallTranscript) to retrieve the full transcript text.
```json
{
"id": "evt_01jqr5k8m3n4p6q7r8s9t0u1v9",
"type": "recording.transcription.complete",
"created_at": "2026-01-15T14:35:45Z",
"account_id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
"data": {
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45",
"status": "completed"
}
}
```
### `recording.summary.complete`
Sent when an AI-generated call summary is ready. Use [`GET /v1/calls/{call_id}/transcript`](/api#tag/Calls/operation/getCallTranscript) to retrieve the summary.
```json
{
"id": "evt_01jqr5k8m3n4p6q7r8s9t0u1va",
"type": "recording.summary.complete",
"created_at": "2026-01-15T14:36:00Z",
"account_id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
"data": {
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45"
}
}
```
### `voicemail.transcription.complete`
Sent when a voicemail transcription is ready. Use [`GET /v1/voicemails/{voicemail_id}/transcript`](/api#tag/Voicemails/operation/getVoicemailTranscript) to retrieve the transcript text.
```json
{
"id": "evt_01jqr5k8m3n4p6q7r8s9t0u1vb",
"type": "voicemail.transcription.complete",
"created_at": "2026-01-15T14:36:10Z",
"account_id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
"data": {
"voicemail_id": "vm_01h2xcejqtf2nbrexx3vqjhp46",
"user_id": "user_01h2xcejqtf2nbrexx3vqjhp42",
"status": "completed"
}
}
```
## Webhook Protocol
### Request Format
DialStack sends a `POST` request to your platform's configured webhook URL with the event as the JSON body.
**Headers:**
| Header | Description |
| ------------------------ | -------------------------------------- |
| `Content-Type` | `application/json` |
| `X-DialStack-Signature` | HMAC-SHA256 signature for verification |
| `X-DialStack-Account-Id` | Account where the event occurred |
| `User-Agent` | `DialStack-Webhook/1.0` |
### Signature Verification
Every webhook request is signed using HMAC-SHA256 with your platform's webhook secret. The signature header format is:
```
X-DialStack-Signature: t=1705312530,v1=a1b2c3d4e5f6...
```
To verify:
1. Extract the timestamp (`t`) and signature (`v1`) from the header
2. Construct the signed payload: `{timestamp}.{request_body}`
3. Compute HMAC-SHA256 of the signed payload using your webhook secret
4. Compare with the provided signature
For detailed verification examples in Node.js, Python, and Go, see [Appointment Webhooks — Signature Verification](./appointment-webhooks#signature-verification).
### Expected Response
Return any `2xx` status code to acknowledge receipt. The response body is ignored. Non-`2xx` responses trigger a retry.
### Retry Behavior
Failed deliveries (non-`2xx` response or timeout) are retried automatically:
- Up to **5 retry attempts** at approximately **60-second intervals**
- **30-second timeout** per delivery attempt
- After all retries are exhausted, the event is moved to a dead letter queue for investigation
### Ordering
Events for the same account are delivered **in order**. Events for different accounts may be delivered in parallel. Do not assume ordering across accounts.
## Timing
| Event | Typical Latency |
| ---------------------------------- | ------------------------------ |
| `call.initiated` | < 1 second |
| `call.incoming` | < 1 second |
| `call.ringing` | < 1 second |
| `call.answered` | < 1 second |
| `call.end` | < 1 second |
| `call.transfer` | < 1 second |
| `voicemail.new` | < 2 seconds |
| `recording.available` | < 5 seconds after call ends |
| `recording.transcription.complete` | ~10 seconds after recording |
| `recording.summary.complete` | ~15 seconds after recording |
| `voicemail.transcription.complete` | ~10 seconds after voicemail |
## Best Practices
- **Verify signatures** on every request to prevent spoofing
- **Return `200` quickly** and defer processing — long-running handlers risk timeouts
- **Handle events idempotently** using the `id` field — events may be delivered more than once
- **Don't rely on strict cross-account ordering** — events from different accounts may arrive in any order
## Related Resources
- [Real-Time Events (SSE)](./events) — Frontend event streaming
- [Appointment Webhooks](./appointment-webhooks) — Scheduling webhook protocol
- [Voice Apps](./voice-apps) — Programmable voice webhooks
---
## Direct API
**Raw power, 100% control.** Talk directly to the REST and WebSocket APIs, handle events yourself, build exactly the experience you want — no components, no portal, no assumptions.
This is the tier when off-the-shelf components don't fit: AI call centers, bespoke dispatcher consoles, unusual call-routing logic, or any time you want to be close to the metal.
## Authentication modes
Three token types, each with a different audience:
| Token | Gets | Use for |
| ------------------------------------ | --------------------------------------------- | ----------------------------------------------------------------------- |
| **Platform API key** (`sk_live_...`) | Full platform access across all your accounts | Backend-to-backend: provisioning, management, activity logging |
| **Session token** (JWT) | One account's scope, 1-hour TTL | Frontend components (see [Embedded](/integration-tiers/embedded)) |
| **User token** (JWT) | One user's scope within an account | Softphone + user-facing apps (WebRTC signalling, per-user call history) |
All three use `Authorization: Bearer `. Platform keys additionally require the `DialStack-Account` header when scoping to a specific customer; session and user tokens carry the account in their JWT claims.
Full flow: [Authentication guide](/authentication).
## Example: Click-to-call with activity logging
This example demonstrates how to build a complete backend workflow for outbound sales or dispatching. It shows how to provision a new customer, trigger an outbound call via the API, and log the resulting call duration and status to your own database using a webhook handler — all in ~30 lines of code.
### 1. Provision a customer and user
```ts
import { DialStack } from '@dialstack/sdk';
const ds = new DialStack(process.env.DIALSTACK_KEY);
const account = await ds.accounts.create({ email: 'contact@joneschiro.com' });
const user = await ds.users.create({ name: 'Dr. Alice Smith' }, { dialstackAccount: account.id });
```
### 2. Trigger click-to-call
Alice's endpoints ring first; when she answers, DialStack dials the prospect and bridges the audio.
```ts
const call = await ds.calls.create(
{ from: user.id, to: '+16175551234' },
{ dialstackAccount: account.id }
);
// → { id: 'cdr_...', status: 'initiated', ... }
```
### 3. Handle `call.end` webhooks
Configure your platform's `webhook_url` once. DialStack delivers events for all accounts to that URL.
```ts
app.post('/webhooks/dialstack', express.raw({ type: 'application/json' }), (req, res) => {
verifySignature(req); // see webhook-events guide
const event = JSON.parse(req.body);
if (event.type === 'call.end') {
db.calls.upsert({
id: event.data.call_id,
duration: event.data.duration_seconds,
status: event.data.status,
});
}
res.status(200).end();
});
```
See [Activity Logging](/guides/activity-logging) for the full four-event pattern (`call.end`, `voicemail.new`, `recording.available`, `*.transcription.complete`).
## Advanced example: dial plan with AI overflow
Everything you see in the landing hero is a single `ds.dialPlans.create` call. Real routing — business-hours schedule, team ring, AI receptionist fallback — expressed as a node graph:
```ts
await ds.dialPlans.create(
{
name: 'Main number',
entry_node: 'hours',
nodes: [
{
id: 'hours',
type: 'schedule',
config: { schedule_id: 'sch_business_hours', open: 'ring_team', closed: 'ai_reception' },
},
{ id: 'ring_team', type: 'ring_all_users', config: { timeout: 25, next: 'ai_reception' } },
{ id: 'ai_reception', type: 'internal_dial', config: { target_id: 'va_ai_receptionist' } },
],
},
{ dialstackAccount: account.id }
);
```
Full node surface: [Dial Plans](/guides/dial-plans). AI agent setup: [AI Scheduling](/guides/voiceai-scheduling).
## Real-time and streaming
- **Webhooks** — platform-scoped, fire-and-forget, for backend pipelines. See [Webhook Events](/guides/webhook-events).
- **SSE (Server-Sent Events)** — account-scoped, account-ID stream for frontends (Screen Pop, live dashboards). See [Real-Time Events](/guides/events).
- **WebSocket audio streaming** — bidirectional media for Voice Apps and one-way media for call listeners (transcription, monitoring). See [Voice Apps](/guides/voice-apps) and [BYO VoiceAI](/guides/voiceai-byo).
## API reference
Every operation has curl and SDK samples at [`/api`](/api). The reference is generated from the same OpenAPI spec the SDK is generated from — what you see there is what the platform does.
- Full endpoint catalog, grouped into: Accounts & Users / Calls / Routing / AI & Voice Apps / Devices & Hardware / Platform.
- Download the spec at [`/api/openapi.yaml`](/api/openapi.yaml) to generate your own client in any language.
## When to pick this
- You're building a unique voice experience (AI call center, bespoke dispatcher console, live agent copilot).
- You need fine-grained control over call routing, media streaming, or event handling.
- You have engineering capacity and want no abstraction between your code and the platform.
## When to pick something else
- If you need a full phone-system portal without front-end work → [White Label](/integration-tiers/white-label).
- If you want voice features inside your existing UI but don't need custom flows → [Embedded](/integration-tiers/embedded).
## See also
- [Quickstart](/quickstart) — the shortest path to a first API call.
- [Architecture overview](/guides/architecture) — the mental model.
- [Webhook Events](/guides/webhook-events) — every event shape.
- [WebSocket API](/websocket-api) — real-time media protocol.
---
## Embedded
**Native feel inside your app.** Drop React components and Web Components into your existing UI so voice feels like a built-in feature.
Prebuilt components handle WebRTC signaling, device permissions, audio routing, and reconnection. You keep full control over layout, navigation, and identity.
## Component inventory
### React (`@dialstack/sdk/react`)
| Component | Purpose |
| ------------------------------- | --------------------------------------------------------------------------- |
| `` | Provides session and auth context for all child components. |
| `` | Displays a call history table (date, direction, duration, status, quality). |
| `` | Displays a compact recent-call list for sidebars and cards. |
| `` | Displays a voicemail list with audio playback, transcription, and delete. |
| `` | Manages phone numbers for an account. |
| `` | Searches and orders new phone numbers. |
| `` | Renders a dial-plan graph (`mode="view"`, `"edit"`, or `"preview"`). |
| `useDialstack()` | Exposes a headless hook for fully custom UIs on top of the same data. |
### Web Components (`@dialstack/sdk/pure`)
Framework-agnostic versions for use from Vue, Svelte, Angular, or plain HTML:
| Component | Purpose |
| ----------------------------------- | --------------------------------------------------------------------------- |
| `` | Displays a call history table (date, direction, duration, status, quality). |
| `` | Displays a compact recent-call list for sidebars and cards. |
| `` | Displays a voicemail list with audio playback, transcription, and delete. |
| `` | Manages phone numbers for an account. |
| `` | Searches and orders new phone numbers. |
### Separate entry point
| Component | Entry | Purpose |
| -------------------- | --------------------------- | ------------------------------------------------------------------------------------- |
| `` | `@dialstack/sdk/onboarding` | Provides a guided first-time setup wizard. Loads separately to keep the bundle small. |
## Session token flow
Your backend mints a session, your frontend drops it into the provider, components authenticate transparently.
```ts
// Backend — /api/dialstack/session
import { DialStack } from '@dialstack/sdk/server';
const ds = new DialStack(process.env.DIALSTACK_KEY);
export default async function handler(req, res) {
const accountId = getAccountForUser(req); // your app's logic
const { client_secret } = await ds.accountSessions.create({ account: accountId });
res.json({ client_secret });
}
```
```tsx
// Frontend
import { loadDialStack, DialstackComponentsProvider, CallLogs, Voicemails } from '@dialstack/sdk';
const dialstack = await loadDialStack('pk_live_YOUR_KEY', {
fetchClientSecret: async () => {
const res = await fetch('/api/dialstack/session');
return res.json();
},
});
export function VoiceInbox() {
return (
);
}
```
The SDK refreshes the session token automatically before expiry. Session tokens are account-scoped and expire in one hour.
See [Authentication](/sdks/authentication) for token lifecycle, revocation, and multi-account handling.
## Theming
For a full list of CSS variables (colors, typography, spacing, shadows) and layout variants, see the [Theming guide](/sdks/theming).
Pass an `appearance` block to `initialize()` / `loadDialStack()`:
```ts
const dialstack = await loadDialStack('pk_live_YOUR_KEY', {
fetchClientSecret,
appearance: {
theme: 'auto', // 'light' | 'dark' | 'auto'
variables: {
colorPrimary: '#6B2CFF',
colorPrimaryHover: '#5A25D9',
fontFamily: 'Inter, system-ui, sans-serif',
borderRadius: '8px',
},
},
});
```
Per-component density:
```tsx
```
## Component embedding example
The `` handles the session token lifecycle. Any child components you nest inside it automatically inherit the authenticated context, fetch their own data, and render fully functional views. Here is an example composing a sidebar and a main content area:
```tsx
import {
loadDialStack,
DialstackComponentsProvider,
CallHistory,
PhoneNumbers,
} from '@dialstack/sdk';
const dialstack = await loadDialStack('pk_live_YOUR_KEY', {
fetchClientSecret: async () => {
const res = await fetch('/api/dialstack/session');
const { client_secret } = await res.json();
return client_secret;
},
});
export function AccountDashboard() {
return (
{/* Sidebar for recent activity */}
{/* Main area for management */}
Phone Numbers
);
}
```
## When to pick this
- Voice lives inside a workflow your users already use daily (CRM, dispatcher, EHR).
- You want to control layout and navigation but not rebuild softphone internals.
- You have a React or modern front-end and want to ship in a few sprints.
## When to pick something else
- If your customers prefer a dedicated phone portal (simpler onboarding, fewer surfaces) → [White Label](/integration-tiers/white-label).
- If you're building a bespoke workflow that doesn't match any prebuilt component → [Direct API](/integration-tiers/direct-api).
## See also
- [SDK overview](/sdks) — distribution targets (`main`, `pure`, `server`) and bundle sizes.
- [React components](/sdks/react) — per-component props and events.
- [Web Components](/sdks/web-components) — framework-agnostic wrappers.
- [Theming](/sdks/theming) — full appearance surface.
---
## White Label
**Branded portal, zero UI dev.** Best for platforms that want a premium phone-system experience without building or maintaining a voice UI.
Your customers log into a DialStack-hosted portal at `.netvoice.io` — our dedicated white-label domain. The admin console, call history, voicemail inbox, and device management are all provided — you own the branding and the identity flow. A custom domain like `phones.yourplatform.com` is also possible (see [Custom domain](#custom-domain) below).
## What you ship
- A fully branded phone-system portal at `.netvoice.io`.
- Administrative interfaces (e.g., for managing users, numbers, dial plans).
- User features (e.g., call history, voicemail inbox, and device provisioning).
- SSO from your app → the portal so users never see a second login.
## Provisioning flow
```mermaid
sequenceDiagram
participant App as Your platform
participant DS as DialStack
participant User as End user's browser
Note over App,DS: Customer signup
App->>DS: POST /v1/accounts
DS-->>App: { id: 'acct_...' }
Note over App,DS: User onboarding
App->>DS: POST /v1/users (DialStack-Account: acct_...)
DS-->>App: { id: 'user_...' }
Note over App,User: User accesses their phone system
App->>DS: accountSessions.create({ account: 'acct_...' })
DS-->>App: { client_secret, expires_at }
App-->>User: 302 → yourplatform.netvoice.io?session_token=
User->>DS: Portal loads, auto-authenticated
```
Three API calls. That's it.
## Provision a new customer
When your signup flow runs, create a DialStack account for the customer:
```ts
import { DialStack } from '@dialstack/sdk';
const ds = new DialStack(process.env.DIALSTACK_KEY);
const account = await ds.accounts.create({
email: 'contact@joneschiro.com',
});
// → { id: 'acct_01h2xcejqtf2nbrexx3vqjhp41', ... }
```
Persist `account.id` against your customer record. All subsequent user / billing / config calls scope to this ID via the `DialStack-Account` header.
## Sync users
Whenever your product creates or deletes a user on that customer's account, mirror it to DialStack:
```ts
const user = await ds.users.create(
{ name: 'Dr. Alice Smith', email: 'alice@joneschiro.com' },
{ dialstackAccount: account.id }
);
// later, on offboard:
await ds.users.del(user.id, { dialstackAccount: account.id });
```
The user now shows up in the portal's admin console and can be assigned a phone number.
## Issue a session and redirect
When the user clicks "Open phones" in your app, create a short-lived session token on your backend and redirect with it:
```ts
// Backend
const { client_secret } = await ds.accountSessions.create({
account: account.id,
});
// Redirect URL
const url = `https://yourplatform.netvoice.io?session_token=${client_secret}`;
```
Session tokens are account-scoped, expire in one hour, and are safe to pass through a redirect URL. The portal consumes the token on load and drops into the authenticated UI.
## Theming
Your logo and brand colors are configured once in the Platform Admin and applied across the portal and transactional email. No code, no CSS.
## Custom domain
By default the portal lives at `.netvoice.io`. That's production-ready and branded — no DNS required.
If you want the portal to live under your own domain (e.g., `phones.yourplatform.com`), that's supported too. It involves more than a simple CNAME — we coordinate DNS, TLS provisioning, and per-tenant routing together. Reach out and we'll walk through it.
## What you don't build
- Call-logs list, voicemail inbox, device provisioning
- Admin tools (users, dial plans, number ordering)
- Authentication UX — session tokens carry identity
## What you do build
- Account creation on customer signup (`ds.accounts.create`)
- User sync on user onboard/offboard (`ds.users.create` / `ds.users.del`)
- "Open phones" button in your app that issues a session and redirects
## When to pick this
- You want voice live in weeks, not months.
- You don't have front-end capacity for a voice surface.
- Your customers are used to logging into vendor portals (payroll, scheduling, DMS tools).
## When to pick something else
- If voice has to live inside your app's main workspace with no context switch → [Embedded](/integration-tiers/embedded).
- If you're building a bespoke voice workflow (dispatcher console, agent cockpit) → [Direct API](/integration-tiers/direct-api).
## See also
- [Quickstart](/quickstart) — the `ds.accounts.create` / `ds.users.create` / `ds.accountSessions.create` trio.
- [Authentication](/authentication) — session-token lifecycle, refresh, revocation.
---
## Function: isDECTBase()
[@dialstack/sdk](../../index.md) / [index](../index.md) / isDECTBase
# Function: isDECTBase()
```ts
function isDECTBase(device): boolean;
```
Defined in: [sdk/src/types/device.ts:81](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L81)
Type guard: returns true if the device is a DECT base station.
## Parameters
### device
[`Device`](../interfaces/Device.md)
## Returns
`boolean`
---
## Function: isDeskphone()
[@dialstack/sdk](../../index.md) / [index](../index.md) / isDeskphone
# Function: isDeskphone()
```ts
function isDeskphone(device): boolean;
```
Defined in: [sdk/src/types/device.ts:74](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L74)
Type guard: returns true if the device is a deskphone.
## Parameters
### device
[`Device`](../interfaces/Device.md)
## Returns
`boolean`
---
## Function: loadDialstackAndInitialize()
[@dialstack/sdk](../../index.md) / [index](../index.md) / loadDialstackAndInitialize
# Function: loadDialstackAndInitialize()
```ts
function loadDialstackAndInitialize(initParams): Promise;
```
Defined in: [sdk/src/core/initialize-pure.ts:44](https://github.com/dialstack/dialstack-sdk/blob/main/src/core/initialize-pure.ts#L44)
Load and initialize the DialStack SDK (pure, no side effects)
This is the pure version that doesn't auto-register Web Components.
Use the regular loadDialstackAndInitialize() from '@dialstack/sdk' if you
want automatic component registration.
## Parameters
### initParams
[`DialStackInitParams`](../interfaces/DialStackInitParams.md)
Initialization parameters
## Returns
`Promise`\<[`DialStackInstance`](../interfaces/DialStackInstance.md)\>
DialStack SDK instance with create(), update(), and logout() methods
## Example
```typescript
import { loadDialstackAndInitialize } from '@dialstack/sdk/pure';
// For SSR/testing - components won't be registered
const dialstack = await loadDialstackAndInitialize({
publishableKey: 'pk_test_...',
fetchClientSecret: async () => {
const response = await fetch('/api/dialstack/session');
const data = await response.json();
return data.clientSecret;
}
});
```
---
## index
[@dialstack/sdk](../index.md) / index
# index
DialStack SDK - Official JavaScript SDK for DialStack
## Interfaces
- [AbstractSettings](interfaces/AbstractSettings.md)
- [AccountOnboardingClasses](interfaces/AccountOnboardingClasses.md)
- [AppearanceOptions](interfaces/AppearanceOptions.md)
- [ApprovePortOrderRequest](interfaces/ApprovePortOrderRequest.md)
- [AvailablePhoneNumber](interfaces/AvailablePhoneNumber.md)
- [CallEventMap](interfaces/CallEventMap.md)
- [CallHistoryClasses](interfaces/CallHistoryClasses.md)
- [CallHistoryDisplayOptions](interfaces/CallHistoryDisplayOptions.md)
- [CallLog](interfaces/CallLog.md)
- [CallLogDisplayOptions](interfaces/CallLogDisplayOptions.md)
- [CallLogsCallbacks](interfaces/CallLogsCallbacks.md)
- [CommonComponentCallbacks](interfaces/CommonComponentCallbacks.md)
- [ComponentIcons](interfaces/ComponentIcons.md)
- [CreateDECTBaseRequest](interfaces/CreateDECTBaseRequest.md)
- [CreateDECTExtensionRequest](interfaces/CreateDECTExtensionRequest.md)
- [CreateDECTHandsetRequest](interfaces/CreateDECTHandsetRequest.md)
- [CreateDeskphoneLineRequest](interfaces/CreateDeskphoneLineRequest.md)
- [CreateDeskphoneRequest](interfaces/CreateDeskphoneRequest.md)
- [DateRange](interfaces/DateRange.md)
- [DECTBase](interfaces/DECTBase.md)
- [DECTExtension](interfaces/DECTExtension.md)
- [DECTHandset](interfaces/DECTHandset.md)
- [Device](interfaces/Device.md)
- [DeviceLine](interfaces/DeviceLine.md)
- [DeviceListOptions](interfaces/DeviceListOptions.md)
- [DeviceSettings](interfaces/DeviceSettings.md)
- [DialStackInitParams](interfaces/DialStackInitParams.md)
- [DialStackInstance](interfaces/DialStackInstance.md)
- [DIDItem](interfaces/DIDItem.md)
- [FormattingOptions](interfaces/FormattingOptions.md)
- [IncomingCallEvent](interfaces/IncomingCallEvent.md)
- [LoadError](interfaces/LoadError.md)
- [LoaderStart](interfaces/LoaderStart.md)
- [NonPortableNumber](interfaces/NonPortableNumber.md)
- [NumberOrder](interfaces/NumberOrder.md)
- [OnboardingCollectionOptions](interfaces/OnboardingCollectionOptions.md)
- [OnboardingPortalClasses](interfaces/OnboardingPortalClasses.md)
- [OnboardingUser](interfaces/OnboardingUser.md)
- [PaginatedResponse](interfaces/PaginatedResponse.md)
- [PaginationOptions](interfaces/PaginationOptions.md)
- [PhoneNumberItem](interfaces/PhoneNumberItem.md)
- [PhoneNumberOrderingClasses](interfaces/PhoneNumberOrderingClasses.md)
- [PhoneNumbersClasses](interfaces/PhoneNumbersClasses.md)
- [PortableNumber](interfaces/PortableNumber.md)
- [PortApproval](interfaces/PortApproval.md)
- [PortEligibilityResult](interfaces/PortEligibilityResult.md)
- [~~ProvisionedDevice~~](interfaces/ProvisionedDevice.md)
- [ProvisioningEvent](interfaces/ProvisioningEvent.md)
- [ProvisioningEventListOptions](interfaces/ProvisioningEventListOptions.md)
- [QualityMetricLeg](interfaces/QualityMetricLeg.md)
- [SDKCreatePortOrderRequest](interfaces/SDKCreatePortOrderRequest.md)
- [SDKPortOrder](interfaces/SDKPortOrder.md)
- [SDKPortOrderDetails](interfaces/SDKPortOrderDetails.md)
- [UpdateDECTBaseRequest](interfaces/UpdateDECTBaseRequest.md)
- [UpdateDECTHandsetRequest](interfaces/UpdateDECTHandsetRequest.md)
- [UpdateDeskphoneLineRequest](interfaces/UpdateDeskphoneLineRequest.md)
- [UpdateDeskphoneRequest](interfaces/UpdateDeskphoneRequest.md)
- [UpdateOptions](interfaces/UpdateOptions.md)
- [UpdatePhoneNumberRequest](interfaces/UpdatePhoneNumberRequest.md)
- [VoicemailBehaviorOptions](interfaces/VoicemailBehaviorOptions.md)
- [VoicemailDisplayOptions](interfaces/VoicemailDisplayOptions.md)
- [VoicemailsCallbacks](interfaces/VoicemailsCallbacks.md)
## Type Aliases
- [AccountOnboardingStep](type-aliases/AccountOnboardingStep.md)
- [CallEventHandler](type-aliases/CallEventHandler.md)
- [CallEventType](type-aliases/CallEventType.md)
- [CallLogRowRenderer](type-aliases/CallLogRowRenderer.md)
- [ClientSecretResponse](type-aliases/ClientSecretResponse.md)
- [ComponentTagName](type-aliases/ComponentTagName.md)
- [DeviceStatus](type-aliases/DeviceStatus.md)
- [DeviceType](type-aliases/DeviceType.md)
- [DirectoryListingType](type-aliases/DirectoryListingType.md)
- [HandsetStatus](type-aliases/HandsetStatus.md)
- [IconString](type-aliases/IconString.md)
- [LayoutVariant](type-aliases/LayoutVariant.md)
- [MulticellRole](type-aliases/MulticellRole.md)
- [PhoneNumberStatus](type-aliases/PhoneNumberStatus.md)
- [SDKPortOrderStatus](type-aliases/SDKPortOrderStatus.md)
- [VoicemailRowRenderer](type-aliases/VoicemailRowRenderer.md)
## Variables
- [defaultIcons](variables/defaultIcons.md)
## Functions
- [isDECTBase](functions/isDECTBase.md)
- [isDeskphone](functions/isDeskphone.md)
- [loadDialstackAndInitialize](functions/loadDialstackAndInitialize.md)
---
## Interface: AbstractSettings
[@dialstack/sdk](../../index.md) / [index](../index.md) / AbstractSettings
# Interface: AbstractSettings
Defined in: [sdk/src/types/provisioning.ts:274](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/provisioning.ts#L274)
Vendor-agnostic device settings.
These settings are translated to vendor-specific configuration by the provisioning system.
## Properties
### audio?
```ts
optional audio?: AudioSettings;
```
Defined in: [sdk/src/types/provisioning.ts:278](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/provisioning.ts#L278)
Audio settings (VAD, echo cancellation, jitter buffer).
***
### display?
```ts
optional display?: DisplaySettings;
```
Defined in: [sdk/src/types/provisioning.ts:282](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/provisioning.ts#L282)
Display settings (time/date format, backlight).
***
### features?
```ts
optional features?: FeatureSettings;
```
Defined in: [sdk/src/types/provisioning.ts:294](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/provisioning.ts#L294)
Feature availability settings.
***
### lineKeys?
```ts
optional lineKeys?: LineKey[];
```
Defined in: [sdk/src/types/provisioning.ts:299](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/provisioning.ts#L299)
Programmable line keys configuration.
When specified, replaces the entire line keys array from parent.
***
### network?
```ts
optional network?: NetworkSettings;
```
Defined in: [sdk/src/types/provisioning.ts:290](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/provisioning.ts#L290)
Network settings (VLAN, QoS, NTP).
***
### regional?
```ts
optional regional?: RegionalSettings;
```
Defined in: [sdk/src/types/provisioning.ts:286](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/provisioning.ts#L286)
Regional settings (timezone, language, tone scheme).
---
## Interface: AccountOnboardingClasses
[@dialstack/sdk](../../index.md) / [index](../index.md) / AccountOnboardingClasses
# Interface: AccountOnboardingClasses
Defined in: [sdk/src/types/account-onboarding.ts:31](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/account-onboarding.ts#L31)
## Extends
- `BaseComponentClasses`
## Properties
### base?
```ts
optional base?: string;
```
Defined in: [sdk/src/types/appearance.ts:161](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L161)
Base class applied to the container always
#### Default
```ts
'dialstack-component'
```
#### Inherited from
```ts
BaseComponentClasses.base
```
***
### empty?
```ts
optional empty?: string;
```
Defined in: [sdk/src/types/appearance.ts:179](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L179)
Class applied when the component has no data
#### Default
```ts
'dialstack-component--empty'
```
#### Inherited from
```ts
BaseComponentClasses.empty
```
***
### error?
```ts
optional error?: string;
```
Defined in: [sdk/src/types/appearance.ts:173](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L173)
Class applied when there's an error
#### Default
```ts
'dialstack-component--error'
```
#### Inherited from
```ts
BaseComponentClasses.error
```
***
### loading?
```ts
optional loading?: string;
```
Defined in: [sdk/src/types/appearance.ts:167](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L167)
Class applied when the component is loading
#### Default
```ts
'dialstack-component--loading'
```
#### Inherited from
```ts
BaseComponentClasses.loading
```
***
### stepAccount?
```ts
optional stepAccount?: string;
```
Defined in: [sdk/src/types/account-onboarding.ts:32](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/account-onboarding.ts#L32)
***
### stepComplete?
```ts
optional stepComplete?: string;
```
Defined in: [sdk/src/types/account-onboarding.ts:35](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/account-onboarding.ts#L35)
***
### stepHardware?
```ts
optional stepHardware?: string;
```
Defined in: [sdk/src/types/account-onboarding.ts:34](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/account-onboarding.ts#L34)
***
### stepNumbers?
```ts
optional stepNumbers?: string;
```
Defined in: [sdk/src/types/account-onboarding.ts:33](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/account-onboarding.ts#L33)
---
## Interface: AppearanceOptions
[@dialstack/sdk](../../index.md) / [index](../index.md) / AppearanceOptions
# Interface: AppearanceOptions
Defined in: [sdk/src/types/appearance.ts:89](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L89)
Appearance options for theming components
## Properties
### theme?
```ts
optional theme?: Theme;
```
Defined in: [sdk/src/types/appearance.ts:93](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L93)
Theme variant
***
### variables?
```ts
optional variables?: AppearanceVariables;
```
Defined in: [sdk/src/types/appearance.ts:98](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L98)
Custom variables for styling
---
## Interface: ApprovePortOrderRequest
[@dialstack/sdk](../../index.md) / [index](../index.md) / ApprovePortOrderRequest
# Interface: ApprovePortOrderRequest
Defined in: [sdk/src/types/number-porting.ts:46](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L46)
## Properties
### ip
```ts
ip: string;
```
Defined in: [sdk/src/types/number-porting.ts:48](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L48)
***
### signature
```ts
signature: string;
```
Defined in: [sdk/src/types/number-porting.ts:47](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L47)
---
## Interface: AvailablePhoneNumber
[@dialstack/sdk](../../index.md) / [index](../index.md) / AvailablePhoneNumber
# Interface: AvailablePhoneNumber
Defined in: [sdk/src/types/phone-number-ordering.ts:16](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-number-ordering.ts#L16)
## Properties
### city
```ts
city: string;
```
Defined in: [sdk/src/types/phone-number-ordering.ts:18](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-number-ordering.ts#L18)
***
### lata
```ts
lata: string;
```
Defined in: [sdk/src/types/phone-number-ordering.ts:21](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-number-ordering.ts#L21)
***
### phone\_number
```ts
phone_number: string;
```
Defined in: [sdk/src/types/phone-number-ordering.ts:17](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-number-ordering.ts#L17)
***
### rate\_center
```ts
rate_center: string;
```
Defined in: [sdk/src/types/phone-number-ordering.ts:20](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-number-ordering.ts#L20)
***
### state
```ts
state: string;
```
Defined in: [sdk/src/types/phone-number-ordering.ts:19](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-number-ordering.ts#L19)
---
## Interface: CallEventMap
[@dialstack/sdk](../../index.md) / [index](../index.md) / CallEventMap
# Interface: CallEventMap
Defined in: [sdk/src/types/callbacks.ts:86](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/callbacks.ts#L86)
Map of call event types to their event data
## Properties
### call.incoming
```ts
call.incoming: IncomingCallEvent;
```
Defined in: [sdk/src/types/callbacks.ts:87](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/callbacks.ts#L87)
---
## Interface: CallHistoryClasses
[@dialstack/sdk](../../index.md) / [index](../index.md) / CallHistoryClasses
# Interface: CallHistoryClasses
Defined in: [sdk/src/types/appearance.ts:267](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L267)
CSS class names for CallHistory component
## Extends
- `BaseComponentClasses`
## Properties
### base?
```ts
optional base?: string;
```
Defined in: [sdk/src/types/appearance.ts:161](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L161)
Base class applied to the container always
#### Default
```ts
'dialstack-component'
```
#### Inherited from
```ts
BaseComponentClasses.base
```
***
### duration?
```ts
optional duration?: string;
```
Defined in: [sdk/src/types/appearance.ts:320](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L320)
Class for duration display
#### Default
```ts
'dialstack-call-history-duration'
```
***
### empty?
```ts
optional empty?: string;
```
Defined in: [sdk/src/types/appearance.ts:179](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L179)
Class applied when the component has no data
#### Default
```ts
'dialstack-component--empty'
```
#### Inherited from
```ts
BaseComponentClasses.empty
```
***
### error?
```ts
optional error?: string;
```
Defined in: [sdk/src/types/appearance.ts:173](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L173)
Class applied when there's an error
#### Default
```ts
'dialstack-component--error'
```
#### Inherited from
```ts
BaseComponentClasses.error
```
***
### icon?
```ts
optional icon?: string;
```
Defined in: [sdk/src/types/appearance.ts:308](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L308)
Class for direction icon
#### Default
```ts
'dialstack-call-history-icon'
```
***
### item?
```ts
optional item?: string;
```
Defined in: [sdk/src/types/appearance.ts:278](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L278)
Class for each call history item
#### Default
```ts
'dialstack-call-history-item'
```
***
### itemInbound?
```ts
optional itemInbound?: string;
```
Defined in: [sdk/src/types/appearance.ts:284](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L284)
Class for inbound call items
#### Default
```ts
'dialstack-call-history-item--inbound'
```
***
### itemMissed?
```ts
optional itemMissed?: string;
```
Defined in: [sdk/src/types/appearance.ts:296](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L296)
Class for missed call items
#### Default
```ts
'dialstack-call-history-item--missed'
```
***
### itemOutbound?
```ts
optional itemOutbound?: string;
```
Defined in: [sdk/src/types/appearance.ts:290](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L290)
Class for outbound call items
#### Default
```ts
'dialstack-call-history-item--outbound'
```
***
### itemVoicemail?
```ts
optional itemVoicemail?: string;
```
Defined in: [sdk/src/types/appearance.ts:302](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L302)
Class for voicemail call items
#### Default
```ts
'dialstack-call-history-item--voicemail'
```
***
### list?
```ts
optional list?: string;
```
Defined in: [sdk/src/types/appearance.ts:272](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L272)
Class for the call history list container
#### Default
```ts
'dialstack-call-history-list'
```
***
### loading?
```ts
optional loading?: string;
```
Defined in: [sdk/src/types/appearance.ts:167](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L167)
Class applied when the component is loading
#### Default
```ts
'dialstack-component--loading'
```
#### Inherited from
```ts
BaseComponentClasses.loading
```
***
### time?
```ts
optional time?: string;
```
Defined in: [sdk/src/types/appearance.ts:314](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L314)
Class for time display
#### Default
```ts
'dialstack-call-history-time'
```
---
## Interface: CallHistoryDisplayOptions
[@dialstack/sdk](../../index.md) / [index](../index.md) / CallHistoryDisplayOptions
# Interface: CallHistoryDisplayOptions
Defined in: [sdk/src/types/components.ts:114](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L114)
Display options for CallHistory component
## Properties
### showDirectionIcon?
```ts
optional showDirectionIcon?: boolean;
```
Defined in: [sdk/src/types/components.ts:131](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L131)
Show direction icon (inbound/outbound/missed)
#### Default
```ts
true
```
***
### showDuration?
```ts
optional showDuration?: boolean;
```
Defined in: [sdk/src/types/components.ts:119](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L119)
Show call duration
#### Default
```ts
true
```
***
### showRelativeTime?
```ts
optional showRelativeTime?: boolean;
```
Defined in: [sdk/src/types/components.ts:125](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L125)
Show relative time (e.g., "2 min ago", "Yesterday")
#### Default
```ts
true
```
---
## Interface: CallLog
[@dialstack/sdk](../../index.md) / [index](../index.md) / CallLog
# Interface: CallLog
Defined in: [sdk/src/types/components.ts:217](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L217)
Call log data structure
## Properties
### answered\_at?
```ts
optional answered_at?: string;
```
Defined in: [sdk/src/types/components.ts:229](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L229)
***
### did\_id?
```ts
optional did_id?: string;
```
Defined in: [sdk/src/types/components.ts:221](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L221)
***
### did\_phone\_number?
```ts
optional did_phone_number?: string;
```
Defined in: [sdk/src/types/components.ts:222](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L222)
***
### direction
```ts
direction: "inbound" | "outbound" | "internal";
```
Defined in: [sdk/src/types/components.ts:223](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L223)
***
### duration\_seconds?
```ts
optional duration_seconds?: number;
```
Defined in: [sdk/src/types/components.ts:231](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L231)
***
### ended\_at?
```ts
optional ended_at?: string;
```
Defined in: [sdk/src/types/components.ts:230](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L230)
***
### endpoint\_id?
```ts
optional endpoint_id?: string;
```
Defined in: [sdk/src/types/components.ts:220](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L220)
***
### from\_label?
```ts
optional from_label?: string | null;
```
Defined in: [sdk/src/types/components.ts:225](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L225)
***
### from\_number
```ts
from_number: string;
```
Defined in: [sdk/src/types/components.ts:224](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L224)
***
### id
```ts
id: string;
```
Defined in: [sdk/src/types/components.ts:218](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L218)
***
### quality\_metrics?
```ts
optional quality_metrics?: QualityMetricLeg[];
```
Defined in: [sdk/src/types/components.ts:237](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L237)
***
### recording\_url?
```ts
optional recording_url?: string | null;
```
Defined in: [sdk/src/types/components.ts:234](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L234)
***
### started\_at
```ts
started_at: string;
```
Defined in: [sdk/src/types/components.ts:228](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L228)
***
### status
```ts
status: "failed" | "voicemail" | "completed" | "no-answer" | "busy";
```
Defined in: [sdk/src/types/components.ts:232](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L232)
***
### summary?
```ts
optional summary?: string | null;
```
Defined in: [sdk/src/types/components.ts:233](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L233)
***
### to\_label?
```ts
optional to_label?: string | null;
```
Defined in: [sdk/src/types/components.ts:227](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L227)
***
### to\_number
```ts
to_number: string;
```
Defined in: [sdk/src/types/components.ts:226](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L226)
***
### user\_id?
```ts
optional user_id?: string;
```
Defined in: [sdk/src/types/components.ts:219](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L219)
---
## Interface: CallLogDisplayOptions
[@dialstack/sdk](../../index.md) / [index](../index.md) / CallLogDisplayOptions
# Interface: CallLogDisplayOptions
Defined in: [sdk/src/types/components.ts:67](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L67)
Display options for CallLogs component
## Properties
### showDate?
```ts
optional showDate?: boolean;
```
Defined in: [sdk/src/types/components.ts:72](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L72)
Show date/time column
#### Default
```ts
true
```
***
### showDirection?
```ts
optional showDirection?: boolean;
```
Defined in: [sdk/src/types/components.ts:78](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L78)
Show direction column
#### Default
```ts
true
```
***
### showDuration?
```ts
optional showDuration?: boolean;
```
Defined in: [sdk/src/types/components.ts:96](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L96)
Show duration column
#### Default
```ts
true
```
***
### showFrom?
```ts
optional showFrom?: boolean;
```
Defined in: [sdk/src/types/components.ts:84](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L84)
Show from number column
#### Default
```ts
true
```
***
### showQuality?
```ts
optional showQuality?: boolean;
```
Defined in: [sdk/src/types/components.ts:108](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L108)
Show quality (MOS) column
#### Default
```ts
true
```
***
### showStatus?
```ts
optional showStatus?: boolean;
```
Defined in: [sdk/src/types/components.ts:102](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L102)
Show status column
#### Default
```ts
true
```
***
### showTo?
```ts
optional showTo?: boolean;
```
Defined in: [sdk/src/types/components.ts:90](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L90)
Show to number column
#### Default
```ts
true
```
---
## Interface: CallLogsCallbacks
[@dialstack/sdk](../../index.md) / [index](../index.md) / CallLogsCallbacks
# Interface: CallLogsCallbacks
Defined in: [sdk/src/types/callbacks.ts:49](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/callbacks.ts#L49)
CallLogs component callbacks
## Extends
- [`CommonComponentCallbacks`](CommonComponentCallbacks.md)
## Properties
### onLoadError?
```ts
optional onLoadError?: (event) => void;
```
Defined in: [sdk/src/types/callbacks.ts:27](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/callbacks.ts#L27)
#### Parameters
##### event
[`LoadError`](LoadError.md)
#### Returns
`void`
#### Inherited from
[`CommonComponentCallbacks`](CommonComponentCallbacks.md).[`onLoadError`](CommonComponentCallbacks.md#onloaderror)
***
### onLoaderStart?
```ts
optional onLoaderStart?: (event) => void;
```
Defined in: [sdk/src/types/callbacks.ts:26](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/callbacks.ts#L26)
#### Parameters
##### event
[`LoaderStart`](LoaderStart.md)
#### Returns
`void`
#### Inherited from
[`CommonComponentCallbacks`](CommonComponentCallbacks.md).[`onLoaderStart`](CommonComponentCallbacks.md#onloaderstart)
***
### onPageChange?
```ts
optional onPageChange?: (event) => void;
```
Defined in: [sdk/src/types/callbacks.ts:50](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/callbacks.ts#L50)
#### Parameters
##### event
###### limit
`number`
###### offset
`number`
#### Returns
`void`
***
### onRowClick?
```ts
optional onRowClick?: (event) => void;
```
Defined in: [sdk/src/types/callbacks.ts:51](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/callbacks.ts#L51)
#### Parameters
##### event
###### call
[`CallLog`](CallLog.md)
###### callId
`string`
#### Returns
`void`
---
## Interface: CommonComponentCallbacks
[@dialstack/sdk](../../index.md) / [index](../index.md) / CommonComponentCallbacks
# Interface: CommonComponentCallbacks
Defined in: [sdk/src/types/callbacks.ts:25](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/callbacks.ts#L25)
Common callbacks shared by all components
## Extended by
- [`CallLogsCallbacks`](CallLogsCallbacks.md)
- [`VoicemailsCallbacks`](VoicemailsCallbacks.md)
## Properties
### onLoadError?
```ts
optional onLoadError?: (event) => void;
```
Defined in: [sdk/src/types/callbacks.ts:27](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/callbacks.ts#L27)
#### Parameters
##### event
[`LoadError`](LoadError.md)
#### Returns
`void`
***
### onLoaderStart?
```ts
optional onLoaderStart?: (event) => void;
```
Defined in: [sdk/src/types/callbacks.ts:26](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/callbacks.ts#L26)
#### Parameters
##### event
[`LoaderStart`](LoaderStart.md)
#### Returns
`void`
---
## Interface: ComponentIcons
[@dialstack/sdk](../../index.md) / [index](../index.md) / ComponentIcons
# Interface: ComponentIcons
Defined in: [sdk/src/types/appearance.ts:119](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L119)
Default icons used by components
## Properties
### chevronDown?
```ts
optional chevronDown?: string;
```
Defined in: [sdk/src/types/appearance.ts:126](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L126)
***
### chevronLeft?
```ts
optional chevronLeft?: string;
```
Defined in: [sdk/src/types/appearance.ts:125](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L125)
***
### chevronRight?
```ts
optional chevronRight?: string;
```
Defined in: [sdk/src/types/appearance.ts:124](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L124)
***
### document?
```ts
optional document?: string;
```
Defined in: [sdk/src/types/appearance.ts:132](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L132)
***
### inbound?
```ts
optional inbound?: string;
```
Defined in: [sdk/src/types/appearance.ts:128](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L128)
***
### outbound?
```ts
optional outbound?: string;
```
Defined in: [sdk/src/types/appearance.ts:129](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L129)
***
### pause?
```ts
optional pause?: string;
```
Defined in: [sdk/src/types/appearance.ts:121](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L121)
***
### phone?
```ts
optional phone?: string;
```
Defined in: [sdk/src/types/appearance.ts:122](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L122)
***
### play?
```ts
optional play?: string;
```
Defined in: [sdk/src/types/appearance.ts:120](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L120)
***
### sparkle?
```ts
optional sparkle?: string;
```
Defined in: [sdk/src/types/appearance.ts:131](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L131)
***
### spinner?
```ts
optional spinner?: string;
```
Defined in: [sdk/src/types/appearance.ts:127](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L127)
***
### trash?
```ts
optional trash?: string;
```
Defined in: [sdk/src/types/appearance.ts:123](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L123)
***
### voicemail?
```ts
optional voicemail?: string;
```
Defined in: [sdk/src/types/appearance.ts:130](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L130)
---
## Interface: CreateDECTBaseRequest
[@dialstack/sdk](../../index.md) / [index](../index.md) / CreateDECTBaseRequest
# Interface: CreateDECTBaseRequest
Defined in: [sdk/src/types/dect.ts:141](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L141)
Request payload for creating a new DECT base station.
## Properties
### mac\_address
```ts
mac_address: string;
```
Defined in: [sdk/src/types/dect.ts:143](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L143)
Hardware MAC address (e.g., "00:04:13:aa:bb:cc")
***
### model?
```ts
optional model?: string;
```
Defined in: [sdk/src/types/dect.ts:145](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L145)
Device model (optional, can be auto-detected)
***
### multicell\_role?
```ts
optional multicell_role?: MulticellRole;
```
Defined in: [sdk/src/types/dect.ts:147](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L147)
Role in multicell deployment (default: "single")
***
### overrides?
```ts
optional overrides?: DeviceSettings;
```
Defined in: [sdk/src/types/dect.ts:149](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L149)
Device-specific settings overrides
---
## Interface: CreateDECTExtensionRequest
[@dialstack/sdk](../../index.md) / [index](../index.md) / CreateDECTExtensionRequest
# Interface: CreateDECTExtensionRequest
Defined in: [sdk/src/types/dect.ts:191](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L191)
Request payload for creating a DECT extension.
## Properties
### display\_name?
```ts
optional display_name?: string;
```
Defined in: [sdk/src/types/dect.ts:195](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L195)
Optional display name override
***
### endpoint\_id
```ts
endpoint_id: string;
```
Defined in: [sdk/src/types/dect.ts:193](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L193)
TypeID of the SIP endpoint to assign
---
## Interface: CreateDECTHandsetRequest
[@dialstack/sdk](../../index.md) / [index](../index.md) / CreateDECTHandsetRequest
# Interface: CreateDECTHandsetRequest
Defined in: [sdk/src/types/dect.ts:169](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L169)
Request payload for creating a new DECT handset.
## Properties
### display\_name?
```ts
optional display_name?: string;
```
Defined in: [sdk/src/types/dect.ts:173](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L173)
Optional display name
***
### ipei
```ts
ipei: string;
```
Defined in: [sdk/src/types/dect.ts:171](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L171)
International Portable Equipment Identity
***
### model?
```ts
optional model?: string;
```
Defined in: [sdk/src/types/dect.ts:175](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L175)
Handset model
---
## Interface: CreateDeskphoneLineRequest
[@dialstack/sdk](../../index.md) / [index](../index.md) / CreateDeskphoneLineRequest
# Interface: CreateDeskphoneLineRequest
Defined in: [sdk/src/types/device.ts:226](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L226)
Request payload for creating a deskphone line.
## Properties
### endpoint\_id
```ts
endpoint_id: string;
```
Defined in: [sdk/src/types/device.ts:228](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L228)
TypeID of the endpoint to assign
---
## Interface: CreateDeskphoneRequest
[@dialstack/sdk](../../index.md) / [index](../index.md) / CreateDeskphoneRequest
# Interface: CreateDeskphoneRequest
Defined in: [sdk/src/types/device.ts:164](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L164)
Request payload for creating a new deskphone.
## Properties
### mac\_address
```ts
mac_address: string;
```
Defined in: [sdk/src/types/device.ts:166](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L166)
Hardware MAC address (e.g., "00:04:13:aa:bb:cc")
***
### model?
```ts
optional model?: string;
```
Defined in: [sdk/src/types/device.ts:168](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L168)
Device model (optional, can be auto-detected)
***
### overrides?
```ts
optional overrides?: DeviceSettings;
```
Defined in: [sdk/src/types/device.ts:170](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L170)
Device-specific settings overrides
---
## Interface: DECTBase
[@dialstack/sdk](../../index.md) / [index](../index.md) / DECTBase
# Interface: DECTBase
Defined in: [sdk/src/types/dect.ts:32](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L32)
A DECT base station.
## Properties
### created\_at
```ts
created_at: string;
```
Defined in: [sdk/src/types/dect.ts:58](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L58)
ISO 8601 timestamp
***
### current\_ip\_address?
```ts
optional current_ip_address?: string;
```
Defined in: [sdk/src/types/dect.ts:52](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L52)
Last known IP address from provisioning request
***
### firmware\_version?
```ts
optional firmware_version?: string;
```
Defined in: [sdk/src/types/dect.ts:48](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L48)
Current firmware version
***
### handsets?
```ts
optional handsets?: DECTHandset[];
```
Defined in: [sdk/src/types/dect.ts:56](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L56)
Associated handsets (when eager-loaded)
***
### id
```ts
id: string;
```
Defined in: [sdk/src/types/dect.ts:34](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L34)
TypeID with `dectb_` prefix
***
### last\_provisioned\_at?
```ts
optional last_provisioned_at?: string;
```
Defined in: [sdk/src/types/dect.ts:54](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L54)
ISO 8601 timestamp of last successful config fetch
***
### mac\_address
```ts
mac_address: string;
```
Defined in: [sdk/src/types/dect.ts:36](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L36)
Hardware MAC address (e.g., "00:04:13:aa:bb:cc")
***
### max\_handsets
```ts
max_handsets: number;
```
Defined in: [sdk/src/types/dect.ts:46](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L46)
Maximum number of handsets this base supports
***
### model?
```ts
optional model?: string;
```
Defined in: [sdk/src/types/dect.ts:40](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L40)
Device model (e.g., "M500", "M700", "M900")
***
### multicell\_role
```ts
multicell_role: MulticellRole;
```
Defined in: [sdk/src/types/dect.ts:44](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L44)
Role in multicell deployment
***
### overrides?
```ts
optional overrides?: DeviceSettings;
```
Defined in: [sdk/src/types/dect.ts:50](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L50)
Device-specific settings overrides
***
### status
```ts
status: DeviceStatus;
```
Defined in: [sdk/src/types/dect.ts:42](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L42)
Current provisioning status
***
### updated\_at
```ts
updated_at: string;
```
Defined in: [sdk/src/types/dect.ts:60](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L60)
ISO 8601 timestamp
***
### vendor
```ts
vendor: string;
```
Defined in: [sdk/src/types/dect.ts:38](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L38)
Detected vendor (e.g., "snom")
---
## Interface: DECTExtension
[@dialstack/sdk](../../index.md) / [index](../index.md) / DECTExtension
# Interface: DECTExtension
Defined in: [sdk/src/types/dect.ts:114](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L114)
A SIP line assignment on a DECT handset.
## Properties
### created\_at
```ts
created_at: string;
```
Defined in: [sdk/src/types/dect.ts:129](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L129)
ISO 8601 timestamp
***
### display\_name?
```ts
optional display_name?: string;
```
Defined in: [sdk/src/types/dect.ts:122](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L122)
Optional display name override
***
### endpoint?
```ts
optional endpoint?: object;
```
Defined in: [sdk/src/types/dect.ts:124](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L124)
Associated endpoint (when eager-loaded)
#### id
```ts
id: string;
```
#### name?
```ts
optional name?: string;
```
***
### endpoint\_id
```ts
endpoint_id: string;
```
Defined in: [sdk/src/types/dect.ts:120](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L120)
TypeID of the SIP endpoint
***
### handset\_id
```ts
handset_id: string;
```
Defined in: [sdk/src/types/dect.ts:118](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L118)
TypeID of the parent handset
***
### id
```ts
id: string;
```
Defined in: [sdk/src/types/dect.ts:116](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L116)
TypeID with `decte_` prefix
***
### updated\_at
```ts
updated_at: string;
```
Defined in: [sdk/src/types/dect.ts:131](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L131)
ISO 8601 timestamp
---
## Interface: DECTHandset
[@dialstack/sdk](../../index.md) / [index](../index.md) / DECTHandset
# Interface: DECTHandset
Defined in: [sdk/src/types/dect.ts:80](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L80)
A DECT handset paired with a base station.
## Properties
### base\_id
```ts
base_id: string;
```
Defined in: [sdk/src/types/dect.ts:84](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L84)
TypeID of the parent base station
***
### created\_at
```ts
created_at: string;
```
Defined in: [sdk/src/types/dect.ts:102](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L102)
ISO 8601 timestamp
***
### display\_name?
```ts
optional display_name?: string;
```
Defined in: [sdk/src/types/dect.ts:90](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L90)
Optional display name
***
### extensions?
```ts
optional extensions?: DECTExtension[];
```
Defined in: [sdk/src/types/dect.ts:100](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L100)
Associated extensions (when eager-loaded)
***
### firmware\_version?
```ts
optional firmware_version?: string;
```
Defined in: [sdk/src/types/dect.ts:96](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L96)
Handset firmware version
***
### id
```ts
id: string;
```
Defined in: [sdk/src/types/dect.ts:82](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L82)
TypeID with `decth_` prefix
***
### ipei
```ts
ipei: string;
```
Defined in: [sdk/src/types/dect.ts:86](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L86)
International Portable Equipment Identity (20-char unique identifier)
***
### model?
```ts
optional model?: string;
```
Defined in: [sdk/src/types/dect.ts:94](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L94)
Handset model
***
### registered\_at?
```ts
optional registered_at?: string;
```
Defined in: [sdk/src/types/dect.ts:98](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L98)
ISO 8601 timestamp when handset was registered
***
### slot\_number
```ts
slot_number: number;
```
Defined in: [sdk/src/types/dect.ts:92](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L92)
Slot number on the base (1-based)
***
### status
```ts
status: HandsetStatus;
```
Defined in: [sdk/src/types/dect.ts:88](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L88)
Current handset status
***
### updated\_at
```ts
updated_at: string;
```
Defined in: [sdk/src/types/dect.ts:104](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L104)
ISO 8601 timestamp
---
## Interface: DIDItem
[@dialstack/sdk](../../index.md) / [index](../index.md) / DIDItem
# Interface: DIDItem
Defined in: [sdk/src/types/phone-numbers.ts:22](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L22)
A DID (Direct Inward Dial) as returned by the API
## Properties
### caller\_id\_name?
```ts
optional caller_id_name?: string | null;
```
Defined in: [sdk/src/types/phone-numbers.ts:29](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L29)
***
### created\_at
```ts
created_at: string;
```
Defined in: [sdk/src/types/phone-numbers.ts:34](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L34)
***
### directory\_listing\_location\_id?
```ts
optional directory_listing_location_id?: string | null;
```
Defined in: [sdk/src/types/phone-numbers.ts:32](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L32)
***
### directory\_listing\_name?
```ts
optional directory_listing_name?: string | null;
```
Defined in: [sdk/src/types/phone-numbers.ts:30](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L30)
***
### directory\_listing\_type?
```ts
optional directory_listing_type?: DirectoryListingType;
```
Defined in: [sdk/src/types/phone-numbers.ts:31](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L31)
***
### expires\_at?
```ts
optional expires_at?: string | null;
```
Defined in: [sdk/src/types/phone-numbers.ts:27](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L27)
***
### id
```ts
id: string;
```
Defined in: [sdk/src/types/phone-numbers.ts:23](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L23)
***
### number\_class?
```ts
optional number_class?: "account_owned" | "temporary";
```
Defined in: [sdk/src/types/phone-numbers.ts:26](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L26)
***
### outbound\_enabled
```ts
outbound_enabled: boolean;
```
Defined in: [sdk/src/types/phone-numbers.ts:28](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L28)
***
### phone\_number
```ts
phone_number: string;
```
Defined in: [sdk/src/types/phone-numbers.ts:24](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L24)
***
### routing\_target?
```ts
optional routing_target?: string | null;
```
Defined in: [sdk/src/types/phone-numbers.ts:33](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L33)
***
### status
```ts
status: "active" | "inactive" | "released";
```
Defined in: [sdk/src/types/phone-numbers.ts:25](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L25)
***
### updated\_at
```ts
updated_at: string;
```
Defined in: [sdk/src/types/phone-numbers.ts:35](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L35)
---
## Interface: DateRange
[@dialstack/sdk](../../index.md) / [index](../index.md) / DateRange
# Interface: DateRange
Defined in: [sdk/src/components/call-logs.ts:24](https://github.com/dialstack/dialstack-sdk/blob/main/src/components/call-logs.ts#L24)
Date range filter
## Properties
### end?
```ts
optional end?: string;
```
Defined in: [sdk/src/components/call-logs.ts:26](https://github.com/dialstack/dialstack-sdk/blob/main/src/components/call-logs.ts#L26)
***
### start?
```ts
optional start?: string;
```
Defined in: [sdk/src/components/call-logs.ts:25](https://github.com/dialstack/dialstack-sdk/blob/main/src/components/call-logs.ts#L25)
---
## Interface: Device
[@dialstack/sdk](../../index.md) / [index](../index.md) / Device
# Interface: Device
Defined in: [sdk/src/types/device.ts:30](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L30)
A device returned by `GET /v1/devices` or `GET /v1/devices/:id`.
The `type` field discriminates between deskphones and DECT bases.
Type-specific fields are present only for the corresponding type.
Use the `isDeskphone()` and `isDECTBase()` type guards for safe narrowing.
## Properties
### created\_at
```ts
created_at: string;
```
Defined in: [sdk/src/types/device.ts:50](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L50)
ISO 8601 timestamp
***
### current\_ip\_address?
```ts
optional current_ip_address?: string;
```
Defined in: [sdk/src/types/device.ts:46](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L46)
Last known IP address from provisioning request
***
### firmware\_version?
```ts
optional firmware_version?: string;
```
Defined in: [sdk/src/types/device.ts:66](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L66)
Current firmware version
***
### handsets?
```ts
optional handsets?: DECTHandset[];
```
Defined in: [sdk/src/types/device.ts:68](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L68)
Associated handsets (when eager-loaded)
***
### id
```ts
id: string;
```
Defined in: [sdk/src/types/device.ts:32](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L32)
TypeID with `dev_` or `dectb_` prefix
***
### last\_provisioned\_at?
```ts
optional last_provisioned_at?: string;
```
Defined in: [sdk/src/types/device.ts:48](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L48)
ISO 8601 timestamp of last successful config fetch
***
### lines?
```ts
optional lines?: DeviceLine[];
```
Defined in: [sdk/src/types/device.ts:58](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L58)
Configured lines on this device
***
### mac\_address
```ts
mac_address: string;
```
Defined in: [sdk/src/types/device.ts:36](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L36)
Hardware MAC address (e.g., "00:04:13:aa:bb:cc")
***
### max\_handsets?
```ts
optional max_handsets?: number;
```
Defined in: [sdk/src/types/device.ts:64](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L64)
Maximum number of handsets this base supports
***
### model?
```ts
optional model?: string;
```
Defined in: [sdk/src/types/device.ts:40](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L40)
Device model (e.g., "D785", "M700")
***
### multicell\_role?
```ts
optional multicell_role?: MulticellRole;
```
Defined in: [sdk/src/types/device.ts:62](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L62)
Role in multicell deployment
***
### overrides?
```ts
optional overrides?: DeviceSettings;
```
Defined in: [sdk/src/types/device.ts:44](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L44)
Device-specific settings overrides
***
### primary\_line\_id?
```ts
optional primary_line_id?: string;
```
Defined in: [sdk/src/types/device.ts:56](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L56)
TypeID of the primary line
***
### status
```ts
status: DeviceStatus;
```
Defined in: [sdk/src/types/device.ts:42](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L42)
Current provisioning status
***
### type
```ts
type: DeviceType;
```
Defined in: [sdk/src/types/device.ts:34](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L34)
Device type discriminator
***
### updated\_at
```ts
updated_at: string;
```
Defined in: [sdk/src/types/device.ts:52](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L52)
ISO 8601 timestamp
***
### vendor
```ts
vendor: string;
```
Defined in: [sdk/src/types/device.ts:38](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L38)
Detected vendor (e.g., "snom", "yealink")
---
## Interface: DeviceLine
[@dialstack/sdk](../../index.md) / [index](../index.md) / DeviceLine
# Interface: DeviceLine
Defined in: [sdk/src/types/device.ts:104](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L104)
A SIP line configured on a provisioned device.
## Properties
### created\_at
```ts
created_at: string;
```
Defined in: [sdk/src/types/device.ts:114](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L114)
ISO 8601 timestamp
***
### device\_id
```ts
device_id: string;
```
Defined in: [sdk/src/types/device.ts:108](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L108)
TypeID of the parent device
***
### endpoint\_id?
```ts
optional endpoint_id?: string;
```
Defined in: [sdk/src/types/device.ts:112](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L112)
TypeID of the associated endpoint, if any
***
### id
```ts
id: string;
```
Defined in: [sdk/src/types/device.ts:106](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L106)
TypeID with `dln_` prefix
***
### line\_number
```ts
line_number: number;
```
Defined in: [sdk/src/types/device.ts:110](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L110)
Line number on the device (1-based)
***
### updated\_at
```ts
updated_at: string;
```
Defined in: [sdk/src/types/device.ts:116](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L116)
ISO 8601 timestamp
---
## Interface: DeviceListOptions
[@dialstack/sdk](../../index.md) / [index](../index.md) / DeviceListOptions
# Interface: DeviceListOptions
Defined in: [sdk/src/types/device.ts:192](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L192)
Options for listing devices.
## Extended by
- [`ProvisioningEventListOptions`](ProvisioningEventListOptions.md)
## Properties
### limit?
```ts
optional limit?: number;
```
Defined in: [sdk/src/types/device.ts:194](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L194)
Maximum number of devices to return (default: 10, max: 100)
***
### type?
```ts
optional type?: DeviceType;
```
Defined in: [sdk/src/types/device.ts:196](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L196)
Filter by device type ('deskphone' or 'dect_base')
---
## Interface: DeviceSettings
[@dialstack/sdk](../../index.md) / [index](../index.md) / DeviceSettings
# Interface: DeviceSettings
Defined in: [sdk/src/types/provisioning.ts:346](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/provisioning.ts#L346)
Complete device settings configuration.
This type is used at all levels of the configuration hierarchy:
- Platform level: Sets defaults for all devices in the platform
- Account level: Sets defaults for all devices in the account
- Device level: Sets overrides for a specific device
All fields are optional. Omitting a field means "inherit from parent layer".
The server resolves the final configuration by merging: Global -> Platform -> Account -> Device
## Example
```typescript
// Account-wide settings
const accountSettings: DeviceSettings = {
abstractions: {
regional: {
timezone: 'America/Chicago',
language: 'en-US',
},
features: {
callWaitingEnabled: true,
dndEnabled: true,
},
},
};
// Device-specific override with vendor customization
const deviceSettings: DeviceSettings = {
abstractions: {
display: {
backlightLevel: 'low', // This device is in a dark room
},
},
vendorOverrides: {
'user_phone_wallpaper': 'company_logo.png', // Snom-specific setting
},
};
```
## Properties
### abstractions?
```ts
optional abstractions?: AbstractSettings;
```
Defined in: [sdk/src/types/provisioning.ts:350](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/provisioning.ts#L350)
Vendor-agnostic settings that are translated to device-specific configuration.
***
### vendorOverrides?
```ts
optional vendorOverrides?: Record;
```
Defined in: [sdk/src/types/provisioning.ts:368](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/provisioning.ts#L368)
Vendor-specific key/value overrides.
Keys must be on the server's allowlist for the target vendor.
These bypass the abstraction layer for advanced customization.
Common prefixes by vendor:
- Snom desk phones: `codec_*`, `user_*`, `network_*`, `rtp_*`
- Snom DECT: `audio.*`, `call_settings.*`, `network.*`
#### Example
```typescript
vendorOverrides: {
'user_phone_wallpaper': 'company_logo.png',
'user_ringer1': 'Ringer4',
}
```
---
## Interface: DialStackInitParams
[@dialstack/sdk](../../index.md) / [index](../index.md) / DialStackInitParams
# Interface: DialStackInitParams
Defined in: [sdk/src/types/core.ts:104](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/core.ts#L104)
Initialization parameters for loadDialstackAndInitialize()
## Properties
### apiUrl?
```ts
optional apiUrl?: string;
```
Defined in: [sdk/src/types/core.ts:148](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/core.ts#L148)
Optional API endpoint URL (defaults to https://api.dialstack.ai)
***
### appearance?
```ts
optional appearance?: AppearanceOptions;
```
Defined in: [sdk/src/types/core.ts:143](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/core.ts#L143)
Optional appearance configuration
***
### fetchClientSecret
```ts
fetchClientSecret: () => Promise;
```
Defined in: [sdk/src/types/core.ts:138](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/core.ts#L138)
Function that fetches a client secret from your backend.
Can return either:
- A string (the client secret)
- An object with `clientSecret` and optional `expiresAt` for optimal refresh scheduling
#### Returns
`Promise`\<[`ClientSecretResponse`](../type-aliases/ClientSecretResponse.md)\>
#### Example
```typescript
// Simple: just return the secret
fetchClientSecret: async () => {
const res = await fetch('/api/dialstack/session');
const { client_secret } = await res.json();
return client_secret;
}
// Recommended: return with expiry for optimal refresh
fetchClientSecret: async () => {
const res = await fetch('/api/dialstack/session');
const { client_secret, expires_at, account_id } = await res.json();
return {
clientSecret: client_secret,
expiresAt: expires_at,
accountId: account_id,
};
}
```
***
### publishableKey
```ts
publishableKey: string;
```
Defined in: [sdk/src/types/core.ts:108](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/core.ts#L108)
Your DialStack publishable API key (starts with pk_live_ or pk_test_)
---
## Interface: DialStackInstance
[@dialstack/sdk](../../index.md) / [index](../index.md) / DialStackInstance
# Interface: DialStackInstance
Defined in: [sdk/src/types/core.ts:415](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/core.ts#L415)
The DialStack SDK instance returned by loadDialstackAndInitialize()
## Properties
### account
```ts
account: AccountResource;
```
Defined in: [sdk/src/types/core.ts:477](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/core.ts#L477)
***
### addresses
```ts
addresses: AddressesResource;
```
Defined in: [sdk/src/types/core.ts:480](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/core.ts#L480)
***
### availablePhoneNumbers
```ts
availablePhoneNumbers: AvailablePhoneNumbersResource;
```
Defined in: [sdk/src/types/core.ts:464](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/core.ts#L464)
***
### calls
```ts
calls: CallsResource;
```
Defined in: [sdk/src/types/core.ts:461](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/core.ts#L461)
***
### dectBases
```ts
dectBases: DECTBasesResource;
```
Defined in: [sdk/src/types/core.ts:476](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/core.ts#L476)
***
### deskphones
```ts
deskphones: DeskphonesResource;
```
Defined in: [sdk/src/types/core.ts:474](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/core.ts#L474)
***
### devices
```ts
devices: DevicesResource;
```
Defined in: [sdk/src/types/core.ts:475](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/core.ts#L475)
***
### dialPlans
```ts
dialPlans: DialPlansResource;
```
Defined in: [sdk/src/types/core.ts:467](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/core.ts#L467)
***
### extensions
```ts
extensions: ExtensionsResource;
```
Defined in: [sdk/src/types/core.ts:473](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/core.ts#L473)
***
### locations
```ts
locations: LocationsResource;
```
Defined in: [sdk/src/types/core.ts:479](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/core.ts#L479)
***
### phoneNumberOrders
```ts
phoneNumberOrders: PhoneNumberOrdersResource;
```
Defined in: [sdk/src/types/core.ts:465](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/core.ts#L465)
***
### phoneNumbers
```ts
phoneNumbers: PhoneNumbersResource;
```
Defined in: [sdk/src/types/core.ts:463](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/core.ts#L463)
***
### portOrders
```ts
portOrders: PortOrdersResource;
```
Defined in: [sdk/src/types/core.ts:466](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/core.ts#L466)
***
### queues
```ts
queues: QueuesResource;
```
Defined in: [sdk/src/types/core.ts:470](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/core.ts#L470)
***
### ringGroups
```ts
ringGroups: RingGroupsResource;
```
Defined in: [sdk/src/types/core.ts:469](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/core.ts#L469)
***
### schedules
```ts
schedules: SchedulesResource;
```
Defined in: [sdk/src/types/core.ts:468](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/core.ts#L468)
***
### sharedVoicemailBoxes
```ts
sharedVoicemailBoxes: SharedVoicemailBoxesResource;
```
Defined in: [sdk/src/types/core.ts:472](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/core.ts#L472)
***
### users
```ts
users: UsersResource;
```
Defined in: [sdk/src/types/core.ts:478](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/core.ts#L478)
***
### voiceApps
```ts
voiceApps: VoiceAppsResource;
```
Defined in: [sdk/src/types/core.ts:471](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/core.ts#L471)
***
### voicemails
```ts
voicemails: VoicemailsResource;
```
Defined in: [sdk/src/types/core.ts:462](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/core.ts#L462)
## Methods
### addAppearanceTarget()
```ts
addAppearanceTarget(element): void;
```
Defined in: [sdk/src/types/core.ts:430](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/core.ts#L430)
**`Internal`**
Register an arbitrary host element to receive `dialstack-appearance-update`
events when [DialStackInstance.update](#update) is called. Used internally by
React-only SDK components (no underlying custom element) so they
participate in the same notification path as web components.
#### Parameters
##### element
`HTMLElement`
#### Returns
`void`
***
### create()
```ts
create(tagName): ComponentElement[T];
```
Defined in: [sdk/src/types/core.ts:421](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/core.ts#L421)
Create a new embedded component
#### Type Parameters
##### T
`T` *extends* [`ComponentTagName`](../type-aliases/ComponentTagName.md)
#### Parameters
##### tagName
`T`
#### Returns
`ComponentElement`\[`T`\]
***
### fetchAllPages()
```ts
fetchAllPages(fetchFn): Promise;
```
Defined in: [sdk/src/types/core.ts:440](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/core.ts#L440)
Fetch all pages of a paginated list endpoint
#### Type Parameters
##### T
`T`
#### Parameters
##### fetchFn
(`opts`) => `Promise`\<[`PaginatedResponse`](PaginatedResponse.md)\<`T`\>\>
#### Returns
`Promise`\<`T`[]\>
***
### fetchApi()
```ts
fetchApi(path, options?): Promise;
```
Defined in: [sdk/src/types/core.ts:438](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/core.ts#L438)
Make an authenticated API request
#### Parameters
##### path
`string`
##### options?
`RequestInit`
#### Returns
`Promise`\<`Response`\>
***
### getAppearance()
```ts
getAppearance(): AppearanceOptions | undefined;
```
Defined in: [sdk/src/types/core.ts:455](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/core.ts#L455)
Get current appearance options
#### Returns
[`AppearanceOptions`](AppearanceOptions.md) \| `undefined`
***
### logout()
```ts
logout(): Promise;
```
Defined in: [sdk/src/types/core.ts:436](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/core.ts#L436)
Log out and clean up the session
#### Returns
`Promise`\<`void`\>
***
### off()
```ts
off(event, handler?): void;
```
Defined in: [sdk/src/types/core.ts:446](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/core.ts#L446)
Unsubscribe from real-time call events
#### Type Parameters
##### K
`K` *extends* `"call.incoming"`
#### Parameters
##### event
`K`
##### handler?
[`CallEventHandler`](../type-aliases/CallEventHandler.md)\<[`CallEventMap`](CallEventMap.md)\[`K`\]\>
#### Returns
`void`
***
### on()
```ts
on(event, handler): void;
```
Defined in: [sdk/src/types/core.ts:444](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/core.ts#L444)
Subscribe to real-time call events
#### Type Parameters
##### K
`K` *extends* `"call.incoming"`
#### Parameters
##### event
`K`
##### handler
[`CallEventHandler`](../type-aliases/CallEventHandler.md)\<[`CallEventMap`](CallEventMap.md)\[`K`\]\>
#### Returns
`void`
***
### removeAppearanceTarget()
```ts
removeAppearanceTarget(element): void;
```
Defined in: [sdk/src/types/core.ts:432](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/core.ts#L432)
**`Internal`**
Inverse of [DialStackInstance.addAppearanceTarget](#addappearancetarget).
#### Parameters
##### element
`HTMLElement`
#### Returns
`void`
***
### resolveRoutingTarget()
```ts
resolveRoutingTarget(target): Promise<
| {
extension_number?: string | null;
id: string;
name: string | null;
type: "user" | "dial_plan" | "voice_app" | "ring_group" | "shared_voicemail";
}
| null>;
```
Defined in: [sdk/src/types/core.ts:448](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/core.ts#L448)
Resolve a routing target TypeID to its type and display name
#### Parameters
##### target
`string`
#### Returns
`Promise`\<
\| \{
`extension_number?`: `string` \| `null`;
`id`: `string`;
`name`: `string` \| `null`;
`type`: `"user"` \| `"dial_plan"` \| `"voice_app"` \| `"ring_group"` \| `"shared_voicemail"`;
\}
\| `null`\>
***
### update()
```ts
update(updateOptions): void;
```
Defined in: [sdk/src/types/core.ts:434](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/core.ts#L434)
Update appearance for all components
#### Parameters
##### updateOptions
[`UpdateOptions`](UpdateOptions.md)
#### Returns
`void`
---
## Interface: FormattingOptions
[@dialstack/sdk](../../index.md) / [index](../index.md) / FormattingOptions
# Interface: FormattingOptions
Defined in: [sdk/src/types/components.ts:287](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L287)
Formatting options for components
## Properties
### dateLocale?
```ts
optional dateLocale?: string;
```
Defined in: [sdk/src/types/components.ts:298](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L298)
Locale for date/time formatting (BCP 47 language tag)
#### Default
```ts
'en-US'
```
***
### defaultCountry?
```ts
optional defaultCountry?: string;
```
Defined in: [sdk/src/types/components.ts:292](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L292)
Default country code for phone number formatting (ISO 3166-1 alpha-2)
#### Default
```ts
'US'
```
***
### showTimezone?
```ts
optional showTimezone?: boolean;
```
Defined in: [sdk/src/types/components.ts:310](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L310)
Show timezone in date/time display
#### Default
```ts
true
```
***
### use24HourTime?
```ts
optional use24HourTime?: boolean;
```
Defined in: [sdk/src/types/components.ts:304](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L304)
Use 24-hour time format
#### Default
```ts
false
```
---
## Interface: IncomingCallEvent
[@dialstack/sdk](../../index.md) / [index](../index.md) / IncomingCallEvent
# Interface: IncomingCallEvent
Defined in: [sdk/src/types/callbacks.ts:61](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/callbacks.ts#L61)
Event fired when a call starts ringing
## Properties
### from\_name
```ts
from_name: string | null;
```
Defined in: [sdk/src/types/callbacks.ts:65](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/callbacks.ts#L65)
Caller ID name (if available)
***
### from\_number
```ts
from_number: string;
```
Defined in: [sdk/src/types/callbacks.ts:63](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/callbacks.ts#L63)
Caller phone number
***
### timestamp
```ts
timestamp: Date;
```
Defined in: [sdk/src/types/callbacks.ts:75](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/callbacks.ts#L75)
When the call started ringing
***
### to\_number
```ts
to_number: string;
```
Defined in: [sdk/src/types/callbacks.ts:67](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/callbacks.ts#L67)
Called phone number (DID)
***
### user\_id?
```ts
optional user_id?: string;
```
Defined in: [sdk/src/types/callbacks.ts:73](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/callbacks.ts#L73)
User the call is routed to. Set only when the DID targets a single user
directly; omitted for ring groups, voice apps, dial plans, and other
shared destinations where no single user is known at ring time.
---
## Interface: LoadError
[@dialstack/sdk](../../index.md) / [index](../index.md) / LoadError
# Interface: LoadError
Defined in: [sdk/src/types/callbacks.ts:17](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/callbacks.ts#L17)
Event fired when a component fails to load
## Properties
### elementTagName
```ts
elementTagName: string;
```
Defined in: [sdk/src/types/callbacks.ts:19](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/callbacks.ts#L19)
***
### error
```ts
error: string;
```
Defined in: [sdk/src/types/callbacks.ts:18](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/callbacks.ts#L18)
---
## Interface: LoaderStart
[@dialstack/sdk](../../index.md) / [index](../index.md) / LoaderStart
# Interface: LoaderStart
Defined in: [sdk/src/types/callbacks.ts:10](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/callbacks.ts#L10)
Event fired when a component starts loading
## Properties
### elementTagName
```ts
elementTagName: string;
```
Defined in: [sdk/src/types/callbacks.ts:11](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/callbacks.ts#L11)
---
## Interface: NonPortableNumber
[@dialstack/sdk](../../index.md) / [index](../index.md) / NonPortableNumber
# Interface: NonPortableNumber
Defined in: [sdk/src/types/number-porting.ts:107](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L107)
## Properties
### city?
```ts
optional city?: string;
```
Defined in: [sdk/src/types/number-porting.ts:110](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L110)
***
### phone\_number
```ts
phone_number: string;
```
Defined in: [sdk/src/types/number-porting.ts:108](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L108)
***
### rate\_center?
```ts
optional rate_center?: string;
```
Defined in: [sdk/src/types/number-porting.ts:109](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L109)
***
### state?
```ts
optional state?: string;
```
Defined in: [sdk/src/types/number-porting.ts:111](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L111)
---
## Interface: NumberOrder
[@dialstack/sdk](../../index.md) / [index](../index.md) / NumberOrder
# Interface: NumberOrder
Defined in: [sdk/src/types/phone-number-ordering.ts:24](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-number-ordering.ts#L24)
## Properties
### completed\_numbers
```ts
completed_numbers: string[];
```
Defined in: [sdk/src/types/phone-number-ordering.ts:29](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-number-ordering.ts#L29)
***
### created\_at
```ts
created_at: string;
```
Defined in: [sdk/src/types/phone-number-ordering.ts:32](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-number-ordering.ts#L32)
***
### error\_message
```ts
error_message: string | null;
```
Defined in: [sdk/src/types/phone-number-ordering.ts:31](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-number-ordering.ts#L31)
***
### failed\_numbers
```ts
failed_numbers: string[];
```
Defined in: [sdk/src/types/phone-number-ordering.ts:30](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-number-ordering.ts#L30)
***
### id
```ts
id: string;
```
Defined in: [sdk/src/types/phone-number-ordering.ts:25](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-number-ordering.ts#L25)
***
### order\_type
```ts
order_type: "purchase" | "disconnect";
```
Defined in: [sdk/src/types/phone-number-ordering.ts:26](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-number-ordering.ts#L26)
***
### phone\_numbers
```ts
phone_numbers: string[];
```
Defined in: [sdk/src/types/phone-number-ordering.ts:28](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-number-ordering.ts#L28)
***
### status
```ts
status: "pending" | "complete" | "partial" | "failed";
```
Defined in: [sdk/src/types/phone-number-ordering.ts:27](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-number-ordering.ts#L27)
***
### updated\_at
```ts
updated_at: string;
```
Defined in: [sdk/src/types/phone-number-ordering.ts:33](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-number-ordering.ts#L33)
---
## Interface: OnboardingCollectionOptions
[@dialstack/sdk](../../index.md) / [index](../index.md) / OnboardingCollectionOptions
# Interface: OnboardingCollectionOptions
Defined in: [sdk/src/types/account-onboarding.ts:17](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/account-onboarding.ts#L17)
Options to control which onboarding steps are presented.
- `include` scopes collection to only the listed steps.
- `exclude` hides the listed steps.
- When both are set, `include` is applied first, then `exclude` removes from that result.
- The `final_complete` step is always shown regardless of these options.
## Properties
### steps?
```ts
optional steps?: object;
```
Defined in: [sdk/src/types/account-onboarding.ts:18](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/account-onboarding.ts#L18)
#### exclude?
```ts
optional exclude?: AccountOnboardingStep[];
```
Hide these steps, preventing the user from seeing them.
#### include?
```ts
optional include?: AccountOnboardingStep[];
```
Show only these steps (the `final_complete` step is always included).
---
## Interface: OnboardingPortalClasses
[@dialstack/sdk](../../index.md) / [index](../index.md) / OnboardingPortalClasses
# Interface: OnboardingPortalClasses
Defined in: [sdk/src/types/account-onboarding.ts:26](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/account-onboarding.ts#L26)
## Extends
- `BaseComponentClasses`
## Properties
### base?
```ts
optional base?: string;
```
Defined in: [sdk/src/types/appearance.ts:161](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L161)
Base class applied to the container always
#### Default
```ts
'dialstack-component'
```
#### Inherited from
```ts
BaseComponentClasses.base
```
***
### empty?
```ts
optional empty?: string;
```
Defined in: [sdk/src/types/appearance.ts:179](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L179)
Class applied when the component has no data
#### Default
```ts
'dialstack-component--empty'
```
#### Inherited from
```ts
BaseComponentClasses.empty
```
***
### error?
```ts
optional error?: string;
```
Defined in: [sdk/src/types/appearance.ts:173](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L173)
Class applied when there's an error
#### Default
```ts
'dialstack-component--error'
```
#### Inherited from
```ts
BaseComponentClasses.error
```
***
### loading?
```ts
optional loading?: string;
```
Defined in: [sdk/src/types/appearance.ts:167](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L167)
Class applied when the component is loading
#### Default
```ts
'dialstack-component--loading'
```
#### Inherited from
```ts
BaseComponentClasses.loading
```
***
### mainContent?
```ts
optional mainContent?: string;
```
Defined in: [sdk/src/types/account-onboarding.ts:28](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/account-onboarding.ts#L28)
***
### sidebar?
```ts
optional sidebar?: string;
```
Defined in: [sdk/src/types/account-onboarding.ts:27](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/account-onboarding.ts#L27)
---
## Interface: OnboardingUser
[@dialstack/sdk](../../index.md) / [index](../index.md) / OnboardingUser
# Interface: OnboardingUser
Defined in: [sdk/src/types/account-onboarding.ts:72](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/account-onboarding.ts#L72)
## Properties
### account\_role?
```ts
optional account_role?: string | null;
```
Defined in: [sdk/src/types/account-onboarding.ts:76](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/account-onboarding.ts#L76)
***
### created\_at
```ts
created_at: string;
```
Defined in: [sdk/src/types/account-onboarding.ts:78](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/account-onboarding.ts#L78)
***
### email?
```ts
optional email?: string | null;
```
Defined in: [sdk/src/types/account-onboarding.ts:75](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/account-onboarding.ts#L75)
***
### extensions?
```ts
optional extensions?: object;
```
Defined in: [sdk/src/types/account-onboarding.ts:77](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/account-onboarding.ts#L77)
#### data?
```ts
optional data?: object[];
```
***
### id
```ts
id: string;
```
Defined in: [sdk/src/types/account-onboarding.ts:73](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/account-onboarding.ts#L73)
***
### name?
```ts
optional name?: string | null;
```
Defined in: [sdk/src/types/account-onboarding.ts:74](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/account-onboarding.ts#L74)
***
### updated\_at
```ts
updated_at: string;
```
Defined in: [sdk/src/types/account-onboarding.ts:79](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/account-onboarding.ts#L79)
---
## Interface: PaginatedResponse\
[@dialstack/sdk](../../index.md) / [index](../index.md) / PaginatedResponse
# Interface: PaginatedResponse\
Defined in: [sdk/src/types/phone-numbers.ts:11](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L11)
Paginated list response from the API
## Type Parameters
### T
`T`
## Properties
### data
```ts
data: T[];
```
Defined in: [sdk/src/types/phone-numbers.ts:16](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L16)
***
### next\_page\_url
```ts
next_page_url: string | null;
```
Defined in: [sdk/src/types/phone-numbers.ts:14](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L14)
***
### object
```ts
object: "list";
```
Defined in: [sdk/src/types/phone-numbers.ts:12](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L12)
***
### previous\_page\_url
```ts
previous_page_url: string | null;
```
Defined in: [sdk/src/types/phone-numbers.ts:15](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L15)
***
### url
```ts
url: string;
```
Defined in: [sdk/src/types/phone-numbers.ts:13](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L13)
---
## Interface: PaginationOptions
[@dialstack/sdk](../../index.md) / [index](../index.md) / PaginationOptions
# Interface: PaginationOptions
Defined in: [sdk/src/types/components.ts:270](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L270)
Pagination options for list components
## Properties
### defaultPageSize?
```ts
optional defaultPageSize?: number;
```
Defined in: [sdk/src/types/components.ts:281](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L281)
Default page size
#### Default
```ts
20
```
***
### pageSizes?
```ts
optional pageSizes?: number[];
```
Defined in: [sdk/src/types/components.ts:275](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L275)
Available page sizes for the dropdown
#### Default
```ts
[10, 20, 50, 100]
```
---
## Interface: PhoneNumberItem
[@dialstack/sdk](../../index.md) / [index](../index.md) / PhoneNumberItem
# Interface: PhoneNumberItem
Defined in: [sdk/src/types/phone-numbers.ts:74](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L74)
A unified phone number item merging data from DIDs, number orders, and port orders
## Properties
### caller\_id\_name?
```ts
optional caller_id_name?: string | null;
```
Defined in: [sdk/src/types/phone-numbers.ts:80](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L80)
***
### carrier?
```ts
optional carrier?: string;
```
Defined in: [sdk/src/types/phone-numbers.ts:82](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L82)
***
### created\_at
```ts
created_at: string;
```
Defined in: [sdk/src/types/phone-numbers.ts:85](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L85)
***
### did\_id?
```ts
optional did_id?: string;
```
Defined in: [sdk/src/types/phone-numbers.ts:87](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L87)
***
### expires\_at?
```ts
optional expires_at?: string | null;
```
Defined in: [sdk/src/types/phone-numbers.ts:78](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L78)
***
### number\_class?
```ts
optional number_class?: "account_owned" | "temporary";
```
Defined in: [sdk/src/types/phone-numbers.ts:77](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L77)
***
### order\_id?
```ts
optional order_id?: string;
```
Defined in: [sdk/src/types/phone-numbers.ts:88](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L88)
***
### outbound\_enabled
```ts
outbound_enabled: boolean | null;
```
Defined in: [sdk/src/types/phone-numbers.ts:79](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L79)
***
### phone\_number
```ts
phone_number: string;
```
Defined in: [sdk/src/types/phone-numbers.ts:75](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L75)
***
### port\_order\_id?
```ts
optional port_order_id?: string;
```
Defined in: [sdk/src/types/phone-numbers.ts:89](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L89)
***
### routing\_target?
```ts
optional routing_target?: string | null;
```
Defined in: [sdk/src/types/phone-numbers.ts:81](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L81)
***
### source
```ts
source: "did" | "number_order" | "port_order";
```
Defined in: [sdk/src/types/phone-numbers.ts:84](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L84)
***
### status
```ts
status: PhoneNumberStatus;
```
Defined in: [sdk/src/types/phone-numbers.ts:76](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L76)
***
### transfer\_date?
```ts
optional transfer_date?: string;
```
Defined in: [sdk/src/types/phone-numbers.ts:83](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L83)
***
### updated\_at
```ts
updated_at: string;
```
Defined in: [sdk/src/types/phone-numbers.ts:86](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L86)
---
## Interface: PhoneNumberOrderingClasses
[@dialstack/sdk](../../index.md) / [index](../index.md) / PhoneNumberOrderingClasses
# Interface: PhoneNumberOrderingClasses
Defined in: [sdk/src/types/phone-number-ordering.ts:36](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-number-ordering.ts#L36)
## Extends
- `BaseComponentClasses`
## Properties
### base?
```ts
optional base?: string;
```
Defined in: [sdk/src/types/appearance.ts:161](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L161)
Base class applied to the container always
#### Default
```ts
'dialstack-component'
```
#### Inherited from
```ts
BaseComponentClasses.base
```
***
### confirmPanel?
```ts
optional confirmPanel?: string;
```
Defined in: [sdk/src/types/phone-number-ordering.ts:41](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-number-ordering.ts#L41)
***
### empty?
```ts
optional empty?: string;
```
Defined in: [sdk/src/types/appearance.ts:179](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L179)
Class applied when the component has no data
#### Default
```ts
'dialstack-component--empty'
```
#### Inherited from
```ts
BaseComponentClasses.empty
```
***
### error?
```ts
optional error?: string;
```
Defined in: [sdk/src/types/appearance.ts:173](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L173)
Class applied when there's an error
#### Default
```ts
'dialstack-component--error'
```
#### Inherited from
```ts
BaseComponentClasses.error
```
***
### loading?
```ts
optional loading?: string;
```
Defined in: [sdk/src/types/appearance.ts:167](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L167)
Class applied when the component is loading
#### Default
```ts
'dialstack-component--loading'
```
#### Inherited from
```ts
BaseComponentClasses.loading
```
***
### orderComplete?
```ts
optional orderComplete?: string;
```
Defined in: [sdk/src/types/phone-number-ordering.ts:42](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-number-ordering.ts#L42)
***
### resultRow?
```ts
optional resultRow?: string;
```
Defined in: [sdk/src/types/phone-number-ordering.ts:39](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-number-ordering.ts#L39)
***
### resultRowSelected?
```ts
optional resultRowSelected?: string;
```
Defined in: [sdk/src/types/phone-number-ordering.ts:40](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-number-ordering.ts#L40)
***
### resultsTable?
```ts
optional resultsTable?: string;
```
Defined in: [sdk/src/types/phone-number-ordering.ts:38](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-number-ordering.ts#L38)
***
### searchForm?
```ts
optional searchForm?: string;
```
Defined in: [sdk/src/types/phone-number-ordering.ts:37](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-number-ordering.ts#L37)
---
## Interface: PhoneNumbersClasses
[@dialstack/sdk](../../index.md) / [index](../index.md) / PhoneNumbersClasses
# Interface: PhoneNumbersClasses
Defined in: [sdk/src/types/phone-numbers.ts:95](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L95)
CSS classes for the PhoneNumbers component
## Extends
- `BaseComponentClasses`
## Properties
### base?
```ts
optional base?: string;
```
Defined in: [sdk/src/types/appearance.ts:161](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L161)
Base class applied to the container always
#### Default
```ts
'dialstack-component'
```
#### Inherited from
```ts
BaseComponentClasses.base
```
***
### empty?
```ts
optional empty?: string;
```
Defined in: [sdk/src/types/appearance.ts:179](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L179)
Class applied when the component has no data
#### Default
```ts
'dialstack-component--empty'
```
#### Inherited from
```ts
BaseComponentClasses.empty
```
***
### error?
```ts
optional error?: string;
```
Defined in: [sdk/src/types/appearance.ts:173](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L173)
Class applied when there's an error
#### Default
```ts
'dialstack-component--error'
```
#### Inherited from
```ts
BaseComponentClasses.error
```
***
### loading?
```ts
optional loading?: string;
```
Defined in: [sdk/src/types/appearance.ts:167](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L167)
Class applied when the component is loading
#### Default
```ts
'dialstack-component--loading'
```
#### Inherited from
```ts
BaseComponentClasses.loading
```
***
### pagination?
```ts
optional pagination?: string;
```
Defined in: [sdk/src/types/phone-numbers.ts:99](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L99)
***
### row?
```ts
optional row?: string;
```
Defined in: [sdk/src/types/phone-numbers.ts:97](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L97)
***
### statusBadge?
```ts
optional statusBadge?: string;
```
Defined in: [sdk/src/types/phone-numbers.ts:98](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L98)
***
### table?
```ts
optional table?: string;
```
Defined in: [sdk/src/types/phone-numbers.ts:96](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L96)
---
## Interface: PortApproval
[@dialstack/sdk](../../index.md) / [index](../index.md) / PortApproval
# Interface: PortApproval
Defined in: [sdk/src/types/number-porting.ts:40](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L40)
## Properties
### ip
```ts
ip: string;
```
Defined in: [sdk/src/types/number-porting.ts:42](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L42)
***
### signature
```ts
signature: string;
```
Defined in: [sdk/src/types/number-porting.ts:41](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L41)
***
### timestamp
```ts
timestamp: string;
```
Defined in: [sdk/src/types/number-porting.ts:43](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L43)
---
## Interface: PortEligibilityResult
[@dialstack/sdk](../../index.md) / [index](../index.md) / PortEligibilityResult
# Interface: PortEligibilityResult
Defined in: [sdk/src/types/number-porting.ts:114](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L114)
## Properties
### non\_portable\_numbers
```ts
non_portable_numbers: NonPortableNumber[];
```
Defined in: [sdk/src/types/number-porting.ts:116](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L116)
***
### portable\_numbers
```ts
portable_numbers: PortableNumber[];
```
Defined in: [sdk/src/types/number-porting.ts:115](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L115)
---
## Interface: PortableNumber
[@dialstack/sdk](../../index.md) / [index](../index.md) / PortableNumber
# Interface: PortableNumber
Defined in: [sdk/src/types/number-porting.ts:99](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L99)
## Properties
### account\_number\_required
```ts
account_number_required: boolean;
```
Defined in: [sdk/src/types/number-porting.ts:104](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L104)
***
### is\_wireless
```ts
is_wireless: boolean;
```
Defined in: [sdk/src/types/number-porting.ts:103](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L103)
***
### losing\_carrier\_name?
```ts
optional losing_carrier_name?: string;
```
Defined in: [sdk/src/types/number-porting.ts:101](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L101)
***
### losing\_carrier\_spid?
```ts
optional losing_carrier_spid?: string;
```
Defined in: [sdk/src/types/number-porting.ts:102](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L102)
***
### phone\_number
```ts
phone_number: string;
```
Defined in: [sdk/src/types/number-porting.ts:100](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L100)
---
## ~~Interface: ProvisionedDevice~~
[@dialstack/sdk](../../index.md) / [index](../index.md) / ProvisionedDevice
# ~~Interface: ProvisionedDevice~~
Defined in: [sdk/src/types/device.ts:128](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L128)
A provisioned device (desk phone, DECT base, etc.).
## Deprecated
Use `Device` from the `/v1/devices` endpoint instead.
Still used for create/update return types that hit `/v1/deskphones`.
## Properties
### ~~created\_at~~
```ts
created_at: string;
```
Defined in: [sdk/src/types/device.ts:152](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L152)
ISO 8601 timestamp
***
### ~~current\_ip\_address?~~
```ts
optional current_ip_address?: string;
```
Defined in: [sdk/src/types/device.ts:144](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L144)
Last known IP address from provisioning request
***
### ~~id~~
```ts
id: string;
```
Defined in: [sdk/src/types/device.ts:130](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L130)
TypeID with `dev_` prefix
***
### ~~last\_provisioned\_at?~~
```ts
optional last_provisioned_at?: string;
```
Defined in: [sdk/src/types/device.ts:146](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L146)
ISO 8601 timestamp of last successful config fetch
***
### ~~lines?~~
```ts
optional lines?: DeviceLine[];
```
Defined in: [sdk/src/types/device.ts:150](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L150)
Configured lines on this device
***
### ~~mac\_address~~
```ts
mac_address: string;
```
Defined in: [sdk/src/types/device.ts:132](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L132)
Hardware MAC address (e.g., "00:04:13:aa:bb:cc")
***
### ~~model?~~
```ts
optional model?: string;
```
Defined in: [sdk/src/types/device.ts:136](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L136)
Device model (e.g., "D785", "T48S")
***
### ~~overrides?~~
```ts
optional overrides?: DeviceSettings;
```
Defined in: [sdk/src/types/device.ts:142](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L142)
Device-specific settings overrides
***
### ~~primary\_line\_id?~~
```ts
optional primary_line_id?: string;
```
Defined in: [sdk/src/types/device.ts:148](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L148)
TypeID of the primary line
***
### ~~profile\_id?~~
```ts
optional profile_id?: string;
```
Defined in: [sdk/src/types/device.ts:140](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L140)
TypeID of the provisioning profile, if using profile-based config
***
### ~~status~~
```ts
status: DeviceStatus;
```
Defined in: [sdk/src/types/device.ts:138](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L138)
Current provisioning status
***
### ~~updated\_at~~
```ts
updated_at: string;
```
Defined in: [sdk/src/types/device.ts:154](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L154)
ISO 8601 timestamp
***
### ~~vendor~~
```ts
vendor: string;
```
Defined in: [sdk/src/types/device.ts:134](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L134)
Detected vendor (e.g., "snom", "yealink")
---
## Interface: ProvisioningEvent
[@dialstack/sdk](../../index.md) / [index](../index.md) / ProvisioningEvent
# Interface: ProvisioningEvent
Defined in: [sdk/src/types/device.ts:206](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L206)
A provisioning event logged when a device fetches its configuration.
## Properties
### created\_at
```ts
created_at: string;
```
Defined in: [sdk/src/types/device.ts:220](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L220)
ISO 8601 timestamp
***
### details?
```ts
optional details?: Record;
```
Defined in: [sdk/src/types/device.ts:218](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L218)
Additional event details
***
### device\_id
```ts
device_id: string;
```
Defined in: [sdk/src/types/device.ts:210](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L210)
TypeID of the device
***
### event\_type
```ts
event_type: string;
```
Defined in: [sdk/src/types/device.ts:212](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L212)
Type of event (e.g., "config_fetch", "config_error")
***
### id
```ts
id: string;
```
Defined in: [sdk/src/types/device.ts:208](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L208)
TypeID with `preve_` prefix
***
### source\_ip?
```ts
optional source_ip?: string;
```
Defined in: [sdk/src/types/device.ts:214](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L214)
IP address that initiated the request
***
### user\_agent?
```ts
optional user_agent?: string;
```
Defined in: [sdk/src/types/device.ts:216](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L216)
User-Agent header from the request
---
## Interface: ProvisioningEventListOptions
[@dialstack/sdk](../../index.md) / [index](../index.md) / ProvisioningEventListOptions
# Interface: ProvisioningEventListOptions
Defined in: [sdk/src/types/device.ts:242](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L242)
Options for listing provisioning events.
## Extends
- [`DeviceListOptions`](DeviceListOptions.md)
## Properties
### from?
```ts
optional from?: string;
```
Defined in: [sdk/src/types/device.ts:244](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L244)
ISO 8601 timestamp to filter events from
***
### limit?
```ts
optional limit?: number;
```
Defined in: [sdk/src/types/device.ts:194](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L194)
Maximum number of devices to return (default: 10, max: 100)
#### Inherited from
[`DeviceListOptions`](DeviceListOptions.md).[`limit`](DeviceListOptions.md#limit)
***
### to?
```ts
optional to?: string;
```
Defined in: [sdk/src/types/device.ts:246](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L246)
ISO 8601 timestamp to filter events to
***
### type?
```ts
optional type?: DeviceType;
```
Defined in: [sdk/src/types/device.ts:196](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L196)
Filter by device type ('deskphone' or 'dect_base')
#### Inherited from
[`DeviceListOptions`](DeviceListOptions.md).[`type`](DeviceListOptions.md#type)
---
## Interface: QualityMetricLeg
[@dialstack/sdk](../../index.md) / [index](../index.md) / QualityMetricLeg
# Interface: QualityMetricLeg
Defined in: [sdk/src/types/components.ts:197](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L197)
RTP quality metrics for a single call leg (PSTN or endpoint)
## Properties
### endpoint\_id?
```ts
optional endpoint_id?: string | null;
```
Defined in: [sdk/src/types/components.ts:199](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L199)
***
### jitter\_max\_ms?
```ts
optional jitter_max_ms?: number | null;
```
Defined in: [sdk/src/types/components.ts:202](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L202)
***
### jitter\_min\_ms?
```ts
optional jitter_min_ms?: number | null;
```
Defined in: [sdk/src/types/components.ts:201](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L201)
***
### jitter\_ms?
```ts
optional jitter_ms?: number | null;
```
Defined in: [sdk/src/types/components.ts:200](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L200)
***
### jitter\_stddev\_ms?
```ts
optional jitter_stddev_ms?: number | null;
```
Defined in: [sdk/src/types/components.ts:203](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L203)
***
### leg
```ts
leg: "pstn" | "endpoint";
```
Defined in: [sdk/src/types/components.ts:198](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L198)
***
### mos?
```ts
optional mos?: number | null;
```
Defined in: [sdk/src/types/components.ts:211](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L211)
***
### packet\_loss\_pct?
```ts
optional packet_loss_pct?: number | null;
```
Defined in: [sdk/src/types/components.ts:204](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L204)
***
### rtt\_max\_ms?
```ts
optional rtt_max_ms?: number | null;
```
Defined in: [sdk/src/types/components.ts:207](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L207)
***
### rtt\_min\_ms?
```ts
optional rtt_min_ms?: number | null;
```
Defined in: [sdk/src/types/components.ts:206](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L206)
***
### rtt\_ms?
```ts
optional rtt_ms?: number | null;
```
Defined in: [sdk/src/types/components.ts:205](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L205)
***
### rtt\_stddev\_ms?
```ts
optional rtt_stddev_ms?: number | null;
```
Defined in: [sdk/src/types/components.ts:208](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L208)
***
### rx\_count?
```ts
optional rx_count?: number | null;
```
Defined in: [sdk/src/types/components.ts:209](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L209)
***
### tx\_count?
```ts
optional tx_count?: number | null;
```
Defined in: [sdk/src/types/components.ts:210](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L210)
---
## Interface: SDKCreatePortOrderRequest
[@dialstack/sdk](../../index.md) / [index](../index.md) / SDKCreatePortOrderRequest
# Interface: SDKCreatePortOrderRequest
Defined in: [sdk/src/types/number-porting.ts:92](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L92)
## Properties
### phone\_numbers
```ts
phone_numbers: string[];
```
Defined in: [sdk/src/types/number-porting.ts:93](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L93)
***
### requested\_foc\_date
```ts
requested_foc_date: string;
```
Defined in: [sdk/src/types/number-porting.ts:95](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L95)
***
### requested\_foc\_time?
```ts
optional requested_foc_time?: string;
```
Defined in: [sdk/src/types/number-porting.ts:96](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L96)
***
### subscriber
```ts
subscriber: PortOrderSubscriber;
```
Defined in: [sdk/src/types/number-porting.ts:94](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L94)
---
## Interface: SDKPortOrder
[@dialstack/sdk](../../index.md) / [index](../index.md) / SDKPortOrder
# Interface: SDKPortOrder
Defined in: [sdk/src/types/number-porting.ts:83](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L83)
## Properties
### created\_at
```ts
created_at: string;
```
Defined in: [sdk/src/types/number-porting.ts:88](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L88)
***
### details
```ts
details: SDKPortOrderDetails;
```
Defined in: [sdk/src/types/number-porting.ts:86](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L86)
***
### id
```ts
id: string;
```
Defined in: [sdk/src/types/number-porting.ts:84](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L84)
***
### status
```ts
status: SDKPortOrderStatus;
```
Defined in: [sdk/src/types/number-porting.ts:85](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L85)
***
### submitted\_at
```ts
submitted_at: string | null;
```
Defined in: [sdk/src/types/number-porting.ts:87](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L87)
***
### updated\_at
```ts
updated_at: string;
```
Defined in: [sdk/src/types/number-porting.ts:89](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L89)
---
## Interface: SDKPortOrderDetails
[@dialstack/sdk](../../index.md) / [index](../index.md) / SDKPortOrderDetails
# Interface: SDKPortOrderDetails
Defined in: [sdk/src/types/number-porting.ts:68](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L68)
## Properties
### actual\_foc\_date?
```ts
optional actual_foc_date?: string | null;
```
Defined in: [sdk/src/types/number-porting.ts:73](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L73)
***
### approval?
```ts
optional approval?: PortApproval | null;
```
Defined in: [sdk/src/types/number-porting.ts:77](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L77)
***
### bill\_copy?
```ts
optional bill_copy?: PortDocumentMeta | null;
```
Defined in: [sdk/src/types/number-porting.ts:80](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L80)
***
### csr?
```ts
optional csr?: PortDocumentMeta | null;
```
Defined in: [sdk/src/types/number-porting.ts:79](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L79)
***
### eligibility?
```ts
optional eligibility?: PortNumberEligibility[] | null;
```
Defined in: [sdk/src/types/number-porting.ts:75](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L75)
***
### loa?
```ts
optional loa?: PortDocumentMeta | null;
```
Defined in: [sdk/src/types/number-porting.ts:78](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L78)
***
### losing\_carrier?
```ts
optional losing_carrier?: PortCarrier | null;
```
Defined in: [sdk/src/types/number-porting.ts:74](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L74)
***
### phone\_numbers
```ts
phone_numbers: string[];
```
Defined in: [sdk/src/types/number-porting.ts:69](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L69)
***
### rejection?
```ts
optional rejection?: PortRejection | null;
```
Defined in: [sdk/src/types/number-porting.ts:76](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L76)
***
### requested\_foc\_date?
```ts
optional requested_foc_date?: string;
```
Defined in: [sdk/src/types/number-porting.ts:71](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L71)
***
### requested\_foc\_time?
```ts
optional requested_foc_time?: string | null;
```
Defined in: [sdk/src/types/number-porting.ts:72](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L72)
***
### subscriber?
```ts
optional subscriber?: PortOrderSubscriber | null;
```
Defined in: [sdk/src/types/number-porting.ts:70](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L70)
---
## Interface: UpdateDECTBaseRequest
[@dialstack/sdk](../../index.md) / [index](../index.md) / UpdateDECTBaseRequest
# Interface: UpdateDECTBaseRequest
Defined in: [sdk/src/types/dect.ts:155](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L155)
Request payload for updating a DECT base station.
## Properties
### model?
```ts
optional model?: string;
```
Defined in: [sdk/src/types/dect.ts:157](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L157)
Device model
***
### multicell\_role?
```ts
optional multicell_role?: MulticellRole;
```
Defined in: [sdk/src/types/dect.ts:161](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L161)
Role in multicell deployment
***
### overrides?
```ts
optional overrides?: DeviceSettings;
```
Defined in: [sdk/src/types/dect.ts:163](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L163)
Device-specific settings overrides
***
### status?
```ts
optional status?: DeviceStatus;
```
Defined in: [sdk/src/types/dect.ts:159](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L159)
Device status
---
## Interface: UpdateDECTHandsetRequest
[@dialstack/sdk](../../index.md) / [index](../index.md) / UpdateDECTHandsetRequest
# Interface: UpdateDECTHandsetRequest
Defined in: [sdk/src/types/dect.ts:181](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L181)
Request payload for updating a DECT handset.
## Properties
### display\_name?
```ts
optional display_name?: string;
```
Defined in: [sdk/src/types/dect.ts:185](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L185)
Display name for the handset
***
### ipei?
```ts
optional ipei?: string;
```
Defined in: [sdk/src/types/dect.ts:183](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L183)
International Portable Equipment Identity
---
## Interface: UpdateDeskphoneLineRequest
[@dialstack/sdk](../../index.md) / [index](../index.md) / UpdateDeskphoneLineRequest
# Interface: UpdateDeskphoneLineRequest
Defined in: [sdk/src/types/device.ts:234](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L234)
Request payload for updating a deskphone line (reassigning endpoint).
## Properties
### endpoint\_id
```ts
endpoint_id: string;
```
Defined in: [sdk/src/types/device.ts:236](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L236)
TypeID of the new endpoint to assign
---
## Interface: UpdateDeskphoneRequest
[@dialstack/sdk](../../index.md) / [index](../index.md) / UpdateDeskphoneRequest
# Interface: UpdateDeskphoneRequest
Defined in: [sdk/src/types/device.ts:176](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L176)
Request payload for updating a deskphone.
## Properties
### model?
```ts
optional model?: string;
```
Defined in: [sdk/src/types/device.ts:178](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L178)
Device model
***
### overrides?
```ts
optional overrides?: DeviceSettings;
```
Defined in: [sdk/src/types/device.ts:182](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L182)
Device-specific settings overrides
***
### status?
```ts
optional status?: DeviceStatus;
```
Defined in: [sdk/src/types/device.ts:180](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L180)
Device status
---
## Interface: UpdateOptions
[@dialstack/sdk](../../index.md) / [index](../index.md) / UpdateOptions
# Interface: UpdateOptions
Defined in: [sdk/src/types/appearance.ts:104](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L104)
Options for updating component appearance
## Properties
### appearance
```ts
appearance: AppearanceOptions;
```
Defined in: [sdk/src/types/appearance.ts:108](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L108)
Appearance settings to update
---
## Interface: UpdatePhoneNumberRequest
[@dialstack/sdk](../../index.md) / [index](../index.md) / UpdatePhoneNumberRequest
# Interface: UpdatePhoneNumberRequest
Defined in: [sdk/src/types/phone-numbers.ts:46](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L46)
Request body for updating a phone number via POST /v1/phone-numbers/:id
## Properties
### caller\_id\_name?
```ts
optional caller_id_name?: string;
```
Defined in: [sdk/src/types/phone-numbers.ts:52](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L52)
***
### caller\_id\_visibility?
```ts
optional caller_id_visibility?: "PUBLIC" | "PRIVATE";
```
Defined in: [sdk/src/types/phone-numbers.ts:53](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L53)
***
### directory\_listing\_location\_id?
```ts
optional directory_listing_location_id?: string;
```
Defined in: [sdk/src/types/phone-numbers.ts:51](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L51)
***
### directory\_listing\_name?
```ts
optional directory_listing_name?: string;
```
Defined in: [sdk/src/types/phone-numbers.ts:49](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L49)
***
### directory\_listing\_type?
```ts
optional directory_listing_type?: DirectoryListingType;
```
Defined in: [sdk/src/types/phone-numbers.ts:50](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L50)
***
### outbound\_enabled?
```ts
optional outbound_enabled?: boolean;
```
Defined in: [sdk/src/types/phone-numbers.ts:47](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L47)
***
### status?
```ts
optional status?: "active" | "inactive";
```
Defined in: [sdk/src/types/phone-numbers.ts:48](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L48)
---
## Interface: VoicemailBehaviorOptions
[@dialstack/sdk](../../index.md) / [index](../index.md) / VoicemailBehaviorOptions
# Interface: VoicemailBehaviorOptions
Defined in: [sdk/src/types/components.ts:141](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L141)
Behavior options for Voicemails component
## Properties
### allowSeeking?
```ts
optional allowSeeking?: boolean;
```
Defined in: [sdk/src/types/components.ts:164](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L164)
Allow seeking in audio playback
#### Default
```ts
true
```
***
### autoPlayOnExpand?
```ts
optional autoPlayOnExpand?: boolean;
```
Defined in: [sdk/src/types/components.ts:146](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L146)
Auto-play voicemail when expanded
#### Default
```ts
true
```
***
### confirmBeforeDelete?
```ts
optional confirmBeforeDelete?: boolean;
```
Defined in: [sdk/src/types/components.ts:152](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L152)
Show confirmation dialog before deleting
#### Default
```ts
true
```
***
### markAsReadOnPlay?
```ts
optional markAsReadOnPlay?: boolean;
```
Defined in: [sdk/src/types/components.ts:158](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L158)
Mark voicemail as read when played
#### Default
```ts
true
```
---
## Interface: VoicemailDisplayOptions
[@dialstack/sdk](../../index.md) / [index](../index.md) / VoicemailDisplayOptions
# Interface: VoicemailDisplayOptions
Defined in: [sdk/src/types/components.ts:26](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L26)
Display options for Voicemails component
## Properties
### showCallbackButton?
```ts
optional showCallbackButton?: boolean;
```
Defined in: [sdk/src/types/components.ts:43](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L43)
Show callback button
#### Default
```ts
true
```
***
### showDeleteButton?
```ts
optional showDeleteButton?: boolean;
```
Defined in: [sdk/src/types/components.ts:49](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L49)
Show delete button
#### Default
```ts
true
```
***
### showDuration?
```ts
optional showDuration?: boolean;
```
Defined in: [sdk/src/types/components.ts:31](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L31)
Show voicemail duration
#### Default
```ts
true
```
***
### showProgressBar?
```ts
optional showProgressBar?: boolean;
```
Defined in: [sdk/src/types/components.ts:55](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L55)
Show progress bar in expanded view
#### Default
```ts
true
```
***
### showTimestamp?
```ts
optional showTimestamp?: boolean;
```
Defined in: [sdk/src/types/components.ts:61](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L61)
Show timestamp
#### Default
```ts
true
```
***
### showTranscription?
```ts
optional showTranscription?: boolean;
```
Defined in: [sdk/src/types/components.ts:37](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L37)
Show transcription when available
#### Default
```ts
true
```
---
## Interface: VoicemailsCallbacks
[@dialstack/sdk](../../index.md) / [index](../index.md) / VoicemailsCallbacks
# Interface: VoicemailsCallbacks
Defined in: [sdk/src/types/callbacks.ts:33](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/callbacks.ts#L33)
Voicemails component callbacks
## Extends
- [`CommonComponentCallbacks`](CommonComponentCallbacks.md)
## Properties
### onCallBack?
```ts
optional onCallBack?: (event) => void;
```
Defined in: [sdk/src/types/callbacks.ts:38](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/callbacks.ts#L38)
#### Parameters
##### event
###### phoneNumber
`string`
#### Returns
`void`
***
### onDeleteRequest?
```ts
optional onDeleteRequest?: (voicemailId) => Promise;
```
Defined in: [sdk/src/types/callbacks.ts:43](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/callbacks.ts#L43)
Custom delete confirmation handler. Return true to proceed with deletion.
If not provided, uses built-in confirmation based on confirmBeforeDelete setting.
#### Parameters
##### voicemailId
`string`
#### Returns
`Promise`\<`boolean`\>
***
### onLoadError?
```ts
optional onLoadError?: (event) => void;
```
Defined in: [sdk/src/types/callbacks.ts:27](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/callbacks.ts#L27)
#### Parameters
##### event
[`LoadError`](LoadError.md)
#### Returns
`void`
#### Inherited from
[`CommonComponentCallbacks`](CommonComponentCallbacks.md).[`onLoadError`](CommonComponentCallbacks.md#onloaderror)
***
### onLoaderStart?
```ts
optional onLoaderStart?: (event) => void;
```
Defined in: [sdk/src/types/callbacks.ts:26](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/callbacks.ts#L26)
#### Parameters
##### event
[`LoaderStart`](LoaderStart.md)
#### Returns
`void`
#### Inherited from
[`CommonComponentCallbacks`](CommonComponentCallbacks.md).[`onLoaderStart`](CommonComponentCallbacks.md#onloaderstart)
***
### onVoicemailDelete?
```ts
optional onVoicemailDelete?: (event) => void;
```
Defined in: [sdk/src/types/callbacks.ts:37](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/callbacks.ts#L37)
#### Parameters
##### event
###### voicemailId
`string`
#### Returns
`void`
***
### onVoicemailPause?
```ts
optional onVoicemailPause?: (event) => void;
```
Defined in: [sdk/src/types/callbacks.ts:36](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/callbacks.ts#L36)
#### Parameters
##### event
###### voicemailId
`string`
#### Returns
`void`
***
### onVoicemailPlay?
```ts
optional onVoicemailPlay?: (event) => void;
```
Defined in: [sdk/src/types/callbacks.ts:35](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/callbacks.ts#L35)
#### Parameters
##### event
###### voicemailId
`string`
#### Returns
`void`
***
### onVoicemailSelect?
```ts
optional onVoicemailSelect?: (event) => void;
```
Defined in: [sdk/src/types/callbacks.ts:34](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/callbacks.ts#L34)
#### Parameters
##### event
###### voicemailId
`string`
#### Returns
`void`
---
## Type Alias: AccountOnboardingStep
[@dialstack/sdk](../../index.md) / [index](../index.md) / AccountOnboardingStep
# Type Alias: AccountOnboardingStep
```ts
type AccountOnboardingStep = "account" | "numbers" | "hardware" | "final_complete";
```
Defined in: [sdk/src/types/account-onboarding.ts:7](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/account-onboarding.ts#L7)
---
## Type Alias: CallEventHandler\
[@dialstack/sdk](../../index.md) / [index](../index.md) / CallEventHandler
# Type Alias: CallEventHandler\
```ts
type CallEventHandler = (event) => void;
```
Defined in: [sdk/src/types/callbacks.ts:93](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/callbacks.ts#L93)
Event handler function type
## Type Parameters
### T
`T`
## Parameters
### event
`T`
## Returns
`void`
---
## Type Alias: CallEventType
[@dialstack/sdk](../../index.md) / [index](../index.md) / CallEventType
# Type Alias: CallEventType
```ts
type CallEventType = "call.incoming";
```
Defined in: [sdk/src/types/callbacks.ts:81](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/callbacks.ts#L81)
Call event type names for on()/off() methods
---
## Type Alias: CallLogRowRenderer
[@dialstack/sdk](../../index.md) / [index](../index.md) / CallLogRowRenderer
# Type Alias: CallLogRowRenderer
```ts
type CallLogRowRenderer = (call) => string;
```
Defined in: [sdk/src/types/components.ts:188](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L188)
Render function for custom call log row rendering
## Parameters
### call
[`CallLog`](../interfaces/CallLog.md)
## Returns
`string`
---
## Type Alias: ClientSecretResponse
[@dialstack/sdk](../../index.md) / [index](../index.md) / ClientSecretResponse
# Type Alias: ClientSecretResponse
```ts
type ClientSecretResponse =
| string
| {
accountId?: string;
clientSecret: string;
expiresAt?: string;
}
| {
account_id?: string;
client_secret: string;
expires_at?: string;
};
```
Defined in: [sdk/src/types/core.ts:76](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/core.ts#L76)
Client secret response from fetchClientSecret
Can be either a string (for backward compatibility) or an object with expiry info
## Union Members
`string`
***
### Type Literal
```ts
{
accountId?: string;
clientSecret: string;
expiresAt?: string;
}
```
#### accountId?
```ts
optional accountId?: string;
```
Account TypeID (e.g. acct_...) for account-scoped SDK methods
#### clientSecret
```ts
clientSecret: string;
```
#### expiresAt?
```ts
optional expiresAt?: string;
```
ISO 8601 datetime string when the session expires
***
### Type Literal
```ts
{
account_id?: string;
client_secret: string;
expires_at?: string;
}
```
#### account\_id?
```ts
optional account_id?: string;
```
Account TypeID (e.g. acct_...) for account-scoped SDK methods
#### client\_secret
```ts
client_secret: string;
```
#### expires\_at?
```ts
optional expires_at?: string;
```
ISO 8601 datetime string when the session expires
---
## Type Alias: ComponentTagName
[@dialstack/sdk](../../index.md) / [index](../index.md) / ComponentTagName
# Type Alias: ComponentTagName
```ts
type ComponentTagName =
| "call-logs"
| "voicemails"
| "call-history"
| "phone-number-ordering"
| "phone-numbers";
```
Defined in: [sdk/src/types/components.ts:388](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L388)
Component tag names for embedded components
---
## Type Alias: DeviceStatus
[@dialstack/sdk](../../index.md) / [index](../index.md) / DeviceStatus
# Type Alias: DeviceStatus
```ts
type DeviceStatus = "pending-sync" | "provisioned";
```
Defined in: [sdk/src/types/device.ts:95](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L95)
Status of a provisioned device.
- `pending-sync`: Device has been registered but not yet provisioned
- `provisioned`: Device has successfully fetched its configuration
---
## Type Alias: DeviceType
[@dialstack/sdk](../../index.md) / [index](../index.md) / DeviceType
# Type Alias: DeviceType
```ts
type DeviceType = "deskphone" | "dect_base";
```
Defined in: [sdk/src/types/device.ts:17](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/device.ts#L17)
Discriminator for the unified `/v1/devices` endpoint.
---
## Type Alias: DirectoryListingType
[@dialstack/sdk](../../index.md) / [index](../index.md) / DirectoryListingType
# Type Alias: DirectoryListingType
```ts
type DirectoryListingType = "listed" | "non_listed" | "non_published" | "non_registered";
```
Defined in: [sdk/src/types/phone-numbers.ts:41](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L41)
Directory listing type for a phone number
---
## Type Alias: HandsetStatus
[@dialstack/sdk](../../index.md) / [index](../index.md) / HandsetStatus
# Type Alias: HandsetStatus
```ts
type HandsetStatus = "unpaired" | "pending-sync" | "registered" | "provisioned";
```
Defined in: [sdk/src/types/dect.ts:75](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L75)
Status of a DECT handset.
- `unpaired`: Handset slot is empty or handset was unpaired
- `pending-sync`: Handset created, base hasn't fetched config with this IPEI yet
- `registered`: Handset is paired with the base
- `provisioned`: Handset has SIP lines configured
---
## Type Alias: IconString
[@dialstack/sdk](../../index.md) / [index](../index.md) / IconString
# Type Alias: IconString
```ts
type IconString = string;
```
Defined in: [sdk/src/types/appearance.ts:114](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L114)
SVG icon as a string (raw SVG markup)
---
## Type Alias: LayoutVariant
[@dialstack/sdk](../../index.md) / [index](../index.md) / LayoutVariant
# Type Alias: LayoutVariant
```ts
type LayoutVariant = "compact" | "comfortable" | "default";
```
Defined in: [sdk/src/types/appearance.ts:13](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/appearance.ts#L13)
Layout density variant
---
## Type Alias: MulticellRole
[@dialstack/sdk](../../index.md) / [index](../index.md) / MulticellRole
# Type Alias: MulticellRole
```ts
type MulticellRole = "single" | "data_master" | "secondary";
```
Defined in: [sdk/src/types/dect.ts:27](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dect.ts#L27)
Role of a DECT base in a multicell deployment.
- `single`: Standalone base station (default)
- `data_master`: Primary base in a multicell setup
- `secondary`: Secondary base in a multicell setup
---
## Type Alias: PhoneNumberStatus
[@dialstack/sdk](../../index.md) / [index](../index.md) / PhoneNumberStatus
# Type Alias: PhoneNumberStatus
```ts
type PhoneNumberStatus =
| "active"
| "inactive"
| "released"
| "ordering"
| "order_failed"
| "porting_draft"
| "porting_submitted"
| "porting_exception"
| "porting_foc"
| "porting_approved";
```
Defined in: [sdk/src/types/phone-numbers.ts:59](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/phone-numbers.ts#L59)
Unified phone number status across DIDs, number orders, and port orders
---
## Type Alias: SDKPortOrderStatus
[@dialstack/sdk](../../index.md) / [index](../index.md) / SDKPortOrderStatus
# Type Alias: SDKPortOrderStatus
```ts
type SDKPortOrderStatus =
| "draft"
| "approved"
| "submitted"
| "exception"
| "foc"
| "complete"
| "cancelled";
```
Defined in: [sdk/src/types/number-porting.ts:51](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/number-porting.ts#L51)
---
## Type Alias: VoicemailRowRenderer
[@dialstack/sdk](../../index.md) / [index](../index.md) / VoicemailRowRenderer
# Type Alias: VoicemailRowRenderer
```ts
type VoicemailRowRenderer = (voicemail) => string;
```
Defined in: [sdk/src/types/components.ts:174](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/components.ts#L174)
Render function for custom voicemail row rendering
## Parameters
### voicemail
#### created_at
`string`
#### duration_seconds
`number`
#### from_name
`string`
#### from_number
`string`
#### id
`string`
#### is_read
`boolean`
#### summary?
`string`
#### transcription?
`string`
## Returns
`string`
---
## Variable: defaultIcons
[@dialstack/sdk](../../index.md) / [index](../index.md) / defaultIcons
# Variable: defaultIcons
```ts
const defaultIcons: Required;
```
Defined in: [sdk/src/components/base-component.ts:44](https://github.com/dialstack/dialstack-sdk/blob/main/src/components/base-component.ts#L44)
Default SVG icons used by components
Can be overridden via setIcons()
---
## SDK Reference
Auto-generated from TypeScript source. Every public export of `@dialstack/sdk`
with its signature, parameters, return type, and a link to the source line in
the public SDK repo.
For narrative guides (installation, authentication, theming, getting started
with React or Web Components), see [SDK](/sdks). This page is the exhaustive,
machine-generated surface.
## Entry points
The SDK publishes five entry points, each scoped to a different runtime:
| Import | Use from | Ships |
| --- | --- | --- |
| [`@dialstack/sdk`](/sdk-reference/index/) | React apps | Main bundle — components, provider, hooks |
| [`@dialstack/sdk/react`](/sdk-reference/react/) | React apps | Individual React component imports |
| [`@dialstack/sdk/pure`](/sdk-reference/pure/) | Vanilla JS, Vue, Svelte, Angular | Framework-agnostic Web Components |
| [`@dialstack/sdk/server`](/sdk-reference/server/) | Node.js backends | REST client and session-token issuance |
| [`@dialstack/sdk/onboarding`](/sdk-reference/onboarding/) | React apps | `` (separate bundle) |
## Reading this reference
Each module's page lists its exports grouped by kind:
- **Functions** — the verbs (e.g., `loadDialStack`, `initialize`, hooks).
- **Variables** — the components and other const exports (e.g., `CallLogs`, `Voicemails`).
- **Interfaces** — the shapes of props and option objects (e.g., `CallLogsProps`).
- **Type aliases** — discriminated unions and named types.
- **Classes** — e.g., the `DialStack` server client.
Source links on every symbol point at the corresponding line in the public
[`dialstack-sdk`](https://github.com/dialstack/dialstack-sdk) repo.
---
## onboarding
[@dialstack/sdk](../index.md) / onboarding
# onboarding
DialStack SDK - Onboarding Entry Point
Native React onboarding portal and wizard components.
Import from '@dialstack/sdk/react/onboarding' to use these.
Requires wrapping in DialstackComponentsProvider from '@dialstack/sdk/react':
```tsx
import { DialstackComponentsProvider } from '@dialstack/sdk/react';
import { OnboardingPortal } from '@dialstack/sdk/react/onboarding';
```
## Interfaces
- [OnboardingPortalProps](interfaces/OnboardingPortalProps.md)
## Variables
- [OnboardingPortal](variables/OnboardingPortal.md)
---
## Interface: OnboardingPortalProps
[@dialstack/sdk](../../index.md) / [onboarding](../index.md) / OnboardingPortalProps
# Interface: OnboardingPortalProps
Defined in: [sdk/src/react/onboarding/OnboardingPortal.tsx:43](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/onboarding/OnboardingPortal.tsx#L43)
## Properties
### appearance?
```ts
optional appearance?: object;
```
Defined in: [sdk/src/react/onboarding/OnboardingPortal.tsx:56](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/onboarding/OnboardingPortal.tsx#L56)
#### variables?
```ts
optional variables?: object;
```
##### variables.colorPrimary?
```ts
optional colorPrimary?: string;
```
##### variables.colorPrimaryHover?
```ts
optional colorPrimaryHover?: string;
```
***
### backLabel?
```ts
optional backLabel?: string;
```
Defined in: [sdk/src/react/onboarding/OnboardingPortal.tsx:52](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/onboarding/OnboardingPortal.tsx#L52)
***
### className?
```ts
optional className?: string;
```
Defined in: [sdk/src/react/onboarding/OnboardingPortal.tsx:61](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/onboarding/OnboardingPortal.tsx#L61)
***
### collectionOptions?
```ts
optional collectionOptions?: OnboardingCollectionOptions;
```
Defined in: [sdk/src/react/onboarding/OnboardingPortal.tsx:47](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/onboarding/OnboardingPortal.tsx#L47)
***
### documentationUrl?
```ts
optional documentationUrl?: string;
```
Defined in: [sdk/src/react/onboarding/OnboardingPortal.tsx:57](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/onboarding/OnboardingPortal.tsx#L57)
***
### formatting?
```ts
optional formatting?: FormattingOptions;
```
Defined in: [sdk/src/react/onboarding/OnboardingPortal.tsx:45](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/onboarding/OnboardingPortal.tsx#L45)
***
### fullTermsOfServiceUrl?
```ts
optional fullTermsOfServiceUrl?: string;
```
Defined in: [sdk/src/react/onboarding/OnboardingPortal.tsx:48](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/onboarding/OnboardingPortal.tsx#L48)
***
### icons?
```ts
optional icons?: ComponentIcons;
```
Defined in: [sdk/src/react/onboarding/OnboardingPortal.tsx:46](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/onboarding/OnboardingPortal.tsx#L46)
***
### locale?
```ts
optional locale?: object;
```
Defined in: [sdk/src/react/onboarding/OnboardingPortal.tsx:44](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/onboarding/OnboardingPortal.tsx#L44)
#### accountOnboarding
```ts
accountOnboarding: object;
```
##### accountOnboarding.account
```ts
account: object;
```
##### accountOnboarding.account.details
```ts
details: object;
```
##### accountOnboarding.account.details.companyNameLabel
```ts
companyNameLabel: string = 'Company Name';
```
##### accountOnboarding.account.details.companyNamePlaceholder
```ts
companyNamePlaceholder: string = 'Acme Corp';
```
##### accountOnboarding.account.details.companyNameRequired
```ts
companyNameRequired: string = 'Company name is required';
```
##### accountOnboarding.account.details.emailLabel
```ts
emailLabel: string = 'Primary Contact Email';
```
##### accountOnboarding.account.details.emailPlaceholder
```ts
emailPlaceholder: string = 'admin@company.com';
```
##### accountOnboarding.account.details.emailRequired
```ts
emailRequired: string = 'Primary contact email is required';
```
##### accountOnboarding.account.details.heading
```ts
heading: string = 'Account Details';
```
##### accountOnboarding.account.details.phoneInvalid
```ts
phoneInvalid: string = 'Enter a valid US phone number';
```
##### accountOnboarding.account.details.phoneLabel
```ts
phoneLabel: string = 'Primary Contact Phone Number';
```
##### accountOnboarding.account.details.phonePlaceholder
```ts
phonePlaceholder: string = '(555) 123-4567';
```
##### accountOnboarding.account.details.phoneRequired
```ts
phoneRequired: string = 'Primary contact phone number is required';
```
##### accountOnboarding.account.details.primaryContactLabel
```ts
primaryContactLabel: string = 'Primary Contact';
```
##### accountOnboarding.account.details.primaryContactPlaceholder
```ts
primaryContactPlaceholder: string = 'Jane Doe';
```
##### accountOnboarding.account.details.primaryContactRequired
```ts
primaryContactRequired: string = 'Primary contact is required';
```
##### accountOnboarding.account.details.regionLabel
```ts
regionLabel: string = 'Region';
```
##### accountOnboarding.account.details.regionPlaceholder
```ts
regionPlaceholder: string = 'Select a region';
```
##### accountOnboarding.account.details.timezoneLabel
```ts
timezoneLabel: string = 'Timezone';
```
##### accountOnboarding.account.details.timezonePlaceholder
```ts
timezonePlaceholder: string = 'Select a timezone';
```
##### accountOnboarding.account.details.timezoneRequired
```ts
timezoneRequired: string = 'Timezone is required';
```
##### accountOnboarding.account.location
```ts
location: object;
```
##### accountOnboarding.account.location.addressLabel
```ts
addressLabel: string = 'Address';
```
##### accountOnboarding.account.location.addressRequired
```ts
addressRequired: string = 'Address is required';
```
##### accountOnboarding.account.location.cityLabel
```ts
cityLabel: string = 'City';
```
##### accountOnboarding.account.location.cityPlaceholder
```ts
cityPlaceholder: string = 'New York';
```
##### accountOnboarding.account.location.description
```ts
description: string = 'Add your business address for E911 and caller ID.';
```
##### accountOnboarding.account.location.edit
```ts
edit: string = 'Edit';
```
##### accountOnboarding.account.location.enterManually
```ts
enterManually: string = 'Enter manually';
```
##### accountOnboarding.account.location.heading
```ts
heading: string = 'Business Location';
```
##### accountOnboarding.account.location.houseNumberLabel
```ts
houseNumberLabel: string = '#';
```
##### accountOnboarding.account.location.houseNumberPlaceholder
```ts
houseNumberPlaceholder: string = '123';
```
##### accountOnboarding.account.location.nameLabel
```ts
nameLabel: string = 'Location Name';
```
##### accountOnboarding.account.location.namePlaceholder
```ts
namePlaceholder: string = 'Main Office';
```
##### accountOnboarding.account.location.nameRequired
```ts
nameRequired: string = 'Location name is required';
```
##### accountOnboarding.account.location.noResults
```ts
noResults: string = 'No addresses found';
```
##### accountOnboarding.account.location.postalCodeLabel
```ts
postalCodeLabel: string = 'ZIP';
```
##### accountOnboarding.account.location.postalCodePlaceholder
```ts
postalCodePlaceholder: string = '10001';
```
##### accountOnboarding.account.location.searching
```ts
searching: string = 'Searching...';
```
##### accountOnboarding.account.location.searchInstead
```ts
searchInstead: string = 'Search instead';
```
##### accountOnboarding.account.location.searchPlaceholder
```ts
searchPlaceholder: string = 'Start typing an address...';
```
##### accountOnboarding.account.location.stateLabel
```ts
stateLabel: string = 'State';
```
##### accountOnboarding.account.location.statePlaceholder
```ts
statePlaceholder: string = 'Select';
```
##### accountOnboarding.account.location.streetLabel
```ts
streetLabel: string = 'Street';
```
##### accountOnboarding.account.location.streetPlaceholder
```ts
streetPlaceholder: string = 'Main St';
```
##### accountOnboarding.account.saveError
```ts
saveError: string = 'Failed to save. Please try again.';
```
##### accountOnboarding.account.saving
```ts
saving: string = 'Saving...';
```
##### accountOnboarding.account.subtitle
```ts
subtitle: string = 'Enter your company information';
```
##### accountOnboarding.account.title
```ts
title: string = 'Business Details';
```
##### accountOnboarding.account.users
```ts
users: object;
```
##### accountOnboarding.account.users.addUser
```ts
addUser: string = 'Add User';
```
##### accountOnboarding.account.users.atLeastOne
```ts
atLeastOne: string = 'Add at least one team member to continue.';
```
##### accountOnboarding.account.users.description
```ts
description: string = 'Add users who will have phone extensions';
```
##### accountOnboarding.account.users.duplicateEmail
```ts
duplicateEmail: string = 'A user with this email already exists.';
```
##### accountOnboarding.account.users.emailLabel
```ts
emailLabel: string = 'Email';
```
##### accountOnboarding.account.users.emailPlaceholder
```ts
emailPlaceholder: string = 'john@company.com';
```
##### accountOnboarding.account.users.extensionLabel
```ts
extensionLabel: string = 'Extension';
```
##### accountOnboarding.account.users.extensionPlaceholder
```ts
extensionPlaceholder: string = 'ex. 103';
```
##### accountOnboarding.account.users.heading
```ts
heading: string = 'Team Members';
```
##### accountOnboarding.account.users.nameLabel
```ts
nameLabel: string = 'Full name';
```
##### accountOnboarding.account.users.namePlaceholder
```ts
namePlaceholder: string = 'John Doe';
```
##### accountOnboarding.account.users.nameRequired
```ts
nameRequired: string = 'Name is required';
```
##### accountOnboarding.account.users.noUsers
```ts
noUsers: string = 'No team members added yet.';
```
##### accountOnboarding.account.users.removeUser
```ts
removeUser: string = 'Remove';
```
##### accountOnboarding.account.users.roleAdmin
```ts
roleAdmin: string = 'Admin';
```
##### accountOnboarding.account.users.roleLabel
```ts
roleLabel: string = 'Role';
```
##### accountOnboarding.account.users.roleUser
```ts
roleUser: string = 'User';
```
##### accountOnboarding.breadcrumbAriaLabel
```ts
breadcrumbAriaLabel: string = 'Onboarding progress';
```
##### accountOnboarding.complete
```ts
complete: object;
```
##### accountOnboarding.complete.e911
```ts
e911: object;
```
##### accountOnboarding.complete.e911.addressStandardized
```ts
addressStandardized: string = 'Your address was standardized for emergency services accuracy.';
```
##### accountOnboarding.complete.e911.deferred
```ts
deferred: string = 'E911 emergency services have not been fully configured. Each location with a phone number needs a verified emergency address before your phone service can be activated.';
```
##### accountOnboarding.complete.e911.errorDescription
```ts
errorDescription: string = 'There was an error configuring emergency services. You can retry or configure manually later.';
```
##### accountOnboarding.complete.e911.errorTitle
```ts
errorTitle: string = 'E911 configuration failed';
```
##### accountOnboarding.complete.e911.loading
```ts
loading: string = 'Configuring emergency services...';
```
##### accountOnboarding.complete.e911.pendingAfterPolling
```ts
pendingAfterPolling: string = 'E911 registration submitted. Your phone service is active — emergency address verification will complete shortly.';
```
##### accountOnboarding.complete.e911.pollingStatus
```ts
pollingStatus: string = 'Verifying emergency services registration...';
```
##### accountOnboarding.complete.e911.primaryAssigned
```ts
primaryAssigned: string = 'assigned as primary number for';
```
##### accountOnboarding.complete.e911.processing
```ts
processing: string = 'E911 registration is being processed. This may take a few minutes.';
```
##### accountOnboarding.complete.e911.retryButton
```ts
retryButton: string = 'Retry';
```
##### accountOnboarding.complete.e911.verified
```ts
verified: string = 'E911 emergency address is verified.';
```
##### accountOnboarding.complete.subtitle
```ts
subtitle: string = "It's time to start using your embedded voice system";
```
##### accountOnboarding.complete.title
```ts
title: string = 'Wahoo!';
```
##### accountOnboarding.error
```ts
error: object;
```
##### accountOnboarding.error.description
```ts
description: string = 'Something went wrong loading the onboarding wizard.';
```
##### accountOnboarding.error.retry
```ts
retry: string = 'Try Again';
```
##### accountOnboarding.error.title
```ts
title: string = 'Unable to Load';
```
##### accountOnboarding.hardware
```ts
hardware: object;
```
##### accountOnboarding.hardware.addDeviceButton
```ts
addDeviceButton: string = '+ Add Device';
```
##### accountOnboarding.hardware.addHandsetButton
```ts
addHandsetButton: string = '+ Handset';
```
##### accountOnboarding.hardware.allAssigned
```ts
allAssigned: string = 'All devices have been assigned';
```
##### accountOnboarding.hardware.assignAndComplete
```ts
assignAndComplete: string = 'Assign & Complete';
```
##### accountOnboarding.hardware.availableDevices
```ts
availableDevices: string = 'Available Devices';
```
##### accountOnboarding.hardware.cancel
```ts
cancel: string = 'Cancel';
```
##### accountOnboarding.hardware.clickToAssign
```ts
clickToAssign: string = 'Click to assign';
```
##### accountOnboarding.hardware.cordless
```ts
cordless: string = 'Cordless';
```
##### accountOnboarding.hardware.dectBase
```ts
dectBase: string = 'Cordless Base';
```
##### accountOnboarding.hardware.deskPhone
```ts
deskPhone: string = 'Desk phone';
```
##### accountOnboarding.hardware.deviceNotFound
```ts
deviceNotFound: string = 'Device was created but could not be found. Please try again.';
```
##### accountOnboarding.hardware.dragDropHint
```ts
dragDropHint: string = 'Drag and drop device here';
```
##### accountOnboarding.hardware.duplicateMac
```ts
duplicateMac: string = 'This MAC address is already registered.';
```
##### accountOnboarding.hardware.gate
```ts
gate: object;
```
##### accountOnboarding.hardware.gate.noDevices
```ts
noDevices: string = 'No devices are available for your account. Please contact support to add devices before completing this step.';
```
##### accountOnboarding.hardware.handset
```ts
handset: string = 'handset';
```
##### accountOnboarding.hardware.handsets
```ts
handsets: string = 'handsets';
```
##### accountOnboarding.hardware.invalidIpei
```ts
invalidIpei: string = 'Enter a valid IPEI (hex digits only).';
```
##### accountOnboarding.hardware.invalidMac
```ts
invalidMac: string = 'Enter a valid 12-digit MAC address.';
```
##### accountOnboarding.hardware.ipeiLabel
```ts
ipeiLabel: string = 'Handset IPEI';
```
##### accountOnboarding.hardware.ipeiNotMac
```ts
ipeiNotMac: string = 'This looks like a MAC address, not an IPEI. An IPEI looks like 03AABB1234567890CCDD.';
```
##### accountOnboarding.hardware.ipeiPlaceholder
```ts
ipeiPlaceholder: string = '03AABB1234567890CCDD';
```
##### accountOnboarding.hardware.isDectBase
```ts
isDectBase: string = 'This is a cordless handset base station';
```
##### accountOnboarding.hardware.macLabel
```ts
macLabel: string = 'MAC Address';
```
##### accountOnboarding.hardware.macPlaceholder
```ts
macPlaceholder: string = '00:04:13:AA:BB:CC';
```
##### accountOnboarding.hardware.noDevices
```ts
noDevices: string = 'No devices are available for your account at the moment.';
```
##### accountOnboarding.hardware.noUsers
```ts
noUsers: string = 'No team members found. Add team members in the Account step first.';
```
##### accountOnboarding.hardware.removeBaseFailed
```ts
removeBaseFailed: string = 'Failed to remove cordless base.';
```
##### accountOnboarding.hardware.removeDevice
```ts
removeDevice: string = 'Remove';
```
##### accountOnboarding.hardware.save
```ts
save: string = 'Save';
```
##### accountOnboarding.hardware.saving
```ts
saving: string = 'Saving...';
```
##### accountOnboarding.hardware.selectUser
```ts
selectUser: string = 'Select a team member';
```
##### accountOnboarding.hardware.selectUserRequired
```ts
selectUserRequired: string = 'Please select a team member.';
```
##### accountOnboarding.hardware.shippingAddress
```ts
shippingAddress: string = 'Shipping Address';
```
##### accountOnboarding.hardware.submitOrder
```ts
submitOrder: string = 'Submit Order';
```
##### accountOnboarding.hardware.submitting
```ts
submitting: string = 'Submitting...';
```
##### accountOnboarding.hardware.subtitle
```ts
subtitle: string = 'Drag and drop devices to assign them to team members';
```
##### accountOnboarding.hardware.tableHeaderDevice
```ts
tableHeaderDevice: string = 'Assigned Device';
```
##### accountOnboarding.hardware.tableHeaderExtension
```ts
tableHeaderExtension: string = 'Extension';
```
##### accountOnboarding.hardware.tableHeaderName
```ts
tableHeaderName: string = 'Full name';
```
##### accountOnboarding.hardware.title
```ts
title: string = 'Assign Devices';
```
##### accountOnboarding.hardware.unassign
```ts
unassign: string = 'Unassign';
```
##### accountOnboarding.hardware.unsupportedVendor
```ts
unsupportedVendor: string = 'This device is not currently supported. Our support team has been notified and will follow up.';
```
##### accountOnboarding.hardware.userLabel
```ts
userLabel: string = 'Team Member';
```
##### accountOnboarding.legal
```ts
legal: object;
```
##### accountOnboarding.legal.and
```ts
and: string = 'and';
```
##### accountOnboarding.legal.prefix
```ts
prefix: string = 'By continuing, you agree to the';
```
##### accountOnboarding.legal.privacyPolicy
```ts
privacyPolicy: string = 'Privacy Policy';
```
##### accountOnboarding.legal.recipientTerms
```ts
recipientTerms: string = 'Recipient Terms of Service';
```
##### accountOnboarding.legal.termsOfService
```ts
termsOfService: string = 'Terms of Service';
```
##### accountOnboarding.loading
```ts
loading: string = 'Loading...';
```
##### accountOnboarding.nav
```ts
nav: object;
```
##### accountOnboarding.nav.back
```ts
back: string = 'Back';
```
##### accountOnboarding.nav.exit
```ts
exit: string = 'Finish';
```
##### accountOnboarding.nav.next
```ts
next: string = 'Next';
```
##### accountOnboarding.nav.skip
```ts
skip: string = 'Skip';
```
##### accountOnboarding.numbers
```ts
numbers: object;
```
##### accountOnboarding.numbers.callerId
```ts
callerId: object;
```
##### accountOnboarding.numbers.callerId.alreadySet
```ts
alreadySet: string = 'Already configured';
```
##### accountOnboarding.numbers.callerId.charCount
```ts
charCount: string = '{count}/15';
```
##### accountOnboarding.numbers.callerId.directoryListing
```ts
directoryListing: object;
```
##### accountOnboarding.numbers.callerId.directoryListing.info
```ts
info: string = 'To update your directory listing, contact {platformName} support.';
```
##### accountOnboarding.numbers.callerId.directoryListing.title
```ts
title: string = 'Directory Listing (DA/DL)';
```
##### accountOnboarding.numbers.callerId.error
```ts
error: object;
```
##### accountOnboarding.numbers.callerId.error.conflict
```ts
conflict: string = 'A caller ID update is already in progress for this number.';
```
##### accountOnboarding.numbers.callerId.error.submitFailed
```ts
submitFailed: string = 'Failed to set caller ID. Please try again.';
```
##### accountOnboarding.numbers.callerId.inputHelp
```ts
inputHelp: string = 'Max 15 characters. Letters, numbers, spaces, and hyphens only.';
```
##### accountOnboarding.numbers.callerId.inputLabel
```ts
inputLabel: string = 'Caller ID Name';
```
##### accountOnboarding.numbers.callerId.inputPlaceholder
```ts
inputPlaceholder: string = 'e.g. ACME Corp';
```
##### accountOnboarding.numbers.callerId.noDIDs
```ts
noDIDs: string = 'No active phone numbers to configure.';
```
##### accountOnboarding.numbers.callerId.partialError
```ts
partialError: string = 'Some caller IDs could not be set. Fix errors and retry, or skip.';
```
##### accountOnboarding.numbers.callerId.skipCallerId
```ts
skipCallerId: string = 'Skip';
```
##### accountOnboarding.numbers.callerId.submit
```ts
submit: string = 'Set Caller ID';
```
##### accountOnboarding.numbers.callerId.submitAll
```ts
submitAll: string = 'Set All Caller IDs';
```
##### accountOnboarding.numbers.callerId.submitted
```ts
submitted: string = 'Submitted';
```
##### accountOnboarding.numbers.callerId.submitting
```ts
submitting: string = 'Submitting...';
```
##### accountOnboarding.numbers.callerId.submittingAll
```ts
submittingAll: string = 'Submitting caller IDs...';
```
##### accountOnboarding.numbers.callerId.subtitle
```ts
subtitle: string = 'Configure the name displayed when making outbound calls';
```
##### accountOnboarding.numbers.callerId.title
```ts
title: string = 'Caller ID Setup';
```
##### accountOnboarding.numbers.callerId.validation
```ts
validation: object;
```
##### accountOnboarding.numbers.callerId.validation.invalidChars
```ts
invalidChars: string = 'Only letters, numbers, spaces, and hyphens allowed';
```
##### accountOnboarding.numbers.callerId.validation.required
```ts
required: string = 'Caller ID name is required';
```
##### accountOnboarding.numbers.callerId.validation.tooLong
```ts
tooLong: string = 'Must be 15 characters or fewer';
```
##### accountOnboarding.numbers.defaultDialPlanName
```ts
defaultDialPlanName: string = 'Onboarding Dial Plan';
```
##### accountOnboarding.numbers.directoryListing
```ts
directoryListing: object;
```
##### accountOnboarding.numbers.directoryListing.businessName
```ts
businessName: string = 'Business Name';
```
##### accountOnboarding.numbers.directoryListing.businessNameHelp
```ts
businessNameHelp: string = 'The name shown in directory listings and used for caller verification. Max 200 characters.';
```
##### accountOnboarding.numbers.directoryListing.businessNamePlaceholder
```ts
businessNamePlaceholder: string = 'Enter business name for listing';
```
##### accountOnboarding.numbers.directoryListing.noDIDs
```ts
noDIDs: string = 'No eligible phone numbers to configure.';
```
##### accountOnboarding.numbers.directoryListing.noneOption
```ts
noneOption: string = 'None \u2014 skip directory listing';
```
##### accountOnboarding.numbers.directoryListing.selectPrompt
```ts
selectPrompt: string = 'Select which number should be listed:';
```
##### accountOnboarding.numbers.directoryListing.subtitle
```ts
subtitle: string = 'A directory listing feeds your business information into online directories and data aggregators, helping customers find you. It also reduces the chance of your outbound calls being flagged as spam by call-screening apps.';
```
##### accountOnboarding.numbers.directoryListing.title
```ts
title: string = 'Directory Listing';
```
##### accountOnboarding.numbers.directoryListing.validation
```ts
validation: object;
```
##### accountOnboarding.numbers.directoryListing.validation.nameRequired
```ts
nameRequired: string = 'Business name is required for the directory listing.';
```
##### accountOnboarding.numbers.gate
```ts
gate: object;
```
##### accountOnboarding.numbers.gate.noDIDsAvailable
```ts
noDIDsAvailable: string = 'You need at least one phone number before selecting a primary number. Order or port a number first.';
```
##### accountOnboarding.numbers.gate.primaryRequired
```ts
primaryRequired: string = 'Please select a primary number to continue.';
```
##### accountOnboarding.numbers.nav
```ts
nav: object;
```
##### accountOnboarding.numbers.nav.back
```ts
back: string = 'Back';
```
##### accountOnboarding.numbers.nav.backToSearch
```ts
backToSearch: string = 'Back to Search';
```
##### accountOnboarding.numbers.nav.cancel
```ts
cancel: string = 'Cancel';
```
##### accountOnboarding.numbers.nav.confirm
```ts
confirm: string = 'Confirm';
```
##### accountOnboarding.numbers.nav.next
```ts
next: string = 'Next';
```
##### accountOnboarding.numbers.order
```ts
order: object;
```
##### accountOnboarding.numbers.order.areaCodeLabel
```ts
areaCodeLabel: string = 'Area Code';
```
##### accountOnboarding.numbers.order.areaCodePlaceholder
```ts
areaCodePlaceholder: string = '212';
```
##### accountOnboarding.numbers.order.carrierNote
```ts
carrierNote: string = 'Your order will be submitted to the carrier for fulfillment. This usually completes within seconds but may take longer.';
```
##### accountOnboarding.numbers.order.confirmSubtitle
```ts
confirmSubtitle: string = 'You are about to order {count} phone numbers';
```
##### accountOnboarding.numbers.order.confirmSubtitle\_one
```ts
confirmSubtitle_one: string = 'You are about to order {count} phone number';
```
##### accountOnboarding.numbers.order.confirmSubtitle\_other
```ts
confirmSubtitle_other: string = 'You are about to order {count} phone numbers';
```
##### accountOnboarding.numbers.order.confirmTitle
```ts
confirmTitle: string = 'Confirm Your Order';
```
##### accountOnboarding.numbers.order.continue
```ts
continue: string = 'Continue';
```
##### accountOnboarding.numbers.order.deselectAll
```ts
deselectAll: string = 'Deselect All';
```
##### accountOnboarding.numbers.order.done
```ts
done: string = 'Done';
```
##### accountOnboarding.numbers.order.error
```ts
error: string = 'An error occurred while placing the order.';
```
##### accountOnboarding.numbers.order.noResults
```ts
noResults: string = 'No numbers found. Try a different search.';
```
##### accountOnboarding.numbers.order.ordering
```ts
ordering: string = 'Ordering...';
```
##### accountOnboarding.numbers.order.orderMore
```ts
orderMore: string = 'Order More Numbers';
```
##### accountOnboarding.numbers.order.placeOrder
```ts
placeOrder: string = 'Place Order';
```
##### accountOnboarding.numbers.order.placing
```ts
placing: string = 'Placing Order...';
```
##### accountOnboarding.numbers.order.quantityLabel
```ts
quantityLabel: string = 'Quantity';
```
##### accountOnboarding.numbers.order.resultsSubtitle
```ts
resultsSubtitle: string = 'Select the numbers you would like to order.';
```
##### accountOnboarding.numbers.order.resultsTitle
```ts
resultsTitle: string = 'Available Numbers';
```
##### accountOnboarding.numbers.order.search
```ts
search: string = 'Search';
```
##### accountOnboarding.numbers.order.searchByAreaCode
```ts
searchByAreaCode: string = 'Area Code';
```
##### accountOnboarding.numbers.order.searchByZip
```ts
searchByZip: string = 'ZIP Code';
```
##### accountOnboarding.numbers.order.searching
```ts
searching: string = 'Searching...';
```
##### accountOnboarding.numbers.order.searchSubtitle
```ts
searchSubtitle: string = 'Find available numbers by entering an area code or ZIP code';
```
##### accountOnboarding.numbers.order.searchTitle
```ts
searchTitle: string = 'Search Available Numbers';
```
##### accountOnboarding.numbers.order.selectAll
```ts
selectAll: string = 'Select All';
```
##### accountOnboarding.numbers.order.selected
```ts
selected: string = 'selected';
```
##### accountOnboarding.numbers.order.state
```ts
state: string = 'State';
```
##### accountOnboarding.numbers.order.statusComplete
```ts
statusComplete: string = 'Your numbers have been activated.';
```
##### accountOnboarding.numbers.order.statusFailed
```ts
statusFailed: string = 'The order could not be completed.';
```
##### accountOnboarding.numbers.order.statusPartial
```ts
statusPartial: string = 'Some numbers were activated, but others failed.';
```
##### accountOnboarding.numbers.order.statusPending
```ts
statusPending: string = 'Your order has been submitted to the carrier. Fulfillment usually completes within seconds but may take longer.';
```
##### accountOnboarding.numbers.order.statusStalled
```ts
statusStalled: string = 'Your order has been submitted to the carrier. Fulfillment usually completes within seconds but may take longer.';
```
##### accountOnboarding.numbers.order.statusTitle
```ts
statusTitle: string = 'Order Submitted';
```
##### accountOnboarding.numbers.order.zipLabel
```ts
zipLabel: string = 'ZIP Code';
```
##### accountOnboarding.numbers.order.zipPlaceholder
```ts
zipPlaceholder: string = '10001';
```
##### accountOnboarding.numbers.overview
```ts
overview: object;
```
##### accountOnboarding.numbers.overview.empty
```ts
empty: string = 'No telephone numbers yet. Request new numbers or port your existing ones.';
```
##### accountOnboarding.numbers.overview.heading
```ts
heading: string = 'Your Numbers';
```
##### accountOnboarding.numbers.overview.loadError
```ts
loadError: string = 'Failed to load telephone numbers. Please try again.';
```
##### accountOnboarding.numbers.overview.phoneNumber
```ts
phoneNumber: string = 'Phone Number';
```
##### accountOnboarding.numbers.overview.portExisting
```ts
portExisting: string = 'Port Existing Number';
```
##### accountOnboarding.numbers.overview.portExistingDesc
```ts
portExistingDesc: string = 'Transfer your current business number to {platformName}. This typically takes 5–10 business days.';
```
##### accountOnboarding.numbers.overview.requestNew
```ts
requestNew: string = 'Request New Numbers';
```
##### accountOnboarding.numbers.overview.requestNewDesc
```ts
requestNewDesc: string = 'Get new business phone numbers instantly. Choose from available numbers in your area.';
```
##### accountOnboarding.numbers.overview.retry
```ts
retry: string = 'Retry';
```
##### accountOnboarding.numbers.overview.source
```ts
source: string = 'Source';
```
##### accountOnboarding.numbers.overview.status
```ts
status: string = 'Status';
```
##### accountOnboarding.numbers.overview.temporaryBanner
```ts
temporaryBanner: string = 'A temporary number has been assigned to your account while you set up your permanent numbers.';
```
##### accountOnboarding.numbers.overview.type
```ts
type: string = 'Type';
```
##### accountOnboarding.numbers.port
```ts
port: object;
```
##### accountOnboarding.numbers.port.accountNumberLabel
```ts
accountNumberLabel: string = 'Account Number';
```
##### accountOnboarding.numbers.port.accountNumberPlaceholder
```ts
accountNumberPlaceholder: string = 'From your current carrier';
```
##### accountOnboarding.numbers.port.accountRequired
```ts
accountRequired: string = 'Account # Required';
```
##### accountOnboarding.numbers.port.addAnother
```ts
addAnother: string = 'Add another number';
```
##### accountOnboarding.numbers.port.addressHeading
```ts
addressHeading: string = 'Service Address';
```
##### accountOnboarding.numbers.port.approve
```ts
approve: string = 'Approve & Submit';
```
##### accountOnboarding.numbers.port.approverNameLabel
```ts
approverNameLabel: string = 'Authorized Contact';
```
##### accountOnboarding.numbers.port.approverNamePlaceholder
```ts
approverNamePlaceholder: string = 'John Doe';
```
##### accountOnboarding.numbers.port.backToOverview
```ts
backToOverview: string = 'Back to Numbers';
```
##### accountOnboarding.numbers.port.billCopyDesc
```ts
billCopyDesc: string = 'A recent bill from your current carrier showing the numbers to be ported.';
```
##### accountOnboarding.numbers.port.billCopyLabel
```ts
billCopyLabel: string = 'Phone Bill Copy';
```
##### accountOnboarding.numbers.port.billCopyRequired
```ts
billCopyRequired: string = 'Required';
```
##### accountOnboarding.numbers.port.btnLabel
```ts
btnLabel: string = 'Billing Telephone Number (BTN)';
```
##### accountOnboarding.numbers.port.btnPlaceholder
```ts
btnPlaceholder: string = '(555) 123-4567';
```
##### accountOnboarding.numbers.port.businessNameLabel
```ts
businessNameLabel: string = 'Business Name';
```
##### accountOnboarding.numbers.port.businessNamePlaceholder
```ts
businessNamePlaceholder: string = 'Acme Corp';
```
##### accountOnboarding.numbers.port.carrier
```ts
carrier: string = 'Current Carrier';
```
##### accountOnboarding.numbers.port.carrierContinue
```ts
carrierContinue: string = 'Continue';
```
##### accountOnboarding.numbers.port.carrierGroupsSubtitle
```ts
carrierGroupsSubtitle: string = 'Your numbers are with different carriers. Each carrier requires a separate port request.';
```
##### accountOnboarding.numbers.port.carrierGroupsTitle
```ts
carrierGroupsTitle: string = 'Carrier Groups';
```
##### accountOnboarding.numbers.port.carrierStart
```ts
carrierStart: string = 'Start';
```
##### accountOnboarding.numbers.port.carrierSubmitted
```ts
carrierSubmitted: string = 'Submitted';
```
##### accountOnboarding.numbers.port.checkEligibility
```ts
checkEligibility: string = 'Check Eligibility';
```
##### accountOnboarding.numbers.port.checking
```ts
checking: string = 'Checking...';
```
##### accountOnboarding.numbers.port.cityLabel
```ts
cityLabel: string = 'City';
```
##### accountOnboarding.numbers.port.cityPlaceholder
```ts
cityPlaceholder: string = 'New York';
```
##### accountOnboarding.numbers.port.continueWithPortable
```ts
continueWithPortable: string = 'Continue with Portable Numbers';
```
##### accountOnboarding.numbers.port.csrDesc
```ts
csrDesc: string = 'Optional but recommended — speeds up the porting process.';
```
##### accountOnboarding.numbers.port.csrLabel
```ts
csrLabel: string = 'Customer Service Record (CSR)';
```
##### accountOnboarding.numbers.port.csrOptional
```ts
csrOptional: string = 'Optional';
```
##### accountOnboarding.numbers.port.documentsSection
```ts
documentsSection: string = 'Documents';
```
##### accountOnboarding.numbers.port.documentsSubtitle
```ts
documentsSubtitle: string = 'Upload your latest phone bill and optionally a Customer Service Record (CSR).';
```
##### accountOnboarding.numbers.port.documentsTitle
```ts
documentsTitle: string = 'Supporting Documents';
```
##### accountOnboarding.numbers.port.eligibilitySubtitle
```ts
eligibilitySubtitle: string = 'Review which numbers can be ported.';
```
##### accountOnboarding.numbers.port.eligibilityTitle
```ts
eligibilityTitle: string = 'Port Eligibility';
```
##### accountOnboarding.numbers.port.fileSelected
```ts
fileSelected: string = 'Selected:';
```
##### accountOnboarding.numbers.port.focDateLabel
```ts
focDateLabel: string = 'Port Date';
```
##### accountOnboarding.numbers.port.focSection
```ts
focSection: string = 'Port Date';
```
##### accountOnboarding.numbers.port.focSubtitle
```ts
focSubtitle: string = 'Choose when you want the numbers transferred. Must be at least 5 business days out.';
```
##### accountOnboarding.numbers.port.focTimeLabel
```ts
focTimeLabel: string = 'Port Time (Eastern)';
```
##### accountOnboarding.numbers.port.focTimePlaceholder
```ts
focTimePlaceholder: string = 'Select time';
```
##### accountOnboarding.numbers.port.focTitle
```ts
focTitle: string = 'Requested Port Date';
```
##### accountOnboarding.numbers.port.houseNumberLabel
```ts
houseNumberLabel: string = 'Street Number';
```
##### accountOnboarding.numbers.port.houseNumberPlaceholder
```ts
houseNumberPlaceholder: string = '123';
```
##### accountOnboarding.numbers.port.line2Label
```ts
line2Label: string = 'Suite / Unit';
```
##### accountOnboarding.numbers.port.line2Placeholder
```ts
line2Placeholder: string = 'Suite 100';
```
##### accountOnboarding.numbers.port.noFileSelected
```ts
noFileSelected: string = 'No file selected';
```
##### accountOnboarding.numbers.port.noPortable
```ts
noPortable: string = 'None of the entered numbers are eligible for porting.';
```
##### accountOnboarding.numbers.port.notPortable
```ts
notPortable: string = 'Not Portable';
```
##### accountOnboarding.numbers.port.numberPlural
```ts
numberPlural: string = 'numbers';
```
##### accountOnboarding.numbers.port.numberSingular
```ts
numberSingular: string = 'number';
```
##### accountOnboarding.numbers.port.numbersSection
```ts
numbersSection: string = 'Numbers';
```
##### accountOnboarding.numbers.port.numbersSubtitle
```ts
numbersSubtitle: string = 'Enter the phone numbers you want to transfer to {platformName}.';
```
##### accountOnboarding.numbers.port.numbersTitle
```ts
numbersTitle: string = 'Numbers to Port';
```
##### accountOnboarding.numbers.port.phoneLabel
```ts
phoneLabel: string = 'Phone Number';
```
##### accountOnboarding.numbers.port.phonePlaceholder
```ts
phonePlaceholder: string = '(555) 123-4567';
```
##### accountOnboarding.numbers.port.pinLabel
```ts
pinLabel: string = 'Account PIN';
```
##### accountOnboarding.numbers.port.pinPlaceholder
```ts
pinPlaceholder: string = '1234';
```
##### accountOnboarding.numbers.port.portable
```ts
portable: string = 'Portable';
```
##### accountOnboarding.numbers.port.removeNumber
```ts
removeNumber: string = 'Remove';
```
##### accountOnboarding.numbers.port.reviewSubtitle
```ts
reviewSubtitle: string = 'Verify all details before submitting your port request.';
```
##### accountOnboarding.numbers.port.reviewTitle
```ts
reviewTitle: string = 'Review & Approve';
```
##### accountOnboarding.numbers.port.signatureHelp
```ts
signatureHelp: string = 'By signing, you authorize the transfer of the listed numbers to {platformName}.';
```
##### accountOnboarding.numbers.port.signatureLabel
```ts
signatureLabel: string = 'Electronic Signature';
```
##### accountOnboarding.numbers.port.signaturePlaceholder
```ts
signaturePlaceholder: string = 'Type your full legal name';
```
##### accountOnboarding.numbers.port.stateLabel
```ts
stateLabel: string = 'State';
```
##### accountOnboarding.numbers.port.statePlaceholder
```ts
statePlaceholder: string = 'Select state';
```
##### accountOnboarding.numbers.port.streetNameLabel
```ts
streetNameLabel: string = 'Street Name';
```
##### accountOnboarding.numbers.port.streetNamePlaceholder
```ts
streetNamePlaceholder: string = 'Main St';
```
##### accountOnboarding.numbers.port.submittedStatus
```ts
submittedStatus: string = 'Status';
```
##### accountOnboarding.numbers.port.submittedSubtitle
```ts
submittedSubtitle: string = 'Your port request has been submitted and is being processed.';
```
##### accountOnboarding.numbers.port.submittedTitle
```ts
submittedTitle: string = 'Port Request Submitted';
```
##### accountOnboarding.numbers.port.submitting
```ts
submitting: string = 'Submitting...';
```
##### accountOnboarding.numbers.port.subscriberSection
```ts
subscriberSection: string = 'Subscriber';
```
##### accountOnboarding.numbers.port.subscriberSubtitle
```ts
subscriberSubtitle: string = 'Enter the details exactly as they appear on your current phone bill.';
```
##### accountOnboarding.numbers.port.subscriberTitle
```ts
subscriberTitle: string = 'Subscriber Information';
```
##### accountOnboarding.numbers.port.uploadFile
```ts
uploadFile: string = 'Choose File';
```
##### accountOnboarding.numbers.port.uploading
```ts
uploading: string = 'Uploading...';
```
##### accountOnboarding.numbers.port.wireless
```ts
wireless: string = 'Wireless';
```
##### accountOnboarding.numbers.port.wirelessNo
```ts
wirelessNo: string = 'No';
```
##### accountOnboarding.numbers.port.wirelessYes
```ts
wirelessYes: string = 'Yes';
```
##### accountOnboarding.numbers.port.zipLabel
```ts
zipLabel: string = 'ZIP Code';
```
##### accountOnboarding.numbers.port.zipPlaceholder
```ts
zipPlaceholder: string = '10001';
```
##### accountOnboarding.numbers.primaryNumber
```ts
primaryNumber: object;
```
##### accountOnboarding.numbers.primaryNumber.autoMatched
```ts
autoMatched: string = '{phone} matches your account phone and has been selected as the primary number for E911.';
```
##### accountOnboarding.numbers.primaryNumber.autoMatchedBadge
```ts
autoMatchedBadge: string = 'Account number — auto-selected';
```
##### accountOnboarding.numbers.primaryNumber.description
```ts
description: string = 'Select the primary phone number for this location. This number is registered with E911 emergency services.';
```
##### accountOnboarding.numbers.primaryNumber.heading
```ts
heading: string = 'Primary Number';
```
##### accountOnboarding.numbers.primaryNumber.loading
```ts
loading: string = 'Loading phone numbers...';
```
##### accountOnboarding.numbers.primaryNumber.noDIDs
```ts
noDIDs: string = 'No active phone numbers available yet. E911 will be configured once numbers are provisioned.';
```
##### accountOnboarding.numbers.primaryNumber.temporary
```ts
temporary: string = 'Temporary';
```
##### accountOnboarding.numbers.primaryNumber.temporaryNote
```ts
temporaryNote: string = 'This is a temporary number assigned to get you started. You can replace it with a permanent number at any time.';
```
##### accountOnboarding.numbers.source
```ts
source: object;
```
##### accountOnboarding.numbers.source.did
```ts
did: string = 'Account';
```
##### accountOnboarding.numbers.source.didTemporary
```ts
didTemporary: string = 'Temporary';
```
##### accountOnboarding.numbers.source.number\_order
```ts
number_order: string = 'New Order';
```
##### accountOnboarding.numbers.source.port\_order
```ts
port_order: string = 'Port';
```
##### accountOnboarding.numbers.status
```ts
status: object;
```
##### accountOnboarding.numbers.status.active
```ts
active: string = 'Active';
```
##### accountOnboarding.numbers.status.inactive
```ts
inactive: string = 'Inactive';
```
##### accountOnboarding.numbers.status.order\_failed
```ts
order_failed: string = 'Order Failed';
```
##### accountOnboarding.numbers.status.ordering
```ts
ordering: string = 'Ordering';
```
##### accountOnboarding.numbers.status.porting\_approved
```ts
porting_approved: string = 'Port Approved';
```
##### accountOnboarding.numbers.status.porting\_draft
```ts
porting_draft: string = 'Port Draft';
```
##### accountOnboarding.numbers.status.porting\_exception
```ts
porting_exception: string = 'Port Exception';
```
##### accountOnboarding.numbers.status.porting\_foc
```ts
porting_foc: string = 'Port Scheduled';
```
##### accountOnboarding.numbers.status.porting\_submitted
```ts
porting_submitted: string = 'Port Submitted';
```
##### accountOnboarding.numbers.status.released
```ts
released: string = 'Released';
```
##### accountOnboarding.numbers.subtitle
```ts
subtitle: string = "Choose how you'd like to set up your business numbers";
```
##### accountOnboarding.numbers.title
```ts
title: string = 'Phone Numbers';
```
##### accountOnboarding.numbers.validation
```ts
validation: object;
```
##### accountOnboarding.numbers.validation.approverNameRequired
```ts
approverNameRequired: string = 'Authorized contact name is required.';
```
##### accountOnboarding.numbers.validation.areaCodeFormat
```ts
areaCodeFormat: string = 'Enter a 3-digit area code.';
```
##### accountOnboarding.numbers.validation.areaCodeRequired
```ts
areaCodeRequired: string = 'Area code is required.';
```
##### accountOnboarding.numbers.validation.billCopyRequired
```ts
billCopyRequired: string = 'A phone bill copy is required.';
```
##### accountOnboarding.numbers.validation.btnInvalid
```ts
btnInvalid: string = 'Enter a valid US phone number.';
```
##### accountOnboarding.numbers.validation.btnRequired
```ts
btnRequired: string = 'BTN is required.';
```
##### accountOnboarding.numbers.validation.businessNameRequired
```ts
businessNameRequired: string = 'Business name is required.';
```
##### accountOnboarding.numbers.validation.cityRequired
```ts
cityRequired: string = 'City is required.';
```
##### accountOnboarding.numbers.validation.eligibilityError
```ts
eligibilityError: string = 'Failed to check eligibility. Please try again.';
```
##### accountOnboarding.numbers.validation.focDateRequired
```ts
focDateRequired: string = 'Port date is required.';
```
##### accountOnboarding.numbers.validation.focDateTooFar
```ts
focDateTooFar: string = 'Port date must be within 30 days.';
```
##### accountOnboarding.numbers.validation.focDateTooSoon
```ts
focDateTooSoon: string = 'Port date must be at least 5 business days from today.';
```
##### accountOnboarding.numbers.validation.focTimeRequired
```ts
focTimeRequired: string = 'Port time is required.';
```
##### accountOnboarding.numbers.validation.houseNumberRequired
```ts
houseNumberRequired: string = 'Street number is required.';
```
##### accountOnboarding.numbers.validation.phoneDuplicate
```ts
phoneDuplicate: string = 'This number has already been entered.';
```
##### accountOnboarding.numbers.validation.phoneInvalid
```ts
phoneInvalid: string = 'Enter a valid US phone number.';
```
##### accountOnboarding.numbers.validation.phoneRequired
```ts
phoneRequired: string = 'At least one phone number is required.';
```
##### accountOnboarding.numbers.validation.selectAtLeastOne
```ts
selectAtLeastOne: string = 'Select at least one number.';
```
##### accountOnboarding.numbers.validation.signatureRequired
```ts
signatureRequired: string = 'Signature is required.';
```
##### accountOnboarding.numbers.validation.stateRequired
```ts
stateRequired: string = 'State is required.';
```
##### accountOnboarding.numbers.validation.streetNameRequired
```ts
streetNameRequired: string = 'Street name is required.';
```
##### accountOnboarding.numbers.validation.submitError
```ts
submitError: string = 'Failed to submit port request. Please try again.';
```
##### accountOnboarding.numbers.validation.zipFormat
```ts
zipFormat: string = 'Enter a 5-digit ZIP code.';
```
##### accountOnboarding.numbers.validation.zipRequired
```ts
zipRequired: string = 'ZIP code is required.';
```
##### accountOnboarding.sidebar
```ts
sidebar: object;
```
##### accountOnboarding.sidebar.businessDetails
```ts
businessDetails: string = 'Business Details';
```
##### accountOnboarding.sidebar.businessDetailsDesc
```ts
businessDetailsDesc: string = 'Enter your company information';
```
##### accountOnboarding.sidebar.callerId
```ts
callerId: string = 'Caller ID';
```
##### accountOnboarding.sidebar.callerIdDesc
```ts
callerIdDesc: string = 'Set caller ID for your numbers';
```
##### accountOnboarding.sidebar.deviceAssignment
```ts
deviceAssignment: string = 'Device Assignment';
```
##### accountOnboarding.sidebar.deviceAssignmentDesc
```ts
deviceAssignmentDesc: string = 'Assign devices to users';
```
##### accountOnboarding.sidebar.directoryListing
```ts
directoryListing: string = 'Directory Listing';
```
##### accountOnboarding.sidebar.directoryListingDesc
```ts
directoryListingDesc: string = 'Configure 411 directory listing';
```
##### accountOnboarding.sidebar.finalCompletion
```ts
finalCompletion: string = 'Final Completion';
```
##### accountOnboarding.sidebar.finalCompletionDesc
```ts
finalCompletionDesc: string = 'Complete your onboarding';
```
##### accountOnboarding.sidebar.numberOptions
```ts
numberOptions: string = 'Number Options';
```
##### accountOnboarding.sidebar.numberOptionsDesc
```ts
numberOptionsDesc: string = 'Choose to port existing or get new numbers';
```
##### accountOnboarding.sidebar.numberSetup
```ts
numberSetup: string = 'Number Setup';
```
##### accountOnboarding.sidebar.numberSetupDesc
```ts
numberSetupDesc: string = 'Configure your phone numbers';
```
##### accountOnboarding.sidebar.primaryNumber
```ts
primaryNumber: string = 'Primary Number';
```
##### accountOnboarding.sidebar.primaryNumberDesc
```ts
primaryNumberDesc: string = 'Select your main E911 number';
```
##### accountOnboarding.sidebar.teamMembers
```ts
teamMembers: string = 'Team Members';
```
##### accountOnboarding.sidebar.teamMembersDesc
```ts
teamMembersDesc: string = 'Add users and assign extensions';
```
##### accountOnboarding.sidebar.verification
```ts
verification: string = 'Verification';
```
##### accountOnboarding.sidebar.verificationDesc
```ts
verificationDesc: string = 'Verify number status';
```
##### accountOnboarding.stepComplete
```ts
stepComplete: object;
```
##### accountOnboarding.stepComplete.done
```ts
done: string = 'Done';
```
##### accountOnboarding.stepComplete.subtitle
```ts
subtitle: string = 'This step has been completed successfully.';
```
##### accountOnboarding.stepComplete.title
```ts
title: string = '{stepName} Complete';
```
##### accountOnboarding.steps
```ts
steps: object;
```
##### accountOnboarding.steps.account
```ts
account: string = 'Account Setup';
```
##### accountOnboarding.steps.complete
```ts
complete: string = 'Complete';
```
##### accountOnboarding.steps.hardware
```ts
hardware: string = 'Hardware Setup';
```
##### accountOnboarding.steps.numbers
```ts
numbers: string = 'Phone Numbers';
```
##### accountOnboarding.title
```ts
title: string = 'Account Onboarding';
```
#### callHistory
```ts
callHistory: object;
```
##### callHistory.clickToCall
```ts
clickToCall: string = 'Click to call';
```
##### callHistory.empty
```ts
empty: string = 'No call history';
```
##### callHistory.error
```ts
error: string = 'Unable to load call history';
```
##### callHistory.loading
```ts
loading: string = 'Loading call history...';
```
##### callHistory.noPhoneNumber
```ts
noPhoneNumber: string = 'Please set a phone number to load call history';
```
##### callHistory.relativeTime
```ts
relativeTime: object;
```
##### callHistory.relativeTime.hourAgo
```ts
hourAgo: string = '1 hour ago';
```
##### callHistory.relativeTime.hoursAgo
```ts
hoursAgo: string = '{count} hours ago';
```
##### callHistory.relativeTime.justNow
```ts
justNow: string = 'Just now';
```
##### callHistory.relativeTime.minuteAgo
```ts
minuteAgo: string = '1 min ago';
```
##### callHistory.relativeTime.minutesAgo
```ts
minutesAgo: string = '{count} min ago';
```
##### callHistory.relativeTime.yesterday
```ts
yesterday: string = 'Yesterday';
```
##### callHistory.summaryNotAvailable
```ts
summaryNotAvailable: string = 'Summary not available';
```
##### callHistory.title
```ts
title: string = 'Call History';
```
#### callLogs
```ts
callLogs: object;
```
##### callLogs.calledBy
```ts
calledBy: string = 'Called by:';
```
##### callLogs.columns
```ts
columns: object;
```
##### callLogs.columns.date
```ts
date: string = 'Date';
```
##### callLogs.columns.direction
```ts
direction: string = 'Direction';
```
##### callLogs.columns.duration
```ts
duration: string = 'Duration';
```
##### callLogs.columns.from
```ts
from: string = 'From';
```
##### callLogs.columns.quality
```ts
quality: string = 'MOS';
```
##### callLogs.columns.status
```ts
status: string = 'Status';
```
##### callLogs.columns.to
```ts
to: string = 'To';
```
##### callLogs.directions
```ts
directions: object;
```
##### callLogs.directions.inbound
```ts
inbound: string = 'Inbound';
```
##### callLogs.directions.internal
```ts
internal: string = 'Internal';
```
##### callLogs.directions.outbound
```ts
outbound: string = 'Outbound';
```
##### callLogs.empty
```ts
empty: string = 'No call logs found';
```
##### callLogs.loading
```ts
loading: string = 'Loading call logs...';
```
##### callLogs.quality
```ts
quality: object;
```
##### callLogs.quality.fair
```ts
fair: string = 'Fair';
```
##### callLogs.quality.good
```ts
good: string = 'Good';
```
##### callLogs.quality.poor
```ts
poor: string = 'Poor';
```
##### callLogs.quality.unavailable
```ts
unavailable: string = 'N/A';
```
##### callLogs.quality.unavailableTooltip
```ts
unavailableTooltip: string = 'No quality data available';
```
##### callLogs.routedTo
```ts
routedTo: string = 'Routed to:';
```
##### callLogs.statuses
```ts
statuses: object;
```
##### callLogs.statuses.busy
```ts
busy: string = 'Busy';
```
##### callLogs.statuses.completed
```ts
completed: string = 'Completed';
```
##### callLogs.statuses.failed
```ts
failed: string = 'Failed';
```
##### callLogs.statuses.noAnswer
```ts
noAnswer: string = 'No Answer';
```
##### callLogs.statuses.voicemail
```ts
voicemail: string = 'Voicemail';
```
##### callLogs.title
```ts
title: string = 'Call Logs';
```
#### common
```ts
common: object;
```
##### common.call
```ts
call: string = 'Call';
```
##### common.cancel
```ts
cancel: string = 'Cancel';
```
##### common.confirm
```ts
confirm: string = 'Confirm';
```
##### common.delete
```ts
delete: string = 'Delete';
```
##### common.error
```ts
error: string = 'Error';
```
##### common.loading
```ts
loading: string = 'Loading...';
```
##### common.next
```ts
next: string = 'Next';
```
##### common.noResults
```ts
noResults: string = 'No results';
```
##### common.pause
```ts
pause: string = 'Pause';
```
##### common.perPage
```ts
perPage: string = 'Per page';
```
##### common.play
```ts
play: string = 'Play';
```
##### common.previous
```ts
previous: string = 'Previous';
```
##### common.showing
```ts
showing: string = 'Showing {start}-{end} of {total}';
```
#### dialPlan
```ts
dialPlan: object;
```
##### dialPlan.empty
```ts
empty: string = 'No dial plan found';
```
##### dialPlan.error
```ts
error: string = 'Failed to load dial plan';
```
##### dialPlan.exits
```ts
exits: object;
```
##### dialPlan.exits.closed
```ts
closed: string = 'Closed';
```
##### dialPlan.exits.next
```ts
next: string = 'No Answer';
```
##### dialPlan.exits.open
```ts
open: string = 'Open';
```
##### dialPlan.exits.timeout
```ts
timeout: string = 'Timeout';
```
##### dialPlan.loading
```ts
loading: string = 'Loading dial plan...';
```
##### dialPlan.nodeTypes
```ts
nodeTypes: object;
```
##### dialPlan.nodeTypes.externalDial
```ts
externalDial: string = 'External Number';
```
##### dialPlan.nodeTypes.internalDial
```ts
internalDial: string = 'Internal Extension';
```
##### dialPlan.nodeTypes.schedule
```ts
schedule: string = 'Schedule';
```
##### dialPlan.nodeTypes.start
```ts
start: string = 'Start';
```
##### dialPlan.nodeTypes.voiceApp
```ts
voiceApp: string = 'Voice App';
```
##### dialPlan.nodeTypes.voicemail
```ts
voicemail: string = 'Voicemail';
```
##### dialPlan.title
```ts
title: string = 'Dial Plan';
```
#### onboardingPortal
```ts
onboardingPortal: object;
```
##### onboardingPortal.back
```ts
back: string = 'Back';
```
##### onboardingPortal.helpSupport
```ts
helpSupport: string = 'Help & Support';
```
##### onboardingPortal.onboardingComplete
```ts
onboardingComplete: string = 'Onboarding complete';
```
##### onboardingPortal.onboardingFlows
```ts
onboardingFlows: string = 'ONBOARDING FLOWS';
```
##### onboardingPortal.overview
```ts
overview: object;
```
##### onboardingPortal.overview.accountDesc
```ts
accountDesc: string = 'Set up your business profile, add team members, and configure your dial plan';
```
##### onboardingPortal.overview.complete
```ts
complete: string = 'Complete';
```
##### onboardingPortal.overview.completeSetup
```ts
completeSetup: string = 'Complete Setup';
```
##### onboardingPortal.overview.continueSetup
```ts
continueSetup: string = 'Continue Setup';
```
##### onboardingPortal.overview.flowsComplete
```ts
flowsComplete: string = '{completed} of {total} flows complete';
```
##### onboardingPortal.overview.hardwareDesc
```ts
hardwareDesc: string = 'Assign phones to team members and track delivery';
```
##### onboardingPortal.overview.label
```ts
label: string = 'Overview';
```
##### onboardingPortal.overview.needHelp
```ts
needHelp: string = 'Need help?';
```
##### onboardingPortal.overview.needHelpSubtitle
```ts
needHelpSubtitle: string = 'Our team is here to help you get set up quickly';
```
##### onboardingPortal.overview.numbersDesc
```ts
numbersDesc: string = 'Port existing numbers or request new business lines';
```
##### onboardingPortal.overview.phoneStatusComplete
```ts
phoneStatusComplete: string = 'Complete';
```
##### onboardingPortal.overview.phoneStatusNumber
```ts
phoneStatusNumber: string = 'Phone Number';
```
##### onboardingPortal.overview.phoneStatusProcessing
```ts
phoneStatusProcessing: string = 'Processing';
```
##### onboardingPortal.overview.phoneStatusStatus
```ts
phoneStatusStatus: string = 'Status';
```
##### onboardingPortal.overview.phoneStatusSubtitle
```ts
phoneStatusSubtitle: string = 'Track the status of your phone numbers';
```
##### onboardingPortal.overview.phoneStatusTemporary
```ts
phoneStatusTemporary: string = 'Temporary';
```
##### onboardingPortal.overview.phoneStatusTitle
```ts
phoneStatusTitle: string = 'Phone number status';
```
##### onboardingPortal.overview.phoneStatusType
```ts
phoneStatusType: string = 'Type';
```
##### onboardingPortal.overview.phoneStatusTypeNew
```ts
phoneStatusTypeNew: string = 'New';
```
##### onboardingPortal.overview.phoneStatusTypePort
```ts
phoneStatusTypePort: string = 'Port';
```
##### onboardingPortal.overview.progress
```ts
progress: string = 'Progress';
```
##### onboardingPortal.overview.progressTitle
```ts
progressTitle: string = 'Onboarding Progress';
```
##### onboardingPortal.overview.review
```ts
review: string = 'Review';
```
##### onboardingPortal.overview.scheduleCall
```ts
scheduleCall: string = 'Schedule a Call';
```
##### onboardingPortal.overview.stepsTitle
```ts
stepsTitle: string = 'Onboarding Steps';
```
##### onboardingPortal.overview.subtitle
```ts
subtitle: string = 'Complete the steps below to set up your business phone system';
```
##### onboardingPortal.overview.title
```ts
title: string = 'Your Business Onboarding';
```
##### onboardingPortal.overview.viewDocs
```ts
viewDocs: string = 'View Documentation';
```
##### onboardingPortal.saveAndExit
```ts
saveAndExit: string = 'Save & Exit to Overview';
```
##### onboardingPortal.splash
```ts
splash: object;
```
##### onboardingPortal.splash.start
```ts
start: string = 'Start Onboarding';
```
##### onboardingPortal.splash.step1
```ts
step1: string = 'Account Details';
```
##### onboardingPortal.splash.step2
```ts
step2: string = 'Setup Phone Numbers';
```
##### onboardingPortal.splash.step3
```ts
step3: string = 'Assign Hardware';
```
##### onboardingPortal.splash.subtitle
```ts
subtitle: string = "Let's get your business set up in 3 easy steps";
```
##### onboardingPortal.splash.title
```ts
title: string = 'Welcome\nto {platformName}';
```
#### phoneNumberOrdering
```ts
phoneNumberOrdering: object;
```
##### phoneNumberOrdering.complete
```ts
complete: object;
```
##### phoneNumberOrdering.complete.assignmentHint
```ts
assignmentHint: string = 'Numbers added to your inventory still need to be assigned to an extension or dial plan before they can receive calls.';
```
##### phoneNumberOrdering.complete.checking
```ts
checking: string = 'Checking order status...';
```
##### phoneNumberOrdering.complete.descriptionCompleteOne
```ts
descriptionCompleteOne: string = 'Your phone number is now in your inventory and ready to be configured.';
```
##### phoneNumberOrdering.complete.descriptionCompleteOther
```ts
descriptionCompleteOther: string = 'Your phone numbers are now in your inventory and ready to be configured.';
```
##### phoneNumberOrdering.complete.descriptionPartialOne
```ts
descriptionPartialOne: string = 'Some numbers could not be fulfilled by the carrier.';
```
##### phoneNumberOrdering.complete.descriptionPartialOther
```ts
descriptionPartialOther: string = 'Some numbers could not be fulfilled by the carrier.';
```
##### phoneNumberOrdering.complete.descriptionPendingOne
```ts
descriptionPendingOne: string = 'Your order has been submitted to the carrier. Fulfillment usually completes within seconds but may take longer.';
```
##### phoneNumberOrdering.complete.descriptionPendingOther
```ts
descriptionPendingOther: string = 'Your order has been submitted to the carrier. Fulfillment usually completes within seconds but may take longer.';
```
##### phoneNumberOrdering.complete.orderMore
```ts
orderMore: string = 'Order More Numbers';
```
##### phoneNumberOrdering.complete.titleCompleteOne
```ts
titleCompleteOne: string = 'Number Ready';
```
##### phoneNumberOrdering.complete.titleCompleteOther
```ts
titleCompleteOther: string = 'Numbers Ready';
```
##### phoneNumberOrdering.complete.titlePartialOne
```ts
titlePartialOne: string = 'Partially Fulfilled';
```
##### phoneNumberOrdering.complete.titlePartialOther
```ts
titlePartialOther: string = 'Partially Fulfilled';
```
##### phoneNumberOrdering.complete.titlePendingOne
```ts
titlePendingOne: string = 'Order Submitted';
```
##### phoneNumberOrdering.complete.titlePendingOther
```ts
titlePendingOther: string = 'Order Submitted';
```
##### phoneNumberOrdering.confirm
```ts
confirm: object;
```
##### phoneNumberOrdering.confirm.back
```ts
back: string = 'Back';
```
##### phoneNumberOrdering.confirm.description
```ts
description: string = 'Your order will be submitted to the carrier for fulfillment. This usually completes within seconds but may take longer.';
```
##### phoneNumberOrdering.confirm.placeOrder
```ts
placeOrder: string = 'Place Order';
```
##### phoneNumberOrdering.confirm.subtitleOne
```ts
subtitleOne: string = 'You are about to order 1 phone number';
```
##### phoneNumberOrdering.confirm.subtitleOther
```ts
subtitleOther: string = 'You are about to order {count} phone numbers';
```
##### phoneNumberOrdering.confirm.title
```ts
title: string = 'Confirm Order';
```
##### phoneNumberOrdering.error
```ts
error: object;
```
##### phoneNumberOrdering.error.description
```ts
description: string = 'The carrier was unable to fulfill your order.';
```
##### phoneNumberOrdering.error.title
```ts
title: string = 'Order Failed';
```
##### phoneNumberOrdering.error.tryAgain
```ts
tryAgain: string = 'Try Again';
```
##### phoneNumberOrdering.ordering
```ts
ordering: object;
```
##### phoneNumberOrdering.ordering.title
```ts
title: string = 'Placing Order...';
```
##### phoneNumberOrdering.results
```ts
results: object;
```
##### phoneNumberOrdering.results.backToSearch
```ts
backToSearch: string = 'Back to Search';
```
##### phoneNumberOrdering.results.continue
```ts
continue: string = 'Continue';
```
##### phoneNumberOrdering.results.noResults
```ts
noResults: string = 'No numbers available for this search';
```
##### phoneNumberOrdering.results.phoneNumber
```ts
phoneNumber: string = 'Phone Number';
```
##### phoneNumberOrdering.results.selectAll
```ts
selectAll: string = 'Select all';
```
##### phoneNumberOrdering.results.selected
```ts
selected: string = '{count} selected';
```
##### phoneNumberOrdering.results.state
```ts
state: string = 'State';
```
##### phoneNumberOrdering.results.title
```ts
title: string = 'Available Numbers';
```
##### phoneNumberOrdering.search
```ts
search: object;
```
##### phoneNumberOrdering.search.areaCode
```ts
areaCode: string = 'Area Code';
```
##### phoneNumberOrdering.search.areaCodeLabel
```ts
areaCodeLabel: string = 'Area Code';
```
##### phoneNumberOrdering.search.areaCodePlaceholder
```ts
areaCodePlaceholder: string = 'e.g. 212';
```
##### phoneNumberOrdering.search.numberOfResults
```ts
numberOfResults: string = 'Quantity to display';
```
##### phoneNumberOrdering.search.search
```ts
search: string = 'Search';
```
##### phoneNumberOrdering.search.searchType
```ts
searchType: string = 'Search by';
```
##### phoneNumberOrdering.search.subtitle
```ts
subtitle: string = 'Find available phone numbers by entering an area code or ZIP code.';
```
##### phoneNumberOrdering.search.title
```ts
title: string = 'Search Available Numbers';
```
##### phoneNumberOrdering.search.zip
```ts
zip: string = 'ZIP Code';
```
##### phoneNumberOrdering.search.zipLabel
```ts
zipLabel: string = 'ZIP Code';
```
##### phoneNumberOrdering.search.zipPlaceholder
```ts
zipPlaceholder: string = 'e.g. 10001';
```
##### phoneNumberOrdering.statuses
```ts
statuses: object;
```
##### phoneNumberOrdering.statuses.complete
```ts
complete: string = 'Complete';
```
##### phoneNumberOrdering.statuses.failed
```ts
failed: string = 'Failed';
```
##### phoneNumberOrdering.statuses.partial
```ts
partial: string = 'Partial';
```
##### phoneNumberOrdering.statuses.pending
```ts
pending: string = 'Pending';
```
##### phoneNumberOrdering.steps
```ts
steps: object;
```
##### phoneNumberOrdering.steps.confirm
```ts
confirm: string = 'Confirm';
```
##### phoneNumberOrdering.steps.done
```ts
done: string = 'Done';
```
##### phoneNumberOrdering.steps.search
```ts
search: string = 'Search';
```
##### phoneNumberOrdering.steps.select
```ts
select: string = 'Select';
```
##### phoneNumberOrdering.steps.stepOf
```ts
stepOf: string = 'Step {current} of {total}';
```
##### phoneNumberOrdering.title
```ts
title: string = 'Order Phone Numbers';
```
#### phoneNumbers
```ts
phoneNumbers: object;
```
##### phoneNumbers.badges
```ts
badges: object;
```
##### phoneNumbers.badges.temporary
```ts
temporary: string = 'Temporary';
```
##### phoneNumbers.columns
```ts
columns: object;
```
##### phoneNumbers.columns.callerID
```ts
callerID: string = 'Caller ID';
```
##### phoneNumbers.columns.cancelledDate
```ts
cancelledDate: string = 'Date Cancelled';
```
##### phoneNumbers.columns.carrier
```ts
carrier: string = 'Carrier';
```
##### phoneNumbers.columns.outbound
```ts
outbound: string = 'Direction';
```
##### phoneNumbers.columns.phoneNumber
```ts
phoneNumber: string = 'Phone Number';
```
##### phoneNumbers.columns.routingTarget
```ts
routingTarget: string = 'Call Routing';
```
##### phoneNumbers.columns.status
```ts
status: string = 'Status';
```
##### phoneNumbers.columns.transferDate
```ts
transferDate: string = 'Transfer Date';
```
##### phoneNumbers.empty
```ts
empty: string = 'No phone numbers';
```
##### phoneNumbers.filterLabel
```ts
filterLabel: string = 'Filter by status';
```
##### phoneNumbers.filters
```ts
filters: object;
```
##### phoneNumbers.filters.active
```ts
active: string = 'Active';
```
##### phoneNumbers.filters.cancelled
```ts
cancelled: string = 'Cancelled';
```
##### phoneNumbers.filters.in\_progress
```ts
in_progress: string = 'In Progress';
```
##### phoneNumbers.loading
```ts
loading: string = 'Loading phone numbers...';
```
##### phoneNumbers.outbound
```ts
outbound: object;
```
##### phoneNumbers.outbound.disabled
```ts
disabled: string = 'Inbound only';
```
##### phoneNumbers.outbound.enabled
```ts
enabled: string = 'Two-way';
```
##### phoneNumbers.routingTarget
```ts
routingTarget: object;
```
##### phoneNumbers.routingTarget.notSet
```ts
notSet: string = 'Not set';
```
##### phoneNumbers.routingTargetTypes
```ts
routingTargetTypes: object;
```
##### phoneNumbers.routingTargetTypes.dialPlan
```ts
dialPlan: string = 'Dial Plan';
```
##### phoneNumbers.routingTargetTypes.ringGroup
```ts
ringGroup: string = 'Ring Group';
```
##### phoneNumbers.routingTargetTypes.user
```ts
user: string = 'User';
```
##### phoneNumbers.routingTargetTypes.voiceApp
```ts
voiceApp: string = 'Voice App';
```
##### phoneNumbers.statuses
```ts
statuses: object;
```
##### phoneNumbers.statuses.active
```ts
active: string = 'Active';
```
##### phoneNumbers.statuses.inactive
```ts
inactive: string = 'Inactive';
```
##### phoneNumbers.statuses.orderFailed
```ts
orderFailed: string = 'Order Failed';
```
##### phoneNumbers.statuses.ordering
```ts
ordering: string = 'Ordering';
```
##### phoneNumbers.statuses.portingApproved
```ts
portingApproved: string = 'Port Approved';
```
##### phoneNumbers.statuses.portingDraft
```ts
portingDraft: string = 'Port Draft';
```
##### phoneNumbers.statuses.portingException
```ts
portingException: string = 'Port Issue';
```
##### phoneNumbers.statuses.portingFoc
```ts
portingFoc: string = 'Port Scheduled';
```
##### phoneNumbers.statuses.portingSubmitted
```ts
portingSubmitted: string = 'Port Submitted';
```
##### phoneNumbers.statuses.released
```ts
released: string = 'Released';
```
##### phoneNumbers.title
```ts
title: string = 'Phone Numbers';
```
#### voicemails
```ts
voicemails: object;
```
##### voicemails.deleteConfirm
```ts
deleteConfirm: string = 'Delete this voicemail?';
```
##### voicemails.deleteTitle
```ts
deleteTitle: string = 'Delete Voicemail';
```
##### voicemails.empty
```ts
empty: string = 'No voicemails';
```
##### voicemails.loading
```ts
loading: string = 'Loading voicemails...';
```
##### voicemails.noUserId
```ts
noUserId: string = 'Please set a user ID to load voicemails';
```
##### voicemails.progress
```ts
progress: string = 'Playback progress';
```
##### voicemails.summary
```ts
summary: string = 'Summary';
```
##### voicemails.title
```ts
title: string = 'Voicemails';
```
##### voicemails.transcript
```ts
transcript: string = 'Full Transcript';
```
##### voicemails.transcription
```ts
transcription: string = 'Transcription';
```
##### voicemails.transcriptLoading
```ts
transcriptLoading: string = 'Loading transcript...';
```
##### voicemails.transcriptNotAvailable
```ts
transcriptNotAvailable: string = 'Transcript not available';
```
***
### logoHtml?
```ts
optional logoHtml?: string;
```
Defined in: [sdk/src/react/onboarding/OnboardingPortal.tsx:53](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/onboarding/OnboardingPortal.tsx#L53)
***
### onBack?
```ts
optional onBack?: () => void;
```
Defined in: [sdk/src/react/onboarding/OnboardingPortal.tsx:51](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/onboarding/OnboardingPortal.tsx#L51)
#### Returns
`void`
***
### onHelpSupport?
```ts
optional onHelpSupport?: () => void;
```
Defined in: [sdk/src/react/onboarding/OnboardingPortal.tsx:59](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/onboarding/OnboardingPortal.tsx#L59)
#### Returns
`void`
***
### onScheduleCall?
```ts
optional onScheduleCall?: () => void;
```
Defined in: [sdk/src/react/onboarding/OnboardingPortal.tsx:58](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/onboarding/OnboardingPortal.tsx#L58)
#### Returns
`void`
***
### onStepChange?
```ts
optional onStepChange?: (event) => void;
```
Defined in: [sdk/src/react/onboarding/OnboardingPortal.tsx:60](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/onboarding/OnboardingPortal.tsx#L60)
#### Parameters
##### event
###### step
[`AccountOnboardingStep`](../../index/type-aliases/AccountOnboardingStep.md)
#### Returns
`void`
***
### platformName?
```ts
optional platformName?: string;
```
Defined in: [sdk/src/react/onboarding/OnboardingPortal.tsx:54](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/onboarding/OnboardingPortal.tsx#L54)
***
### privacyPolicyUrl?
```ts
optional privacyPolicyUrl?: string;
```
Defined in: [sdk/src/react/onboarding/OnboardingPortal.tsx:50](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/onboarding/OnboardingPortal.tsx#L50)
***
### recipientTermsOfServiceUrl?
```ts
optional recipientTermsOfServiceUrl?: string;
```
Defined in: [sdk/src/react/onboarding/OnboardingPortal.tsx:49](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/onboarding/OnboardingPortal.tsx#L49)
***
### style?
```ts
optional style?: CSSProperties;
```
Defined in: [sdk/src/react/onboarding/OnboardingPortal.tsx:62](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/onboarding/OnboardingPortal.tsx#L62)
***
### theme?
```ts
optional theme?: "light" | "dark";
```
Defined in: [sdk/src/react/onboarding/OnboardingPortal.tsx:55](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/onboarding/OnboardingPortal.tsx#L55)
---
## Variable: OnboardingPortal
[@dialstack/sdk](../../index.md) / [onboarding](../index.md) / OnboardingPortal
# Variable: OnboardingPortal
```ts
const OnboardingPortal: React.FC;
```
Defined in: [sdk/src/react/onboarding/OnboardingPortal.tsx:68](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/onboarding/OnboardingPortal.tsx#L68)
---
## Function: registerComponents()
[@dialstack/sdk](../../index.md) / [pure](../index.md) / registerComponents
# Function: registerComponents()
```ts
function registerComponents(): void;
```
Defined in: [sdk/src/core/initialize-pure.ts:148](https://github.com/dialstack/dialstack-sdk/blob/main/src/core/initialize-pure.ts#L148)
Register Web Components manually
Call this to register the DialStack Web Components when using the pure entry point.
This is only needed in browser environments where you want to use dialstack.create().
## Returns
`void`
## Example
```typescript
import { loadDialstackAndInitialize, registerComponents } from '@dialstack/sdk/pure';
// Register components when ready (e.g., after hydration)
if (typeof window !== 'undefined') {
registerComponents();
}
```
---
## pure
[@dialstack/sdk](../index.md) / pure
# pure
DialStack SDK - Pure Entry Point (No Side Effects)
This entry point does NOT auto-register Web Components.
Use this for:
- Server-side rendering (SSR)
- Testing environments
- When you want manual control over component registration
For automatic component registration, use '@dialstack/sdk' instead.
## Functions
- [registerComponents](functions/registerComponents.md)
## References
### AppearanceOptions
Re-exports [AppearanceOptions](../index/interfaces/AppearanceOptions.md)
***
### CallEventHandler
Re-exports [CallEventHandler](../index/type-aliases/CallEventHandler.md)
***
### CallEventMap
Re-exports [CallEventMap](../index/interfaces/CallEventMap.md)
***
### CallEventType
Re-exports [CallEventType](../index/type-aliases/CallEventType.md)
***
### CallLog
Re-exports [CallLog](../index/interfaces/CallLog.md)
***
### CallLogDisplayOptions
Re-exports [CallLogDisplayOptions](../index/interfaces/CallLogDisplayOptions.md)
***
### CallLogRowRenderer
Re-exports [CallLogRowRenderer](../index/type-aliases/CallLogRowRenderer.md)
***
### CallLogsCallbacks
Re-exports [CallLogsCallbacks](../index/interfaces/CallLogsCallbacks.md)
***
### ClientSecretResponse
Re-exports [ClientSecretResponse](../index/type-aliases/ClientSecretResponse.md)
***
### CommonComponentCallbacks
Re-exports [CommonComponentCallbacks](../index/interfaces/CommonComponentCallbacks.md)
***
### ComponentIcons
Re-exports [ComponentIcons](../index/interfaces/ComponentIcons.md)
***
### ComponentTagName
Re-exports [ComponentTagName](../index/type-aliases/ComponentTagName.md)
***
### DateRange
Re-exports [DateRange](../index/interfaces/DateRange.md)
***
### defaultIcons
Re-exports [defaultIcons](../index/variables/defaultIcons.md)
***
### DialStackInitParams
Re-exports [DialStackInitParams](../index/interfaces/DialStackInitParams.md)
***
### DialStackInstance
Re-exports [DialStackInstance](../index/interfaces/DialStackInstance.md)
***
### FormattingOptions
Re-exports [FormattingOptions](../index/interfaces/FormattingOptions.md)
***
### IconString
Re-exports [IconString](../index/type-aliases/IconString.md)
***
### IncomingCallEvent
Re-exports [IncomingCallEvent](../index/interfaces/IncomingCallEvent.md)
***
### LayoutVariant
Re-exports [LayoutVariant](../index/type-aliases/LayoutVariant.md)
***
### loadDialstackAndInitialize
Re-exports [loadDialstackAndInitialize](../index/functions/loadDialstackAndInitialize.md)
***
### LoadError
Re-exports [LoadError](../index/interfaces/LoadError.md)
***
### LoaderStart
Re-exports [LoaderStart](../index/interfaces/LoaderStart.md)
***
### PaginationOptions
Re-exports [PaginationOptions](../index/interfaces/PaginationOptions.md)
***
### UpdateOptions
Re-exports [UpdateOptions](../index/interfaces/UpdateOptions.md)
***
### VoicemailBehaviorOptions
Re-exports [VoicemailBehaviorOptions](../index/interfaces/VoicemailBehaviorOptions.md)
***
### VoicemailDisplayOptions
Re-exports [VoicemailDisplayOptions](../index/interfaces/VoicemailDisplayOptions.md)
***
### VoicemailRowRenderer
Re-exports [VoicemailRowRenderer](../index/type-aliases/VoicemailRowRenderer.md)
***
### VoicemailsCallbacks
Re-exports [VoicemailsCallbacks](../index/interfaces/VoicemailsCallbacks.md)
---
## Function: useCreateComponent()
[@dialstack/sdk](../../index.md) / [react](../index.md) / useCreateComponent
# Function: useCreateComponent()
```ts
function useCreateComponent(dialstack, tagName): UseCreateComponentResult;
```
Defined in: [sdk/src/react/useCreateComponent.tsx:38](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/useCreateComponent.tsx#L38)
Hook to create and manage a Web Component instance
Uses a callback ref pattern for synchronous component creation when the
container mounts. Creates components using dialstack.create() and handles
cleanup when the container unmounts or when dependencies change.
## Type Parameters
### T
`T` *extends* [`ComponentTagName`](../../index/type-aliases/ComponentTagName.md)
## Parameters
### dialstack
[`DialStackInstance`](../../index/interfaces/DialStackInstance.md)
The DialStack instance
### tagName
`T`
The component tag name (e.g., 'call-logs', 'voicemails')
## Returns
`UseCreateComponentResult`\<`T`\>
Object with containerRef (callback) and properly typed componentInstance
## Example
```tsx
const { containerRef, componentInstance } = useCreateComponent(dialstack, 'voicemails');
// containerRef is a callback ref to attach to the container div
// componentInstance is typed as VoicemailsElement | null
// TypeScript knows about setUserId, setOnVoicemailPlay, etc.
```
---
## Function: useDialstack()
[@dialstack/sdk](../../index.md) / [react](../index.md) / useDialstack
# Function: useDialstack()
```ts
function useDialstack(): DialStackInstance;
```
Defined in: [sdk/src/react/DialstackComponentsProvider.tsx:82](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/DialstackComponentsProvider.tsx#L82)
Hook to access the DialStack instance directly
## Returns
[`DialStackInstance`](../../index/interfaces/DialStackInstance.md)
## Throws
If used outside of DialstackComponentsProvider
---
## Function: useDialstackComponents()
[@dialstack/sdk](../../index.md) / [react](../index.md) / useDialstackComponents
# Function: useDialstackComponents()
```ts
function useDialstackComponents(): DialstackComponentsContextValue;
```
Defined in: [sdk/src/react/DialstackComponentsProvider.tsx:66](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/DialstackComponentsProvider.tsx#L66)
Hook to access the DialStack context
## Returns
`DialstackComponentsContextValue`
## Throws
If used outside of DialstackComponentsProvider
---
## Function: useUpdateWithSetter()
[@dialstack/sdk](../../index.md) / [react](../index.md) / useUpdateWithSetter
# Function: useUpdateWithSetter()
```ts
function useUpdateWithSetter(
component,
value,
onUpdated): void;
```
Defined in: [sdk/src/react/useUpdateWithSetter.ts:38](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/useUpdateWithSetter.ts#L38)
Hook that synchronizes a React prop value to a Web Component setter method
This enables declarative React patterns (props) to control imperative
Web Component APIs (setter methods) in a type-safe way.
## Type Parameters
### T
`T` *extends* `HTMLElement`
### V
`V`
## Parameters
### component
`T` \| `null`
The Web Component instance (or null if not mounted)
### value
`V` \| `undefined`
The prop value to sync
### onUpdated
(`component`, `value`) => `void`
Callback that receives the component and value, should call the setter
## Returns
`void`
## Example
```tsx
const Voicemails = ({ userId, onVoicemailSelect }) => {
const { containerRef, componentInstance } = useCreateComponent(dialstack, 'voicemails');
// Type-safe: TypeScript knows componentInstance has setUserId method
useUpdateWithSetter(componentInstance, userId, (comp, val) => {
comp.setUserId(val);
});
useUpdateWithSetter(componentInstance, onVoicemailSelect, (comp, val) => {
comp.setOnVoicemailSelect(val);
});
return ;
};
```
---
## react
[@dialstack/sdk](../index.md) / react
# react
DialStack SDK - React Entry Point
All React components, hooks, and React-specific types.
Import from '@dialstack/sdk/react' to use these.
## Interfaces
- [CallHistoryProps](interfaces/CallHistoryProps.md)
- [CallLogsProps](interfaces/CallLogsProps.md)
- [DialPlanData](interfaces/DialPlanData.md)
- [DialPlanHandle](interfaces/DialPlanHandle.md)
- [DialPlanProps](interfaces/DialPlanProps.md)
- [DialstackComponentsProviderProps](interfaces/DialstackComponentsProviderProps.md)
- [ExternalDialNode](interfaces/ExternalDialNode.md)
- [ExternalDialNodeConfig](interfaces/ExternalDialNodeConfig.md)
- [InternalDialNode](interfaces/InternalDialNode.md)
- [InternalDialNodeConfig](interfaces/InternalDialNodeConfig.md)
- [PhoneNumberOrderingProps](interfaces/PhoneNumberOrderingProps.md)
- [PhoneNumbersProps](interfaces/PhoneNumbersProps.md)
- [RingAllUsersNode](interfaces/RingAllUsersNode.md)
- [RingAllUsersNodeConfig](interfaces/RingAllUsersNodeConfig.md)
- [ScheduleNode](interfaces/ScheduleNode.md)
- [ScheduleNodeConfig](interfaces/ScheduleNodeConfig.md)
- [VoiceAppNodeData](interfaces/VoiceAppNodeData.md)
- [VoicemailsProps](interfaces/VoicemailsProps.md)
## Type Aliases
- [DialPlanMode](type-aliases/DialPlanMode.md)
- [DialPlanNode](type-aliases/DialPlanNode.md)
- [DialPlanNodeType](type-aliases/DialPlanNodeType.md)
- [ResourceType](type-aliases/ResourceType.md)
## Variables
- [CallHistory](variables/CallHistory.md)
- [CallLogs](variables/CallLogs.md)
- [DialPlan](variables/DialPlan.md)
- [DialstackComponentsProvider](variables/DialstackComponentsProvider.md)
- [PhoneNumberOrdering](variables/PhoneNumberOrdering.md)
- [PhoneNumbers](variables/PhoneNumbers.md)
- [Voicemails](variables/Voicemails.md)
## Functions
- [useCreateComponent](functions/useCreateComponent.md)
- [useDialstack](functions/useDialstack.md)
- [useDialstackComponents](functions/useDialstackComponents.md)
- [useUpdateWithSetter](functions/useUpdateWithSetter.md)
---
## Interface: CallHistoryProps
[@dialstack/sdk](../../index.md) / [react](../index.md) / CallHistoryProps
# Interface: CallHistoryProps
Defined in: [sdk/src/react/CallHistory.tsx:20](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/CallHistory.tsx#L20)
## Properties
### classes?
```ts
optional classes?: CallHistoryClasses;
```
Defined in: [sdk/src/react/CallHistory.tsx:76](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/CallHistory.tsx#L76)
Custom CSS classes for styling integration
#### Example
```tsx
```
***
### className?
```ts
optional className?: string;
```
Defined in: [sdk/src/react/CallHistory.tsx:35](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/CallHistory.tsx#L35)
Optional CSS class name
***
### displayOptions?
```ts
optional displayOptions?: CallHistoryDisplayOptions;
```
Defined in: [sdk/src/react/CallHistory.tsx:81](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/CallHistory.tsx#L81)
Display options for controlling field visibility
***
### formatting?
```ts
optional formatting?: FormattingOptions;
```
Defined in: [sdk/src/react/CallHistory.tsx:50](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/CallHistory.tsx#L50)
Formatting options for dates
***
### icons?
```ts
optional icons?: ComponentIcons;
```
Defined in: [sdk/src/react/CallHistory.tsx:55](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/CallHistory.tsx#L55)
Custom icons (partial override of defaults)
***
### layoutVariant?
```ts
optional layoutVariant?: LayoutVariant;
```
Defined in: [sdk/src/react/CallHistory.tsx:60](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/CallHistory.tsx#L60)
Layout variant (compact, comfortable, default)
***
### limit?
```ts
optional limit?: number;
```
Defined in: [sdk/src/react/CallHistory.tsx:30](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/CallHistory.tsx#L30)
Maximum number of calls to display
#### Default
```ts
5
```
***
### locale?
```ts
optional locale?: object;
```
Defined in: [sdk/src/react/CallHistory.tsx:45](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/CallHistory.tsx#L45)
Locale for UI strings
#### accountOnboarding
```ts
accountOnboarding: object;
```
##### accountOnboarding.account
```ts
account: object;
```
##### accountOnboarding.account.details
```ts
details: object;
```
##### accountOnboarding.account.details.companyNameLabel
```ts
companyNameLabel: string = 'Company Name';
```
##### accountOnboarding.account.details.companyNamePlaceholder
```ts
companyNamePlaceholder: string = 'Acme Corp';
```
##### accountOnboarding.account.details.companyNameRequired
```ts
companyNameRequired: string = 'Company name is required';
```
##### accountOnboarding.account.details.emailLabel
```ts
emailLabel: string = 'Primary Contact Email';
```
##### accountOnboarding.account.details.emailPlaceholder
```ts
emailPlaceholder: string = 'admin@company.com';
```
##### accountOnboarding.account.details.emailRequired
```ts
emailRequired: string = 'Primary contact email is required';
```
##### accountOnboarding.account.details.heading
```ts
heading: string = 'Account Details';
```
##### accountOnboarding.account.details.phoneInvalid
```ts
phoneInvalid: string = 'Enter a valid US phone number';
```
##### accountOnboarding.account.details.phoneLabel
```ts
phoneLabel: string = 'Primary Contact Phone Number';
```
##### accountOnboarding.account.details.phonePlaceholder
```ts
phonePlaceholder: string = '(555) 123-4567';
```
##### accountOnboarding.account.details.phoneRequired
```ts
phoneRequired: string = 'Primary contact phone number is required';
```
##### accountOnboarding.account.details.primaryContactLabel
```ts
primaryContactLabel: string = 'Primary Contact';
```
##### accountOnboarding.account.details.primaryContactPlaceholder
```ts
primaryContactPlaceholder: string = 'Jane Doe';
```
##### accountOnboarding.account.details.primaryContactRequired
```ts
primaryContactRequired: string = 'Primary contact is required';
```
##### accountOnboarding.account.details.regionLabel
```ts
regionLabel: string = 'Region';
```
##### accountOnboarding.account.details.regionPlaceholder
```ts
regionPlaceholder: string = 'Select a region';
```
##### accountOnboarding.account.details.timezoneLabel
```ts
timezoneLabel: string = 'Timezone';
```
##### accountOnboarding.account.details.timezonePlaceholder
```ts
timezonePlaceholder: string = 'Select a timezone';
```
##### accountOnboarding.account.details.timezoneRequired
```ts
timezoneRequired: string = 'Timezone is required';
```
##### accountOnboarding.account.location
```ts
location: object;
```
##### accountOnboarding.account.location.addressLabel
```ts
addressLabel: string = 'Address';
```
##### accountOnboarding.account.location.addressRequired
```ts
addressRequired: string = 'Address is required';
```
##### accountOnboarding.account.location.cityLabel
```ts
cityLabel: string = 'City';
```
##### accountOnboarding.account.location.cityPlaceholder
```ts
cityPlaceholder: string = 'New York';
```
##### accountOnboarding.account.location.description
```ts
description: string = 'Add your business address for E911 and caller ID.';
```
##### accountOnboarding.account.location.edit
```ts
edit: string = 'Edit';
```
##### accountOnboarding.account.location.enterManually
```ts
enterManually: string = 'Enter manually';
```
##### accountOnboarding.account.location.heading
```ts
heading: string = 'Business Location';
```
##### accountOnboarding.account.location.houseNumberLabel
```ts
houseNumberLabel: string = '#';
```
##### accountOnboarding.account.location.houseNumberPlaceholder
```ts
houseNumberPlaceholder: string = '123';
```
##### accountOnboarding.account.location.nameLabel
```ts
nameLabel: string = 'Location Name';
```
##### accountOnboarding.account.location.namePlaceholder
```ts
namePlaceholder: string = 'Main Office';
```
##### accountOnboarding.account.location.nameRequired
```ts
nameRequired: string = 'Location name is required';
```
##### accountOnboarding.account.location.noResults
```ts
noResults: string = 'No addresses found';
```
##### accountOnboarding.account.location.postalCodeLabel
```ts
postalCodeLabel: string = 'ZIP';
```
##### accountOnboarding.account.location.postalCodePlaceholder
```ts
postalCodePlaceholder: string = '10001';
```
##### accountOnboarding.account.location.searching
```ts
searching: string = 'Searching...';
```
##### accountOnboarding.account.location.searchInstead
```ts
searchInstead: string = 'Search instead';
```
##### accountOnboarding.account.location.searchPlaceholder
```ts
searchPlaceholder: string = 'Start typing an address...';
```
##### accountOnboarding.account.location.stateLabel
```ts
stateLabel: string = 'State';
```
##### accountOnboarding.account.location.statePlaceholder
```ts
statePlaceholder: string = 'Select';
```
##### accountOnboarding.account.location.streetLabel
```ts
streetLabel: string = 'Street';
```
##### accountOnboarding.account.location.streetPlaceholder
```ts
streetPlaceholder: string = 'Main St';
```
##### accountOnboarding.account.saveError
```ts
saveError: string = 'Failed to save. Please try again.';
```
##### accountOnboarding.account.saving
```ts
saving: string = 'Saving...';
```
##### accountOnboarding.account.subtitle
```ts
subtitle: string = 'Enter your company information';
```
##### accountOnboarding.account.title
```ts
title: string = 'Business Details';
```
##### accountOnboarding.account.users
```ts
users: object;
```
##### accountOnboarding.account.users.addUser
```ts
addUser: string = 'Add User';
```
##### accountOnboarding.account.users.atLeastOne
```ts
atLeastOne: string = 'Add at least one team member to continue.';
```
##### accountOnboarding.account.users.description
```ts
description: string = 'Add users who will have phone extensions';
```
##### accountOnboarding.account.users.duplicateEmail
```ts
duplicateEmail: string = 'A user with this email already exists.';
```
##### accountOnboarding.account.users.emailLabel
```ts
emailLabel: string = 'Email';
```
##### accountOnboarding.account.users.emailPlaceholder
```ts
emailPlaceholder: string = 'john@company.com';
```
##### accountOnboarding.account.users.extensionLabel
```ts
extensionLabel: string = 'Extension';
```
##### accountOnboarding.account.users.extensionPlaceholder
```ts
extensionPlaceholder: string = 'ex. 103';
```
##### accountOnboarding.account.users.heading
```ts
heading: string = 'Team Members';
```
##### accountOnboarding.account.users.nameLabel
```ts
nameLabel: string = 'Full name';
```
##### accountOnboarding.account.users.namePlaceholder
```ts
namePlaceholder: string = 'John Doe';
```
##### accountOnboarding.account.users.nameRequired
```ts
nameRequired: string = 'Name is required';
```
##### accountOnboarding.account.users.noUsers
```ts
noUsers: string = 'No team members added yet.';
```
##### accountOnboarding.account.users.removeUser
```ts
removeUser: string = 'Remove';
```
##### accountOnboarding.account.users.roleAdmin
```ts
roleAdmin: string = 'Admin';
```
##### accountOnboarding.account.users.roleLabel
```ts
roleLabel: string = 'Role';
```
##### accountOnboarding.account.users.roleUser
```ts
roleUser: string = 'User';
```
##### accountOnboarding.breadcrumbAriaLabel
```ts
breadcrumbAriaLabel: string = 'Onboarding progress';
```
##### accountOnboarding.complete
```ts
complete: object;
```
##### accountOnboarding.complete.e911
```ts
e911: object;
```
##### accountOnboarding.complete.e911.addressStandardized
```ts
addressStandardized: string = 'Your address was standardized for emergency services accuracy.';
```
##### accountOnboarding.complete.e911.deferred
```ts
deferred: string = 'E911 emergency services have not been fully configured. Each location with a phone number needs a verified emergency address before your phone service can be activated.';
```
##### accountOnboarding.complete.e911.errorDescription
```ts
errorDescription: string = 'There was an error configuring emergency services. You can retry or configure manually later.';
```
##### accountOnboarding.complete.e911.errorTitle
```ts
errorTitle: string = 'E911 configuration failed';
```
##### accountOnboarding.complete.e911.loading
```ts
loading: string = 'Configuring emergency services...';
```
##### accountOnboarding.complete.e911.pendingAfterPolling
```ts
pendingAfterPolling: string = 'E911 registration submitted. Your phone service is active — emergency address verification will complete shortly.';
```
##### accountOnboarding.complete.e911.pollingStatus
```ts
pollingStatus: string = 'Verifying emergency services registration...';
```
##### accountOnboarding.complete.e911.primaryAssigned
```ts
primaryAssigned: string = 'assigned as primary number for';
```
##### accountOnboarding.complete.e911.processing
```ts
processing: string = 'E911 registration is being processed. This may take a few minutes.';
```
##### accountOnboarding.complete.e911.retryButton
```ts
retryButton: string = 'Retry';
```
##### accountOnboarding.complete.e911.verified
```ts
verified: string = 'E911 emergency address is verified.';
```
##### accountOnboarding.complete.subtitle
```ts
subtitle: string = "It's time to start using your embedded voice system";
```
##### accountOnboarding.complete.title
```ts
title: string = 'Wahoo!';
```
##### accountOnboarding.error
```ts
error: object;
```
##### accountOnboarding.error.description
```ts
description: string = 'Something went wrong loading the onboarding wizard.';
```
##### accountOnboarding.error.retry
```ts
retry: string = 'Try Again';
```
##### accountOnboarding.error.title
```ts
title: string = 'Unable to Load';
```
##### accountOnboarding.hardware
```ts
hardware: object;
```
##### accountOnboarding.hardware.addDeviceButton
```ts
addDeviceButton: string = '+ Add Device';
```
##### accountOnboarding.hardware.addHandsetButton
```ts
addHandsetButton: string = '+ Handset';
```
##### accountOnboarding.hardware.allAssigned
```ts
allAssigned: string = 'All devices have been assigned';
```
##### accountOnboarding.hardware.assignAndComplete
```ts
assignAndComplete: string = 'Assign & Complete';
```
##### accountOnboarding.hardware.availableDevices
```ts
availableDevices: string = 'Available Devices';
```
##### accountOnboarding.hardware.cancel
```ts
cancel: string = 'Cancel';
```
##### accountOnboarding.hardware.clickToAssign
```ts
clickToAssign: string = 'Click to assign';
```
##### accountOnboarding.hardware.cordless
```ts
cordless: string = 'Cordless';
```
##### accountOnboarding.hardware.dectBase
```ts
dectBase: string = 'Cordless Base';
```
##### accountOnboarding.hardware.deskPhone
```ts
deskPhone: string = 'Desk phone';
```
##### accountOnboarding.hardware.deviceNotFound
```ts
deviceNotFound: string = 'Device was created but could not be found. Please try again.';
```
##### accountOnboarding.hardware.dragDropHint
```ts
dragDropHint: string = 'Drag and drop device here';
```
##### accountOnboarding.hardware.duplicateMac
```ts
duplicateMac: string = 'This MAC address is already registered.';
```
##### accountOnboarding.hardware.gate
```ts
gate: object;
```
##### accountOnboarding.hardware.gate.noDevices
```ts
noDevices: string = 'No devices are available for your account. Please contact support to add devices before completing this step.';
```
##### accountOnboarding.hardware.handset
```ts
handset: string = 'handset';
```
##### accountOnboarding.hardware.handsets
```ts
handsets: string = 'handsets';
```
##### accountOnboarding.hardware.invalidIpei
```ts
invalidIpei: string = 'Enter a valid IPEI (hex digits only).';
```
##### accountOnboarding.hardware.invalidMac
```ts
invalidMac: string = 'Enter a valid 12-digit MAC address.';
```
##### accountOnboarding.hardware.ipeiLabel
```ts
ipeiLabel: string = 'Handset IPEI';
```
##### accountOnboarding.hardware.ipeiNotMac
```ts
ipeiNotMac: string = 'This looks like a MAC address, not an IPEI. An IPEI looks like 03AABB1234567890CCDD.';
```
##### accountOnboarding.hardware.ipeiPlaceholder
```ts
ipeiPlaceholder: string = '03AABB1234567890CCDD';
```
##### accountOnboarding.hardware.isDectBase
```ts
isDectBase: string = 'This is a cordless handset base station';
```
##### accountOnboarding.hardware.macLabel
```ts
macLabel: string = 'MAC Address';
```
##### accountOnboarding.hardware.macPlaceholder
```ts
macPlaceholder: string = '00:04:13:AA:BB:CC';
```
##### accountOnboarding.hardware.noDevices
```ts
noDevices: string = 'No devices are available for your account at the moment.';
```
##### accountOnboarding.hardware.noUsers
```ts
noUsers: string = 'No team members found. Add team members in the Account step first.';
```
##### accountOnboarding.hardware.removeBaseFailed
```ts
removeBaseFailed: string = 'Failed to remove cordless base.';
```
##### accountOnboarding.hardware.removeDevice
```ts
removeDevice: string = 'Remove';
```
##### accountOnboarding.hardware.save
```ts
save: string = 'Save';
```
##### accountOnboarding.hardware.saving
```ts
saving: string = 'Saving...';
```
##### accountOnboarding.hardware.selectUser
```ts
selectUser: string = 'Select a team member';
```
##### accountOnboarding.hardware.selectUserRequired
```ts
selectUserRequired: string = 'Please select a team member.';
```
##### accountOnboarding.hardware.shippingAddress
```ts
shippingAddress: string = 'Shipping Address';
```
##### accountOnboarding.hardware.submitOrder
```ts
submitOrder: string = 'Submit Order';
```
##### accountOnboarding.hardware.submitting
```ts
submitting: string = 'Submitting...';
```
##### accountOnboarding.hardware.subtitle
```ts
subtitle: string = 'Drag and drop devices to assign them to team members';
```
##### accountOnboarding.hardware.tableHeaderDevice
```ts
tableHeaderDevice: string = 'Assigned Device';
```
##### accountOnboarding.hardware.tableHeaderExtension
```ts
tableHeaderExtension: string = 'Extension';
```
##### accountOnboarding.hardware.tableHeaderName
```ts
tableHeaderName: string = 'Full name';
```
##### accountOnboarding.hardware.title
```ts
title: string = 'Assign Devices';
```
##### accountOnboarding.hardware.unassign
```ts
unassign: string = 'Unassign';
```
##### accountOnboarding.hardware.unsupportedVendor
```ts
unsupportedVendor: string = 'This device is not currently supported. Our support team has been notified and will follow up.';
```
##### accountOnboarding.hardware.userLabel
```ts
userLabel: string = 'Team Member';
```
##### accountOnboarding.legal
```ts
legal: object;
```
##### accountOnboarding.legal.and
```ts
and: string = 'and';
```
##### accountOnboarding.legal.prefix
```ts
prefix: string = 'By continuing, you agree to the';
```
##### accountOnboarding.legal.privacyPolicy
```ts
privacyPolicy: string = 'Privacy Policy';
```
##### accountOnboarding.legal.recipientTerms
```ts
recipientTerms: string = 'Recipient Terms of Service';
```
##### accountOnboarding.legal.termsOfService
```ts
termsOfService: string = 'Terms of Service';
```
##### accountOnboarding.loading
```ts
loading: string = 'Loading...';
```
##### accountOnboarding.nav
```ts
nav: object;
```
##### accountOnboarding.nav.back
```ts
back: string = 'Back';
```
##### accountOnboarding.nav.exit
```ts
exit: string = 'Finish';
```
##### accountOnboarding.nav.next
```ts
next: string = 'Next';
```
##### accountOnboarding.nav.skip
```ts
skip: string = 'Skip';
```
##### accountOnboarding.numbers
```ts
numbers: object;
```
##### accountOnboarding.numbers.callerId
```ts
callerId: object;
```
##### accountOnboarding.numbers.callerId.alreadySet
```ts
alreadySet: string = 'Already configured';
```
##### accountOnboarding.numbers.callerId.charCount
```ts
charCount: string = '{count}/15';
```
##### accountOnboarding.numbers.callerId.directoryListing
```ts
directoryListing: object;
```
##### accountOnboarding.numbers.callerId.directoryListing.info
```ts
info: string = 'To update your directory listing, contact {platformName} support.';
```
##### accountOnboarding.numbers.callerId.directoryListing.title
```ts
title: string = 'Directory Listing (DA/DL)';
```
##### accountOnboarding.numbers.callerId.error
```ts
error: object;
```
##### accountOnboarding.numbers.callerId.error.conflict
```ts
conflict: string = 'A caller ID update is already in progress for this number.';
```
##### accountOnboarding.numbers.callerId.error.submitFailed
```ts
submitFailed: string = 'Failed to set caller ID. Please try again.';
```
##### accountOnboarding.numbers.callerId.inputHelp
```ts
inputHelp: string = 'Max 15 characters. Letters, numbers, spaces, and hyphens only.';
```
##### accountOnboarding.numbers.callerId.inputLabel
```ts
inputLabel: string = 'Caller ID Name';
```
##### accountOnboarding.numbers.callerId.inputPlaceholder
```ts
inputPlaceholder: string = 'e.g. ACME Corp';
```
##### accountOnboarding.numbers.callerId.noDIDs
```ts
noDIDs: string = 'No active phone numbers to configure.';
```
##### accountOnboarding.numbers.callerId.partialError
```ts
partialError: string = 'Some caller IDs could not be set. Fix errors and retry, or skip.';
```
##### accountOnboarding.numbers.callerId.skipCallerId
```ts
skipCallerId: string = 'Skip';
```
##### accountOnboarding.numbers.callerId.submit
```ts
submit: string = 'Set Caller ID';
```
##### accountOnboarding.numbers.callerId.submitAll
```ts
submitAll: string = 'Set All Caller IDs';
```
##### accountOnboarding.numbers.callerId.submitted
```ts
submitted: string = 'Submitted';
```
##### accountOnboarding.numbers.callerId.submitting
```ts
submitting: string = 'Submitting...';
```
##### accountOnboarding.numbers.callerId.submittingAll
```ts
submittingAll: string = 'Submitting caller IDs...';
```
##### accountOnboarding.numbers.callerId.subtitle
```ts
subtitle: string = 'Configure the name displayed when making outbound calls';
```
##### accountOnboarding.numbers.callerId.title
```ts
title: string = 'Caller ID Setup';
```
##### accountOnboarding.numbers.callerId.validation
```ts
validation: object;
```
##### accountOnboarding.numbers.callerId.validation.invalidChars
```ts
invalidChars: string = 'Only letters, numbers, spaces, and hyphens allowed';
```
##### accountOnboarding.numbers.callerId.validation.required
```ts
required: string = 'Caller ID name is required';
```
##### accountOnboarding.numbers.callerId.validation.tooLong
```ts
tooLong: string = 'Must be 15 characters or fewer';
```
##### accountOnboarding.numbers.defaultDialPlanName
```ts
defaultDialPlanName: string = 'Onboarding Dial Plan';
```
##### accountOnboarding.numbers.directoryListing
```ts
directoryListing: object;
```
##### accountOnboarding.numbers.directoryListing.businessName
```ts
businessName: string = 'Business Name';
```
##### accountOnboarding.numbers.directoryListing.businessNameHelp
```ts
businessNameHelp: string = 'The name shown in directory listings and used for caller verification. Max 200 characters.';
```
##### accountOnboarding.numbers.directoryListing.businessNamePlaceholder
```ts
businessNamePlaceholder: string = 'Enter business name for listing';
```
##### accountOnboarding.numbers.directoryListing.noDIDs
```ts
noDIDs: string = 'No eligible phone numbers to configure.';
```
##### accountOnboarding.numbers.directoryListing.noneOption
```ts
noneOption: string = 'None \u2014 skip directory listing';
```
##### accountOnboarding.numbers.directoryListing.selectPrompt
```ts
selectPrompt: string = 'Select which number should be listed:';
```
##### accountOnboarding.numbers.directoryListing.subtitle
```ts
subtitle: string = 'A directory listing feeds your business information into online directories and data aggregators, helping customers find you. It also reduces the chance of your outbound calls being flagged as spam by call-screening apps.';
```
##### accountOnboarding.numbers.directoryListing.title
```ts
title: string = 'Directory Listing';
```
##### accountOnboarding.numbers.directoryListing.validation
```ts
validation: object;
```
##### accountOnboarding.numbers.directoryListing.validation.nameRequired
```ts
nameRequired: string = 'Business name is required for the directory listing.';
```
##### accountOnboarding.numbers.gate
```ts
gate: object;
```
##### accountOnboarding.numbers.gate.noDIDsAvailable
```ts
noDIDsAvailable: string = 'You need at least one phone number before selecting a primary number. Order or port a number first.';
```
##### accountOnboarding.numbers.gate.primaryRequired
```ts
primaryRequired: string = 'Please select a primary number to continue.';
```
##### accountOnboarding.numbers.nav
```ts
nav: object;
```
##### accountOnboarding.numbers.nav.back
```ts
back: string = 'Back';
```
##### accountOnboarding.numbers.nav.backToSearch
```ts
backToSearch: string = 'Back to Search';
```
##### accountOnboarding.numbers.nav.cancel
```ts
cancel: string = 'Cancel';
```
##### accountOnboarding.numbers.nav.confirm
```ts
confirm: string = 'Confirm';
```
##### accountOnboarding.numbers.nav.next
```ts
next: string = 'Next';
```
##### accountOnboarding.numbers.order
```ts
order: object;
```
##### accountOnboarding.numbers.order.areaCodeLabel
```ts
areaCodeLabel: string = 'Area Code';
```
##### accountOnboarding.numbers.order.areaCodePlaceholder
```ts
areaCodePlaceholder: string = '212';
```
##### accountOnboarding.numbers.order.carrierNote
```ts
carrierNote: string = 'Your order will be submitted to the carrier for fulfillment. This usually completes within seconds but may take longer.';
```
##### accountOnboarding.numbers.order.confirmSubtitle
```ts
confirmSubtitle: string = 'You are about to order {count} phone numbers';
```
##### accountOnboarding.numbers.order.confirmSubtitle\_one
```ts
confirmSubtitle_one: string = 'You are about to order {count} phone number';
```
##### accountOnboarding.numbers.order.confirmSubtitle\_other
```ts
confirmSubtitle_other: string = 'You are about to order {count} phone numbers';
```
##### accountOnboarding.numbers.order.confirmTitle
```ts
confirmTitle: string = 'Confirm Your Order';
```
##### accountOnboarding.numbers.order.continue
```ts
continue: string = 'Continue';
```
##### accountOnboarding.numbers.order.deselectAll
```ts
deselectAll: string = 'Deselect All';
```
##### accountOnboarding.numbers.order.done
```ts
done: string = 'Done';
```
##### accountOnboarding.numbers.order.error
```ts
error: string = 'An error occurred while placing the order.';
```
##### accountOnboarding.numbers.order.noResults
```ts
noResults: string = 'No numbers found. Try a different search.';
```
##### accountOnboarding.numbers.order.ordering
```ts
ordering: string = 'Ordering...';
```
##### accountOnboarding.numbers.order.orderMore
```ts
orderMore: string = 'Order More Numbers';
```
##### accountOnboarding.numbers.order.placeOrder
```ts
placeOrder: string = 'Place Order';
```
##### accountOnboarding.numbers.order.placing
```ts
placing: string = 'Placing Order...';
```
##### accountOnboarding.numbers.order.quantityLabel
```ts
quantityLabel: string = 'Quantity';
```
##### accountOnboarding.numbers.order.resultsSubtitle
```ts
resultsSubtitle: string = 'Select the numbers you would like to order.';
```
##### accountOnboarding.numbers.order.resultsTitle
```ts
resultsTitle: string = 'Available Numbers';
```
##### accountOnboarding.numbers.order.search
```ts
search: string = 'Search';
```
##### accountOnboarding.numbers.order.searchByAreaCode
```ts
searchByAreaCode: string = 'Area Code';
```
##### accountOnboarding.numbers.order.searchByZip
```ts
searchByZip: string = 'ZIP Code';
```
##### accountOnboarding.numbers.order.searching
```ts
searching: string = 'Searching...';
```
##### accountOnboarding.numbers.order.searchSubtitle
```ts
searchSubtitle: string = 'Find available numbers by entering an area code or ZIP code';
```
##### accountOnboarding.numbers.order.searchTitle
```ts
searchTitle: string = 'Search Available Numbers';
```
##### accountOnboarding.numbers.order.selectAll
```ts
selectAll: string = 'Select All';
```
##### accountOnboarding.numbers.order.selected
```ts
selected: string = 'selected';
```
##### accountOnboarding.numbers.order.state
```ts
state: string = 'State';
```
##### accountOnboarding.numbers.order.statusComplete
```ts
statusComplete: string = 'Your numbers have been activated.';
```
##### accountOnboarding.numbers.order.statusFailed
```ts
statusFailed: string = 'The order could not be completed.';
```
##### accountOnboarding.numbers.order.statusPartial
```ts
statusPartial: string = 'Some numbers were activated, but others failed.';
```
##### accountOnboarding.numbers.order.statusPending
```ts
statusPending: string = 'Your order has been submitted to the carrier. Fulfillment usually completes within seconds but may take longer.';
```
##### accountOnboarding.numbers.order.statusStalled
```ts
statusStalled: string = 'Your order has been submitted to the carrier. Fulfillment usually completes within seconds but may take longer.';
```
##### accountOnboarding.numbers.order.statusTitle
```ts
statusTitle: string = 'Order Submitted';
```
##### accountOnboarding.numbers.order.zipLabel
```ts
zipLabel: string = 'ZIP Code';
```
##### accountOnboarding.numbers.order.zipPlaceholder
```ts
zipPlaceholder: string = '10001';
```
##### accountOnboarding.numbers.overview
```ts
overview: object;
```
##### accountOnboarding.numbers.overview.empty
```ts
empty: string = 'No telephone numbers yet. Request new numbers or port your existing ones.';
```
##### accountOnboarding.numbers.overview.heading
```ts
heading: string = 'Your Numbers';
```
##### accountOnboarding.numbers.overview.loadError
```ts
loadError: string = 'Failed to load telephone numbers. Please try again.';
```
##### accountOnboarding.numbers.overview.phoneNumber
```ts
phoneNumber: string = 'Phone Number';
```
##### accountOnboarding.numbers.overview.portExisting
```ts
portExisting: string = 'Port Existing Number';
```
##### accountOnboarding.numbers.overview.portExistingDesc
```ts
portExistingDesc: string = 'Transfer your current business number to {platformName}. This typically takes 5–10 business days.';
```
##### accountOnboarding.numbers.overview.requestNew
```ts
requestNew: string = 'Request New Numbers';
```
##### accountOnboarding.numbers.overview.requestNewDesc
```ts
requestNewDesc: string = 'Get new business phone numbers instantly. Choose from available numbers in your area.';
```
##### accountOnboarding.numbers.overview.retry
```ts
retry: string = 'Retry';
```
##### accountOnboarding.numbers.overview.source
```ts
source: string = 'Source';
```
##### accountOnboarding.numbers.overview.status
```ts
status: string = 'Status';
```
##### accountOnboarding.numbers.overview.temporaryBanner
```ts
temporaryBanner: string = 'A temporary number has been assigned to your account while you set up your permanent numbers.';
```
##### accountOnboarding.numbers.overview.type
```ts
type: string = 'Type';
```
##### accountOnboarding.numbers.port
```ts
port: object;
```
##### accountOnboarding.numbers.port.accountNumberLabel
```ts
accountNumberLabel: string = 'Account Number';
```
##### accountOnboarding.numbers.port.accountNumberPlaceholder
```ts
accountNumberPlaceholder: string = 'From your current carrier';
```
##### accountOnboarding.numbers.port.accountRequired
```ts
accountRequired: string = 'Account # Required';
```
##### accountOnboarding.numbers.port.addAnother
```ts
addAnother: string = 'Add another number';
```
##### accountOnboarding.numbers.port.addressHeading
```ts
addressHeading: string = 'Service Address';
```
##### accountOnboarding.numbers.port.approve
```ts
approve: string = 'Approve & Submit';
```
##### accountOnboarding.numbers.port.approverNameLabel
```ts
approverNameLabel: string = 'Authorized Contact';
```
##### accountOnboarding.numbers.port.approverNamePlaceholder
```ts
approverNamePlaceholder: string = 'John Doe';
```
##### accountOnboarding.numbers.port.backToOverview
```ts
backToOverview: string = 'Back to Numbers';
```
##### accountOnboarding.numbers.port.billCopyDesc
```ts
billCopyDesc: string = 'A recent bill from your current carrier showing the numbers to be ported.';
```
##### accountOnboarding.numbers.port.billCopyLabel
```ts
billCopyLabel: string = 'Phone Bill Copy';
```
##### accountOnboarding.numbers.port.billCopyRequired
```ts
billCopyRequired: string = 'Required';
```
##### accountOnboarding.numbers.port.btnLabel
```ts
btnLabel: string = 'Billing Telephone Number (BTN)';
```
##### accountOnboarding.numbers.port.btnPlaceholder
```ts
btnPlaceholder: string = '(555) 123-4567';
```
##### accountOnboarding.numbers.port.businessNameLabel
```ts
businessNameLabel: string = 'Business Name';
```
##### accountOnboarding.numbers.port.businessNamePlaceholder
```ts
businessNamePlaceholder: string = 'Acme Corp';
```
##### accountOnboarding.numbers.port.carrier
```ts
carrier: string = 'Current Carrier';
```
##### accountOnboarding.numbers.port.carrierContinue
```ts
carrierContinue: string = 'Continue';
```
##### accountOnboarding.numbers.port.carrierGroupsSubtitle
```ts
carrierGroupsSubtitle: string = 'Your numbers are with different carriers. Each carrier requires a separate port request.';
```
##### accountOnboarding.numbers.port.carrierGroupsTitle
```ts
carrierGroupsTitle: string = 'Carrier Groups';
```
##### accountOnboarding.numbers.port.carrierStart
```ts
carrierStart: string = 'Start';
```
##### accountOnboarding.numbers.port.carrierSubmitted
```ts
carrierSubmitted: string = 'Submitted';
```
##### accountOnboarding.numbers.port.checkEligibility
```ts
checkEligibility: string = 'Check Eligibility';
```
##### accountOnboarding.numbers.port.checking
```ts
checking: string = 'Checking...';
```
##### accountOnboarding.numbers.port.cityLabel
```ts
cityLabel: string = 'City';
```
##### accountOnboarding.numbers.port.cityPlaceholder
```ts
cityPlaceholder: string = 'New York';
```
##### accountOnboarding.numbers.port.continueWithPortable
```ts
continueWithPortable: string = 'Continue with Portable Numbers';
```
##### accountOnboarding.numbers.port.csrDesc
```ts
csrDesc: string = 'Optional but recommended — speeds up the porting process.';
```
##### accountOnboarding.numbers.port.csrLabel
```ts
csrLabel: string = 'Customer Service Record (CSR)';
```
##### accountOnboarding.numbers.port.csrOptional
```ts
csrOptional: string = 'Optional';
```
##### accountOnboarding.numbers.port.documentsSection
```ts
documentsSection: string = 'Documents';
```
##### accountOnboarding.numbers.port.documentsSubtitle
```ts
documentsSubtitle: string = 'Upload your latest phone bill and optionally a Customer Service Record (CSR).';
```
##### accountOnboarding.numbers.port.documentsTitle
```ts
documentsTitle: string = 'Supporting Documents';
```
##### accountOnboarding.numbers.port.eligibilitySubtitle
```ts
eligibilitySubtitle: string = 'Review which numbers can be ported.';
```
##### accountOnboarding.numbers.port.eligibilityTitle
```ts
eligibilityTitle: string = 'Port Eligibility';
```
##### accountOnboarding.numbers.port.fileSelected
```ts
fileSelected: string = 'Selected:';
```
##### accountOnboarding.numbers.port.focDateLabel
```ts
focDateLabel: string = 'Port Date';
```
##### accountOnboarding.numbers.port.focSection
```ts
focSection: string = 'Port Date';
```
##### accountOnboarding.numbers.port.focSubtitle
```ts
focSubtitle: string = 'Choose when you want the numbers transferred. Must be at least 5 business days out.';
```
##### accountOnboarding.numbers.port.focTimeLabel
```ts
focTimeLabel: string = 'Port Time (Eastern)';
```
##### accountOnboarding.numbers.port.focTimePlaceholder
```ts
focTimePlaceholder: string = 'Select time';
```
##### accountOnboarding.numbers.port.focTitle
```ts
focTitle: string = 'Requested Port Date';
```
##### accountOnboarding.numbers.port.houseNumberLabel
```ts
houseNumberLabel: string = 'Street Number';
```
##### accountOnboarding.numbers.port.houseNumberPlaceholder
```ts
houseNumberPlaceholder: string = '123';
```
##### accountOnboarding.numbers.port.line2Label
```ts
line2Label: string = 'Suite / Unit';
```
##### accountOnboarding.numbers.port.line2Placeholder
```ts
line2Placeholder: string = 'Suite 100';
```
##### accountOnboarding.numbers.port.noFileSelected
```ts
noFileSelected: string = 'No file selected';
```
##### accountOnboarding.numbers.port.noPortable
```ts
noPortable: string = 'None of the entered numbers are eligible for porting.';
```
##### accountOnboarding.numbers.port.notPortable
```ts
notPortable: string = 'Not Portable';
```
##### accountOnboarding.numbers.port.numberPlural
```ts
numberPlural: string = 'numbers';
```
##### accountOnboarding.numbers.port.numberSingular
```ts
numberSingular: string = 'number';
```
##### accountOnboarding.numbers.port.numbersSection
```ts
numbersSection: string = 'Numbers';
```
##### accountOnboarding.numbers.port.numbersSubtitle
```ts
numbersSubtitle: string = 'Enter the phone numbers you want to transfer to {platformName}.';
```
##### accountOnboarding.numbers.port.numbersTitle
```ts
numbersTitle: string = 'Numbers to Port';
```
##### accountOnboarding.numbers.port.phoneLabel
```ts
phoneLabel: string = 'Phone Number';
```
##### accountOnboarding.numbers.port.phonePlaceholder
```ts
phonePlaceholder: string = '(555) 123-4567';
```
##### accountOnboarding.numbers.port.pinLabel
```ts
pinLabel: string = 'Account PIN';
```
##### accountOnboarding.numbers.port.pinPlaceholder
```ts
pinPlaceholder: string = '1234';
```
##### accountOnboarding.numbers.port.portable
```ts
portable: string = 'Portable';
```
##### accountOnboarding.numbers.port.removeNumber
```ts
removeNumber: string = 'Remove';
```
##### accountOnboarding.numbers.port.reviewSubtitle
```ts
reviewSubtitle: string = 'Verify all details before submitting your port request.';
```
##### accountOnboarding.numbers.port.reviewTitle
```ts
reviewTitle: string = 'Review & Approve';
```
##### accountOnboarding.numbers.port.signatureHelp
```ts
signatureHelp: string = 'By signing, you authorize the transfer of the listed numbers to {platformName}.';
```
##### accountOnboarding.numbers.port.signatureLabel
```ts
signatureLabel: string = 'Electronic Signature';
```
##### accountOnboarding.numbers.port.signaturePlaceholder
```ts
signaturePlaceholder: string = 'Type your full legal name';
```
##### accountOnboarding.numbers.port.stateLabel
```ts
stateLabel: string = 'State';
```
##### accountOnboarding.numbers.port.statePlaceholder
```ts
statePlaceholder: string = 'Select state';
```
##### accountOnboarding.numbers.port.streetNameLabel
```ts
streetNameLabel: string = 'Street Name';
```
##### accountOnboarding.numbers.port.streetNamePlaceholder
```ts
streetNamePlaceholder: string = 'Main St';
```
##### accountOnboarding.numbers.port.submittedStatus
```ts
submittedStatus: string = 'Status';
```
##### accountOnboarding.numbers.port.submittedSubtitle
```ts
submittedSubtitle: string = 'Your port request has been submitted and is being processed.';
```
##### accountOnboarding.numbers.port.submittedTitle
```ts
submittedTitle: string = 'Port Request Submitted';
```
##### accountOnboarding.numbers.port.submitting
```ts
submitting: string = 'Submitting...';
```
##### accountOnboarding.numbers.port.subscriberSection
```ts
subscriberSection: string = 'Subscriber';
```
##### accountOnboarding.numbers.port.subscriberSubtitle
```ts
subscriberSubtitle: string = 'Enter the details exactly as they appear on your current phone bill.';
```
##### accountOnboarding.numbers.port.subscriberTitle
```ts
subscriberTitle: string = 'Subscriber Information';
```
##### accountOnboarding.numbers.port.uploadFile
```ts
uploadFile: string = 'Choose File';
```
##### accountOnboarding.numbers.port.uploading
```ts
uploading: string = 'Uploading...';
```
##### accountOnboarding.numbers.port.wireless
```ts
wireless: string = 'Wireless';
```
##### accountOnboarding.numbers.port.wirelessNo
```ts
wirelessNo: string = 'No';
```
##### accountOnboarding.numbers.port.wirelessYes
```ts
wirelessYes: string = 'Yes';
```
##### accountOnboarding.numbers.port.zipLabel
```ts
zipLabel: string = 'ZIP Code';
```
##### accountOnboarding.numbers.port.zipPlaceholder
```ts
zipPlaceholder: string = '10001';
```
##### accountOnboarding.numbers.primaryNumber
```ts
primaryNumber: object;
```
##### accountOnboarding.numbers.primaryNumber.autoMatched
```ts
autoMatched: string = '{phone} matches your account phone and has been selected as the primary number for E911.';
```
##### accountOnboarding.numbers.primaryNumber.autoMatchedBadge
```ts
autoMatchedBadge: string = 'Account number — auto-selected';
```
##### accountOnboarding.numbers.primaryNumber.description
```ts
description: string = 'Select the primary phone number for this location. This number is registered with E911 emergency services.';
```
##### accountOnboarding.numbers.primaryNumber.heading
```ts
heading: string = 'Primary Number';
```
##### accountOnboarding.numbers.primaryNumber.loading
```ts
loading: string = 'Loading phone numbers...';
```
##### accountOnboarding.numbers.primaryNumber.noDIDs
```ts
noDIDs: string = 'No active phone numbers available yet. E911 will be configured once numbers are provisioned.';
```
##### accountOnboarding.numbers.primaryNumber.temporary
```ts
temporary: string = 'Temporary';
```
##### accountOnboarding.numbers.primaryNumber.temporaryNote
```ts
temporaryNote: string = 'This is a temporary number assigned to get you started. You can replace it with a permanent number at any time.';
```
##### accountOnboarding.numbers.source
```ts
source: object;
```
##### accountOnboarding.numbers.source.did
```ts
did: string = 'Account';
```
##### accountOnboarding.numbers.source.didTemporary
```ts
didTemporary: string = 'Temporary';
```
##### accountOnboarding.numbers.source.number\_order
```ts
number_order: string = 'New Order';
```
##### accountOnboarding.numbers.source.port\_order
```ts
port_order: string = 'Port';
```
##### accountOnboarding.numbers.status
```ts
status: object;
```
##### accountOnboarding.numbers.status.active
```ts
active: string = 'Active';
```
##### accountOnboarding.numbers.status.inactive
```ts
inactive: string = 'Inactive';
```
##### accountOnboarding.numbers.status.order\_failed
```ts
order_failed: string = 'Order Failed';
```
##### accountOnboarding.numbers.status.ordering
```ts
ordering: string = 'Ordering';
```
##### accountOnboarding.numbers.status.porting\_approved
```ts
porting_approved: string = 'Port Approved';
```
##### accountOnboarding.numbers.status.porting\_draft
```ts
porting_draft: string = 'Port Draft';
```
##### accountOnboarding.numbers.status.porting\_exception
```ts
porting_exception: string = 'Port Exception';
```
##### accountOnboarding.numbers.status.porting\_foc
```ts
porting_foc: string = 'Port Scheduled';
```
##### accountOnboarding.numbers.status.porting\_submitted
```ts
porting_submitted: string = 'Port Submitted';
```
##### accountOnboarding.numbers.status.released
```ts
released: string = 'Released';
```
##### accountOnboarding.numbers.subtitle
```ts
subtitle: string = "Choose how you'd like to set up your business numbers";
```
##### accountOnboarding.numbers.title
```ts
title: string = 'Phone Numbers';
```
##### accountOnboarding.numbers.validation
```ts
validation: object;
```
##### accountOnboarding.numbers.validation.approverNameRequired
```ts
approverNameRequired: string = 'Authorized contact name is required.';
```
##### accountOnboarding.numbers.validation.areaCodeFormat
```ts
areaCodeFormat: string = 'Enter a 3-digit area code.';
```
##### accountOnboarding.numbers.validation.areaCodeRequired
```ts
areaCodeRequired: string = 'Area code is required.';
```
##### accountOnboarding.numbers.validation.billCopyRequired
```ts
billCopyRequired: string = 'A phone bill copy is required.';
```
##### accountOnboarding.numbers.validation.btnInvalid
```ts
btnInvalid: string = 'Enter a valid US phone number.';
```
##### accountOnboarding.numbers.validation.btnRequired
```ts
btnRequired: string = 'BTN is required.';
```
##### accountOnboarding.numbers.validation.businessNameRequired
```ts
businessNameRequired: string = 'Business name is required.';
```
##### accountOnboarding.numbers.validation.cityRequired
```ts
cityRequired: string = 'City is required.';
```
##### accountOnboarding.numbers.validation.eligibilityError
```ts
eligibilityError: string = 'Failed to check eligibility. Please try again.';
```
##### accountOnboarding.numbers.validation.focDateRequired
```ts
focDateRequired: string = 'Port date is required.';
```
##### accountOnboarding.numbers.validation.focDateTooFar
```ts
focDateTooFar: string = 'Port date must be within 30 days.';
```
##### accountOnboarding.numbers.validation.focDateTooSoon
```ts
focDateTooSoon: string = 'Port date must be at least 5 business days from today.';
```
##### accountOnboarding.numbers.validation.focTimeRequired
```ts
focTimeRequired: string = 'Port time is required.';
```
##### accountOnboarding.numbers.validation.houseNumberRequired
```ts
houseNumberRequired: string = 'Street number is required.';
```
##### accountOnboarding.numbers.validation.phoneDuplicate
```ts
phoneDuplicate: string = 'This number has already been entered.';
```
##### accountOnboarding.numbers.validation.phoneInvalid
```ts
phoneInvalid: string = 'Enter a valid US phone number.';
```
##### accountOnboarding.numbers.validation.phoneRequired
```ts
phoneRequired: string = 'At least one phone number is required.';
```
##### accountOnboarding.numbers.validation.selectAtLeastOne
```ts
selectAtLeastOne: string = 'Select at least one number.';
```
##### accountOnboarding.numbers.validation.signatureRequired
```ts
signatureRequired: string = 'Signature is required.';
```
##### accountOnboarding.numbers.validation.stateRequired
```ts
stateRequired: string = 'State is required.';
```
##### accountOnboarding.numbers.validation.streetNameRequired
```ts
streetNameRequired: string = 'Street name is required.';
```
##### accountOnboarding.numbers.validation.submitError
```ts
submitError: string = 'Failed to submit port request. Please try again.';
```
##### accountOnboarding.numbers.validation.zipFormat
```ts
zipFormat: string = 'Enter a 5-digit ZIP code.';
```
##### accountOnboarding.numbers.validation.zipRequired
```ts
zipRequired: string = 'ZIP code is required.';
```
##### accountOnboarding.sidebar
```ts
sidebar: object;
```
##### accountOnboarding.sidebar.businessDetails
```ts
businessDetails: string = 'Business Details';
```
##### accountOnboarding.sidebar.businessDetailsDesc
```ts
businessDetailsDesc: string = 'Enter your company information';
```
##### accountOnboarding.sidebar.callerId
```ts
callerId: string = 'Caller ID';
```
##### accountOnboarding.sidebar.callerIdDesc
```ts
callerIdDesc: string = 'Set caller ID for your numbers';
```
##### accountOnboarding.sidebar.deviceAssignment
```ts
deviceAssignment: string = 'Device Assignment';
```
##### accountOnboarding.sidebar.deviceAssignmentDesc
```ts
deviceAssignmentDesc: string = 'Assign devices to users';
```
##### accountOnboarding.sidebar.directoryListing
```ts
directoryListing: string = 'Directory Listing';
```
##### accountOnboarding.sidebar.directoryListingDesc
```ts
directoryListingDesc: string = 'Configure 411 directory listing';
```
##### accountOnboarding.sidebar.finalCompletion
```ts
finalCompletion: string = 'Final Completion';
```
##### accountOnboarding.sidebar.finalCompletionDesc
```ts
finalCompletionDesc: string = 'Complete your onboarding';
```
##### accountOnboarding.sidebar.numberOptions
```ts
numberOptions: string = 'Number Options';
```
##### accountOnboarding.sidebar.numberOptionsDesc
```ts
numberOptionsDesc: string = 'Choose to port existing or get new numbers';
```
##### accountOnboarding.sidebar.numberSetup
```ts
numberSetup: string = 'Number Setup';
```
##### accountOnboarding.sidebar.numberSetupDesc
```ts
numberSetupDesc: string = 'Configure your phone numbers';
```
##### accountOnboarding.sidebar.primaryNumber
```ts
primaryNumber: string = 'Primary Number';
```
##### accountOnboarding.sidebar.primaryNumberDesc
```ts
primaryNumberDesc: string = 'Select your main E911 number';
```
##### accountOnboarding.sidebar.teamMembers
```ts
teamMembers: string = 'Team Members';
```
##### accountOnboarding.sidebar.teamMembersDesc
```ts
teamMembersDesc: string = 'Add users and assign extensions';
```
##### accountOnboarding.sidebar.verification
```ts
verification: string = 'Verification';
```
##### accountOnboarding.sidebar.verificationDesc
```ts
verificationDesc: string = 'Verify number status';
```
##### accountOnboarding.stepComplete
```ts
stepComplete: object;
```
##### accountOnboarding.stepComplete.done
```ts
done: string = 'Done';
```
##### accountOnboarding.stepComplete.subtitle
```ts
subtitle: string = 'This step has been completed successfully.';
```
##### accountOnboarding.stepComplete.title
```ts
title: string = '{stepName} Complete';
```
##### accountOnboarding.steps
```ts
steps: object;
```
##### accountOnboarding.steps.account
```ts
account: string = 'Account Setup';
```
##### accountOnboarding.steps.complete
```ts
complete: string = 'Complete';
```
##### accountOnboarding.steps.hardware
```ts
hardware: string = 'Hardware Setup';
```
##### accountOnboarding.steps.numbers
```ts
numbers: string = 'Phone Numbers';
```
##### accountOnboarding.title
```ts
title: string = 'Account Onboarding';
```
#### callHistory
```ts
callHistory: object;
```
##### callHistory.clickToCall
```ts
clickToCall: string = 'Click to call';
```
##### callHistory.empty
```ts
empty: string = 'No call history';
```
##### callHistory.error
```ts
error: string = 'Unable to load call history';
```
##### callHistory.loading
```ts
loading: string = 'Loading call history...';
```
##### callHistory.noPhoneNumber
```ts
noPhoneNumber: string = 'Please set a phone number to load call history';
```
##### callHistory.relativeTime
```ts
relativeTime: object;
```
##### callHistory.relativeTime.hourAgo
```ts
hourAgo: string = '1 hour ago';
```
##### callHistory.relativeTime.hoursAgo
```ts
hoursAgo: string = '{count} hours ago';
```
##### callHistory.relativeTime.justNow
```ts
justNow: string = 'Just now';
```
##### callHistory.relativeTime.minuteAgo
```ts
minuteAgo: string = '1 min ago';
```
##### callHistory.relativeTime.minutesAgo
```ts
minutesAgo: string = '{count} min ago';
```
##### callHistory.relativeTime.yesterday
```ts
yesterday: string = 'Yesterday';
```
##### callHistory.summaryNotAvailable
```ts
summaryNotAvailable: string = 'Summary not available';
```
##### callHistory.title
```ts
title: string = 'Call History';
```
#### callLogs
```ts
callLogs: object;
```
##### callLogs.calledBy
```ts
calledBy: string = 'Called by:';
```
##### callLogs.columns
```ts
columns: object;
```
##### callLogs.columns.date
```ts
date: string = 'Date';
```
##### callLogs.columns.direction
```ts
direction: string = 'Direction';
```
##### callLogs.columns.duration
```ts
duration: string = 'Duration';
```
##### callLogs.columns.from
```ts
from: string = 'From';
```
##### callLogs.columns.quality
```ts
quality: string = 'MOS';
```
##### callLogs.columns.status
```ts
status: string = 'Status';
```
##### callLogs.columns.to
```ts
to: string = 'To';
```
##### callLogs.directions
```ts
directions: object;
```
##### callLogs.directions.inbound
```ts
inbound: string = 'Inbound';
```
##### callLogs.directions.internal
```ts
internal: string = 'Internal';
```
##### callLogs.directions.outbound
```ts
outbound: string = 'Outbound';
```
##### callLogs.empty
```ts
empty: string = 'No call logs found';
```
##### callLogs.loading
```ts
loading: string = 'Loading call logs...';
```
##### callLogs.quality
```ts
quality: object;
```
##### callLogs.quality.fair
```ts
fair: string = 'Fair';
```
##### callLogs.quality.good
```ts
good: string = 'Good';
```
##### callLogs.quality.poor
```ts
poor: string = 'Poor';
```
##### callLogs.quality.unavailable
```ts
unavailable: string = 'N/A';
```
##### callLogs.quality.unavailableTooltip
```ts
unavailableTooltip: string = 'No quality data available';
```
##### callLogs.routedTo
```ts
routedTo: string = 'Routed to:';
```
##### callLogs.statuses
```ts
statuses: object;
```
##### callLogs.statuses.busy
```ts
busy: string = 'Busy';
```
##### callLogs.statuses.completed
```ts
completed: string = 'Completed';
```
##### callLogs.statuses.failed
```ts
failed: string = 'Failed';
```
##### callLogs.statuses.noAnswer
```ts
noAnswer: string = 'No Answer';
```
##### callLogs.statuses.voicemail
```ts
voicemail: string = 'Voicemail';
```
##### callLogs.title
```ts
title: string = 'Call Logs';
```
#### common
```ts
common: object;
```
##### common.call
```ts
call: string = 'Call';
```
##### common.cancel
```ts
cancel: string = 'Cancel';
```
##### common.confirm
```ts
confirm: string = 'Confirm';
```
##### common.delete
```ts
delete: string = 'Delete';
```
##### common.error
```ts
error: string = 'Error';
```
##### common.loading
```ts
loading: string = 'Loading...';
```
##### common.next
```ts
next: string = 'Next';
```
##### common.noResults
```ts
noResults: string = 'No results';
```
##### common.pause
```ts
pause: string = 'Pause';
```
##### common.perPage
```ts
perPage: string = 'Per page';
```
##### common.play
```ts
play: string = 'Play';
```
##### common.previous
```ts
previous: string = 'Previous';
```
##### common.showing
```ts
showing: string = 'Showing {start}-{end} of {total}';
```
#### dialPlan
```ts
dialPlan: object;
```
##### dialPlan.empty
```ts
empty: string = 'No dial plan found';
```
##### dialPlan.error
```ts
error: string = 'Failed to load dial plan';
```
##### dialPlan.exits
```ts
exits: object;
```
##### dialPlan.exits.closed
```ts
closed: string = 'Closed';
```
##### dialPlan.exits.next
```ts
next: string = 'No Answer';
```
##### dialPlan.exits.open
```ts
open: string = 'Open';
```
##### dialPlan.exits.timeout
```ts
timeout: string = 'Timeout';
```
##### dialPlan.loading
```ts
loading: string = 'Loading dial plan...';
```
##### dialPlan.nodeTypes
```ts
nodeTypes: object;
```
##### dialPlan.nodeTypes.externalDial
```ts
externalDial: string = 'External Number';
```
##### dialPlan.nodeTypes.internalDial
```ts
internalDial: string = 'Internal Extension';
```
##### dialPlan.nodeTypes.schedule
```ts
schedule: string = 'Schedule';
```
##### dialPlan.nodeTypes.start
```ts
start: string = 'Start';
```
##### dialPlan.nodeTypes.voiceApp
```ts
voiceApp: string = 'Voice App';
```
##### dialPlan.nodeTypes.voicemail
```ts
voicemail: string = 'Voicemail';
```
##### dialPlan.title
```ts
title: string = 'Dial Plan';
```
#### onboardingPortal
```ts
onboardingPortal: object;
```
##### onboardingPortal.back
```ts
back: string = 'Back';
```
##### onboardingPortal.helpSupport
```ts
helpSupport: string = 'Help & Support';
```
##### onboardingPortal.onboardingComplete
```ts
onboardingComplete: string = 'Onboarding complete';
```
##### onboardingPortal.onboardingFlows
```ts
onboardingFlows: string = 'ONBOARDING FLOWS';
```
##### onboardingPortal.overview
```ts
overview: object;
```
##### onboardingPortal.overview.accountDesc
```ts
accountDesc: string = 'Set up your business profile, add team members, and configure your dial plan';
```
##### onboardingPortal.overview.complete
```ts
complete: string = 'Complete';
```
##### onboardingPortal.overview.completeSetup
```ts
completeSetup: string = 'Complete Setup';
```
##### onboardingPortal.overview.continueSetup
```ts
continueSetup: string = 'Continue Setup';
```
##### onboardingPortal.overview.flowsComplete
```ts
flowsComplete: string = '{completed} of {total} flows complete';
```
##### onboardingPortal.overview.hardwareDesc
```ts
hardwareDesc: string = 'Assign phones to team members and track delivery';
```
##### onboardingPortal.overview.label
```ts
label: string = 'Overview';
```
##### onboardingPortal.overview.needHelp
```ts
needHelp: string = 'Need help?';
```
##### onboardingPortal.overview.needHelpSubtitle
```ts
needHelpSubtitle: string = 'Our team is here to help you get set up quickly';
```
##### onboardingPortal.overview.numbersDesc
```ts
numbersDesc: string = 'Port existing numbers or request new business lines';
```
##### onboardingPortal.overview.phoneStatusComplete
```ts
phoneStatusComplete: string = 'Complete';
```
##### onboardingPortal.overview.phoneStatusNumber
```ts
phoneStatusNumber: string = 'Phone Number';
```
##### onboardingPortal.overview.phoneStatusProcessing
```ts
phoneStatusProcessing: string = 'Processing';
```
##### onboardingPortal.overview.phoneStatusStatus
```ts
phoneStatusStatus: string = 'Status';
```
##### onboardingPortal.overview.phoneStatusSubtitle
```ts
phoneStatusSubtitle: string = 'Track the status of your phone numbers';
```
##### onboardingPortal.overview.phoneStatusTemporary
```ts
phoneStatusTemporary: string = 'Temporary';
```
##### onboardingPortal.overview.phoneStatusTitle
```ts
phoneStatusTitle: string = 'Phone number status';
```
##### onboardingPortal.overview.phoneStatusType
```ts
phoneStatusType: string = 'Type';
```
##### onboardingPortal.overview.phoneStatusTypeNew
```ts
phoneStatusTypeNew: string = 'New';
```
##### onboardingPortal.overview.phoneStatusTypePort
```ts
phoneStatusTypePort: string = 'Port';
```
##### onboardingPortal.overview.progress
```ts
progress: string = 'Progress';
```
##### onboardingPortal.overview.progressTitle
```ts
progressTitle: string = 'Onboarding Progress';
```
##### onboardingPortal.overview.review
```ts
review: string = 'Review';
```
##### onboardingPortal.overview.scheduleCall
```ts
scheduleCall: string = 'Schedule a Call';
```
##### onboardingPortal.overview.stepsTitle
```ts
stepsTitle: string = 'Onboarding Steps';
```
##### onboardingPortal.overview.subtitle
```ts
subtitle: string = 'Complete the steps below to set up your business phone system';
```
##### onboardingPortal.overview.title
```ts
title: string = 'Your Business Onboarding';
```
##### onboardingPortal.overview.viewDocs
```ts
viewDocs: string = 'View Documentation';
```
##### onboardingPortal.saveAndExit
```ts
saveAndExit: string = 'Save & Exit to Overview';
```
##### onboardingPortal.splash
```ts
splash: object;
```
##### onboardingPortal.splash.start
```ts
start: string = 'Start Onboarding';
```
##### onboardingPortal.splash.step1
```ts
step1: string = 'Account Details';
```
##### onboardingPortal.splash.step2
```ts
step2: string = 'Setup Phone Numbers';
```
##### onboardingPortal.splash.step3
```ts
step3: string = 'Assign Hardware';
```
##### onboardingPortal.splash.subtitle
```ts
subtitle: string = "Let's get your business set up in 3 easy steps";
```
##### onboardingPortal.splash.title
```ts
title: string = 'Welcome\nto {platformName}';
```
#### phoneNumberOrdering
```ts
phoneNumberOrdering: object;
```
##### phoneNumberOrdering.complete
```ts
complete: object;
```
##### phoneNumberOrdering.complete.assignmentHint
```ts
assignmentHint: string = 'Numbers added to your inventory still need to be assigned to an extension or dial plan before they can receive calls.';
```
##### phoneNumberOrdering.complete.checking
```ts
checking: string = 'Checking order status...';
```
##### phoneNumberOrdering.complete.descriptionCompleteOne
```ts
descriptionCompleteOne: string = 'Your phone number is now in your inventory and ready to be configured.';
```
##### phoneNumberOrdering.complete.descriptionCompleteOther
```ts
descriptionCompleteOther: string = 'Your phone numbers are now in your inventory and ready to be configured.';
```
##### phoneNumberOrdering.complete.descriptionPartialOne
```ts
descriptionPartialOne: string = 'Some numbers could not be fulfilled by the carrier.';
```
##### phoneNumberOrdering.complete.descriptionPartialOther
```ts
descriptionPartialOther: string = 'Some numbers could not be fulfilled by the carrier.';
```
##### phoneNumberOrdering.complete.descriptionPendingOne
```ts
descriptionPendingOne: string = 'Your order has been submitted to the carrier. Fulfillment usually completes within seconds but may take longer.';
```
##### phoneNumberOrdering.complete.descriptionPendingOther
```ts
descriptionPendingOther: string = 'Your order has been submitted to the carrier. Fulfillment usually completes within seconds but may take longer.';
```
##### phoneNumberOrdering.complete.orderMore
```ts
orderMore: string = 'Order More Numbers';
```
##### phoneNumberOrdering.complete.titleCompleteOne
```ts
titleCompleteOne: string = 'Number Ready';
```
##### phoneNumberOrdering.complete.titleCompleteOther
```ts
titleCompleteOther: string = 'Numbers Ready';
```
##### phoneNumberOrdering.complete.titlePartialOne
```ts
titlePartialOne: string = 'Partially Fulfilled';
```
##### phoneNumberOrdering.complete.titlePartialOther
```ts
titlePartialOther: string = 'Partially Fulfilled';
```
##### phoneNumberOrdering.complete.titlePendingOne
```ts
titlePendingOne: string = 'Order Submitted';
```
##### phoneNumberOrdering.complete.titlePendingOther
```ts
titlePendingOther: string = 'Order Submitted';
```
##### phoneNumberOrdering.confirm
```ts
confirm: object;
```
##### phoneNumberOrdering.confirm.back
```ts
back: string = 'Back';
```
##### phoneNumberOrdering.confirm.description
```ts
description: string = 'Your order will be submitted to the carrier for fulfillment. This usually completes within seconds but may take longer.';
```
##### phoneNumberOrdering.confirm.placeOrder
```ts
placeOrder: string = 'Place Order';
```
##### phoneNumberOrdering.confirm.subtitleOne
```ts
subtitleOne: string = 'You are about to order 1 phone number';
```
##### phoneNumberOrdering.confirm.subtitleOther
```ts
subtitleOther: string = 'You are about to order {count} phone numbers';
```
##### phoneNumberOrdering.confirm.title
```ts
title: string = 'Confirm Order';
```
##### phoneNumberOrdering.error
```ts
error: object;
```
##### phoneNumberOrdering.error.description
```ts
description: string = 'The carrier was unable to fulfill your order.';
```
##### phoneNumberOrdering.error.title
```ts
title: string = 'Order Failed';
```
##### phoneNumberOrdering.error.tryAgain
```ts
tryAgain: string = 'Try Again';
```
##### phoneNumberOrdering.ordering
```ts
ordering: object;
```
##### phoneNumberOrdering.ordering.title
```ts
title: string = 'Placing Order...';
```
##### phoneNumberOrdering.results
```ts
results: object;
```
##### phoneNumberOrdering.results.backToSearch
```ts
backToSearch: string = 'Back to Search';
```
##### phoneNumberOrdering.results.continue
```ts
continue: string = 'Continue';
```
##### phoneNumberOrdering.results.noResults
```ts
noResults: string = 'No numbers available for this search';
```
##### phoneNumberOrdering.results.phoneNumber
```ts
phoneNumber: string = 'Phone Number';
```
##### phoneNumberOrdering.results.selectAll
```ts
selectAll: string = 'Select all';
```
##### phoneNumberOrdering.results.selected
```ts
selected: string = '{count} selected';
```
##### phoneNumberOrdering.results.state
```ts
state: string = 'State';
```
##### phoneNumberOrdering.results.title
```ts
title: string = 'Available Numbers';
```
##### phoneNumberOrdering.search
```ts
search: object;
```
##### phoneNumberOrdering.search.areaCode
```ts
areaCode: string = 'Area Code';
```
##### phoneNumberOrdering.search.areaCodeLabel
```ts
areaCodeLabel: string = 'Area Code';
```
##### phoneNumberOrdering.search.areaCodePlaceholder
```ts
areaCodePlaceholder: string = 'e.g. 212';
```
##### phoneNumberOrdering.search.numberOfResults
```ts
numberOfResults: string = 'Quantity to display';
```
##### phoneNumberOrdering.search.search
```ts
search: string = 'Search';
```
##### phoneNumberOrdering.search.searchType
```ts
searchType: string = 'Search by';
```
##### phoneNumberOrdering.search.subtitle
```ts
subtitle: string = 'Find available phone numbers by entering an area code or ZIP code.';
```
##### phoneNumberOrdering.search.title
```ts
title: string = 'Search Available Numbers';
```
##### phoneNumberOrdering.search.zip
```ts
zip: string = 'ZIP Code';
```
##### phoneNumberOrdering.search.zipLabel
```ts
zipLabel: string = 'ZIP Code';
```
##### phoneNumberOrdering.search.zipPlaceholder
```ts
zipPlaceholder: string = 'e.g. 10001';
```
##### phoneNumberOrdering.statuses
```ts
statuses: object;
```
##### phoneNumberOrdering.statuses.complete
```ts
complete: string = 'Complete';
```
##### phoneNumberOrdering.statuses.failed
```ts
failed: string = 'Failed';
```
##### phoneNumberOrdering.statuses.partial
```ts
partial: string = 'Partial';
```
##### phoneNumberOrdering.statuses.pending
```ts
pending: string = 'Pending';
```
##### phoneNumberOrdering.steps
```ts
steps: object;
```
##### phoneNumberOrdering.steps.confirm
```ts
confirm: string = 'Confirm';
```
##### phoneNumberOrdering.steps.done
```ts
done: string = 'Done';
```
##### phoneNumberOrdering.steps.search
```ts
search: string = 'Search';
```
##### phoneNumberOrdering.steps.select
```ts
select: string = 'Select';
```
##### phoneNumberOrdering.steps.stepOf
```ts
stepOf: string = 'Step {current} of {total}';
```
##### phoneNumberOrdering.title
```ts
title: string = 'Order Phone Numbers';
```
#### phoneNumbers
```ts
phoneNumbers: object;
```
##### phoneNumbers.badges
```ts
badges: object;
```
##### phoneNumbers.badges.temporary
```ts
temporary: string = 'Temporary';
```
##### phoneNumbers.columns
```ts
columns: object;
```
##### phoneNumbers.columns.callerID
```ts
callerID: string = 'Caller ID';
```
##### phoneNumbers.columns.cancelledDate
```ts
cancelledDate: string = 'Date Cancelled';
```
##### phoneNumbers.columns.carrier
```ts
carrier: string = 'Carrier';
```
##### phoneNumbers.columns.outbound
```ts
outbound: string = 'Direction';
```
##### phoneNumbers.columns.phoneNumber
```ts
phoneNumber: string = 'Phone Number';
```
##### phoneNumbers.columns.routingTarget
```ts
routingTarget: string = 'Call Routing';
```
##### phoneNumbers.columns.status
```ts
status: string = 'Status';
```
##### phoneNumbers.columns.transferDate
```ts
transferDate: string = 'Transfer Date';
```
##### phoneNumbers.empty
```ts
empty: string = 'No phone numbers';
```
##### phoneNumbers.filterLabel
```ts
filterLabel: string = 'Filter by status';
```
##### phoneNumbers.filters
```ts
filters: object;
```
##### phoneNumbers.filters.active
```ts
active: string = 'Active';
```
##### phoneNumbers.filters.cancelled
```ts
cancelled: string = 'Cancelled';
```
##### phoneNumbers.filters.in\_progress
```ts
in_progress: string = 'In Progress';
```
##### phoneNumbers.loading
```ts
loading: string = 'Loading phone numbers...';
```
##### phoneNumbers.outbound
```ts
outbound: object;
```
##### phoneNumbers.outbound.disabled
```ts
disabled: string = 'Inbound only';
```
##### phoneNumbers.outbound.enabled
```ts
enabled: string = 'Two-way';
```
##### phoneNumbers.routingTarget
```ts
routingTarget: object;
```
##### phoneNumbers.routingTarget.notSet
```ts
notSet: string = 'Not set';
```
##### phoneNumbers.routingTargetTypes
```ts
routingTargetTypes: object;
```
##### phoneNumbers.routingTargetTypes.dialPlan
```ts
dialPlan: string = 'Dial Plan';
```
##### phoneNumbers.routingTargetTypes.ringGroup
```ts
ringGroup: string = 'Ring Group';
```
##### phoneNumbers.routingTargetTypes.user
```ts
user: string = 'User';
```
##### phoneNumbers.routingTargetTypes.voiceApp
```ts
voiceApp: string = 'Voice App';
```
##### phoneNumbers.statuses
```ts
statuses: object;
```
##### phoneNumbers.statuses.active
```ts
active: string = 'Active';
```
##### phoneNumbers.statuses.inactive
```ts
inactive: string = 'Inactive';
```
##### phoneNumbers.statuses.orderFailed
```ts
orderFailed: string = 'Order Failed';
```
##### phoneNumbers.statuses.ordering
```ts
ordering: string = 'Ordering';
```
##### phoneNumbers.statuses.portingApproved
```ts
portingApproved: string = 'Port Approved';
```
##### phoneNumbers.statuses.portingDraft
```ts
portingDraft: string = 'Port Draft';
```
##### phoneNumbers.statuses.portingException
```ts
portingException: string = 'Port Issue';
```
##### phoneNumbers.statuses.portingFoc
```ts
portingFoc: string = 'Port Scheduled';
```
##### phoneNumbers.statuses.portingSubmitted
```ts
portingSubmitted: string = 'Port Submitted';
```
##### phoneNumbers.statuses.released
```ts
released: string = 'Released';
```
##### phoneNumbers.title
```ts
title: string = 'Phone Numbers';
```
#### voicemails
```ts
voicemails: object;
```
##### voicemails.deleteConfirm
```ts
deleteConfirm: string = 'Delete this voicemail?';
```
##### voicemails.deleteTitle
```ts
deleteTitle: string = 'Delete Voicemail';
```
##### voicemails.empty
```ts
empty: string = 'No voicemails';
```
##### voicemails.loading
```ts
loading: string = 'Loading voicemails...';
```
##### voicemails.noUserId
```ts
noUserId: string = 'Please set a user ID to load voicemails';
```
##### voicemails.progress
```ts
progress: string = 'Playback progress';
```
##### voicemails.summary
```ts
summary: string = 'Summary';
```
##### voicemails.title
```ts
title: string = 'Voicemails';
```
##### voicemails.transcript
```ts
transcript: string = 'Full Transcript';
```
##### voicemails.transcription
```ts
transcription: string = 'Transcription';
```
##### voicemails.transcriptLoading
```ts
transcriptLoading: string = 'Loading transcript...';
```
##### voicemails.transcriptNotAvailable
```ts
transcriptNotAvailable: string = 'Transcript not available';
```
***
### onLoadError?
```ts
optional onLoadError?: (event) => void;
```
Defined in: [sdk/src/react/CallHistory.tsx:91](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/CallHistory.tsx#L91)
Callback when there's an error loading call history
#### Parameters
##### event
[`LoadError`](../../index/interfaces/LoadError.md)
#### Returns
`void`
***
### onLoaderStart?
```ts
optional onLoaderStart?: (event) => void;
```
Defined in: [sdk/src/react/CallHistory.tsx:86](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/CallHistory.tsx#L86)
Callback when component starts loading
#### Parameters
##### event
[`LoaderStart`](../../index/interfaces/LoaderStart.md)
#### Returns
`void`
***
### phoneNumber
```ts
phoneNumber: string;
```
Defined in: [sdk/src/react/CallHistory.tsx:24](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/CallHistory.tsx#L24)
Phone number to fetch call history for (E.164 format, required)
***
### style?
```ts
optional style?: CSSProperties;
```
Defined in: [sdk/src/react/CallHistory.tsx:40](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/CallHistory.tsx#L40)
Optional inline styles
---
## Interface: CallLogsProps
[@dialstack/sdk](../../index.md) / [react](../index.md) / CallLogsProps
# Interface: CallLogsProps
Defined in: [sdk/src/react/CallLogs.tsx:23](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/CallLogs.tsx#L23)
## Properties
### classes?
```ts
optional classes?: CallLogsClasses;
```
Defined in: [sdk/src/react/CallLogs.tsx:79](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/CallLogs.tsx#L79)
Custom CSS classes for styling integration
#### Example
```tsx
```
***
### className?
```ts
optional className?: string;
```
Defined in: [sdk/src/react/CallLogs.tsx:27](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/CallLogs.tsx#L27)
Optional CSS class name
***
### customRowRenderer?
```ts
optional customRowRenderer?: CallLogRowRenderer;
```
Defined in: [sdk/src/react/CallLogs.tsx:89](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/CallLogs.tsx#L89)
Custom row renderer for call log rows
***
### dateRange?
```ts
optional dateRange?: DateRange;
```
Defined in: [sdk/src/react/CallLogs.tsx:37](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/CallLogs.tsx#L37)
Date range filter for call logs
***
### displayOptions?
```ts
optional displayOptions?: CallLogDisplayOptions;
```
Defined in: [sdk/src/react/CallLogs.tsx:84](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/CallLogs.tsx#L84)
Display options for controlling column visibility
***
### formatting?
```ts
optional formatting?: FormattingOptions;
```
Defined in: [sdk/src/react/CallLogs.tsx:52](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/CallLogs.tsx#L52)
Formatting options for dates and phone numbers
***
### icons?
```ts
optional icons?: ComponentIcons;
```
Defined in: [sdk/src/react/CallLogs.tsx:57](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/CallLogs.tsx#L57)
Custom icons (partial override of defaults)
***
### layoutVariant?
```ts
optional layoutVariant?: LayoutVariant;
```
Defined in: [sdk/src/react/CallLogs.tsx:62](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/CallLogs.tsx#L62)
Layout variant (compact, comfortable, default)
***
### limit?
```ts
optional limit?: number;
```
Defined in: [sdk/src/react/CallLogs.tsx:42](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/CallLogs.tsx#L42)
Maximum number of call logs per page (default: 20)
***
### locale?
```ts
optional locale?: object;
```
Defined in: [sdk/src/react/CallLogs.tsx:47](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/CallLogs.tsx#L47)
Locale for UI strings
#### accountOnboarding
```ts
accountOnboarding: object;
```
##### accountOnboarding.account
```ts
account: object;
```
##### accountOnboarding.account.details
```ts
details: object;
```
##### accountOnboarding.account.details.companyNameLabel
```ts
companyNameLabel: string = 'Company Name';
```
##### accountOnboarding.account.details.companyNamePlaceholder
```ts
companyNamePlaceholder: string = 'Acme Corp';
```
##### accountOnboarding.account.details.companyNameRequired
```ts
companyNameRequired: string = 'Company name is required';
```
##### accountOnboarding.account.details.emailLabel
```ts
emailLabel: string = 'Primary Contact Email';
```
##### accountOnboarding.account.details.emailPlaceholder
```ts
emailPlaceholder: string = 'admin@company.com';
```
##### accountOnboarding.account.details.emailRequired
```ts
emailRequired: string = 'Primary contact email is required';
```
##### accountOnboarding.account.details.heading
```ts
heading: string = 'Account Details';
```
##### accountOnboarding.account.details.phoneInvalid
```ts
phoneInvalid: string = 'Enter a valid US phone number';
```
##### accountOnboarding.account.details.phoneLabel
```ts
phoneLabel: string = 'Primary Contact Phone Number';
```
##### accountOnboarding.account.details.phonePlaceholder
```ts
phonePlaceholder: string = '(555) 123-4567';
```
##### accountOnboarding.account.details.phoneRequired
```ts
phoneRequired: string = 'Primary contact phone number is required';
```
##### accountOnboarding.account.details.primaryContactLabel
```ts
primaryContactLabel: string = 'Primary Contact';
```
##### accountOnboarding.account.details.primaryContactPlaceholder
```ts
primaryContactPlaceholder: string = 'Jane Doe';
```
##### accountOnboarding.account.details.primaryContactRequired
```ts
primaryContactRequired: string = 'Primary contact is required';
```
##### accountOnboarding.account.details.regionLabel
```ts
regionLabel: string = 'Region';
```
##### accountOnboarding.account.details.regionPlaceholder
```ts
regionPlaceholder: string = 'Select a region';
```
##### accountOnboarding.account.details.timezoneLabel
```ts
timezoneLabel: string = 'Timezone';
```
##### accountOnboarding.account.details.timezonePlaceholder
```ts
timezonePlaceholder: string = 'Select a timezone';
```
##### accountOnboarding.account.details.timezoneRequired
```ts
timezoneRequired: string = 'Timezone is required';
```
##### accountOnboarding.account.location
```ts
location: object;
```
##### accountOnboarding.account.location.addressLabel
```ts
addressLabel: string = 'Address';
```
##### accountOnboarding.account.location.addressRequired
```ts
addressRequired: string = 'Address is required';
```
##### accountOnboarding.account.location.cityLabel
```ts
cityLabel: string = 'City';
```
##### accountOnboarding.account.location.cityPlaceholder
```ts
cityPlaceholder: string = 'New York';
```
##### accountOnboarding.account.location.description
```ts
description: string = 'Add your business address for E911 and caller ID.';
```
##### accountOnboarding.account.location.edit
```ts
edit: string = 'Edit';
```
##### accountOnboarding.account.location.enterManually
```ts
enterManually: string = 'Enter manually';
```
##### accountOnboarding.account.location.heading
```ts
heading: string = 'Business Location';
```
##### accountOnboarding.account.location.houseNumberLabel
```ts
houseNumberLabel: string = '#';
```
##### accountOnboarding.account.location.houseNumberPlaceholder
```ts
houseNumberPlaceholder: string = '123';
```
##### accountOnboarding.account.location.nameLabel
```ts
nameLabel: string = 'Location Name';
```
##### accountOnboarding.account.location.namePlaceholder
```ts
namePlaceholder: string = 'Main Office';
```
##### accountOnboarding.account.location.nameRequired
```ts
nameRequired: string = 'Location name is required';
```
##### accountOnboarding.account.location.noResults
```ts
noResults: string = 'No addresses found';
```
##### accountOnboarding.account.location.postalCodeLabel
```ts
postalCodeLabel: string = 'ZIP';
```
##### accountOnboarding.account.location.postalCodePlaceholder
```ts
postalCodePlaceholder: string = '10001';
```
##### accountOnboarding.account.location.searching
```ts
searching: string = 'Searching...';
```
##### accountOnboarding.account.location.searchInstead
```ts
searchInstead: string = 'Search instead';
```
##### accountOnboarding.account.location.searchPlaceholder
```ts
searchPlaceholder: string = 'Start typing an address...';
```
##### accountOnboarding.account.location.stateLabel
```ts
stateLabel: string = 'State';
```
##### accountOnboarding.account.location.statePlaceholder
```ts
statePlaceholder: string = 'Select';
```
##### accountOnboarding.account.location.streetLabel
```ts
streetLabel: string = 'Street';
```
##### accountOnboarding.account.location.streetPlaceholder
```ts
streetPlaceholder: string = 'Main St';
```
##### accountOnboarding.account.saveError
```ts
saveError: string = 'Failed to save. Please try again.';
```
##### accountOnboarding.account.saving
```ts
saving: string = 'Saving...';
```
##### accountOnboarding.account.subtitle
```ts
subtitle: string = 'Enter your company information';
```
##### accountOnboarding.account.title
```ts
title: string = 'Business Details';
```
##### accountOnboarding.account.users
```ts
users: object;
```
##### accountOnboarding.account.users.addUser
```ts
addUser: string = 'Add User';
```
##### accountOnboarding.account.users.atLeastOne
```ts
atLeastOne: string = 'Add at least one team member to continue.';
```
##### accountOnboarding.account.users.description
```ts
description: string = 'Add users who will have phone extensions';
```
##### accountOnboarding.account.users.duplicateEmail
```ts
duplicateEmail: string = 'A user with this email already exists.';
```
##### accountOnboarding.account.users.emailLabel
```ts
emailLabel: string = 'Email';
```
##### accountOnboarding.account.users.emailPlaceholder
```ts
emailPlaceholder: string = 'john@company.com';
```
##### accountOnboarding.account.users.extensionLabel
```ts
extensionLabel: string = 'Extension';
```
##### accountOnboarding.account.users.extensionPlaceholder
```ts
extensionPlaceholder: string = 'ex. 103';
```
##### accountOnboarding.account.users.heading
```ts
heading: string = 'Team Members';
```
##### accountOnboarding.account.users.nameLabel
```ts
nameLabel: string = 'Full name';
```
##### accountOnboarding.account.users.namePlaceholder
```ts
namePlaceholder: string = 'John Doe';
```
##### accountOnboarding.account.users.nameRequired
```ts
nameRequired: string = 'Name is required';
```
##### accountOnboarding.account.users.noUsers
```ts
noUsers: string = 'No team members added yet.';
```
##### accountOnboarding.account.users.removeUser
```ts
removeUser: string = 'Remove';
```
##### accountOnboarding.account.users.roleAdmin
```ts
roleAdmin: string = 'Admin';
```
##### accountOnboarding.account.users.roleLabel
```ts
roleLabel: string = 'Role';
```
##### accountOnboarding.account.users.roleUser
```ts
roleUser: string = 'User';
```
##### accountOnboarding.breadcrumbAriaLabel
```ts
breadcrumbAriaLabel: string = 'Onboarding progress';
```
##### accountOnboarding.complete
```ts
complete: object;
```
##### accountOnboarding.complete.e911
```ts
e911: object;
```
##### accountOnboarding.complete.e911.addressStandardized
```ts
addressStandardized: string = 'Your address was standardized for emergency services accuracy.';
```
##### accountOnboarding.complete.e911.deferred
```ts
deferred: string = 'E911 emergency services have not been fully configured. Each location with a phone number needs a verified emergency address before your phone service can be activated.';
```
##### accountOnboarding.complete.e911.errorDescription
```ts
errorDescription: string = 'There was an error configuring emergency services. You can retry or configure manually later.';
```
##### accountOnboarding.complete.e911.errorTitle
```ts
errorTitle: string = 'E911 configuration failed';
```
##### accountOnboarding.complete.e911.loading
```ts
loading: string = 'Configuring emergency services...';
```
##### accountOnboarding.complete.e911.pendingAfterPolling
```ts
pendingAfterPolling: string = 'E911 registration submitted. Your phone service is active — emergency address verification will complete shortly.';
```
##### accountOnboarding.complete.e911.pollingStatus
```ts
pollingStatus: string = 'Verifying emergency services registration...';
```
##### accountOnboarding.complete.e911.primaryAssigned
```ts
primaryAssigned: string = 'assigned as primary number for';
```
##### accountOnboarding.complete.e911.processing
```ts
processing: string = 'E911 registration is being processed. This may take a few minutes.';
```
##### accountOnboarding.complete.e911.retryButton
```ts
retryButton: string = 'Retry';
```
##### accountOnboarding.complete.e911.verified
```ts
verified: string = 'E911 emergency address is verified.';
```
##### accountOnboarding.complete.subtitle
```ts
subtitle: string = "It's time to start using your embedded voice system";
```
##### accountOnboarding.complete.title
```ts
title: string = 'Wahoo!';
```
##### accountOnboarding.error
```ts
error: object;
```
##### accountOnboarding.error.description
```ts
description: string = 'Something went wrong loading the onboarding wizard.';
```
##### accountOnboarding.error.retry
```ts
retry: string = 'Try Again';
```
##### accountOnboarding.error.title
```ts
title: string = 'Unable to Load';
```
##### accountOnboarding.hardware
```ts
hardware: object;
```
##### accountOnboarding.hardware.addDeviceButton
```ts
addDeviceButton: string = '+ Add Device';
```
##### accountOnboarding.hardware.addHandsetButton
```ts
addHandsetButton: string = '+ Handset';
```
##### accountOnboarding.hardware.allAssigned
```ts
allAssigned: string = 'All devices have been assigned';
```
##### accountOnboarding.hardware.assignAndComplete
```ts
assignAndComplete: string = 'Assign & Complete';
```
##### accountOnboarding.hardware.availableDevices
```ts
availableDevices: string = 'Available Devices';
```
##### accountOnboarding.hardware.cancel
```ts
cancel: string = 'Cancel';
```
##### accountOnboarding.hardware.clickToAssign
```ts
clickToAssign: string = 'Click to assign';
```
##### accountOnboarding.hardware.cordless
```ts
cordless: string = 'Cordless';
```
##### accountOnboarding.hardware.dectBase
```ts
dectBase: string = 'Cordless Base';
```
##### accountOnboarding.hardware.deskPhone
```ts
deskPhone: string = 'Desk phone';
```
##### accountOnboarding.hardware.deviceNotFound
```ts
deviceNotFound: string = 'Device was created but could not be found. Please try again.';
```
##### accountOnboarding.hardware.dragDropHint
```ts
dragDropHint: string = 'Drag and drop device here';
```
##### accountOnboarding.hardware.duplicateMac
```ts
duplicateMac: string = 'This MAC address is already registered.';
```
##### accountOnboarding.hardware.gate
```ts
gate: object;
```
##### accountOnboarding.hardware.gate.noDevices
```ts
noDevices: string = 'No devices are available for your account. Please contact support to add devices before completing this step.';
```
##### accountOnboarding.hardware.handset
```ts
handset: string = 'handset';
```
##### accountOnboarding.hardware.handsets
```ts
handsets: string = 'handsets';
```
##### accountOnboarding.hardware.invalidIpei
```ts
invalidIpei: string = 'Enter a valid IPEI (hex digits only).';
```
##### accountOnboarding.hardware.invalidMac
```ts
invalidMac: string = 'Enter a valid 12-digit MAC address.';
```
##### accountOnboarding.hardware.ipeiLabel
```ts
ipeiLabel: string = 'Handset IPEI';
```
##### accountOnboarding.hardware.ipeiNotMac
```ts
ipeiNotMac: string = 'This looks like a MAC address, not an IPEI. An IPEI looks like 03AABB1234567890CCDD.';
```
##### accountOnboarding.hardware.ipeiPlaceholder
```ts
ipeiPlaceholder: string = '03AABB1234567890CCDD';
```
##### accountOnboarding.hardware.isDectBase
```ts
isDectBase: string = 'This is a cordless handset base station';
```
##### accountOnboarding.hardware.macLabel
```ts
macLabel: string = 'MAC Address';
```
##### accountOnboarding.hardware.macPlaceholder
```ts
macPlaceholder: string = '00:04:13:AA:BB:CC';
```
##### accountOnboarding.hardware.noDevices
```ts
noDevices: string = 'No devices are available for your account at the moment.';
```
##### accountOnboarding.hardware.noUsers
```ts
noUsers: string = 'No team members found. Add team members in the Account step first.';
```
##### accountOnboarding.hardware.removeBaseFailed
```ts
removeBaseFailed: string = 'Failed to remove cordless base.';
```
##### accountOnboarding.hardware.removeDevice
```ts
removeDevice: string = 'Remove';
```
##### accountOnboarding.hardware.save
```ts
save: string = 'Save';
```
##### accountOnboarding.hardware.saving
```ts
saving: string = 'Saving...';
```
##### accountOnboarding.hardware.selectUser
```ts
selectUser: string = 'Select a team member';
```
##### accountOnboarding.hardware.selectUserRequired
```ts
selectUserRequired: string = 'Please select a team member.';
```
##### accountOnboarding.hardware.shippingAddress
```ts
shippingAddress: string = 'Shipping Address';
```
##### accountOnboarding.hardware.submitOrder
```ts
submitOrder: string = 'Submit Order';
```
##### accountOnboarding.hardware.submitting
```ts
submitting: string = 'Submitting...';
```
##### accountOnboarding.hardware.subtitle
```ts
subtitle: string = 'Drag and drop devices to assign them to team members';
```
##### accountOnboarding.hardware.tableHeaderDevice
```ts
tableHeaderDevice: string = 'Assigned Device';
```
##### accountOnboarding.hardware.tableHeaderExtension
```ts
tableHeaderExtension: string = 'Extension';
```
##### accountOnboarding.hardware.tableHeaderName
```ts
tableHeaderName: string = 'Full name';
```
##### accountOnboarding.hardware.title
```ts
title: string = 'Assign Devices';
```
##### accountOnboarding.hardware.unassign
```ts
unassign: string = 'Unassign';
```
##### accountOnboarding.hardware.unsupportedVendor
```ts
unsupportedVendor: string = 'This device is not currently supported. Our support team has been notified and will follow up.';
```
##### accountOnboarding.hardware.userLabel
```ts
userLabel: string = 'Team Member';
```
##### accountOnboarding.legal
```ts
legal: object;
```
##### accountOnboarding.legal.and
```ts
and: string = 'and';
```
##### accountOnboarding.legal.prefix
```ts
prefix: string = 'By continuing, you agree to the';
```
##### accountOnboarding.legal.privacyPolicy
```ts
privacyPolicy: string = 'Privacy Policy';
```
##### accountOnboarding.legal.recipientTerms
```ts
recipientTerms: string = 'Recipient Terms of Service';
```
##### accountOnboarding.legal.termsOfService
```ts
termsOfService: string = 'Terms of Service';
```
##### accountOnboarding.loading
```ts
loading: string = 'Loading...';
```
##### accountOnboarding.nav
```ts
nav: object;
```
##### accountOnboarding.nav.back
```ts
back: string = 'Back';
```
##### accountOnboarding.nav.exit
```ts
exit: string = 'Finish';
```
##### accountOnboarding.nav.next
```ts
next: string = 'Next';
```
##### accountOnboarding.nav.skip
```ts
skip: string = 'Skip';
```
##### accountOnboarding.numbers
```ts
numbers: object;
```
##### accountOnboarding.numbers.callerId
```ts
callerId: object;
```
##### accountOnboarding.numbers.callerId.alreadySet
```ts
alreadySet: string = 'Already configured';
```
##### accountOnboarding.numbers.callerId.charCount
```ts
charCount: string = '{count}/15';
```
##### accountOnboarding.numbers.callerId.directoryListing
```ts
directoryListing: object;
```
##### accountOnboarding.numbers.callerId.directoryListing.info
```ts
info: string = 'To update your directory listing, contact {platformName} support.';
```
##### accountOnboarding.numbers.callerId.directoryListing.title
```ts
title: string = 'Directory Listing (DA/DL)';
```
##### accountOnboarding.numbers.callerId.error
```ts
error: object;
```
##### accountOnboarding.numbers.callerId.error.conflict
```ts
conflict: string = 'A caller ID update is already in progress for this number.';
```
##### accountOnboarding.numbers.callerId.error.submitFailed
```ts
submitFailed: string = 'Failed to set caller ID. Please try again.';
```
##### accountOnboarding.numbers.callerId.inputHelp
```ts
inputHelp: string = 'Max 15 characters. Letters, numbers, spaces, and hyphens only.';
```
##### accountOnboarding.numbers.callerId.inputLabel
```ts
inputLabel: string = 'Caller ID Name';
```
##### accountOnboarding.numbers.callerId.inputPlaceholder
```ts
inputPlaceholder: string = 'e.g. ACME Corp';
```
##### accountOnboarding.numbers.callerId.noDIDs
```ts
noDIDs: string = 'No active phone numbers to configure.';
```
##### accountOnboarding.numbers.callerId.partialError
```ts
partialError: string = 'Some caller IDs could not be set. Fix errors and retry, or skip.';
```
##### accountOnboarding.numbers.callerId.skipCallerId
```ts
skipCallerId: string = 'Skip';
```
##### accountOnboarding.numbers.callerId.submit
```ts
submit: string = 'Set Caller ID';
```
##### accountOnboarding.numbers.callerId.submitAll
```ts
submitAll: string = 'Set All Caller IDs';
```
##### accountOnboarding.numbers.callerId.submitted
```ts
submitted: string = 'Submitted';
```
##### accountOnboarding.numbers.callerId.submitting
```ts
submitting: string = 'Submitting...';
```
##### accountOnboarding.numbers.callerId.submittingAll
```ts
submittingAll: string = 'Submitting caller IDs...';
```
##### accountOnboarding.numbers.callerId.subtitle
```ts
subtitle: string = 'Configure the name displayed when making outbound calls';
```
##### accountOnboarding.numbers.callerId.title
```ts
title: string = 'Caller ID Setup';
```
##### accountOnboarding.numbers.callerId.validation
```ts
validation: object;
```
##### accountOnboarding.numbers.callerId.validation.invalidChars
```ts
invalidChars: string = 'Only letters, numbers, spaces, and hyphens allowed';
```
##### accountOnboarding.numbers.callerId.validation.required
```ts
required: string = 'Caller ID name is required';
```
##### accountOnboarding.numbers.callerId.validation.tooLong
```ts
tooLong: string = 'Must be 15 characters or fewer';
```
##### accountOnboarding.numbers.defaultDialPlanName
```ts
defaultDialPlanName: string = 'Onboarding Dial Plan';
```
##### accountOnboarding.numbers.directoryListing
```ts
directoryListing: object;
```
##### accountOnboarding.numbers.directoryListing.businessName
```ts
businessName: string = 'Business Name';
```
##### accountOnboarding.numbers.directoryListing.businessNameHelp
```ts
businessNameHelp: string = 'The name shown in directory listings and used for caller verification. Max 200 characters.';
```
##### accountOnboarding.numbers.directoryListing.businessNamePlaceholder
```ts
businessNamePlaceholder: string = 'Enter business name for listing';
```
##### accountOnboarding.numbers.directoryListing.noDIDs
```ts
noDIDs: string = 'No eligible phone numbers to configure.';
```
##### accountOnboarding.numbers.directoryListing.noneOption
```ts
noneOption: string = 'None \u2014 skip directory listing';
```
##### accountOnboarding.numbers.directoryListing.selectPrompt
```ts
selectPrompt: string = 'Select which number should be listed:';
```
##### accountOnboarding.numbers.directoryListing.subtitle
```ts
subtitle: string = 'A directory listing feeds your business information into online directories and data aggregators, helping customers find you. It also reduces the chance of your outbound calls being flagged as spam by call-screening apps.';
```
##### accountOnboarding.numbers.directoryListing.title
```ts
title: string = 'Directory Listing';
```
##### accountOnboarding.numbers.directoryListing.validation
```ts
validation: object;
```
##### accountOnboarding.numbers.directoryListing.validation.nameRequired
```ts
nameRequired: string = 'Business name is required for the directory listing.';
```
##### accountOnboarding.numbers.gate
```ts
gate: object;
```
##### accountOnboarding.numbers.gate.noDIDsAvailable
```ts
noDIDsAvailable: string = 'You need at least one phone number before selecting a primary number. Order or port a number first.';
```
##### accountOnboarding.numbers.gate.primaryRequired
```ts
primaryRequired: string = 'Please select a primary number to continue.';
```
##### accountOnboarding.numbers.nav
```ts
nav: object;
```
##### accountOnboarding.numbers.nav.back
```ts
back: string = 'Back';
```
##### accountOnboarding.numbers.nav.backToSearch
```ts
backToSearch: string = 'Back to Search';
```
##### accountOnboarding.numbers.nav.cancel
```ts
cancel: string = 'Cancel';
```
##### accountOnboarding.numbers.nav.confirm
```ts
confirm: string = 'Confirm';
```
##### accountOnboarding.numbers.nav.next
```ts
next: string = 'Next';
```
##### accountOnboarding.numbers.order
```ts
order: object;
```
##### accountOnboarding.numbers.order.areaCodeLabel
```ts
areaCodeLabel: string = 'Area Code';
```
##### accountOnboarding.numbers.order.areaCodePlaceholder
```ts
areaCodePlaceholder: string = '212';
```
##### accountOnboarding.numbers.order.carrierNote
```ts
carrierNote: string = 'Your order will be submitted to the carrier for fulfillment. This usually completes within seconds but may take longer.';
```
##### accountOnboarding.numbers.order.confirmSubtitle
```ts
confirmSubtitle: string = 'You are about to order {count} phone numbers';
```
##### accountOnboarding.numbers.order.confirmSubtitle\_one
```ts
confirmSubtitle_one: string = 'You are about to order {count} phone number';
```
##### accountOnboarding.numbers.order.confirmSubtitle\_other
```ts
confirmSubtitle_other: string = 'You are about to order {count} phone numbers';
```
##### accountOnboarding.numbers.order.confirmTitle
```ts
confirmTitle: string = 'Confirm Your Order';
```
##### accountOnboarding.numbers.order.continue
```ts
continue: string = 'Continue';
```
##### accountOnboarding.numbers.order.deselectAll
```ts
deselectAll: string = 'Deselect All';
```
##### accountOnboarding.numbers.order.done
```ts
done: string = 'Done';
```
##### accountOnboarding.numbers.order.error
```ts
error: string = 'An error occurred while placing the order.';
```
##### accountOnboarding.numbers.order.noResults
```ts
noResults: string = 'No numbers found. Try a different search.';
```
##### accountOnboarding.numbers.order.ordering
```ts
ordering: string = 'Ordering...';
```
##### accountOnboarding.numbers.order.orderMore
```ts
orderMore: string = 'Order More Numbers';
```
##### accountOnboarding.numbers.order.placeOrder
```ts
placeOrder: string = 'Place Order';
```
##### accountOnboarding.numbers.order.placing
```ts
placing: string = 'Placing Order...';
```
##### accountOnboarding.numbers.order.quantityLabel
```ts
quantityLabel: string = 'Quantity';
```
##### accountOnboarding.numbers.order.resultsSubtitle
```ts
resultsSubtitle: string = 'Select the numbers you would like to order.';
```
##### accountOnboarding.numbers.order.resultsTitle
```ts
resultsTitle: string = 'Available Numbers';
```
##### accountOnboarding.numbers.order.search
```ts
search: string = 'Search';
```
##### accountOnboarding.numbers.order.searchByAreaCode
```ts
searchByAreaCode: string = 'Area Code';
```
##### accountOnboarding.numbers.order.searchByZip
```ts
searchByZip: string = 'ZIP Code';
```
##### accountOnboarding.numbers.order.searching
```ts
searching: string = 'Searching...';
```
##### accountOnboarding.numbers.order.searchSubtitle
```ts
searchSubtitle: string = 'Find available numbers by entering an area code or ZIP code';
```
##### accountOnboarding.numbers.order.searchTitle
```ts
searchTitle: string = 'Search Available Numbers';
```
##### accountOnboarding.numbers.order.selectAll
```ts
selectAll: string = 'Select All';
```
##### accountOnboarding.numbers.order.selected
```ts
selected: string = 'selected';
```
##### accountOnboarding.numbers.order.state
```ts
state: string = 'State';
```
##### accountOnboarding.numbers.order.statusComplete
```ts
statusComplete: string = 'Your numbers have been activated.';
```
##### accountOnboarding.numbers.order.statusFailed
```ts
statusFailed: string = 'The order could not be completed.';
```
##### accountOnboarding.numbers.order.statusPartial
```ts
statusPartial: string = 'Some numbers were activated, but others failed.';
```
##### accountOnboarding.numbers.order.statusPending
```ts
statusPending: string = 'Your order has been submitted to the carrier. Fulfillment usually completes within seconds but may take longer.';
```
##### accountOnboarding.numbers.order.statusStalled
```ts
statusStalled: string = 'Your order has been submitted to the carrier. Fulfillment usually completes within seconds but may take longer.';
```
##### accountOnboarding.numbers.order.statusTitle
```ts
statusTitle: string = 'Order Submitted';
```
##### accountOnboarding.numbers.order.zipLabel
```ts
zipLabel: string = 'ZIP Code';
```
##### accountOnboarding.numbers.order.zipPlaceholder
```ts
zipPlaceholder: string = '10001';
```
##### accountOnboarding.numbers.overview
```ts
overview: object;
```
##### accountOnboarding.numbers.overview.empty
```ts
empty: string = 'No telephone numbers yet. Request new numbers or port your existing ones.';
```
##### accountOnboarding.numbers.overview.heading
```ts
heading: string = 'Your Numbers';
```
##### accountOnboarding.numbers.overview.loadError
```ts
loadError: string = 'Failed to load telephone numbers. Please try again.';
```
##### accountOnboarding.numbers.overview.phoneNumber
```ts
phoneNumber: string = 'Phone Number';
```
##### accountOnboarding.numbers.overview.portExisting
```ts
portExisting: string = 'Port Existing Number';
```
##### accountOnboarding.numbers.overview.portExistingDesc
```ts
portExistingDesc: string = 'Transfer your current business number to {platformName}. This typically takes 5–10 business days.';
```
##### accountOnboarding.numbers.overview.requestNew
```ts
requestNew: string = 'Request New Numbers';
```
##### accountOnboarding.numbers.overview.requestNewDesc
```ts
requestNewDesc: string = 'Get new business phone numbers instantly. Choose from available numbers in your area.';
```
##### accountOnboarding.numbers.overview.retry
```ts
retry: string = 'Retry';
```
##### accountOnboarding.numbers.overview.source
```ts
source: string = 'Source';
```
##### accountOnboarding.numbers.overview.status
```ts
status: string = 'Status';
```
##### accountOnboarding.numbers.overview.temporaryBanner
```ts
temporaryBanner: string = 'A temporary number has been assigned to your account while you set up your permanent numbers.';
```
##### accountOnboarding.numbers.overview.type
```ts
type: string = 'Type';
```
##### accountOnboarding.numbers.port
```ts
port: object;
```
##### accountOnboarding.numbers.port.accountNumberLabel
```ts
accountNumberLabel: string = 'Account Number';
```
##### accountOnboarding.numbers.port.accountNumberPlaceholder
```ts
accountNumberPlaceholder: string = 'From your current carrier';
```
##### accountOnboarding.numbers.port.accountRequired
```ts
accountRequired: string = 'Account # Required';
```
##### accountOnboarding.numbers.port.addAnother
```ts
addAnother: string = 'Add another number';
```
##### accountOnboarding.numbers.port.addressHeading
```ts
addressHeading: string = 'Service Address';
```
##### accountOnboarding.numbers.port.approve
```ts
approve: string = 'Approve & Submit';
```
##### accountOnboarding.numbers.port.approverNameLabel
```ts
approverNameLabel: string = 'Authorized Contact';
```
##### accountOnboarding.numbers.port.approverNamePlaceholder
```ts
approverNamePlaceholder: string = 'John Doe';
```
##### accountOnboarding.numbers.port.backToOverview
```ts
backToOverview: string = 'Back to Numbers';
```
##### accountOnboarding.numbers.port.billCopyDesc
```ts
billCopyDesc: string = 'A recent bill from your current carrier showing the numbers to be ported.';
```
##### accountOnboarding.numbers.port.billCopyLabel
```ts
billCopyLabel: string = 'Phone Bill Copy';
```
##### accountOnboarding.numbers.port.billCopyRequired
```ts
billCopyRequired: string = 'Required';
```
##### accountOnboarding.numbers.port.btnLabel
```ts
btnLabel: string = 'Billing Telephone Number (BTN)';
```
##### accountOnboarding.numbers.port.btnPlaceholder
```ts
btnPlaceholder: string = '(555) 123-4567';
```
##### accountOnboarding.numbers.port.businessNameLabel
```ts
businessNameLabel: string = 'Business Name';
```
##### accountOnboarding.numbers.port.businessNamePlaceholder
```ts
businessNamePlaceholder: string = 'Acme Corp';
```
##### accountOnboarding.numbers.port.carrier
```ts
carrier: string = 'Current Carrier';
```
##### accountOnboarding.numbers.port.carrierContinue
```ts
carrierContinue: string = 'Continue';
```
##### accountOnboarding.numbers.port.carrierGroupsSubtitle
```ts
carrierGroupsSubtitle: string = 'Your numbers are with different carriers. Each carrier requires a separate port request.';
```
##### accountOnboarding.numbers.port.carrierGroupsTitle
```ts
carrierGroupsTitle: string = 'Carrier Groups';
```
##### accountOnboarding.numbers.port.carrierStart
```ts
carrierStart: string = 'Start';
```
##### accountOnboarding.numbers.port.carrierSubmitted
```ts
carrierSubmitted: string = 'Submitted';
```
##### accountOnboarding.numbers.port.checkEligibility
```ts
checkEligibility: string = 'Check Eligibility';
```
##### accountOnboarding.numbers.port.checking
```ts
checking: string = 'Checking...';
```
##### accountOnboarding.numbers.port.cityLabel
```ts
cityLabel: string = 'City';
```
##### accountOnboarding.numbers.port.cityPlaceholder
```ts
cityPlaceholder: string = 'New York';
```
##### accountOnboarding.numbers.port.continueWithPortable
```ts
continueWithPortable: string = 'Continue with Portable Numbers';
```
##### accountOnboarding.numbers.port.csrDesc
```ts
csrDesc: string = 'Optional but recommended — speeds up the porting process.';
```
##### accountOnboarding.numbers.port.csrLabel
```ts
csrLabel: string = 'Customer Service Record (CSR)';
```
##### accountOnboarding.numbers.port.csrOptional
```ts
csrOptional: string = 'Optional';
```
##### accountOnboarding.numbers.port.documentsSection
```ts
documentsSection: string = 'Documents';
```
##### accountOnboarding.numbers.port.documentsSubtitle
```ts
documentsSubtitle: string = 'Upload your latest phone bill and optionally a Customer Service Record (CSR).';
```
##### accountOnboarding.numbers.port.documentsTitle
```ts
documentsTitle: string = 'Supporting Documents';
```
##### accountOnboarding.numbers.port.eligibilitySubtitle
```ts
eligibilitySubtitle: string = 'Review which numbers can be ported.';
```
##### accountOnboarding.numbers.port.eligibilityTitle
```ts
eligibilityTitle: string = 'Port Eligibility';
```
##### accountOnboarding.numbers.port.fileSelected
```ts
fileSelected: string = 'Selected:';
```
##### accountOnboarding.numbers.port.focDateLabel
```ts
focDateLabel: string = 'Port Date';
```
##### accountOnboarding.numbers.port.focSection
```ts
focSection: string = 'Port Date';
```
##### accountOnboarding.numbers.port.focSubtitle
```ts
focSubtitle: string = 'Choose when you want the numbers transferred. Must be at least 5 business days out.';
```
##### accountOnboarding.numbers.port.focTimeLabel
```ts
focTimeLabel: string = 'Port Time (Eastern)';
```
##### accountOnboarding.numbers.port.focTimePlaceholder
```ts
focTimePlaceholder: string = 'Select time';
```
##### accountOnboarding.numbers.port.focTitle
```ts
focTitle: string = 'Requested Port Date';
```
##### accountOnboarding.numbers.port.houseNumberLabel
```ts
houseNumberLabel: string = 'Street Number';
```
##### accountOnboarding.numbers.port.houseNumberPlaceholder
```ts
houseNumberPlaceholder: string = '123';
```
##### accountOnboarding.numbers.port.line2Label
```ts
line2Label: string = 'Suite / Unit';
```
##### accountOnboarding.numbers.port.line2Placeholder
```ts
line2Placeholder: string = 'Suite 100';
```
##### accountOnboarding.numbers.port.noFileSelected
```ts
noFileSelected: string = 'No file selected';
```
##### accountOnboarding.numbers.port.noPortable
```ts
noPortable: string = 'None of the entered numbers are eligible for porting.';
```
##### accountOnboarding.numbers.port.notPortable
```ts
notPortable: string = 'Not Portable';
```
##### accountOnboarding.numbers.port.numberPlural
```ts
numberPlural: string = 'numbers';
```
##### accountOnboarding.numbers.port.numberSingular
```ts
numberSingular: string = 'number';
```
##### accountOnboarding.numbers.port.numbersSection
```ts
numbersSection: string = 'Numbers';
```
##### accountOnboarding.numbers.port.numbersSubtitle
```ts
numbersSubtitle: string = 'Enter the phone numbers you want to transfer to {platformName}.';
```
##### accountOnboarding.numbers.port.numbersTitle
```ts
numbersTitle: string = 'Numbers to Port';
```
##### accountOnboarding.numbers.port.phoneLabel
```ts
phoneLabel: string = 'Phone Number';
```
##### accountOnboarding.numbers.port.phonePlaceholder
```ts
phonePlaceholder: string = '(555) 123-4567';
```
##### accountOnboarding.numbers.port.pinLabel
```ts
pinLabel: string = 'Account PIN';
```
##### accountOnboarding.numbers.port.pinPlaceholder
```ts
pinPlaceholder: string = '1234';
```
##### accountOnboarding.numbers.port.portable
```ts
portable: string = 'Portable';
```
##### accountOnboarding.numbers.port.removeNumber
```ts
removeNumber: string = 'Remove';
```
##### accountOnboarding.numbers.port.reviewSubtitle
```ts
reviewSubtitle: string = 'Verify all details before submitting your port request.';
```
##### accountOnboarding.numbers.port.reviewTitle
```ts
reviewTitle: string = 'Review & Approve';
```
##### accountOnboarding.numbers.port.signatureHelp
```ts
signatureHelp: string = 'By signing, you authorize the transfer of the listed numbers to {platformName}.';
```
##### accountOnboarding.numbers.port.signatureLabel
```ts
signatureLabel: string = 'Electronic Signature';
```
##### accountOnboarding.numbers.port.signaturePlaceholder
```ts
signaturePlaceholder: string = 'Type your full legal name';
```
##### accountOnboarding.numbers.port.stateLabel
```ts
stateLabel: string = 'State';
```
##### accountOnboarding.numbers.port.statePlaceholder
```ts
statePlaceholder: string = 'Select state';
```
##### accountOnboarding.numbers.port.streetNameLabel
```ts
streetNameLabel: string = 'Street Name';
```
##### accountOnboarding.numbers.port.streetNamePlaceholder
```ts
streetNamePlaceholder: string = 'Main St';
```
##### accountOnboarding.numbers.port.submittedStatus
```ts
submittedStatus: string = 'Status';
```
##### accountOnboarding.numbers.port.submittedSubtitle
```ts
submittedSubtitle: string = 'Your port request has been submitted and is being processed.';
```
##### accountOnboarding.numbers.port.submittedTitle
```ts
submittedTitle: string = 'Port Request Submitted';
```
##### accountOnboarding.numbers.port.submitting
```ts
submitting: string = 'Submitting...';
```
##### accountOnboarding.numbers.port.subscriberSection
```ts
subscriberSection: string = 'Subscriber';
```
##### accountOnboarding.numbers.port.subscriberSubtitle
```ts
subscriberSubtitle: string = 'Enter the details exactly as they appear on your current phone bill.';
```
##### accountOnboarding.numbers.port.subscriberTitle
```ts
subscriberTitle: string = 'Subscriber Information';
```
##### accountOnboarding.numbers.port.uploadFile
```ts
uploadFile: string = 'Choose File';
```
##### accountOnboarding.numbers.port.uploading
```ts
uploading: string = 'Uploading...';
```
##### accountOnboarding.numbers.port.wireless
```ts
wireless: string = 'Wireless';
```
##### accountOnboarding.numbers.port.wirelessNo
```ts
wirelessNo: string = 'No';
```
##### accountOnboarding.numbers.port.wirelessYes
```ts
wirelessYes: string = 'Yes';
```
##### accountOnboarding.numbers.port.zipLabel
```ts
zipLabel: string = 'ZIP Code';
```
##### accountOnboarding.numbers.port.zipPlaceholder
```ts
zipPlaceholder: string = '10001';
```
##### accountOnboarding.numbers.primaryNumber
```ts
primaryNumber: object;
```
##### accountOnboarding.numbers.primaryNumber.autoMatched
```ts
autoMatched: string = '{phone} matches your account phone and has been selected as the primary number for E911.';
```
##### accountOnboarding.numbers.primaryNumber.autoMatchedBadge
```ts
autoMatchedBadge: string = 'Account number — auto-selected';
```
##### accountOnboarding.numbers.primaryNumber.description
```ts
description: string = 'Select the primary phone number for this location. This number is registered with E911 emergency services.';
```
##### accountOnboarding.numbers.primaryNumber.heading
```ts
heading: string = 'Primary Number';
```
##### accountOnboarding.numbers.primaryNumber.loading
```ts
loading: string = 'Loading phone numbers...';
```
##### accountOnboarding.numbers.primaryNumber.noDIDs
```ts
noDIDs: string = 'No active phone numbers available yet. E911 will be configured once numbers are provisioned.';
```
##### accountOnboarding.numbers.primaryNumber.temporary
```ts
temporary: string = 'Temporary';
```
##### accountOnboarding.numbers.primaryNumber.temporaryNote
```ts
temporaryNote: string = 'This is a temporary number assigned to get you started. You can replace it with a permanent number at any time.';
```
##### accountOnboarding.numbers.source
```ts
source: object;
```
##### accountOnboarding.numbers.source.did
```ts
did: string = 'Account';
```
##### accountOnboarding.numbers.source.didTemporary
```ts
didTemporary: string = 'Temporary';
```
##### accountOnboarding.numbers.source.number\_order
```ts
number_order: string = 'New Order';
```
##### accountOnboarding.numbers.source.port\_order
```ts
port_order: string = 'Port';
```
##### accountOnboarding.numbers.status
```ts
status: object;
```
##### accountOnboarding.numbers.status.active
```ts
active: string = 'Active';
```
##### accountOnboarding.numbers.status.inactive
```ts
inactive: string = 'Inactive';
```
##### accountOnboarding.numbers.status.order\_failed
```ts
order_failed: string = 'Order Failed';
```
##### accountOnboarding.numbers.status.ordering
```ts
ordering: string = 'Ordering';
```
##### accountOnboarding.numbers.status.porting\_approved
```ts
porting_approved: string = 'Port Approved';
```
##### accountOnboarding.numbers.status.porting\_draft
```ts
porting_draft: string = 'Port Draft';
```
##### accountOnboarding.numbers.status.porting\_exception
```ts
porting_exception: string = 'Port Exception';
```
##### accountOnboarding.numbers.status.porting\_foc
```ts
porting_foc: string = 'Port Scheduled';
```
##### accountOnboarding.numbers.status.porting\_submitted
```ts
porting_submitted: string = 'Port Submitted';
```
##### accountOnboarding.numbers.status.released
```ts
released: string = 'Released';
```
##### accountOnboarding.numbers.subtitle
```ts
subtitle: string = "Choose how you'd like to set up your business numbers";
```
##### accountOnboarding.numbers.title
```ts
title: string = 'Phone Numbers';
```
##### accountOnboarding.numbers.validation
```ts
validation: object;
```
##### accountOnboarding.numbers.validation.approverNameRequired
```ts
approverNameRequired: string = 'Authorized contact name is required.';
```
##### accountOnboarding.numbers.validation.areaCodeFormat
```ts
areaCodeFormat: string = 'Enter a 3-digit area code.';
```
##### accountOnboarding.numbers.validation.areaCodeRequired
```ts
areaCodeRequired: string = 'Area code is required.';
```
##### accountOnboarding.numbers.validation.billCopyRequired
```ts
billCopyRequired: string = 'A phone bill copy is required.';
```
##### accountOnboarding.numbers.validation.btnInvalid
```ts
btnInvalid: string = 'Enter a valid US phone number.';
```
##### accountOnboarding.numbers.validation.btnRequired
```ts
btnRequired: string = 'BTN is required.';
```
##### accountOnboarding.numbers.validation.businessNameRequired
```ts
businessNameRequired: string = 'Business name is required.';
```
##### accountOnboarding.numbers.validation.cityRequired
```ts
cityRequired: string = 'City is required.';
```
##### accountOnboarding.numbers.validation.eligibilityError
```ts
eligibilityError: string = 'Failed to check eligibility. Please try again.';
```
##### accountOnboarding.numbers.validation.focDateRequired
```ts
focDateRequired: string = 'Port date is required.';
```
##### accountOnboarding.numbers.validation.focDateTooFar
```ts
focDateTooFar: string = 'Port date must be within 30 days.';
```
##### accountOnboarding.numbers.validation.focDateTooSoon
```ts
focDateTooSoon: string = 'Port date must be at least 5 business days from today.';
```
##### accountOnboarding.numbers.validation.focTimeRequired
```ts
focTimeRequired: string = 'Port time is required.';
```
##### accountOnboarding.numbers.validation.houseNumberRequired
```ts
houseNumberRequired: string = 'Street number is required.';
```
##### accountOnboarding.numbers.validation.phoneDuplicate
```ts
phoneDuplicate: string = 'This number has already been entered.';
```
##### accountOnboarding.numbers.validation.phoneInvalid
```ts
phoneInvalid: string = 'Enter a valid US phone number.';
```
##### accountOnboarding.numbers.validation.phoneRequired
```ts
phoneRequired: string = 'At least one phone number is required.';
```
##### accountOnboarding.numbers.validation.selectAtLeastOne
```ts
selectAtLeastOne: string = 'Select at least one number.';
```
##### accountOnboarding.numbers.validation.signatureRequired
```ts
signatureRequired: string = 'Signature is required.';
```
##### accountOnboarding.numbers.validation.stateRequired
```ts
stateRequired: string = 'State is required.';
```
##### accountOnboarding.numbers.validation.streetNameRequired
```ts
streetNameRequired: string = 'Street name is required.';
```
##### accountOnboarding.numbers.validation.submitError
```ts
submitError: string = 'Failed to submit port request. Please try again.';
```
##### accountOnboarding.numbers.validation.zipFormat
```ts
zipFormat: string = 'Enter a 5-digit ZIP code.';
```
##### accountOnboarding.numbers.validation.zipRequired
```ts
zipRequired: string = 'ZIP code is required.';
```
##### accountOnboarding.sidebar
```ts
sidebar: object;
```
##### accountOnboarding.sidebar.businessDetails
```ts
businessDetails: string = 'Business Details';
```
##### accountOnboarding.sidebar.businessDetailsDesc
```ts
businessDetailsDesc: string = 'Enter your company information';
```
##### accountOnboarding.sidebar.callerId
```ts
callerId: string = 'Caller ID';
```
##### accountOnboarding.sidebar.callerIdDesc
```ts
callerIdDesc: string = 'Set caller ID for your numbers';
```
##### accountOnboarding.sidebar.deviceAssignment
```ts
deviceAssignment: string = 'Device Assignment';
```
##### accountOnboarding.sidebar.deviceAssignmentDesc
```ts
deviceAssignmentDesc: string = 'Assign devices to users';
```
##### accountOnboarding.sidebar.directoryListing
```ts
directoryListing: string = 'Directory Listing';
```
##### accountOnboarding.sidebar.directoryListingDesc
```ts
directoryListingDesc: string = 'Configure 411 directory listing';
```
##### accountOnboarding.sidebar.finalCompletion
```ts
finalCompletion: string = 'Final Completion';
```
##### accountOnboarding.sidebar.finalCompletionDesc
```ts
finalCompletionDesc: string = 'Complete your onboarding';
```
##### accountOnboarding.sidebar.numberOptions
```ts
numberOptions: string = 'Number Options';
```
##### accountOnboarding.sidebar.numberOptionsDesc
```ts
numberOptionsDesc: string = 'Choose to port existing or get new numbers';
```
##### accountOnboarding.sidebar.numberSetup
```ts
numberSetup: string = 'Number Setup';
```
##### accountOnboarding.sidebar.numberSetupDesc
```ts
numberSetupDesc: string = 'Configure your phone numbers';
```
##### accountOnboarding.sidebar.primaryNumber
```ts
primaryNumber: string = 'Primary Number';
```
##### accountOnboarding.sidebar.primaryNumberDesc
```ts
primaryNumberDesc: string = 'Select your main E911 number';
```
##### accountOnboarding.sidebar.teamMembers
```ts
teamMembers: string = 'Team Members';
```
##### accountOnboarding.sidebar.teamMembersDesc
```ts
teamMembersDesc: string = 'Add users and assign extensions';
```
##### accountOnboarding.sidebar.verification
```ts
verification: string = 'Verification';
```
##### accountOnboarding.sidebar.verificationDesc
```ts
verificationDesc: string = 'Verify number status';
```
##### accountOnboarding.stepComplete
```ts
stepComplete: object;
```
##### accountOnboarding.stepComplete.done
```ts
done: string = 'Done';
```
##### accountOnboarding.stepComplete.subtitle
```ts
subtitle: string = 'This step has been completed successfully.';
```
##### accountOnboarding.stepComplete.title
```ts
title: string = '{stepName} Complete';
```
##### accountOnboarding.steps
```ts
steps: object;
```
##### accountOnboarding.steps.account
```ts
account: string = 'Account Setup';
```
##### accountOnboarding.steps.complete
```ts
complete: string = 'Complete';
```
##### accountOnboarding.steps.hardware
```ts
hardware: string = 'Hardware Setup';
```
##### accountOnboarding.steps.numbers
```ts
numbers: string = 'Phone Numbers';
```
##### accountOnboarding.title
```ts
title: string = 'Account Onboarding';
```
#### callHistory
```ts
callHistory: object;
```
##### callHistory.clickToCall
```ts
clickToCall: string = 'Click to call';
```
##### callHistory.empty
```ts
empty: string = 'No call history';
```
##### callHistory.error
```ts
error: string = 'Unable to load call history';
```
##### callHistory.loading
```ts
loading: string = 'Loading call history...';
```
##### callHistory.noPhoneNumber
```ts
noPhoneNumber: string = 'Please set a phone number to load call history';
```
##### callHistory.relativeTime
```ts
relativeTime: object;
```
##### callHistory.relativeTime.hourAgo
```ts
hourAgo: string = '1 hour ago';
```
##### callHistory.relativeTime.hoursAgo
```ts
hoursAgo: string = '{count} hours ago';
```
##### callHistory.relativeTime.justNow
```ts
justNow: string = 'Just now';
```
##### callHistory.relativeTime.minuteAgo
```ts
minuteAgo: string = '1 min ago';
```
##### callHistory.relativeTime.minutesAgo
```ts
minutesAgo: string = '{count} min ago';
```
##### callHistory.relativeTime.yesterday
```ts
yesterday: string = 'Yesterday';
```
##### callHistory.summaryNotAvailable
```ts
summaryNotAvailable: string = 'Summary not available';
```
##### callHistory.title
```ts
title: string = 'Call History';
```
#### callLogs
```ts
callLogs: object;
```
##### callLogs.calledBy
```ts
calledBy: string = 'Called by:';
```
##### callLogs.columns
```ts
columns: object;
```
##### callLogs.columns.date
```ts
date: string = 'Date';
```
##### callLogs.columns.direction
```ts
direction: string = 'Direction';
```
##### callLogs.columns.duration
```ts
duration: string = 'Duration';
```
##### callLogs.columns.from
```ts
from: string = 'From';
```
##### callLogs.columns.quality
```ts
quality: string = 'MOS';
```
##### callLogs.columns.status
```ts
status: string = 'Status';
```
##### callLogs.columns.to
```ts
to: string = 'To';
```
##### callLogs.directions
```ts
directions: object;
```
##### callLogs.directions.inbound
```ts
inbound: string = 'Inbound';
```
##### callLogs.directions.internal
```ts
internal: string = 'Internal';
```
##### callLogs.directions.outbound
```ts
outbound: string = 'Outbound';
```
##### callLogs.empty
```ts
empty: string = 'No call logs found';
```
##### callLogs.loading
```ts
loading: string = 'Loading call logs...';
```
##### callLogs.quality
```ts
quality: object;
```
##### callLogs.quality.fair
```ts
fair: string = 'Fair';
```
##### callLogs.quality.good
```ts
good: string = 'Good';
```
##### callLogs.quality.poor
```ts
poor: string = 'Poor';
```
##### callLogs.quality.unavailable
```ts
unavailable: string = 'N/A';
```
##### callLogs.quality.unavailableTooltip
```ts
unavailableTooltip: string = 'No quality data available';
```
##### callLogs.routedTo
```ts
routedTo: string = 'Routed to:';
```
##### callLogs.statuses
```ts
statuses: object;
```
##### callLogs.statuses.busy
```ts
busy: string = 'Busy';
```
##### callLogs.statuses.completed
```ts
completed: string = 'Completed';
```
##### callLogs.statuses.failed
```ts
failed: string = 'Failed';
```
##### callLogs.statuses.noAnswer
```ts
noAnswer: string = 'No Answer';
```
##### callLogs.statuses.voicemail
```ts
voicemail: string = 'Voicemail';
```
##### callLogs.title
```ts
title: string = 'Call Logs';
```
#### common
```ts
common: object;
```
##### common.call
```ts
call: string = 'Call';
```
##### common.cancel
```ts
cancel: string = 'Cancel';
```
##### common.confirm
```ts
confirm: string = 'Confirm';
```
##### common.delete
```ts
delete: string = 'Delete';
```
##### common.error
```ts
error: string = 'Error';
```
##### common.loading
```ts
loading: string = 'Loading...';
```
##### common.next
```ts
next: string = 'Next';
```
##### common.noResults
```ts
noResults: string = 'No results';
```
##### common.pause
```ts
pause: string = 'Pause';
```
##### common.perPage
```ts
perPage: string = 'Per page';
```
##### common.play
```ts
play: string = 'Play';
```
##### common.previous
```ts
previous: string = 'Previous';
```
##### common.showing
```ts
showing: string = 'Showing {start}-{end} of {total}';
```
#### dialPlan
```ts
dialPlan: object;
```
##### dialPlan.empty
```ts
empty: string = 'No dial plan found';
```
##### dialPlan.error
```ts
error: string = 'Failed to load dial plan';
```
##### dialPlan.exits
```ts
exits: object;
```
##### dialPlan.exits.closed
```ts
closed: string = 'Closed';
```
##### dialPlan.exits.next
```ts
next: string = 'No Answer';
```
##### dialPlan.exits.open
```ts
open: string = 'Open';
```
##### dialPlan.exits.timeout
```ts
timeout: string = 'Timeout';
```
##### dialPlan.loading
```ts
loading: string = 'Loading dial plan...';
```
##### dialPlan.nodeTypes
```ts
nodeTypes: object;
```
##### dialPlan.nodeTypes.externalDial
```ts
externalDial: string = 'External Number';
```
##### dialPlan.nodeTypes.internalDial
```ts
internalDial: string = 'Internal Extension';
```
##### dialPlan.nodeTypes.schedule
```ts
schedule: string = 'Schedule';
```
##### dialPlan.nodeTypes.start
```ts
start: string = 'Start';
```
##### dialPlan.nodeTypes.voiceApp
```ts
voiceApp: string = 'Voice App';
```
##### dialPlan.nodeTypes.voicemail
```ts
voicemail: string = 'Voicemail';
```
##### dialPlan.title
```ts
title: string = 'Dial Plan';
```
#### onboardingPortal
```ts
onboardingPortal: object;
```
##### onboardingPortal.back
```ts
back: string = 'Back';
```
##### onboardingPortal.helpSupport
```ts
helpSupport: string = 'Help & Support';
```
##### onboardingPortal.onboardingComplete
```ts
onboardingComplete: string = 'Onboarding complete';
```
##### onboardingPortal.onboardingFlows
```ts
onboardingFlows: string = 'ONBOARDING FLOWS';
```
##### onboardingPortal.overview
```ts
overview: object;
```
##### onboardingPortal.overview.accountDesc
```ts
accountDesc: string = 'Set up your business profile, add team members, and configure your dial plan';
```
##### onboardingPortal.overview.complete
```ts
complete: string = 'Complete';
```
##### onboardingPortal.overview.completeSetup
```ts
completeSetup: string = 'Complete Setup';
```
##### onboardingPortal.overview.continueSetup
```ts
continueSetup: string = 'Continue Setup';
```
##### onboardingPortal.overview.flowsComplete
```ts
flowsComplete: string = '{completed} of {total} flows complete';
```
##### onboardingPortal.overview.hardwareDesc
```ts
hardwareDesc: string = 'Assign phones to team members and track delivery';
```
##### onboardingPortal.overview.label
```ts
label: string = 'Overview';
```
##### onboardingPortal.overview.needHelp
```ts
needHelp: string = 'Need help?';
```
##### onboardingPortal.overview.needHelpSubtitle
```ts
needHelpSubtitle: string = 'Our team is here to help you get set up quickly';
```
##### onboardingPortal.overview.numbersDesc
```ts
numbersDesc: string = 'Port existing numbers or request new business lines';
```
##### onboardingPortal.overview.phoneStatusComplete
```ts
phoneStatusComplete: string = 'Complete';
```
##### onboardingPortal.overview.phoneStatusNumber
```ts
phoneStatusNumber: string = 'Phone Number';
```
##### onboardingPortal.overview.phoneStatusProcessing
```ts
phoneStatusProcessing: string = 'Processing';
```
##### onboardingPortal.overview.phoneStatusStatus
```ts
phoneStatusStatus: string = 'Status';
```
##### onboardingPortal.overview.phoneStatusSubtitle
```ts
phoneStatusSubtitle: string = 'Track the status of your phone numbers';
```
##### onboardingPortal.overview.phoneStatusTemporary
```ts
phoneStatusTemporary: string = 'Temporary';
```
##### onboardingPortal.overview.phoneStatusTitle
```ts
phoneStatusTitle: string = 'Phone number status';
```
##### onboardingPortal.overview.phoneStatusType
```ts
phoneStatusType: string = 'Type';
```
##### onboardingPortal.overview.phoneStatusTypeNew
```ts
phoneStatusTypeNew: string = 'New';
```
##### onboardingPortal.overview.phoneStatusTypePort
```ts
phoneStatusTypePort: string = 'Port';
```
##### onboardingPortal.overview.progress
```ts
progress: string = 'Progress';
```
##### onboardingPortal.overview.progressTitle
```ts
progressTitle: string = 'Onboarding Progress';
```
##### onboardingPortal.overview.review
```ts
review: string = 'Review';
```
##### onboardingPortal.overview.scheduleCall
```ts
scheduleCall: string = 'Schedule a Call';
```
##### onboardingPortal.overview.stepsTitle
```ts
stepsTitle: string = 'Onboarding Steps';
```
##### onboardingPortal.overview.subtitle
```ts
subtitle: string = 'Complete the steps below to set up your business phone system';
```
##### onboardingPortal.overview.title
```ts
title: string = 'Your Business Onboarding';
```
##### onboardingPortal.overview.viewDocs
```ts
viewDocs: string = 'View Documentation';
```
##### onboardingPortal.saveAndExit
```ts
saveAndExit: string = 'Save & Exit to Overview';
```
##### onboardingPortal.splash
```ts
splash: object;
```
##### onboardingPortal.splash.start
```ts
start: string = 'Start Onboarding';
```
##### onboardingPortal.splash.step1
```ts
step1: string = 'Account Details';
```
##### onboardingPortal.splash.step2
```ts
step2: string = 'Setup Phone Numbers';
```
##### onboardingPortal.splash.step3
```ts
step3: string = 'Assign Hardware';
```
##### onboardingPortal.splash.subtitle
```ts
subtitle: string = "Let's get your business set up in 3 easy steps";
```
##### onboardingPortal.splash.title
```ts
title: string = 'Welcome\nto {platformName}';
```
#### phoneNumberOrdering
```ts
phoneNumberOrdering: object;
```
##### phoneNumberOrdering.complete
```ts
complete: object;
```
##### phoneNumberOrdering.complete.assignmentHint
```ts
assignmentHint: string = 'Numbers added to your inventory still need to be assigned to an extension or dial plan before they can receive calls.';
```
##### phoneNumberOrdering.complete.checking
```ts
checking: string = 'Checking order status...';
```
##### phoneNumberOrdering.complete.descriptionCompleteOne
```ts
descriptionCompleteOne: string = 'Your phone number is now in your inventory and ready to be configured.';
```
##### phoneNumberOrdering.complete.descriptionCompleteOther
```ts
descriptionCompleteOther: string = 'Your phone numbers are now in your inventory and ready to be configured.';
```
##### phoneNumberOrdering.complete.descriptionPartialOne
```ts
descriptionPartialOne: string = 'Some numbers could not be fulfilled by the carrier.';
```
##### phoneNumberOrdering.complete.descriptionPartialOther
```ts
descriptionPartialOther: string = 'Some numbers could not be fulfilled by the carrier.';
```
##### phoneNumberOrdering.complete.descriptionPendingOne
```ts
descriptionPendingOne: string = 'Your order has been submitted to the carrier. Fulfillment usually completes within seconds but may take longer.';
```
##### phoneNumberOrdering.complete.descriptionPendingOther
```ts
descriptionPendingOther: string = 'Your order has been submitted to the carrier. Fulfillment usually completes within seconds but may take longer.';
```
##### phoneNumberOrdering.complete.orderMore
```ts
orderMore: string = 'Order More Numbers';
```
##### phoneNumberOrdering.complete.titleCompleteOne
```ts
titleCompleteOne: string = 'Number Ready';
```
##### phoneNumberOrdering.complete.titleCompleteOther
```ts
titleCompleteOther: string = 'Numbers Ready';
```
##### phoneNumberOrdering.complete.titlePartialOne
```ts
titlePartialOne: string = 'Partially Fulfilled';
```
##### phoneNumberOrdering.complete.titlePartialOther
```ts
titlePartialOther: string = 'Partially Fulfilled';
```
##### phoneNumberOrdering.complete.titlePendingOne
```ts
titlePendingOne: string = 'Order Submitted';
```
##### phoneNumberOrdering.complete.titlePendingOther
```ts
titlePendingOther: string = 'Order Submitted';
```
##### phoneNumberOrdering.confirm
```ts
confirm: object;
```
##### phoneNumberOrdering.confirm.back
```ts
back: string = 'Back';
```
##### phoneNumberOrdering.confirm.description
```ts
description: string = 'Your order will be submitted to the carrier for fulfillment. This usually completes within seconds but may take longer.';
```
##### phoneNumberOrdering.confirm.placeOrder
```ts
placeOrder: string = 'Place Order';
```
##### phoneNumberOrdering.confirm.subtitleOne
```ts
subtitleOne: string = 'You are about to order 1 phone number';
```
##### phoneNumberOrdering.confirm.subtitleOther
```ts
subtitleOther: string = 'You are about to order {count} phone numbers';
```
##### phoneNumberOrdering.confirm.title
```ts
title: string = 'Confirm Order';
```
##### phoneNumberOrdering.error
```ts
error: object;
```
##### phoneNumberOrdering.error.description
```ts
description: string = 'The carrier was unable to fulfill your order.';
```
##### phoneNumberOrdering.error.title
```ts
title: string = 'Order Failed';
```
##### phoneNumberOrdering.error.tryAgain
```ts
tryAgain: string = 'Try Again';
```
##### phoneNumberOrdering.ordering
```ts
ordering: object;
```
##### phoneNumberOrdering.ordering.title
```ts
title: string = 'Placing Order...';
```
##### phoneNumberOrdering.results
```ts
results: object;
```
##### phoneNumberOrdering.results.backToSearch
```ts
backToSearch: string = 'Back to Search';
```
##### phoneNumberOrdering.results.continue
```ts
continue: string = 'Continue';
```
##### phoneNumberOrdering.results.noResults
```ts
noResults: string = 'No numbers available for this search';
```
##### phoneNumberOrdering.results.phoneNumber
```ts
phoneNumber: string = 'Phone Number';
```
##### phoneNumberOrdering.results.selectAll
```ts
selectAll: string = 'Select all';
```
##### phoneNumberOrdering.results.selected
```ts
selected: string = '{count} selected';
```
##### phoneNumberOrdering.results.state
```ts
state: string = 'State';
```
##### phoneNumberOrdering.results.title
```ts
title: string = 'Available Numbers';
```
##### phoneNumberOrdering.search
```ts
search: object;
```
##### phoneNumberOrdering.search.areaCode
```ts
areaCode: string = 'Area Code';
```
##### phoneNumberOrdering.search.areaCodeLabel
```ts
areaCodeLabel: string = 'Area Code';
```
##### phoneNumberOrdering.search.areaCodePlaceholder
```ts
areaCodePlaceholder: string = 'e.g. 212';
```
##### phoneNumberOrdering.search.numberOfResults
```ts
numberOfResults: string = 'Quantity to display';
```
##### phoneNumberOrdering.search.search
```ts
search: string = 'Search';
```
##### phoneNumberOrdering.search.searchType
```ts
searchType: string = 'Search by';
```
##### phoneNumberOrdering.search.subtitle
```ts
subtitle: string = 'Find available phone numbers by entering an area code or ZIP code.';
```
##### phoneNumberOrdering.search.title
```ts
title: string = 'Search Available Numbers';
```
##### phoneNumberOrdering.search.zip
```ts
zip: string = 'ZIP Code';
```
##### phoneNumberOrdering.search.zipLabel
```ts
zipLabel: string = 'ZIP Code';
```
##### phoneNumberOrdering.search.zipPlaceholder
```ts
zipPlaceholder: string = 'e.g. 10001';
```
##### phoneNumberOrdering.statuses
```ts
statuses: object;
```
##### phoneNumberOrdering.statuses.complete
```ts
complete: string = 'Complete';
```
##### phoneNumberOrdering.statuses.failed
```ts
failed: string = 'Failed';
```
##### phoneNumberOrdering.statuses.partial
```ts
partial: string = 'Partial';
```
##### phoneNumberOrdering.statuses.pending
```ts
pending: string = 'Pending';
```
##### phoneNumberOrdering.steps
```ts
steps: object;
```
##### phoneNumberOrdering.steps.confirm
```ts
confirm: string = 'Confirm';
```
##### phoneNumberOrdering.steps.done
```ts
done: string = 'Done';
```
##### phoneNumberOrdering.steps.search
```ts
search: string = 'Search';
```
##### phoneNumberOrdering.steps.select
```ts
select: string = 'Select';
```
##### phoneNumberOrdering.steps.stepOf
```ts
stepOf: string = 'Step {current} of {total}';
```
##### phoneNumberOrdering.title
```ts
title: string = 'Order Phone Numbers';
```
#### phoneNumbers
```ts
phoneNumbers: object;
```
##### phoneNumbers.badges
```ts
badges: object;
```
##### phoneNumbers.badges.temporary
```ts
temporary: string = 'Temporary';
```
##### phoneNumbers.columns
```ts
columns: object;
```
##### phoneNumbers.columns.callerID
```ts
callerID: string = 'Caller ID';
```
##### phoneNumbers.columns.cancelledDate
```ts
cancelledDate: string = 'Date Cancelled';
```
##### phoneNumbers.columns.carrier
```ts
carrier: string = 'Carrier';
```
##### phoneNumbers.columns.outbound
```ts
outbound: string = 'Direction';
```
##### phoneNumbers.columns.phoneNumber
```ts
phoneNumber: string = 'Phone Number';
```
##### phoneNumbers.columns.routingTarget
```ts
routingTarget: string = 'Call Routing';
```
##### phoneNumbers.columns.status
```ts
status: string = 'Status';
```
##### phoneNumbers.columns.transferDate
```ts
transferDate: string = 'Transfer Date';
```
##### phoneNumbers.empty
```ts
empty: string = 'No phone numbers';
```
##### phoneNumbers.filterLabel
```ts
filterLabel: string = 'Filter by status';
```
##### phoneNumbers.filters
```ts
filters: object;
```
##### phoneNumbers.filters.active
```ts
active: string = 'Active';
```
##### phoneNumbers.filters.cancelled
```ts
cancelled: string = 'Cancelled';
```
##### phoneNumbers.filters.in\_progress
```ts
in_progress: string = 'In Progress';
```
##### phoneNumbers.loading
```ts
loading: string = 'Loading phone numbers...';
```
##### phoneNumbers.outbound
```ts
outbound: object;
```
##### phoneNumbers.outbound.disabled
```ts
disabled: string = 'Inbound only';
```
##### phoneNumbers.outbound.enabled
```ts
enabled: string = 'Two-way';
```
##### phoneNumbers.routingTarget
```ts
routingTarget: object;
```
##### phoneNumbers.routingTarget.notSet
```ts
notSet: string = 'Not set';
```
##### phoneNumbers.routingTargetTypes
```ts
routingTargetTypes: object;
```
##### phoneNumbers.routingTargetTypes.dialPlan
```ts
dialPlan: string = 'Dial Plan';
```
##### phoneNumbers.routingTargetTypes.ringGroup
```ts
ringGroup: string = 'Ring Group';
```
##### phoneNumbers.routingTargetTypes.user
```ts
user: string = 'User';
```
##### phoneNumbers.routingTargetTypes.voiceApp
```ts
voiceApp: string = 'Voice App';
```
##### phoneNumbers.statuses
```ts
statuses: object;
```
##### phoneNumbers.statuses.active
```ts
active: string = 'Active';
```
##### phoneNumbers.statuses.inactive
```ts
inactive: string = 'Inactive';
```
##### phoneNumbers.statuses.orderFailed
```ts
orderFailed: string = 'Order Failed';
```
##### phoneNumbers.statuses.ordering
```ts
ordering: string = 'Ordering';
```
##### phoneNumbers.statuses.portingApproved
```ts
portingApproved: string = 'Port Approved';
```
##### phoneNumbers.statuses.portingDraft
```ts
portingDraft: string = 'Port Draft';
```
##### phoneNumbers.statuses.portingException
```ts
portingException: string = 'Port Issue';
```
##### phoneNumbers.statuses.portingFoc
```ts
portingFoc: string = 'Port Scheduled';
```
##### phoneNumbers.statuses.portingSubmitted
```ts
portingSubmitted: string = 'Port Submitted';
```
##### phoneNumbers.statuses.released
```ts
released: string = 'Released';
```
##### phoneNumbers.title
```ts
title: string = 'Phone Numbers';
```
#### voicemails
```ts
voicemails: object;
```
##### voicemails.deleteConfirm
```ts
deleteConfirm: string = 'Delete this voicemail?';
```
##### voicemails.deleteTitle
```ts
deleteTitle: string = 'Delete Voicemail';
```
##### voicemails.empty
```ts
empty: string = 'No voicemails';
```
##### voicemails.loading
```ts
loading: string = 'Loading voicemails...';
```
##### voicemails.noUserId
```ts
noUserId: string = 'Please set a user ID to load voicemails';
```
##### voicemails.progress
```ts
progress: string = 'Playback progress';
```
##### voicemails.summary
```ts
summary: string = 'Summary';
```
##### voicemails.title
```ts
title: string = 'Voicemails';
```
##### voicemails.transcript
```ts
transcript: string = 'Full Transcript';
```
##### voicemails.transcription
```ts
transcription: string = 'Transcription';
```
##### voicemails.transcriptLoading
```ts
transcriptLoading: string = 'Loading transcript...';
```
##### voicemails.transcriptNotAvailable
```ts
transcriptNotAvailable: string = 'Transcript not available';
```
***
### onLoadError?
```ts
optional onLoadError?: (event) => void;
```
Defined in: [sdk/src/react/CallLogs.tsx:99](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/CallLogs.tsx#L99)
Callback when there's an error loading call logs
#### Parameters
##### event
[`LoadError`](../../index/interfaces/LoadError.md)
#### Returns
`void`
***
### onLoaderStart?
```ts
optional onLoaderStart?: (event) => void;
```
Defined in: [sdk/src/react/CallLogs.tsx:94](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/CallLogs.tsx#L94)
Callback when component starts loading
#### Parameters
##### event
[`LoaderStart`](../../index/interfaces/LoaderStart.md)
#### Returns
`void`
***
### onRowClick?
```ts
optional onRowClick?: (event) => void;
```
Defined in: [sdk/src/react/CallLogs.tsx:104](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/CallLogs.tsx#L104)
Callback when a row is clicked
#### Parameters
##### event
###### call
[`CallLog`](../../index/interfaces/CallLog.md)
###### callId
`string`
#### Returns
`void`
***
### style?
```ts
optional style?: CSSProperties;
```
Defined in: [sdk/src/react/CallLogs.tsx:32](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/CallLogs.tsx#L32)
Optional inline styles
---
## Interface: DialPlanData
[@dialstack/sdk](../../index.md) / [react](../index.md) / DialPlanData
# Interface: DialPlanData
Defined in: [sdk/src/types/dial-plan.ts:122](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L122)
A complete dial plan definition.
## Properties
### created\_at
```ts
created_at: string;
```
Defined in: [sdk/src/types/dial-plan.ts:132](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L132)
ISO timestamp of when the dial plan was created
***
### entry\_node
```ts
entry_node: string;
```
Defined in: [sdk/src/types/dial-plan.ts:128](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L128)
ID of the first node to execute when a call enters this dial plan
***
### id
```ts
id: string;
```
Defined in: [sdk/src/types/dial-plan.ts:124](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L124)
Unique identifier for the dial plan
***
### name
```ts
name: string;
```
Defined in: [sdk/src/types/dial-plan.ts:126](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L126)
Human-readable name for the dial plan
***
### nodes
```ts
nodes: DialPlanNode[];
```
Defined in: [sdk/src/types/dial-plan.ts:130](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L130)
Array of nodes that make up this dial plan
***
### updated\_at
```ts
updated_at: string;
```
Defined in: [sdk/src/types/dial-plan.ts:134](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L134)
ISO timestamp of when the dial plan was last updated
---
## Interface: DialPlanHandle
[@dialstack/sdk](../../index.md) / [react](../index.md) / DialPlanHandle
# Interface: DialPlanHandle
Defined in: [sdk/src/react/DialPlan.tsx:72](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/DialPlan.tsx#L72)
Imperative handle exposed via ref on the DialPlan component
## Properties
### save
```ts
save: () => Promise;
```
Defined in: [sdk/src/react/DialPlan.tsx:74](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/DialPlan.tsx#L74)
Trigger a save programmatically. Resolves when save succeeds, rejects on error.
#### Returns
`Promise`\<`void`\>
---
## Interface: DialPlanProps
[@dialstack/sdk](../../index.md) / [react](../index.md) / DialPlanProps
# Interface: DialPlanProps
Defined in: [sdk/src/react/DialPlan.tsx:77](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/DialPlan.tsx#L77)
## Properties
### className?
```ts
optional className?: string;
```
Defined in: [sdk/src/react/DialPlan.tsx:101](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/DialPlan.tsx#L101)
Optional CSS class name for the container
***
### dialPlanId?
```ts
optional dialPlanId?: string;
```
Defined in: [sdk/src/react/DialPlan.tsx:79](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/DialPlan.tsx#L79)
The ID of the dial plan to fetch and display
***
### locale?
```ts
optional locale?: DialPlanLocale;
```
Defined in: [sdk/src/react/DialPlan.tsx:83](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/DialPlan.tsx#L83)
Locale strings for node labels and exits
***
### mode?
```ts
optional mode?: DialPlanMode;
```
Defined in: [sdk/src/react/DialPlan.tsx:81](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/DialPlan.tsx#L81)
Display mode: 'view' (default), 'edit', or 'preview' (static thumbnail)
***
### onCreateResource?
```ts
optional onCreateResource?: (type) => Promise<
| {
extension_number?: string;
id: string;
name: string;
}
| undefined>;
```
Defined in: [sdk/src/react/DialPlan.tsx:105](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/DialPlan.tsx#L105)
Optional callback to create a new resource from a config panel select. Provided by the host app.
#### Parameters
##### type
[`ResourceType`](../type-aliases/ResourceType.md)
#### Returns
`Promise`\<
\| \{
`extension_number?`: `string`;
`id`: `string`;
`name`: `string`;
\}
\| `undefined`\>
***
### onDirtyChange?
```ts
optional onDirtyChange?: (isDirty) => void;
```
Defined in: [sdk/src/react/DialPlan.tsx:95](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/DialPlan.tsx#L95)
Callback fired when dirty state changes (edit mode)
#### Parameters
##### isDirty
`boolean`
#### Returns
`void`
***
### onError?
```ts
optional onError?: (error) => void;
```
Defined in: [sdk/src/react/DialPlan.tsx:97](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/DialPlan.tsx#L97)
Alias for onLoadError, used in edit mode
#### Parameters
##### error
`Error`
#### Returns
`void`
***
### onLoaderEnd?
```ts
optional onLoaderEnd?: (dialPlan) => void;
```
Defined in: [sdk/src/react/DialPlan.tsx:89](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/DialPlan.tsx#L89)
Callback fired when the dial plan finishes loading
#### Parameters
##### dialPlan
[`DialPlanData`](DialPlanData.md)
#### Returns
`void`
***
### onLoadError?
```ts
optional onLoadError?: (error) => void;
```
Defined in: [sdk/src/react/DialPlan.tsx:91](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/DialPlan.tsx#L91)
Callback fired when there's an error
#### Parameters
##### error
`Error`
#### Returns
`void`
***
### onLoaderStart?
```ts
optional onLoaderStart?: () => void;
```
Defined in: [sdk/src/react/DialPlan.tsx:87](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/DialPlan.tsx#L87)
Callback fired when the dial plan starts loading
#### Returns
`void`
***
### onNodeClick?
```ts
optional onNodeClick?: (nodeId, node) => void;
```
Defined in: [sdk/src/react/DialPlan.tsx:85](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/DialPlan.tsx#L85)
Callback fired when a node is clicked (view mode)
#### Parameters
##### nodeId
`string`
##### node
[`DialPlanNode`](../type-aliases/DialPlanNode.md)
#### Returns
`void`
***
### onOpenResource?
```ts
optional onOpenResource?: (resourceId) => void;
```
Defined in: [sdk/src/react/DialPlan.tsx:109](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/DialPlan.tsx#L109)
Optional callback to open a resource in a new tab. Provided by the host app.
#### Parameters
##### resourceId
`string`
#### Returns
`void`
***
### onSave?
```ts
optional onSave?: (dialPlan) => void;
```
Defined in: [sdk/src/react/DialPlan.tsx:93](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/DialPlan.tsx#L93)
Callback fired when the dial plan is saved (edit mode)
#### Parameters
##### dialPlan
[`DialPlanData`](DialPlanData.md)
#### Returns
`void`
***
### style?
```ts
optional style?: CSSProperties;
```
Defined in: [sdk/src/react/DialPlan.tsx:103](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/DialPlan.tsx#L103)
Optional inline styles for the container
***
### theme?
```ts
optional theme?: "light" | "dark";
```
Defined in: [sdk/src/react/DialPlan.tsx:99](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/DialPlan.tsx#L99)
Color theme: 'light' (default) or 'dark'
---
## Interface: DialstackComponentsProviderProps
[@dialstack/sdk](../../index.md) / [react](../index.md) / DialstackComponentsProviderProps
# Interface: DialstackComponentsProviderProps
Defined in: [sdk/src/react/DialstackComponentsProvider.tsx:15](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/DialstackComponentsProvider.tsx#L15)
## Properties
### children
```ts
children: ReactNode;
```
Defined in: [sdk/src/react/DialstackComponentsProvider.tsx:24](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/DialstackComponentsProvider.tsx#L24)
Child components to render
***
### dialstack
```ts
dialstack: DialStackInstance;
```
Defined in: [sdk/src/react/DialstackComponentsProvider.tsx:19](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/DialstackComponentsProvider.tsx#L19)
The DialStack instance from loadDialstackAndInitialize()
---
## Interface: ExternalDialNode
[@dialstack/sdk](../../index.md) / [react](../index.md) / ExternalDialNode
# Interface: ExternalDialNode
Defined in: [sdk/src/types/dial-plan.ts:105](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L105)
An external dial node in the dial plan.
## Extends
- `DialPlanNodeBase`
## Properties
### config
```ts
config: ExternalDialNodeConfig;
```
Defined in: [sdk/src/types/dial-plan.ts:107](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L107)
***
### id
```ts
id: string;
```
Defined in: [sdk/src/types/dial-plan.ts:73](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L73)
Unique identifier for this node within the dial plan
#### Inherited from
```ts
DialPlanNodeBase.id
```
***
### position?
```ts
optional position?: object;
```
Defined in: [sdk/src/types/dial-plan.ts:75](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L75)
Optional position for visual layout (if not provided, auto-layout is used)
#### x
```ts
x: number;
```
#### y
```ts
y: number;
```
#### Inherited from
```ts
DialPlanNodeBase.position
```
***
### type
```ts
type: "external_dial";
```
Defined in: [sdk/src/types/dial-plan.ts:106](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L106)
---
## Interface: ExternalDialNodeConfig
[@dialstack/sdk](../../index.md) / [react](../index.md) / ExternalDialNodeConfig
# Interface: ExternalDialNodeConfig
Defined in: [sdk/src/types/dial-plan.ts:42](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L42)
Configuration for an external dial node that dials an external PSTN number.
Has optional timeout handling with next node routing.
## Properties
### next?
```ts
optional next?: string;
```
Defined in: [sdk/src/types/dial-plan.ts:48](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L48)
Node ID to route to on timeout/no answer
***
### phone\_number
```ts
phone_number: string;
```
Defined in: [sdk/src/types/dial-plan.ts:44](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L44)
E.164 formatted phone number to dial (e.g., +14155551234)
***
### timeout
```ts
timeout: number;
```
Defined in: [sdk/src/types/dial-plan.ts:46](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L46)
Timeout in seconds before routing to next node (1-120)
---
## Interface: InternalDialNode
[@dialstack/sdk](../../index.md) / [react](../index.md) / InternalDialNode
# Interface: InternalDialNode
Defined in: [sdk/src/types/dial-plan.ts:89](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L89)
An internal dial node in the dial plan.
## Extends
- `DialPlanNodeBase`
## Properties
### config
```ts
config: InternalDialNodeConfig;
```
Defined in: [sdk/src/types/dial-plan.ts:91](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L91)
***
### id
```ts
id: string;
```
Defined in: [sdk/src/types/dial-plan.ts:73](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L73)
Unique identifier for this node within the dial plan
#### Inherited from
```ts
DialPlanNodeBase.id
```
***
### position?
```ts
optional position?: object;
```
Defined in: [sdk/src/types/dial-plan.ts:75](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L75)
Optional position for visual layout (if not provided, auto-layout is used)
#### x
```ts
x: number;
```
#### y
```ts
y: number;
```
#### Inherited from
```ts
DialPlanNodeBase.position
```
***
### type
```ts
type: "internal_dial";
```
Defined in: [sdk/src/types/dial-plan.ts:90](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L90)
---
## Interface: InternalDialNodeConfig
[@dialstack/sdk](../../index.md) / [react](../index.md) / InternalDialNodeConfig
# Interface: InternalDialNodeConfig
Defined in: [sdk/src/types/dial-plan.ts:29](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L29)
Configuration for an internal dial node that rings a user or group.
Has optional timeout handling with next node routing.
## Properties
### next?
```ts
optional next?: string;
```
Defined in: [sdk/src/types/dial-plan.ts:35](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L35)
Node ID to route to on timeout/no answer
***
### target\_id
```ts
target_id: string;
```
Defined in: [sdk/src/types/dial-plan.ts:31](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L31)
User ID, group ID, or dial plan ID to dial
***
### timeout?
```ts
optional timeout?: number;
```
Defined in: [sdk/src/types/dial-plan.ts:33](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L33)
Timeout in seconds before routing to next node
---
## Interface: PhoneNumberOrderingProps
[@dialstack/sdk](../../index.md) / [react](../index.md) / PhoneNumberOrderingProps
# Interface: PhoneNumberOrderingProps
Defined in: [sdk/src/react/PhoneNumberOrdering.tsx:21](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/PhoneNumberOrdering.tsx#L21)
## Properties
### classes?
```ts
optional classes?: PhoneNumberOrderingClasses;
```
Defined in: [sdk/src/react/PhoneNumberOrdering.tsx:55](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/PhoneNumberOrdering.tsx#L55)
Custom CSS classes for styling integration
***
### className?
```ts
optional className?: string;
```
Defined in: [sdk/src/react/PhoneNumberOrdering.tsx:25](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/PhoneNumberOrdering.tsx#L25)
Optional CSS class name
***
### formatting?
```ts
optional formatting?: FormattingOptions;
```
Defined in: [sdk/src/react/PhoneNumberOrdering.tsx:40](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/PhoneNumberOrdering.tsx#L40)
Formatting options for phone numbers
***
### icons?
```ts
optional icons?: ComponentIcons;
```
Defined in: [sdk/src/react/PhoneNumberOrdering.tsx:45](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/PhoneNumberOrdering.tsx#L45)
Custom icons (partial override of defaults)
***
### layoutVariant?
```ts
optional layoutVariant?: LayoutVariant;
```
Defined in: [sdk/src/react/PhoneNumberOrdering.tsx:50](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/PhoneNumberOrdering.tsx#L50)
Layout variant (compact, comfortable, default)
***
### locale?
```ts
optional locale?: object;
```
Defined in: [sdk/src/react/PhoneNumberOrdering.tsx:35](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/PhoneNumberOrdering.tsx#L35)
Locale for UI strings
#### accountOnboarding
```ts
accountOnboarding: object;
```
##### accountOnboarding.account
```ts
account: object;
```
##### accountOnboarding.account.details
```ts
details: object;
```
##### accountOnboarding.account.details.companyNameLabel
```ts
companyNameLabel: string = 'Company Name';
```
##### accountOnboarding.account.details.companyNamePlaceholder
```ts
companyNamePlaceholder: string = 'Acme Corp';
```
##### accountOnboarding.account.details.companyNameRequired
```ts
companyNameRequired: string = 'Company name is required';
```
##### accountOnboarding.account.details.emailLabel
```ts
emailLabel: string = 'Primary Contact Email';
```
##### accountOnboarding.account.details.emailPlaceholder
```ts
emailPlaceholder: string = 'admin@company.com';
```
##### accountOnboarding.account.details.emailRequired
```ts
emailRequired: string = 'Primary contact email is required';
```
##### accountOnboarding.account.details.heading
```ts
heading: string = 'Account Details';
```
##### accountOnboarding.account.details.phoneInvalid
```ts
phoneInvalid: string = 'Enter a valid US phone number';
```
##### accountOnboarding.account.details.phoneLabel
```ts
phoneLabel: string = 'Primary Contact Phone Number';
```
##### accountOnboarding.account.details.phonePlaceholder
```ts
phonePlaceholder: string = '(555) 123-4567';
```
##### accountOnboarding.account.details.phoneRequired
```ts
phoneRequired: string = 'Primary contact phone number is required';
```
##### accountOnboarding.account.details.primaryContactLabel
```ts
primaryContactLabel: string = 'Primary Contact';
```
##### accountOnboarding.account.details.primaryContactPlaceholder
```ts
primaryContactPlaceholder: string = 'Jane Doe';
```
##### accountOnboarding.account.details.primaryContactRequired
```ts
primaryContactRequired: string = 'Primary contact is required';
```
##### accountOnboarding.account.details.regionLabel
```ts
regionLabel: string = 'Region';
```
##### accountOnboarding.account.details.regionPlaceholder
```ts
regionPlaceholder: string = 'Select a region';
```
##### accountOnboarding.account.details.timezoneLabel
```ts
timezoneLabel: string = 'Timezone';
```
##### accountOnboarding.account.details.timezonePlaceholder
```ts
timezonePlaceholder: string = 'Select a timezone';
```
##### accountOnboarding.account.details.timezoneRequired
```ts
timezoneRequired: string = 'Timezone is required';
```
##### accountOnboarding.account.location
```ts
location: object;
```
##### accountOnboarding.account.location.addressLabel
```ts
addressLabel: string = 'Address';
```
##### accountOnboarding.account.location.addressRequired
```ts
addressRequired: string = 'Address is required';
```
##### accountOnboarding.account.location.cityLabel
```ts
cityLabel: string = 'City';
```
##### accountOnboarding.account.location.cityPlaceholder
```ts
cityPlaceholder: string = 'New York';
```
##### accountOnboarding.account.location.description
```ts
description: string = 'Add your business address for E911 and caller ID.';
```
##### accountOnboarding.account.location.edit
```ts
edit: string = 'Edit';
```
##### accountOnboarding.account.location.enterManually
```ts
enterManually: string = 'Enter manually';
```
##### accountOnboarding.account.location.heading
```ts
heading: string = 'Business Location';
```
##### accountOnboarding.account.location.houseNumberLabel
```ts
houseNumberLabel: string = '#';
```
##### accountOnboarding.account.location.houseNumberPlaceholder
```ts
houseNumberPlaceholder: string = '123';
```
##### accountOnboarding.account.location.nameLabel
```ts
nameLabel: string = 'Location Name';
```
##### accountOnboarding.account.location.namePlaceholder
```ts
namePlaceholder: string = 'Main Office';
```
##### accountOnboarding.account.location.nameRequired
```ts
nameRequired: string = 'Location name is required';
```
##### accountOnboarding.account.location.noResults
```ts
noResults: string = 'No addresses found';
```
##### accountOnboarding.account.location.postalCodeLabel
```ts
postalCodeLabel: string = 'ZIP';
```
##### accountOnboarding.account.location.postalCodePlaceholder
```ts
postalCodePlaceholder: string = '10001';
```
##### accountOnboarding.account.location.searching
```ts
searching: string = 'Searching...';
```
##### accountOnboarding.account.location.searchInstead
```ts
searchInstead: string = 'Search instead';
```
##### accountOnboarding.account.location.searchPlaceholder
```ts
searchPlaceholder: string = 'Start typing an address...';
```
##### accountOnboarding.account.location.stateLabel
```ts
stateLabel: string = 'State';
```
##### accountOnboarding.account.location.statePlaceholder
```ts
statePlaceholder: string = 'Select';
```
##### accountOnboarding.account.location.streetLabel
```ts
streetLabel: string = 'Street';
```
##### accountOnboarding.account.location.streetPlaceholder
```ts
streetPlaceholder: string = 'Main St';
```
##### accountOnboarding.account.saveError
```ts
saveError: string = 'Failed to save. Please try again.';
```
##### accountOnboarding.account.saving
```ts
saving: string = 'Saving...';
```
##### accountOnboarding.account.subtitle
```ts
subtitle: string = 'Enter your company information';
```
##### accountOnboarding.account.title
```ts
title: string = 'Business Details';
```
##### accountOnboarding.account.users
```ts
users: object;
```
##### accountOnboarding.account.users.addUser
```ts
addUser: string = 'Add User';
```
##### accountOnboarding.account.users.atLeastOne
```ts
atLeastOne: string = 'Add at least one team member to continue.';
```
##### accountOnboarding.account.users.description
```ts
description: string = 'Add users who will have phone extensions';
```
##### accountOnboarding.account.users.duplicateEmail
```ts
duplicateEmail: string = 'A user with this email already exists.';
```
##### accountOnboarding.account.users.emailLabel
```ts
emailLabel: string = 'Email';
```
##### accountOnboarding.account.users.emailPlaceholder
```ts
emailPlaceholder: string = 'john@company.com';
```
##### accountOnboarding.account.users.extensionLabel
```ts
extensionLabel: string = 'Extension';
```
##### accountOnboarding.account.users.extensionPlaceholder
```ts
extensionPlaceholder: string = 'ex. 103';
```
##### accountOnboarding.account.users.heading
```ts
heading: string = 'Team Members';
```
##### accountOnboarding.account.users.nameLabel
```ts
nameLabel: string = 'Full name';
```
##### accountOnboarding.account.users.namePlaceholder
```ts
namePlaceholder: string = 'John Doe';
```
##### accountOnboarding.account.users.nameRequired
```ts
nameRequired: string = 'Name is required';
```
##### accountOnboarding.account.users.noUsers
```ts
noUsers: string = 'No team members added yet.';
```
##### accountOnboarding.account.users.removeUser
```ts
removeUser: string = 'Remove';
```
##### accountOnboarding.account.users.roleAdmin
```ts
roleAdmin: string = 'Admin';
```
##### accountOnboarding.account.users.roleLabel
```ts
roleLabel: string = 'Role';
```
##### accountOnboarding.account.users.roleUser
```ts
roleUser: string = 'User';
```
##### accountOnboarding.breadcrumbAriaLabel
```ts
breadcrumbAriaLabel: string = 'Onboarding progress';
```
##### accountOnboarding.complete
```ts
complete: object;
```
##### accountOnboarding.complete.e911
```ts
e911: object;
```
##### accountOnboarding.complete.e911.addressStandardized
```ts
addressStandardized: string = 'Your address was standardized for emergency services accuracy.';
```
##### accountOnboarding.complete.e911.deferred
```ts
deferred: string = 'E911 emergency services have not been fully configured. Each location with a phone number needs a verified emergency address before your phone service can be activated.';
```
##### accountOnboarding.complete.e911.errorDescription
```ts
errorDescription: string = 'There was an error configuring emergency services. You can retry or configure manually later.';
```
##### accountOnboarding.complete.e911.errorTitle
```ts
errorTitle: string = 'E911 configuration failed';
```
##### accountOnboarding.complete.e911.loading
```ts
loading: string = 'Configuring emergency services...';
```
##### accountOnboarding.complete.e911.pendingAfterPolling
```ts
pendingAfterPolling: string = 'E911 registration submitted. Your phone service is active — emergency address verification will complete shortly.';
```
##### accountOnboarding.complete.e911.pollingStatus
```ts
pollingStatus: string = 'Verifying emergency services registration...';
```
##### accountOnboarding.complete.e911.primaryAssigned
```ts
primaryAssigned: string = 'assigned as primary number for';
```
##### accountOnboarding.complete.e911.processing
```ts
processing: string = 'E911 registration is being processed. This may take a few minutes.';
```
##### accountOnboarding.complete.e911.retryButton
```ts
retryButton: string = 'Retry';
```
##### accountOnboarding.complete.e911.verified
```ts
verified: string = 'E911 emergency address is verified.';
```
##### accountOnboarding.complete.subtitle
```ts
subtitle: string = "It's time to start using your embedded voice system";
```
##### accountOnboarding.complete.title
```ts
title: string = 'Wahoo!';
```
##### accountOnboarding.error
```ts
error: object;
```
##### accountOnboarding.error.description
```ts
description: string = 'Something went wrong loading the onboarding wizard.';
```
##### accountOnboarding.error.retry
```ts
retry: string = 'Try Again';
```
##### accountOnboarding.error.title
```ts
title: string = 'Unable to Load';
```
##### accountOnboarding.hardware
```ts
hardware: object;
```
##### accountOnboarding.hardware.addDeviceButton
```ts
addDeviceButton: string = '+ Add Device';
```
##### accountOnboarding.hardware.addHandsetButton
```ts
addHandsetButton: string = '+ Handset';
```
##### accountOnboarding.hardware.allAssigned
```ts
allAssigned: string = 'All devices have been assigned';
```
##### accountOnboarding.hardware.assignAndComplete
```ts
assignAndComplete: string = 'Assign & Complete';
```
##### accountOnboarding.hardware.availableDevices
```ts
availableDevices: string = 'Available Devices';
```
##### accountOnboarding.hardware.cancel
```ts
cancel: string = 'Cancel';
```
##### accountOnboarding.hardware.clickToAssign
```ts
clickToAssign: string = 'Click to assign';
```
##### accountOnboarding.hardware.cordless
```ts
cordless: string = 'Cordless';
```
##### accountOnboarding.hardware.dectBase
```ts
dectBase: string = 'Cordless Base';
```
##### accountOnboarding.hardware.deskPhone
```ts
deskPhone: string = 'Desk phone';
```
##### accountOnboarding.hardware.deviceNotFound
```ts
deviceNotFound: string = 'Device was created but could not be found. Please try again.';
```
##### accountOnboarding.hardware.dragDropHint
```ts
dragDropHint: string = 'Drag and drop device here';
```
##### accountOnboarding.hardware.duplicateMac
```ts
duplicateMac: string = 'This MAC address is already registered.';
```
##### accountOnboarding.hardware.gate
```ts
gate: object;
```
##### accountOnboarding.hardware.gate.noDevices
```ts
noDevices: string = 'No devices are available for your account. Please contact support to add devices before completing this step.';
```
##### accountOnboarding.hardware.handset
```ts
handset: string = 'handset';
```
##### accountOnboarding.hardware.handsets
```ts
handsets: string = 'handsets';
```
##### accountOnboarding.hardware.invalidIpei
```ts
invalidIpei: string = 'Enter a valid IPEI (hex digits only).';
```
##### accountOnboarding.hardware.invalidMac
```ts
invalidMac: string = 'Enter a valid 12-digit MAC address.';
```
##### accountOnboarding.hardware.ipeiLabel
```ts
ipeiLabel: string = 'Handset IPEI';
```
##### accountOnboarding.hardware.ipeiNotMac
```ts
ipeiNotMac: string = 'This looks like a MAC address, not an IPEI. An IPEI looks like 03AABB1234567890CCDD.';
```
##### accountOnboarding.hardware.ipeiPlaceholder
```ts
ipeiPlaceholder: string = '03AABB1234567890CCDD';
```
##### accountOnboarding.hardware.isDectBase
```ts
isDectBase: string = 'This is a cordless handset base station';
```
##### accountOnboarding.hardware.macLabel
```ts
macLabel: string = 'MAC Address';
```
##### accountOnboarding.hardware.macPlaceholder
```ts
macPlaceholder: string = '00:04:13:AA:BB:CC';
```
##### accountOnboarding.hardware.noDevices
```ts
noDevices: string = 'No devices are available for your account at the moment.';
```
##### accountOnboarding.hardware.noUsers
```ts
noUsers: string = 'No team members found. Add team members in the Account step first.';
```
##### accountOnboarding.hardware.removeBaseFailed
```ts
removeBaseFailed: string = 'Failed to remove cordless base.';
```
##### accountOnboarding.hardware.removeDevice
```ts
removeDevice: string = 'Remove';
```
##### accountOnboarding.hardware.save
```ts
save: string = 'Save';
```
##### accountOnboarding.hardware.saving
```ts
saving: string = 'Saving...';
```
##### accountOnboarding.hardware.selectUser
```ts
selectUser: string = 'Select a team member';
```
##### accountOnboarding.hardware.selectUserRequired
```ts
selectUserRequired: string = 'Please select a team member.';
```
##### accountOnboarding.hardware.shippingAddress
```ts
shippingAddress: string = 'Shipping Address';
```
##### accountOnboarding.hardware.submitOrder
```ts
submitOrder: string = 'Submit Order';
```
##### accountOnboarding.hardware.submitting
```ts
submitting: string = 'Submitting...';
```
##### accountOnboarding.hardware.subtitle
```ts
subtitle: string = 'Drag and drop devices to assign them to team members';
```
##### accountOnboarding.hardware.tableHeaderDevice
```ts
tableHeaderDevice: string = 'Assigned Device';
```
##### accountOnboarding.hardware.tableHeaderExtension
```ts
tableHeaderExtension: string = 'Extension';
```
##### accountOnboarding.hardware.tableHeaderName
```ts
tableHeaderName: string = 'Full name';
```
##### accountOnboarding.hardware.title
```ts
title: string = 'Assign Devices';
```
##### accountOnboarding.hardware.unassign
```ts
unassign: string = 'Unassign';
```
##### accountOnboarding.hardware.unsupportedVendor
```ts
unsupportedVendor: string = 'This device is not currently supported. Our support team has been notified and will follow up.';
```
##### accountOnboarding.hardware.userLabel
```ts
userLabel: string = 'Team Member';
```
##### accountOnboarding.legal
```ts
legal: object;
```
##### accountOnboarding.legal.and
```ts
and: string = 'and';
```
##### accountOnboarding.legal.prefix
```ts
prefix: string = 'By continuing, you agree to the';
```
##### accountOnboarding.legal.privacyPolicy
```ts
privacyPolicy: string = 'Privacy Policy';
```
##### accountOnboarding.legal.recipientTerms
```ts
recipientTerms: string = 'Recipient Terms of Service';
```
##### accountOnboarding.legal.termsOfService
```ts
termsOfService: string = 'Terms of Service';
```
##### accountOnboarding.loading
```ts
loading: string = 'Loading...';
```
##### accountOnboarding.nav
```ts
nav: object;
```
##### accountOnboarding.nav.back
```ts
back: string = 'Back';
```
##### accountOnboarding.nav.exit
```ts
exit: string = 'Finish';
```
##### accountOnboarding.nav.next
```ts
next: string = 'Next';
```
##### accountOnboarding.nav.skip
```ts
skip: string = 'Skip';
```
##### accountOnboarding.numbers
```ts
numbers: object;
```
##### accountOnboarding.numbers.callerId
```ts
callerId: object;
```
##### accountOnboarding.numbers.callerId.alreadySet
```ts
alreadySet: string = 'Already configured';
```
##### accountOnboarding.numbers.callerId.charCount
```ts
charCount: string = '{count}/15';
```
##### accountOnboarding.numbers.callerId.directoryListing
```ts
directoryListing: object;
```
##### accountOnboarding.numbers.callerId.directoryListing.info
```ts
info: string = 'To update your directory listing, contact {platformName} support.';
```
##### accountOnboarding.numbers.callerId.directoryListing.title
```ts
title: string = 'Directory Listing (DA/DL)';
```
##### accountOnboarding.numbers.callerId.error
```ts
error: object;
```
##### accountOnboarding.numbers.callerId.error.conflict
```ts
conflict: string = 'A caller ID update is already in progress for this number.';
```
##### accountOnboarding.numbers.callerId.error.submitFailed
```ts
submitFailed: string = 'Failed to set caller ID. Please try again.';
```
##### accountOnboarding.numbers.callerId.inputHelp
```ts
inputHelp: string = 'Max 15 characters. Letters, numbers, spaces, and hyphens only.';
```
##### accountOnboarding.numbers.callerId.inputLabel
```ts
inputLabel: string = 'Caller ID Name';
```
##### accountOnboarding.numbers.callerId.inputPlaceholder
```ts
inputPlaceholder: string = 'e.g. ACME Corp';
```
##### accountOnboarding.numbers.callerId.noDIDs
```ts
noDIDs: string = 'No active phone numbers to configure.';
```
##### accountOnboarding.numbers.callerId.partialError
```ts
partialError: string = 'Some caller IDs could not be set. Fix errors and retry, or skip.';
```
##### accountOnboarding.numbers.callerId.skipCallerId
```ts
skipCallerId: string = 'Skip';
```
##### accountOnboarding.numbers.callerId.submit
```ts
submit: string = 'Set Caller ID';
```
##### accountOnboarding.numbers.callerId.submitAll
```ts
submitAll: string = 'Set All Caller IDs';
```
##### accountOnboarding.numbers.callerId.submitted
```ts
submitted: string = 'Submitted';
```
##### accountOnboarding.numbers.callerId.submitting
```ts
submitting: string = 'Submitting...';
```
##### accountOnboarding.numbers.callerId.submittingAll
```ts
submittingAll: string = 'Submitting caller IDs...';
```
##### accountOnboarding.numbers.callerId.subtitle
```ts
subtitle: string = 'Configure the name displayed when making outbound calls';
```
##### accountOnboarding.numbers.callerId.title
```ts
title: string = 'Caller ID Setup';
```
##### accountOnboarding.numbers.callerId.validation
```ts
validation: object;
```
##### accountOnboarding.numbers.callerId.validation.invalidChars
```ts
invalidChars: string = 'Only letters, numbers, spaces, and hyphens allowed';
```
##### accountOnboarding.numbers.callerId.validation.required
```ts
required: string = 'Caller ID name is required';
```
##### accountOnboarding.numbers.callerId.validation.tooLong
```ts
tooLong: string = 'Must be 15 characters or fewer';
```
##### accountOnboarding.numbers.defaultDialPlanName
```ts
defaultDialPlanName: string = 'Onboarding Dial Plan';
```
##### accountOnboarding.numbers.directoryListing
```ts
directoryListing: object;
```
##### accountOnboarding.numbers.directoryListing.businessName
```ts
businessName: string = 'Business Name';
```
##### accountOnboarding.numbers.directoryListing.businessNameHelp
```ts
businessNameHelp: string = 'The name shown in directory listings and used for caller verification. Max 200 characters.';
```
##### accountOnboarding.numbers.directoryListing.businessNamePlaceholder
```ts
businessNamePlaceholder: string = 'Enter business name for listing';
```
##### accountOnboarding.numbers.directoryListing.noDIDs
```ts
noDIDs: string = 'No eligible phone numbers to configure.';
```
##### accountOnboarding.numbers.directoryListing.noneOption
```ts
noneOption: string = 'None \u2014 skip directory listing';
```
##### accountOnboarding.numbers.directoryListing.selectPrompt
```ts
selectPrompt: string = 'Select which number should be listed:';
```
##### accountOnboarding.numbers.directoryListing.subtitle
```ts
subtitle: string = 'A directory listing feeds your business information into online directories and data aggregators, helping customers find you. It also reduces the chance of your outbound calls being flagged as spam by call-screening apps.';
```
##### accountOnboarding.numbers.directoryListing.title
```ts
title: string = 'Directory Listing';
```
##### accountOnboarding.numbers.directoryListing.validation
```ts
validation: object;
```
##### accountOnboarding.numbers.directoryListing.validation.nameRequired
```ts
nameRequired: string = 'Business name is required for the directory listing.';
```
##### accountOnboarding.numbers.gate
```ts
gate: object;
```
##### accountOnboarding.numbers.gate.noDIDsAvailable
```ts
noDIDsAvailable: string = 'You need at least one phone number before selecting a primary number. Order or port a number first.';
```
##### accountOnboarding.numbers.gate.primaryRequired
```ts
primaryRequired: string = 'Please select a primary number to continue.';
```
##### accountOnboarding.numbers.nav
```ts
nav: object;
```
##### accountOnboarding.numbers.nav.back
```ts
back: string = 'Back';
```
##### accountOnboarding.numbers.nav.backToSearch
```ts
backToSearch: string = 'Back to Search';
```
##### accountOnboarding.numbers.nav.cancel
```ts
cancel: string = 'Cancel';
```
##### accountOnboarding.numbers.nav.confirm
```ts
confirm: string = 'Confirm';
```
##### accountOnboarding.numbers.nav.next
```ts
next: string = 'Next';
```
##### accountOnboarding.numbers.order
```ts
order: object;
```
##### accountOnboarding.numbers.order.areaCodeLabel
```ts
areaCodeLabel: string = 'Area Code';
```
##### accountOnboarding.numbers.order.areaCodePlaceholder
```ts
areaCodePlaceholder: string = '212';
```
##### accountOnboarding.numbers.order.carrierNote
```ts
carrierNote: string = 'Your order will be submitted to the carrier for fulfillment. This usually completes within seconds but may take longer.';
```
##### accountOnboarding.numbers.order.confirmSubtitle
```ts
confirmSubtitle: string = 'You are about to order {count} phone numbers';
```
##### accountOnboarding.numbers.order.confirmSubtitle\_one
```ts
confirmSubtitle_one: string = 'You are about to order {count} phone number';
```
##### accountOnboarding.numbers.order.confirmSubtitle\_other
```ts
confirmSubtitle_other: string = 'You are about to order {count} phone numbers';
```
##### accountOnboarding.numbers.order.confirmTitle
```ts
confirmTitle: string = 'Confirm Your Order';
```
##### accountOnboarding.numbers.order.continue
```ts
continue: string = 'Continue';
```
##### accountOnboarding.numbers.order.deselectAll
```ts
deselectAll: string = 'Deselect All';
```
##### accountOnboarding.numbers.order.done
```ts
done: string = 'Done';
```
##### accountOnboarding.numbers.order.error
```ts
error: string = 'An error occurred while placing the order.';
```
##### accountOnboarding.numbers.order.noResults
```ts
noResults: string = 'No numbers found. Try a different search.';
```
##### accountOnboarding.numbers.order.ordering
```ts
ordering: string = 'Ordering...';
```
##### accountOnboarding.numbers.order.orderMore
```ts
orderMore: string = 'Order More Numbers';
```
##### accountOnboarding.numbers.order.placeOrder
```ts
placeOrder: string = 'Place Order';
```
##### accountOnboarding.numbers.order.placing
```ts
placing: string = 'Placing Order...';
```
##### accountOnboarding.numbers.order.quantityLabel
```ts
quantityLabel: string = 'Quantity';
```
##### accountOnboarding.numbers.order.resultsSubtitle
```ts
resultsSubtitle: string = 'Select the numbers you would like to order.';
```
##### accountOnboarding.numbers.order.resultsTitle
```ts
resultsTitle: string = 'Available Numbers';
```
##### accountOnboarding.numbers.order.search
```ts
search: string = 'Search';
```
##### accountOnboarding.numbers.order.searchByAreaCode
```ts
searchByAreaCode: string = 'Area Code';
```
##### accountOnboarding.numbers.order.searchByZip
```ts
searchByZip: string = 'ZIP Code';
```
##### accountOnboarding.numbers.order.searching
```ts
searching: string = 'Searching...';
```
##### accountOnboarding.numbers.order.searchSubtitle
```ts
searchSubtitle: string = 'Find available numbers by entering an area code or ZIP code';
```
##### accountOnboarding.numbers.order.searchTitle
```ts
searchTitle: string = 'Search Available Numbers';
```
##### accountOnboarding.numbers.order.selectAll
```ts
selectAll: string = 'Select All';
```
##### accountOnboarding.numbers.order.selected
```ts
selected: string = 'selected';
```
##### accountOnboarding.numbers.order.state
```ts
state: string = 'State';
```
##### accountOnboarding.numbers.order.statusComplete
```ts
statusComplete: string = 'Your numbers have been activated.';
```
##### accountOnboarding.numbers.order.statusFailed
```ts
statusFailed: string = 'The order could not be completed.';
```
##### accountOnboarding.numbers.order.statusPartial
```ts
statusPartial: string = 'Some numbers were activated, but others failed.';
```
##### accountOnboarding.numbers.order.statusPending
```ts
statusPending: string = 'Your order has been submitted to the carrier. Fulfillment usually completes within seconds but may take longer.';
```
##### accountOnboarding.numbers.order.statusStalled
```ts
statusStalled: string = 'Your order has been submitted to the carrier. Fulfillment usually completes within seconds but may take longer.';
```
##### accountOnboarding.numbers.order.statusTitle
```ts
statusTitle: string = 'Order Submitted';
```
##### accountOnboarding.numbers.order.zipLabel
```ts
zipLabel: string = 'ZIP Code';
```
##### accountOnboarding.numbers.order.zipPlaceholder
```ts
zipPlaceholder: string = '10001';
```
##### accountOnboarding.numbers.overview
```ts
overview: object;
```
##### accountOnboarding.numbers.overview.empty
```ts
empty: string = 'No telephone numbers yet. Request new numbers or port your existing ones.';
```
##### accountOnboarding.numbers.overview.heading
```ts
heading: string = 'Your Numbers';
```
##### accountOnboarding.numbers.overview.loadError
```ts
loadError: string = 'Failed to load telephone numbers. Please try again.';
```
##### accountOnboarding.numbers.overview.phoneNumber
```ts
phoneNumber: string = 'Phone Number';
```
##### accountOnboarding.numbers.overview.portExisting
```ts
portExisting: string = 'Port Existing Number';
```
##### accountOnboarding.numbers.overview.portExistingDesc
```ts
portExistingDesc: string = 'Transfer your current business number to {platformName}. This typically takes 5–10 business days.';
```
##### accountOnboarding.numbers.overview.requestNew
```ts
requestNew: string = 'Request New Numbers';
```
##### accountOnboarding.numbers.overview.requestNewDesc
```ts
requestNewDesc: string = 'Get new business phone numbers instantly. Choose from available numbers in your area.';
```
##### accountOnboarding.numbers.overview.retry
```ts
retry: string = 'Retry';
```
##### accountOnboarding.numbers.overview.source
```ts
source: string = 'Source';
```
##### accountOnboarding.numbers.overview.status
```ts
status: string = 'Status';
```
##### accountOnboarding.numbers.overview.temporaryBanner
```ts
temporaryBanner: string = 'A temporary number has been assigned to your account while you set up your permanent numbers.';
```
##### accountOnboarding.numbers.overview.type
```ts
type: string = 'Type';
```
##### accountOnboarding.numbers.port
```ts
port: object;
```
##### accountOnboarding.numbers.port.accountNumberLabel
```ts
accountNumberLabel: string = 'Account Number';
```
##### accountOnboarding.numbers.port.accountNumberPlaceholder
```ts
accountNumberPlaceholder: string = 'From your current carrier';
```
##### accountOnboarding.numbers.port.accountRequired
```ts
accountRequired: string = 'Account # Required';
```
##### accountOnboarding.numbers.port.addAnother
```ts
addAnother: string = 'Add another number';
```
##### accountOnboarding.numbers.port.addressHeading
```ts
addressHeading: string = 'Service Address';
```
##### accountOnboarding.numbers.port.approve
```ts
approve: string = 'Approve & Submit';
```
##### accountOnboarding.numbers.port.approverNameLabel
```ts
approverNameLabel: string = 'Authorized Contact';
```
##### accountOnboarding.numbers.port.approverNamePlaceholder
```ts
approverNamePlaceholder: string = 'John Doe';
```
##### accountOnboarding.numbers.port.backToOverview
```ts
backToOverview: string = 'Back to Numbers';
```
##### accountOnboarding.numbers.port.billCopyDesc
```ts
billCopyDesc: string = 'A recent bill from your current carrier showing the numbers to be ported.';
```
##### accountOnboarding.numbers.port.billCopyLabel
```ts
billCopyLabel: string = 'Phone Bill Copy';
```
##### accountOnboarding.numbers.port.billCopyRequired
```ts
billCopyRequired: string = 'Required';
```
##### accountOnboarding.numbers.port.btnLabel
```ts
btnLabel: string = 'Billing Telephone Number (BTN)';
```
##### accountOnboarding.numbers.port.btnPlaceholder
```ts
btnPlaceholder: string = '(555) 123-4567';
```
##### accountOnboarding.numbers.port.businessNameLabel
```ts
businessNameLabel: string = 'Business Name';
```
##### accountOnboarding.numbers.port.businessNamePlaceholder
```ts
businessNamePlaceholder: string = 'Acme Corp';
```
##### accountOnboarding.numbers.port.carrier
```ts
carrier: string = 'Current Carrier';
```
##### accountOnboarding.numbers.port.carrierContinue
```ts
carrierContinue: string = 'Continue';
```
##### accountOnboarding.numbers.port.carrierGroupsSubtitle
```ts
carrierGroupsSubtitle: string = 'Your numbers are with different carriers. Each carrier requires a separate port request.';
```
##### accountOnboarding.numbers.port.carrierGroupsTitle
```ts
carrierGroupsTitle: string = 'Carrier Groups';
```
##### accountOnboarding.numbers.port.carrierStart
```ts
carrierStart: string = 'Start';
```
##### accountOnboarding.numbers.port.carrierSubmitted
```ts
carrierSubmitted: string = 'Submitted';
```
##### accountOnboarding.numbers.port.checkEligibility
```ts
checkEligibility: string = 'Check Eligibility';
```
##### accountOnboarding.numbers.port.checking
```ts
checking: string = 'Checking...';
```
##### accountOnboarding.numbers.port.cityLabel
```ts
cityLabel: string = 'City';
```
##### accountOnboarding.numbers.port.cityPlaceholder
```ts
cityPlaceholder: string = 'New York';
```
##### accountOnboarding.numbers.port.continueWithPortable
```ts
continueWithPortable: string = 'Continue with Portable Numbers';
```
##### accountOnboarding.numbers.port.csrDesc
```ts
csrDesc: string = 'Optional but recommended — speeds up the porting process.';
```
##### accountOnboarding.numbers.port.csrLabel
```ts
csrLabel: string = 'Customer Service Record (CSR)';
```
##### accountOnboarding.numbers.port.csrOptional
```ts
csrOptional: string = 'Optional';
```
##### accountOnboarding.numbers.port.documentsSection
```ts
documentsSection: string = 'Documents';
```
##### accountOnboarding.numbers.port.documentsSubtitle
```ts
documentsSubtitle: string = 'Upload your latest phone bill and optionally a Customer Service Record (CSR).';
```
##### accountOnboarding.numbers.port.documentsTitle
```ts
documentsTitle: string = 'Supporting Documents';
```
##### accountOnboarding.numbers.port.eligibilitySubtitle
```ts
eligibilitySubtitle: string = 'Review which numbers can be ported.';
```
##### accountOnboarding.numbers.port.eligibilityTitle
```ts
eligibilityTitle: string = 'Port Eligibility';
```
##### accountOnboarding.numbers.port.fileSelected
```ts
fileSelected: string = 'Selected:';
```
##### accountOnboarding.numbers.port.focDateLabel
```ts
focDateLabel: string = 'Port Date';
```
##### accountOnboarding.numbers.port.focSection
```ts
focSection: string = 'Port Date';
```
##### accountOnboarding.numbers.port.focSubtitle
```ts
focSubtitle: string = 'Choose when you want the numbers transferred. Must be at least 5 business days out.';
```
##### accountOnboarding.numbers.port.focTimeLabel
```ts
focTimeLabel: string = 'Port Time (Eastern)';
```
##### accountOnboarding.numbers.port.focTimePlaceholder
```ts
focTimePlaceholder: string = 'Select time';
```
##### accountOnboarding.numbers.port.focTitle
```ts
focTitle: string = 'Requested Port Date';
```
##### accountOnboarding.numbers.port.houseNumberLabel
```ts
houseNumberLabel: string = 'Street Number';
```
##### accountOnboarding.numbers.port.houseNumberPlaceholder
```ts
houseNumberPlaceholder: string = '123';
```
##### accountOnboarding.numbers.port.line2Label
```ts
line2Label: string = 'Suite / Unit';
```
##### accountOnboarding.numbers.port.line2Placeholder
```ts
line2Placeholder: string = 'Suite 100';
```
##### accountOnboarding.numbers.port.noFileSelected
```ts
noFileSelected: string = 'No file selected';
```
##### accountOnboarding.numbers.port.noPortable
```ts
noPortable: string = 'None of the entered numbers are eligible for porting.';
```
##### accountOnboarding.numbers.port.notPortable
```ts
notPortable: string = 'Not Portable';
```
##### accountOnboarding.numbers.port.numberPlural
```ts
numberPlural: string = 'numbers';
```
##### accountOnboarding.numbers.port.numberSingular
```ts
numberSingular: string = 'number';
```
##### accountOnboarding.numbers.port.numbersSection
```ts
numbersSection: string = 'Numbers';
```
##### accountOnboarding.numbers.port.numbersSubtitle
```ts
numbersSubtitle: string = 'Enter the phone numbers you want to transfer to {platformName}.';
```
##### accountOnboarding.numbers.port.numbersTitle
```ts
numbersTitle: string = 'Numbers to Port';
```
##### accountOnboarding.numbers.port.phoneLabel
```ts
phoneLabel: string = 'Phone Number';
```
##### accountOnboarding.numbers.port.phonePlaceholder
```ts
phonePlaceholder: string = '(555) 123-4567';
```
##### accountOnboarding.numbers.port.pinLabel
```ts
pinLabel: string = 'Account PIN';
```
##### accountOnboarding.numbers.port.pinPlaceholder
```ts
pinPlaceholder: string = '1234';
```
##### accountOnboarding.numbers.port.portable
```ts
portable: string = 'Portable';
```
##### accountOnboarding.numbers.port.removeNumber
```ts
removeNumber: string = 'Remove';
```
##### accountOnboarding.numbers.port.reviewSubtitle
```ts
reviewSubtitle: string = 'Verify all details before submitting your port request.';
```
##### accountOnboarding.numbers.port.reviewTitle
```ts
reviewTitle: string = 'Review & Approve';
```
##### accountOnboarding.numbers.port.signatureHelp
```ts
signatureHelp: string = 'By signing, you authorize the transfer of the listed numbers to {platformName}.';
```
##### accountOnboarding.numbers.port.signatureLabel
```ts
signatureLabel: string = 'Electronic Signature';
```
##### accountOnboarding.numbers.port.signaturePlaceholder
```ts
signaturePlaceholder: string = 'Type your full legal name';
```
##### accountOnboarding.numbers.port.stateLabel
```ts
stateLabel: string = 'State';
```
##### accountOnboarding.numbers.port.statePlaceholder
```ts
statePlaceholder: string = 'Select state';
```
##### accountOnboarding.numbers.port.streetNameLabel
```ts
streetNameLabel: string = 'Street Name';
```
##### accountOnboarding.numbers.port.streetNamePlaceholder
```ts
streetNamePlaceholder: string = 'Main St';
```
##### accountOnboarding.numbers.port.submittedStatus
```ts
submittedStatus: string = 'Status';
```
##### accountOnboarding.numbers.port.submittedSubtitle
```ts
submittedSubtitle: string = 'Your port request has been submitted and is being processed.';
```
##### accountOnboarding.numbers.port.submittedTitle
```ts
submittedTitle: string = 'Port Request Submitted';
```
##### accountOnboarding.numbers.port.submitting
```ts
submitting: string = 'Submitting...';
```
##### accountOnboarding.numbers.port.subscriberSection
```ts
subscriberSection: string = 'Subscriber';
```
##### accountOnboarding.numbers.port.subscriberSubtitle
```ts
subscriberSubtitle: string = 'Enter the details exactly as they appear on your current phone bill.';
```
##### accountOnboarding.numbers.port.subscriberTitle
```ts
subscriberTitle: string = 'Subscriber Information';
```
##### accountOnboarding.numbers.port.uploadFile
```ts
uploadFile: string = 'Choose File';
```
##### accountOnboarding.numbers.port.uploading
```ts
uploading: string = 'Uploading...';
```
##### accountOnboarding.numbers.port.wireless
```ts
wireless: string = 'Wireless';
```
##### accountOnboarding.numbers.port.wirelessNo
```ts
wirelessNo: string = 'No';
```
##### accountOnboarding.numbers.port.wirelessYes
```ts
wirelessYes: string = 'Yes';
```
##### accountOnboarding.numbers.port.zipLabel
```ts
zipLabel: string = 'ZIP Code';
```
##### accountOnboarding.numbers.port.zipPlaceholder
```ts
zipPlaceholder: string = '10001';
```
##### accountOnboarding.numbers.primaryNumber
```ts
primaryNumber: object;
```
##### accountOnboarding.numbers.primaryNumber.autoMatched
```ts
autoMatched: string = '{phone} matches your account phone and has been selected as the primary number for E911.';
```
##### accountOnboarding.numbers.primaryNumber.autoMatchedBadge
```ts
autoMatchedBadge: string = 'Account number — auto-selected';
```
##### accountOnboarding.numbers.primaryNumber.description
```ts
description: string = 'Select the primary phone number for this location. This number is registered with E911 emergency services.';
```
##### accountOnboarding.numbers.primaryNumber.heading
```ts
heading: string = 'Primary Number';
```
##### accountOnboarding.numbers.primaryNumber.loading
```ts
loading: string = 'Loading phone numbers...';
```
##### accountOnboarding.numbers.primaryNumber.noDIDs
```ts
noDIDs: string = 'No active phone numbers available yet. E911 will be configured once numbers are provisioned.';
```
##### accountOnboarding.numbers.primaryNumber.temporary
```ts
temporary: string = 'Temporary';
```
##### accountOnboarding.numbers.primaryNumber.temporaryNote
```ts
temporaryNote: string = 'This is a temporary number assigned to get you started. You can replace it with a permanent number at any time.';
```
##### accountOnboarding.numbers.source
```ts
source: object;
```
##### accountOnboarding.numbers.source.did
```ts
did: string = 'Account';
```
##### accountOnboarding.numbers.source.didTemporary
```ts
didTemporary: string = 'Temporary';
```
##### accountOnboarding.numbers.source.number\_order
```ts
number_order: string = 'New Order';
```
##### accountOnboarding.numbers.source.port\_order
```ts
port_order: string = 'Port';
```
##### accountOnboarding.numbers.status
```ts
status: object;
```
##### accountOnboarding.numbers.status.active
```ts
active: string = 'Active';
```
##### accountOnboarding.numbers.status.inactive
```ts
inactive: string = 'Inactive';
```
##### accountOnboarding.numbers.status.order\_failed
```ts
order_failed: string = 'Order Failed';
```
##### accountOnboarding.numbers.status.ordering
```ts
ordering: string = 'Ordering';
```
##### accountOnboarding.numbers.status.porting\_approved
```ts
porting_approved: string = 'Port Approved';
```
##### accountOnboarding.numbers.status.porting\_draft
```ts
porting_draft: string = 'Port Draft';
```
##### accountOnboarding.numbers.status.porting\_exception
```ts
porting_exception: string = 'Port Exception';
```
##### accountOnboarding.numbers.status.porting\_foc
```ts
porting_foc: string = 'Port Scheduled';
```
##### accountOnboarding.numbers.status.porting\_submitted
```ts
porting_submitted: string = 'Port Submitted';
```
##### accountOnboarding.numbers.status.released
```ts
released: string = 'Released';
```
##### accountOnboarding.numbers.subtitle
```ts
subtitle: string = "Choose how you'd like to set up your business numbers";
```
##### accountOnboarding.numbers.title
```ts
title: string = 'Phone Numbers';
```
##### accountOnboarding.numbers.validation
```ts
validation: object;
```
##### accountOnboarding.numbers.validation.approverNameRequired
```ts
approverNameRequired: string = 'Authorized contact name is required.';
```
##### accountOnboarding.numbers.validation.areaCodeFormat
```ts
areaCodeFormat: string = 'Enter a 3-digit area code.';
```
##### accountOnboarding.numbers.validation.areaCodeRequired
```ts
areaCodeRequired: string = 'Area code is required.';
```
##### accountOnboarding.numbers.validation.billCopyRequired
```ts
billCopyRequired: string = 'A phone bill copy is required.';
```
##### accountOnboarding.numbers.validation.btnInvalid
```ts
btnInvalid: string = 'Enter a valid US phone number.';
```
##### accountOnboarding.numbers.validation.btnRequired
```ts
btnRequired: string = 'BTN is required.';
```
##### accountOnboarding.numbers.validation.businessNameRequired
```ts
businessNameRequired: string = 'Business name is required.';
```
##### accountOnboarding.numbers.validation.cityRequired
```ts
cityRequired: string = 'City is required.';
```
##### accountOnboarding.numbers.validation.eligibilityError
```ts
eligibilityError: string = 'Failed to check eligibility. Please try again.';
```
##### accountOnboarding.numbers.validation.focDateRequired
```ts
focDateRequired: string = 'Port date is required.';
```
##### accountOnboarding.numbers.validation.focDateTooFar
```ts
focDateTooFar: string = 'Port date must be within 30 days.';
```
##### accountOnboarding.numbers.validation.focDateTooSoon
```ts
focDateTooSoon: string = 'Port date must be at least 5 business days from today.';
```
##### accountOnboarding.numbers.validation.focTimeRequired
```ts
focTimeRequired: string = 'Port time is required.';
```
##### accountOnboarding.numbers.validation.houseNumberRequired
```ts
houseNumberRequired: string = 'Street number is required.';
```
##### accountOnboarding.numbers.validation.phoneDuplicate
```ts
phoneDuplicate: string = 'This number has already been entered.';
```
##### accountOnboarding.numbers.validation.phoneInvalid
```ts
phoneInvalid: string = 'Enter a valid US phone number.';
```
##### accountOnboarding.numbers.validation.phoneRequired
```ts
phoneRequired: string = 'At least one phone number is required.';
```
##### accountOnboarding.numbers.validation.selectAtLeastOne
```ts
selectAtLeastOne: string = 'Select at least one number.';
```
##### accountOnboarding.numbers.validation.signatureRequired
```ts
signatureRequired: string = 'Signature is required.';
```
##### accountOnboarding.numbers.validation.stateRequired
```ts
stateRequired: string = 'State is required.';
```
##### accountOnboarding.numbers.validation.streetNameRequired
```ts
streetNameRequired: string = 'Street name is required.';
```
##### accountOnboarding.numbers.validation.submitError
```ts
submitError: string = 'Failed to submit port request. Please try again.';
```
##### accountOnboarding.numbers.validation.zipFormat
```ts
zipFormat: string = 'Enter a 5-digit ZIP code.';
```
##### accountOnboarding.numbers.validation.zipRequired
```ts
zipRequired: string = 'ZIP code is required.';
```
##### accountOnboarding.sidebar
```ts
sidebar: object;
```
##### accountOnboarding.sidebar.businessDetails
```ts
businessDetails: string = 'Business Details';
```
##### accountOnboarding.sidebar.businessDetailsDesc
```ts
businessDetailsDesc: string = 'Enter your company information';
```
##### accountOnboarding.sidebar.callerId
```ts
callerId: string = 'Caller ID';
```
##### accountOnboarding.sidebar.callerIdDesc
```ts
callerIdDesc: string = 'Set caller ID for your numbers';
```
##### accountOnboarding.sidebar.deviceAssignment
```ts
deviceAssignment: string = 'Device Assignment';
```
##### accountOnboarding.sidebar.deviceAssignmentDesc
```ts
deviceAssignmentDesc: string = 'Assign devices to users';
```
##### accountOnboarding.sidebar.directoryListing
```ts
directoryListing: string = 'Directory Listing';
```
##### accountOnboarding.sidebar.directoryListingDesc
```ts
directoryListingDesc: string = 'Configure 411 directory listing';
```
##### accountOnboarding.sidebar.finalCompletion
```ts
finalCompletion: string = 'Final Completion';
```
##### accountOnboarding.sidebar.finalCompletionDesc
```ts
finalCompletionDesc: string = 'Complete your onboarding';
```
##### accountOnboarding.sidebar.numberOptions
```ts
numberOptions: string = 'Number Options';
```
##### accountOnboarding.sidebar.numberOptionsDesc
```ts
numberOptionsDesc: string = 'Choose to port existing or get new numbers';
```
##### accountOnboarding.sidebar.numberSetup
```ts
numberSetup: string = 'Number Setup';
```
##### accountOnboarding.sidebar.numberSetupDesc
```ts
numberSetupDesc: string = 'Configure your phone numbers';
```
##### accountOnboarding.sidebar.primaryNumber
```ts
primaryNumber: string = 'Primary Number';
```
##### accountOnboarding.sidebar.primaryNumberDesc
```ts
primaryNumberDesc: string = 'Select your main E911 number';
```
##### accountOnboarding.sidebar.teamMembers
```ts
teamMembers: string = 'Team Members';
```
##### accountOnboarding.sidebar.teamMembersDesc
```ts
teamMembersDesc: string = 'Add users and assign extensions';
```
##### accountOnboarding.sidebar.verification
```ts
verification: string = 'Verification';
```
##### accountOnboarding.sidebar.verificationDesc
```ts
verificationDesc: string = 'Verify number status';
```
##### accountOnboarding.stepComplete
```ts
stepComplete: object;
```
##### accountOnboarding.stepComplete.done
```ts
done: string = 'Done';
```
##### accountOnboarding.stepComplete.subtitle
```ts
subtitle: string = 'This step has been completed successfully.';
```
##### accountOnboarding.stepComplete.title
```ts
title: string = '{stepName} Complete';
```
##### accountOnboarding.steps
```ts
steps: object;
```
##### accountOnboarding.steps.account
```ts
account: string = 'Account Setup';
```
##### accountOnboarding.steps.complete
```ts
complete: string = 'Complete';
```
##### accountOnboarding.steps.hardware
```ts
hardware: string = 'Hardware Setup';
```
##### accountOnboarding.steps.numbers
```ts
numbers: string = 'Phone Numbers';
```
##### accountOnboarding.title
```ts
title: string = 'Account Onboarding';
```
#### callHistory
```ts
callHistory: object;
```
##### callHistory.clickToCall
```ts
clickToCall: string = 'Click to call';
```
##### callHistory.empty
```ts
empty: string = 'No call history';
```
##### callHistory.error
```ts
error: string = 'Unable to load call history';
```
##### callHistory.loading
```ts
loading: string = 'Loading call history...';
```
##### callHistory.noPhoneNumber
```ts
noPhoneNumber: string = 'Please set a phone number to load call history';
```
##### callHistory.relativeTime
```ts
relativeTime: object;
```
##### callHistory.relativeTime.hourAgo
```ts
hourAgo: string = '1 hour ago';
```
##### callHistory.relativeTime.hoursAgo
```ts
hoursAgo: string = '{count} hours ago';
```
##### callHistory.relativeTime.justNow
```ts
justNow: string = 'Just now';
```
##### callHistory.relativeTime.minuteAgo
```ts
minuteAgo: string = '1 min ago';
```
##### callHistory.relativeTime.minutesAgo
```ts
minutesAgo: string = '{count} min ago';
```
##### callHistory.relativeTime.yesterday
```ts
yesterday: string = 'Yesterday';
```
##### callHistory.summaryNotAvailable
```ts
summaryNotAvailable: string = 'Summary not available';
```
##### callHistory.title
```ts
title: string = 'Call History';
```
#### callLogs
```ts
callLogs: object;
```
##### callLogs.calledBy
```ts
calledBy: string = 'Called by:';
```
##### callLogs.columns
```ts
columns: object;
```
##### callLogs.columns.date
```ts
date: string = 'Date';
```
##### callLogs.columns.direction
```ts
direction: string = 'Direction';
```
##### callLogs.columns.duration
```ts
duration: string = 'Duration';
```
##### callLogs.columns.from
```ts
from: string = 'From';
```
##### callLogs.columns.quality
```ts
quality: string = 'MOS';
```
##### callLogs.columns.status
```ts
status: string = 'Status';
```
##### callLogs.columns.to
```ts
to: string = 'To';
```
##### callLogs.directions
```ts
directions: object;
```
##### callLogs.directions.inbound
```ts
inbound: string = 'Inbound';
```
##### callLogs.directions.internal
```ts
internal: string = 'Internal';
```
##### callLogs.directions.outbound
```ts
outbound: string = 'Outbound';
```
##### callLogs.empty
```ts
empty: string = 'No call logs found';
```
##### callLogs.loading
```ts
loading: string = 'Loading call logs...';
```
##### callLogs.quality
```ts
quality: object;
```
##### callLogs.quality.fair
```ts
fair: string = 'Fair';
```
##### callLogs.quality.good
```ts
good: string = 'Good';
```
##### callLogs.quality.poor
```ts
poor: string = 'Poor';
```
##### callLogs.quality.unavailable
```ts
unavailable: string = 'N/A';
```
##### callLogs.quality.unavailableTooltip
```ts
unavailableTooltip: string = 'No quality data available';
```
##### callLogs.routedTo
```ts
routedTo: string = 'Routed to:';
```
##### callLogs.statuses
```ts
statuses: object;
```
##### callLogs.statuses.busy
```ts
busy: string = 'Busy';
```
##### callLogs.statuses.completed
```ts
completed: string = 'Completed';
```
##### callLogs.statuses.failed
```ts
failed: string = 'Failed';
```
##### callLogs.statuses.noAnswer
```ts
noAnswer: string = 'No Answer';
```
##### callLogs.statuses.voicemail
```ts
voicemail: string = 'Voicemail';
```
##### callLogs.title
```ts
title: string = 'Call Logs';
```
#### common
```ts
common: object;
```
##### common.call
```ts
call: string = 'Call';
```
##### common.cancel
```ts
cancel: string = 'Cancel';
```
##### common.confirm
```ts
confirm: string = 'Confirm';
```
##### common.delete
```ts
delete: string = 'Delete';
```
##### common.error
```ts
error: string = 'Error';
```
##### common.loading
```ts
loading: string = 'Loading...';
```
##### common.next
```ts
next: string = 'Next';
```
##### common.noResults
```ts
noResults: string = 'No results';
```
##### common.pause
```ts
pause: string = 'Pause';
```
##### common.perPage
```ts
perPage: string = 'Per page';
```
##### common.play
```ts
play: string = 'Play';
```
##### common.previous
```ts
previous: string = 'Previous';
```
##### common.showing
```ts
showing: string = 'Showing {start}-{end} of {total}';
```
#### dialPlan
```ts
dialPlan: object;
```
##### dialPlan.empty
```ts
empty: string = 'No dial plan found';
```
##### dialPlan.error
```ts
error: string = 'Failed to load dial plan';
```
##### dialPlan.exits
```ts
exits: object;
```
##### dialPlan.exits.closed
```ts
closed: string = 'Closed';
```
##### dialPlan.exits.next
```ts
next: string = 'No Answer';
```
##### dialPlan.exits.open
```ts
open: string = 'Open';
```
##### dialPlan.exits.timeout
```ts
timeout: string = 'Timeout';
```
##### dialPlan.loading
```ts
loading: string = 'Loading dial plan...';
```
##### dialPlan.nodeTypes
```ts
nodeTypes: object;
```
##### dialPlan.nodeTypes.externalDial
```ts
externalDial: string = 'External Number';
```
##### dialPlan.nodeTypes.internalDial
```ts
internalDial: string = 'Internal Extension';
```
##### dialPlan.nodeTypes.schedule
```ts
schedule: string = 'Schedule';
```
##### dialPlan.nodeTypes.start
```ts
start: string = 'Start';
```
##### dialPlan.nodeTypes.voiceApp
```ts
voiceApp: string = 'Voice App';
```
##### dialPlan.nodeTypes.voicemail
```ts
voicemail: string = 'Voicemail';
```
##### dialPlan.title
```ts
title: string = 'Dial Plan';
```
#### onboardingPortal
```ts
onboardingPortal: object;
```
##### onboardingPortal.back
```ts
back: string = 'Back';
```
##### onboardingPortal.helpSupport
```ts
helpSupport: string = 'Help & Support';
```
##### onboardingPortal.onboardingComplete
```ts
onboardingComplete: string = 'Onboarding complete';
```
##### onboardingPortal.onboardingFlows
```ts
onboardingFlows: string = 'ONBOARDING FLOWS';
```
##### onboardingPortal.overview
```ts
overview: object;
```
##### onboardingPortal.overview.accountDesc
```ts
accountDesc: string = 'Set up your business profile, add team members, and configure your dial plan';
```
##### onboardingPortal.overview.complete
```ts
complete: string = 'Complete';
```
##### onboardingPortal.overview.completeSetup
```ts
completeSetup: string = 'Complete Setup';
```
##### onboardingPortal.overview.continueSetup
```ts
continueSetup: string = 'Continue Setup';
```
##### onboardingPortal.overview.flowsComplete
```ts
flowsComplete: string = '{completed} of {total} flows complete';
```
##### onboardingPortal.overview.hardwareDesc
```ts
hardwareDesc: string = 'Assign phones to team members and track delivery';
```
##### onboardingPortal.overview.label
```ts
label: string = 'Overview';
```
##### onboardingPortal.overview.needHelp
```ts
needHelp: string = 'Need help?';
```
##### onboardingPortal.overview.needHelpSubtitle
```ts
needHelpSubtitle: string = 'Our team is here to help you get set up quickly';
```
##### onboardingPortal.overview.numbersDesc
```ts
numbersDesc: string = 'Port existing numbers or request new business lines';
```
##### onboardingPortal.overview.phoneStatusComplete
```ts
phoneStatusComplete: string = 'Complete';
```
##### onboardingPortal.overview.phoneStatusNumber
```ts
phoneStatusNumber: string = 'Phone Number';
```
##### onboardingPortal.overview.phoneStatusProcessing
```ts
phoneStatusProcessing: string = 'Processing';
```
##### onboardingPortal.overview.phoneStatusStatus
```ts
phoneStatusStatus: string = 'Status';
```
##### onboardingPortal.overview.phoneStatusSubtitle
```ts
phoneStatusSubtitle: string = 'Track the status of your phone numbers';
```
##### onboardingPortal.overview.phoneStatusTemporary
```ts
phoneStatusTemporary: string = 'Temporary';
```
##### onboardingPortal.overview.phoneStatusTitle
```ts
phoneStatusTitle: string = 'Phone number status';
```
##### onboardingPortal.overview.phoneStatusType
```ts
phoneStatusType: string = 'Type';
```
##### onboardingPortal.overview.phoneStatusTypeNew
```ts
phoneStatusTypeNew: string = 'New';
```
##### onboardingPortal.overview.phoneStatusTypePort
```ts
phoneStatusTypePort: string = 'Port';
```
##### onboardingPortal.overview.progress
```ts
progress: string = 'Progress';
```
##### onboardingPortal.overview.progressTitle
```ts
progressTitle: string = 'Onboarding Progress';
```
##### onboardingPortal.overview.review
```ts
review: string = 'Review';
```
##### onboardingPortal.overview.scheduleCall
```ts
scheduleCall: string = 'Schedule a Call';
```
##### onboardingPortal.overview.stepsTitle
```ts
stepsTitle: string = 'Onboarding Steps';
```
##### onboardingPortal.overview.subtitle
```ts
subtitle: string = 'Complete the steps below to set up your business phone system';
```
##### onboardingPortal.overview.title
```ts
title: string = 'Your Business Onboarding';
```
##### onboardingPortal.overview.viewDocs
```ts
viewDocs: string = 'View Documentation';
```
##### onboardingPortal.saveAndExit
```ts
saveAndExit: string = 'Save & Exit to Overview';
```
##### onboardingPortal.splash
```ts
splash: object;
```
##### onboardingPortal.splash.start
```ts
start: string = 'Start Onboarding';
```
##### onboardingPortal.splash.step1
```ts
step1: string = 'Account Details';
```
##### onboardingPortal.splash.step2
```ts
step2: string = 'Setup Phone Numbers';
```
##### onboardingPortal.splash.step3
```ts
step3: string = 'Assign Hardware';
```
##### onboardingPortal.splash.subtitle
```ts
subtitle: string = "Let's get your business set up in 3 easy steps";
```
##### onboardingPortal.splash.title
```ts
title: string = 'Welcome\nto {platformName}';
```
#### phoneNumberOrdering
```ts
phoneNumberOrdering: object;
```
##### phoneNumberOrdering.complete
```ts
complete: object;
```
##### phoneNumberOrdering.complete.assignmentHint
```ts
assignmentHint: string = 'Numbers added to your inventory still need to be assigned to an extension or dial plan before they can receive calls.';
```
##### phoneNumberOrdering.complete.checking
```ts
checking: string = 'Checking order status...';
```
##### phoneNumberOrdering.complete.descriptionCompleteOne
```ts
descriptionCompleteOne: string = 'Your phone number is now in your inventory and ready to be configured.';
```
##### phoneNumberOrdering.complete.descriptionCompleteOther
```ts
descriptionCompleteOther: string = 'Your phone numbers are now in your inventory and ready to be configured.';
```
##### phoneNumberOrdering.complete.descriptionPartialOne
```ts
descriptionPartialOne: string = 'Some numbers could not be fulfilled by the carrier.';
```
##### phoneNumberOrdering.complete.descriptionPartialOther
```ts
descriptionPartialOther: string = 'Some numbers could not be fulfilled by the carrier.';
```
##### phoneNumberOrdering.complete.descriptionPendingOne
```ts
descriptionPendingOne: string = 'Your order has been submitted to the carrier. Fulfillment usually completes within seconds but may take longer.';
```
##### phoneNumberOrdering.complete.descriptionPendingOther
```ts
descriptionPendingOther: string = 'Your order has been submitted to the carrier. Fulfillment usually completes within seconds but may take longer.';
```
##### phoneNumberOrdering.complete.orderMore
```ts
orderMore: string = 'Order More Numbers';
```
##### phoneNumberOrdering.complete.titleCompleteOne
```ts
titleCompleteOne: string = 'Number Ready';
```
##### phoneNumberOrdering.complete.titleCompleteOther
```ts
titleCompleteOther: string = 'Numbers Ready';
```
##### phoneNumberOrdering.complete.titlePartialOne
```ts
titlePartialOne: string = 'Partially Fulfilled';
```
##### phoneNumberOrdering.complete.titlePartialOther
```ts
titlePartialOther: string = 'Partially Fulfilled';
```
##### phoneNumberOrdering.complete.titlePendingOne
```ts
titlePendingOne: string = 'Order Submitted';
```
##### phoneNumberOrdering.complete.titlePendingOther
```ts
titlePendingOther: string = 'Order Submitted';
```
##### phoneNumberOrdering.confirm
```ts
confirm: object;
```
##### phoneNumberOrdering.confirm.back
```ts
back: string = 'Back';
```
##### phoneNumberOrdering.confirm.description
```ts
description: string = 'Your order will be submitted to the carrier for fulfillment. This usually completes within seconds but may take longer.';
```
##### phoneNumberOrdering.confirm.placeOrder
```ts
placeOrder: string = 'Place Order';
```
##### phoneNumberOrdering.confirm.subtitleOne
```ts
subtitleOne: string = 'You are about to order 1 phone number';
```
##### phoneNumberOrdering.confirm.subtitleOther
```ts
subtitleOther: string = 'You are about to order {count} phone numbers';
```
##### phoneNumberOrdering.confirm.title
```ts
title: string = 'Confirm Order';
```
##### phoneNumberOrdering.error
```ts
error: object;
```
##### phoneNumberOrdering.error.description
```ts
description: string = 'The carrier was unable to fulfill your order.';
```
##### phoneNumberOrdering.error.title
```ts
title: string = 'Order Failed';
```
##### phoneNumberOrdering.error.tryAgain
```ts
tryAgain: string = 'Try Again';
```
##### phoneNumberOrdering.ordering
```ts
ordering: object;
```
##### phoneNumberOrdering.ordering.title
```ts
title: string = 'Placing Order...';
```
##### phoneNumberOrdering.results
```ts
results: object;
```
##### phoneNumberOrdering.results.backToSearch
```ts
backToSearch: string = 'Back to Search';
```
##### phoneNumberOrdering.results.continue
```ts
continue: string = 'Continue';
```
##### phoneNumberOrdering.results.noResults
```ts
noResults: string = 'No numbers available for this search';
```
##### phoneNumberOrdering.results.phoneNumber
```ts
phoneNumber: string = 'Phone Number';
```
##### phoneNumberOrdering.results.selectAll
```ts
selectAll: string = 'Select all';
```
##### phoneNumberOrdering.results.selected
```ts
selected: string = '{count} selected';
```
##### phoneNumberOrdering.results.state
```ts
state: string = 'State';
```
##### phoneNumberOrdering.results.title
```ts
title: string = 'Available Numbers';
```
##### phoneNumberOrdering.search
```ts
search: object;
```
##### phoneNumberOrdering.search.areaCode
```ts
areaCode: string = 'Area Code';
```
##### phoneNumberOrdering.search.areaCodeLabel
```ts
areaCodeLabel: string = 'Area Code';
```
##### phoneNumberOrdering.search.areaCodePlaceholder
```ts
areaCodePlaceholder: string = 'e.g. 212';
```
##### phoneNumberOrdering.search.numberOfResults
```ts
numberOfResults: string = 'Quantity to display';
```
##### phoneNumberOrdering.search.search
```ts
search: string = 'Search';
```
##### phoneNumberOrdering.search.searchType
```ts
searchType: string = 'Search by';
```
##### phoneNumberOrdering.search.subtitle
```ts
subtitle: string = 'Find available phone numbers by entering an area code or ZIP code.';
```
##### phoneNumberOrdering.search.title
```ts
title: string = 'Search Available Numbers';
```
##### phoneNumberOrdering.search.zip
```ts
zip: string = 'ZIP Code';
```
##### phoneNumberOrdering.search.zipLabel
```ts
zipLabel: string = 'ZIP Code';
```
##### phoneNumberOrdering.search.zipPlaceholder
```ts
zipPlaceholder: string = 'e.g. 10001';
```
##### phoneNumberOrdering.statuses
```ts
statuses: object;
```
##### phoneNumberOrdering.statuses.complete
```ts
complete: string = 'Complete';
```
##### phoneNumberOrdering.statuses.failed
```ts
failed: string = 'Failed';
```
##### phoneNumberOrdering.statuses.partial
```ts
partial: string = 'Partial';
```
##### phoneNumberOrdering.statuses.pending
```ts
pending: string = 'Pending';
```
##### phoneNumberOrdering.steps
```ts
steps: object;
```
##### phoneNumberOrdering.steps.confirm
```ts
confirm: string = 'Confirm';
```
##### phoneNumberOrdering.steps.done
```ts
done: string = 'Done';
```
##### phoneNumberOrdering.steps.search
```ts
search: string = 'Search';
```
##### phoneNumberOrdering.steps.select
```ts
select: string = 'Select';
```
##### phoneNumberOrdering.steps.stepOf
```ts
stepOf: string = 'Step {current} of {total}';
```
##### phoneNumberOrdering.title
```ts
title: string = 'Order Phone Numbers';
```
#### phoneNumbers
```ts
phoneNumbers: object;
```
##### phoneNumbers.badges
```ts
badges: object;
```
##### phoneNumbers.badges.temporary
```ts
temporary: string = 'Temporary';
```
##### phoneNumbers.columns
```ts
columns: object;
```
##### phoneNumbers.columns.callerID
```ts
callerID: string = 'Caller ID';
```
##### phoneNumbers.columns.cancelledDate
```ts
cancelledDate: string = 'Date Cancelled';
```
##### phoneNumbers.columns.carrier
```ts
carrier: string = 'Carrier';
```
##### phoneNumbers.columns.outbound
```ts
outbound: string = 'Direction';
```
##### phoneNumbers.columns.phoneNumber
```ts
phoneNumber: string = 'Phone Number';
```
##### phoneNumbers.columns.routingTarget
```ts
routingTarget: string = 'Call Routing';
```
##### phoneNumbers.columns.status
```ts
status: string = 'Status';
```
##### phoneNumbers.columns.transferDate
```ts
transferDate: string = 'Transfer Date';
```
##### phoneNumbers.empty
```ts
empty: string = 'No phone numbers';
```
##### phoneNumbers.filterLabel
```ts
filterLabel: string = 'Filter by status';
```
##### phoneNumbers.filters
```ts
filters: object;
```
##### phoneNumbers.filters.active
```ts
active: string = 'Active';
```
##### phoneNumbers.filters.cancelled
```ts
cancelled: string = 'Cancelled';
```
##### phoneNumbers.filters.in\_progress
```ts
in_progress: string = 'In Progress';
```
##### phoneNumbers.loading
```ts
loading: string = 'Loading phone numbers...';
```
##### phoneNumbers.outbound
```ts
outbound: object;
```
##### phoneNumbers.outbound.disabled
```ts
disabled: string = 'Inbound only';
```
##### phoneNumbers.outbound.enabled
```ts
enabled: string = 'Two-way';
```
##### phoneNumbers.routingTarget
```ts
routingTarget: object;
```
##### phoneNumbers.routingTarget.notSet
```ts
notSet: string = 'Not set';
```
##### phoneNumbers.routingTargetTypes
```ts
routingTargetTypes: object;
```
##### phoneNumbers.routingTargetTypes.dialPlan
```ts
dialPlan: string = 'Dial Plan';
```
##### phoneNumbers.routingTargetTypes.ringGroup
```ts
ringGroup: string = 'Ring Group';
```
##### phoneNumbers.routingTargetTypes.user
```ts
user: string = 'User';
```
##### phoneNumbers.routingTargetTypes.voiceApp
```ts
voiceApp: string = 'Voice App';
```
##### phoneNumbers.statuses
```ts
statuses: object;
```
##### phoneNumbers.statuses.active
```ts
active: string = 'Active';
```
##### phoneNumbers.statuses.inactive
```ts
inactive: string = 'Inactive';
```
##### phoneNumbers.statuses.orderFailed
```ts
orderFailed: string = 'Order Failed';
```
##### phoneNumbers.statuses.ordering
```ts
ordering: string = 'Ordering';
```
##### phoneNumbers.statuses.portingApproved
```ts
portingApproved: string = 'Port Approved';
```
##### phoneNumbers.statuses.portingDraft
```ts
portingDraft: string = 'Port Draft';
```
##### phoneNumbers.statuses.portingException
```ts
portingException: string = 'Port Issue';
```
##### phoneNumbers.statuses.portingFoc
```ts
portingFoc: string = 'Port Scheduled';
```
##### phoneNumbers.statuses.portingSubmitted
```ts
portingSubmitted: string = 'Port Submitted';
```
##### phoneNumbers.statuses.released
```ts
released: string = 'Released';
```
##### phoneNumbers.title
```ts
title: string = 'Phone Numbers';
```
#### voicemails
```ts
voicemails: object;
```
##### voicemails.deleteConfirm
```ts
deleteConfirm: string = 'Delete this voicemail?';
```
##### voicemails.deleteTitle
```ts
deleteTitle: string = 'Delete Voicemail';
```
##### voicemails.empty
```ts
empty: string = 'No voicemails';
```
##### voicemails.loading
```ts
loading: string = 'Loading voicemails...';
```
##### voicemails.noUserId
```ts
noUserId: string = 'Please set a user ID to load voicemails';
```
##### voicemails.progress
```ts
progress: string = 'Playback progress';
```
##### voicemails.summary
```ts
summary: string = 'Summary';
```
##### voicemails.title
```ts
title: string = 'Voicemails';
```
##### voicemails.transcript
```ts
transcript: string = 'Full Transcript';
```
##### voicemails.transcription
```ts
transcription: string = 'Transcription';
```
##### voicemails.transcriptLoading
```ts
transcriptLoading: string = 'Loading transcript...';
```
##### voicemails.transcriptNotAvailable
```ts
transcriptNotAvailable: string = 'Transcript not available';
```
***
### onLoadError?
```ts
optional onLoadError?: (event) => void;
```
Defined in: [sdk/src/react/PhoneNumberOrdering.tsx:70](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/PhoneNumberOrdering.tsx#L70)
Callback when there's an error loading data
#### Parameters
##### event
[`LoadError`](../../index/interfaces/LoadError.md)
#### Returns
`void`
***
### onLoaderStart?
```ts
optional onLoaderStart?: (event) => void;
```
Defined in: [sdk/src/react/PhoneNumberOrdering.tsx:65](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/PhoneNumberOrdering.tsx#L65)
Callback when component starts loading
#### Parameters
##### event
[`LoaderStart`](../../index/interfaces/LoaderStart.md)
#### Returns
`void`
***
### onOrderComplete?
```ts
optional onOrderComplete?: (event) => void;
```
Defined in: [sdk/src/react/PhoneNumberOrdering.tsx:75](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/PhoneNumberOrdering.tsx#L75)
Callback when an order is successfully placed
#### Parameters
##### event
###### order
[`NumberOrder`](../../index/interfaces/NumberOrder.md)
###### orderId
`string`
#### Returns
`void`
***
### onOrderError?
```ts
optional onOrderError?: (event) => void;
```
Defined in: [sdk/src/react/PhoneNumberOrdering.tsx:80](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/PhoneNumberOrdering.tsx#L80)
Callback when an order fails
#### Parameters
##### event
###### error
`string`
#### Returns
`void`
***
### searchTypes?
```ts
optional searchTypes?: SearchType[];
```
Defined in: [sdk/src/react/PhoneNumberOrdering.tsx:60](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/PhoneNumberOrdering.tsx#L60)
Which search modes to show. Defaults to ['area_code', 'zip'].
***
### style?
```ts
optional style?: CSSProperties;
```
Defined in: [sdk/src/react/PhoneNumberOrdering.tsx:30](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/PhoneNumberOrdering.tsx#L30)
Optional inline styles
---
## Interface: PhoneNumbersProps
[@dialstack/sdk](../../index.md) / [react](../index.md) / PhoneNumbersProps
# Interface: PhoneNumbersProps
Defined in: [sdk/src/react/PhoneNumbers.tsx:20](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/PhoneNumbers.tsx#L20)
## Properties
### classes?
```ts
optional classes?: PhoneNumbersClasses;
```
Defined in: [sdk/src/react/PhoneNumbers.tsx:59](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/PhoneNumbers.tsx#L59)
Custom CSS classes for styling integration
***
### className?
```ts
optional className?: string;
```
Defined in: [sdk/src/react/PhoneNumbers.tsx:24](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/PhoneNumbers.tsx#L24)
Optional CSS class name
***
### formatting?
```ts
optional formatting?: FormattingOptions;
```
Defined in: [sdk/src/react/PhoneNumbers.tsx:44](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/PhoneNumbers.tsx#L44)
Formatting options for dates and phone numbers
***
### icons?
```ts
optional icons?: ComponentIcons;
```
Defined in: [sdk/src/react/PhoneNumbers.tsx:49](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/PhoneNumbers.tsx#L49)
Custom icons (partial override of defaults)
***
### layoutVariant?
```ts
optional layoutVariant?: LayoutVariant;
```
Defined in: [sdk/src/react/PhoneNumbers.tsx:54](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/PhoneNumbers.tsx#L54)
Layout variant (compact, comfortable, default)
***
### limit?
```ts
optional limit?: number;
```
Defined in: [sdk/src/react/PhoneNumbers.tsx:34](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/PhoneNumbers.tsx#L34)
Maximum number of phone numbers per page (default: 10)
***
### locale?
```ts
optional locale?: object;
```
Defined in: [sdk/src/react/PhoneNumbers.tsx:39](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/PhoneNumbers.tsx#L39)
Locale for UI strings
#### accountOnboarding
```ts
accountOnboarding: object;
```
##### accountOnboarding.account
```ts
account: object;
```
##### accountOnboarding.account.details
```ts
details: object;
```
##### accountOnboarding.account.details.companyNameLabel
```ts
companyNameLabel: string = 'Company Name';
```
##### accountOnboarding.account.details.companyNamePlaceholder
```ts
companyNamePlaceholder: string = 'Acme Corp';
```
##### accountOnboarding.account.details.companyNameRequired
```ts
companyNameRequired: string = 'Company name is required';
```
##### accountOnboarding.account.details.emailLabel
```ts
emailLabel: string = 'Primary Contact Email';
```
##### accountOnboarding.account.details.emailPlaceholder
```ts
emailPlaceholder: string = 'admin@company.com';
```
##### accountOnboarding.account.details.emailRequired
```ts
emailRequired: string = 'Primary contact email is required';
```
##### accountOnboarding.account.details.heading
```ts
heading: string = 'Account Details';
```
##### accountOnboarding.account.details.phoneInvalid
```ts
phoneInvalid: string = 'Enter a valid US phone number';
```
##### accountOnboarding.account.details.phoneLabel
```ts
phoneLabel: string = 'Primary Contact Phone Number';
```
##### accountOnboarding.account.details.phonePlaceholder
```ts
phonePlaceholder: string = '(555) 123-4567';
```
##### accountOnboarding.account.details.phoneRequired
```ts
phoneRequired: string = 'Primary contact phone number is required';
```
##### accountOnboarding.account.details.primaryContactLabel
```ts
primaryContactLabel: string = 'Primary Contact';
```
##### accountOnboarding.account.details.primaryContactPlaceholder
```ts
primaryContactPlaceholder: string = 'Jane Doe';
```
##### accountOnboarding.account.details.primaryContactRequired
```ts
primaryContactRequired: string = 'Primary contact is required';
```
##### accountOnboarding.account.details.regionLabel
```ts
regionLabel: string = 'Region';
```
##### accountOnboarding.account.details.regionPlaceholder
```ts
regionPlaceholder: string = 'Select a region';
```
##### accountOnboarding.account.details.timezoneLabel
```ts
timezoneLabel: string = 'Timezone';
```
##### accountOnboarding.account.details.timezonePlaceholder
```ts
timezonePlaceholder: string = 'Select a timezone';
```
##### accountOnboarding.account.details.timezoneRequired
```ts
timezoneRequired: string = 'Timezone is required';
```
##### accountOnboarding.account.location
```ts
location: object;
```
##### accountOnboarding.account.location.addressLabel
```ts
addressLabel: string = 'Address';
```
##### accountOnboarding.account.location.addressRequired
```ts
addressRequired: string = 'Address is required';
```
##### accountOnboarding.account.location.cityLabel
```ts
cityLabel: string = 'City';
```
##### accountOnboarding.account.location.cityPlaceholder
```ts
cityPlaceholder: string = 'New York';
```
##### accountOnboarding.account.location.description
```ts
description: string = 'Add your business address for E911 and caller ID.';
```
##### accountOnboarding.account.location.edit
```ts
edit: string = 'Edit';
```
##### accountOnboarding.account.location.enterManually
```ts
enterManually: string = 'Enter manually';
```
##### accountOnboarding.account.location.heading
```ts
heading: string = 'Business Location';
```
##### accountOnboarding.account.location.houseNumberLabel
```ts
houseNumberLabel: string = '#';
```
##### accountOnboarding.account.location.houseNumberPlaceholder
```ts
houseNumberPlaceholder: string = '123';
```
##### accountOnboarding.account.location.nameLabel
```ts
nameLabel: string = 'Location Name';
```
##### accountOnboarding.account.location.namePlaceholder
```ts
namePlaceholder: string = 'Main Office';
```
##### accountOnboarding.account.location.nameRequired
```ts
nameRequired: string = 'Location name is required';
```
##### accountOnboarding.account.location.noResults
```ts
noResults: string = 'No addresses found';
```
##### accountOnboarding.account.location.postalCodeLabel
```ts
postalCodeLabel: string = 'ZIP';
```
##### accountOnboarding.account.location.postalCodePlaceholder
```ts
postalCodePlaceholder: string = '10001';
```
##### accountOnboarding.account.location.searching
```ts
searching: string = 'Searching...';
```
##### accountOnboarding.account.location.searchInstead
```ts
searchInstead: string = 'Search instead';
```
##### accountOnboarding.account.location.searchPlaceholder
```ts
searchPlaceholder: string = 'Start typing an address...';
```
##### accountOnboarding.account.location.stateLabel
```ts
stateLabel: string = 'State';
```
##### accountOnboarding.account.location.statePlaceholder
```ts
statePlaceholder: string = 'Select';
```
##### accountOnboarding.account.location.streetLabel
```ts
streetLabel: string = 'Street';
```
##### accountOnboarding.account.location.streetPlaceholder
```ts
streetPlaceholder: string = 'Main St';
```
##### accountOnboarding.account.saveError
```ts
saveError: string = 'Failed to save. Please try again.';
```
##### accountOnboarding.account.saving
```ts
saving: string = 'Saving...';
```
##### accountOnboarding.account.subtitle
```ts
subtitle: string = 'Enter your company information';
```
##### accountOnboarding.account.title
```ts
title: string = 'Business Details';
```
##### accountOnboarding.account.users
```ts
users: object;
```
##### accountOnboarding.account.users.addUser
```ts
addUser: string = 'Add User';
```
##### accountOnboarding.account.users.atLeastOne
```ts
atLeastOne: string = 'Add at least one team member to continue.';
```
##### accountOnboarding.account.users.description
```ts
description: string = 'Add users who will have phone extensions';
```
##### accountOnboarding.account.users.duplicateEmail
```ts
duplicateEmail: string = 'A user with this email already exists.';
```
##### accountOnboarding.account.users.emailLabel
```ts
emailLabel: string = 'Email';
```
##### accountOnboarding.account.users.emailPlaceholder
```ts
emailPlaceholder: string = 'john@company.com';
```
##### accountOnboarding.account.users.extensionLabel
```ts
extensionLabel: string = 'Extension';
```
##### accountOnboarding.account.users.extensionPlaceholder
```ts
extensionPlaceholder: string = 'ex. 103';
```
##### accountOnboarding.account.users.heading
```ts
heading: string = 'Team Members';
```
##### accountOnboarding.account.users.nameLabel
```ts
nameLabel: string = 'Full name';
```
##### accountOnboarding.account.users.namePlaceholder
```ts
namePlaceholder: string = 'John Doe';
```
##### accountOnboarding.account.users.nameRequired
```ts
nameRequired: string = 'Name is required';
```
##### accountOnboarding.account.users.noUsers
```ts
noUsers: string = 'No team members added yet.';
```
##### accountOnboarding.account.users.removeUser
```ts
removeUser: string = 'Remove';
```
##### accountOnboarding.account.users.roleAdmin
```ts
roleAdmin: string = 'Admin';
```
##### accountOnboarding.account.users.roleLabel
```ts
roleLabel: string = 'Role';
```
##### accountOnboarding.account.users.roleUser
```ts
roleUser: string = 'User';
```
##### accountOnboarding.breadcrumbAriaLabel
```ts
breadcrumbAriaLabel: string = 'Onboarding progress';
```
##### accountOnboarding.complete
```ts
complete: object;
```
##### accountOnboarding.complete.e911
```ts
e911: object;
```
##### accountOnboarding.complete.e911.addressStandardized
```ts
addressStandardized: string = 'Your address was standardized for emergency services accuracy.';
```
##### accountOnboarding.complete.e911.deferred
```ts
deferred: string = 'E911 emergency services have not been fully configured. Each location with a phone number needs a verified emergency address before your phone service can be activated.';
```
##### accountOnboarding.complete.e911.errorDescription
```ts
errorDescription: string = 'There was an error configuring emergency services. You can retry or configure manually later.';
```
##### accountOnboarding.complete.e911.errorTitle
```ts
errorTitle: string = 'E911 configuration failed';
```
##### accountOnboarding.complete.e911.loading
```ts
loading: string = 'Configuring emergency services...';
```
##### accountOnboarding.complete.e911.pendingAfterPolling
```ts
pendingAfterPolling: string = 'E911 registration submitted. Your phone service is active — emergency address verification will complete shortly.';
```
##### accountOnboarding.complete.e911.pollingStatus
```ts
pollingStatus: string = 'Verifying emergency services registration...';
```
##### accountOnboarding.complete.e911.primaryAssigned
```ts
primaryAssigned: string = 'assigned as primary number for';
```
##### accountOnboarding.complete.e911.processing
```ts
processing: string = 'E911 registration is being processed. This may take a few minutes.';
```
##### accountOnboarding.complete.e911.retryButton
```ts
retryButton: string = 'Retry';
```
##### accountOnboarding.complete.e911.verified
```ts
verified: string = 'E911 emergency address is verified.';
```
##### accountOnboarding.complete.subtitle
```ts
subtitle: string = "It's time to start using your embedded voice system";
```
##### accountOnboarding.complete.title
```ts
title: string = 'Wahoo!';
```
##### accountOnboarding.error
```ts
error: object;
```
##### accountOnboarding.error.description
```ts
description: string = 'Something went wrong loading the onboarding wizard.';
```
##### accountOnboarding.error.retry
```ts
retry: string = 'Try Again';
```
##### accountOnboarding.error.title
```ts
title: string = 'Unable to Load';
```
##### accountOnboarding.hardware
```ts
hardware: object;
```
##### accountOnboarding.hardware.addDeviceButton
```ts
addDeviceButton: string = '+ Add Device';
```
##### accountOnboarding.hardware.addHandsetButton
```ts
addHandsetButton: string = '+ Handset';
```
##### accountOnboarding.hardware.allAssigned
```ts
allAssigned: string = 'All devices have been assigned';
```
##### accountOnboarding.hardware.assignAndComplete
```ts
assignAndComplete: string = 'Assign & Complete';
```
##### accountOnboarding.hardware.availableDevices
```ts
availableDevices: string = 'Available Devices';
```
##### accountOnboarding.hardware.cancel
```ts
cancel: string = 'Cancel';
```
##### accountOnboarding.hardware.clickToAssign
```ts
clickToAssign: string = 'Click to assign';
```
##### accountOnboarding.hardware.cordless
```ts
cordless: string = 'Cordless';
```
##### accountOnboarding.hardware.dectBase
```ts
dectBase: string = 'Cordless Base';
```
##### accountOnboarding.hardware.deskPhone
```ts
deskPhone: string = 'Desk phone';
```
##### accountOnboarding.hardware.deviceNotFound
```ts
deviceNotFound: string = 'Device was created but could not be found. Please try again.';
```
##### accountOnboarding.hardware.dragDropHint
```ts
dragDropHint: string = 'Drag and drop device here';
```
##### accountOnboarding.hardware.duplicateMac
```ts
duplicateMac: string = 'This MAC address is already registered.';
```
##### accountOnboarding.hardware.gate
```ts
gate: object;
```
##### accountOnboarding.hardware.gate.noDevices
```ts
noDevices: string = 'No devices are available for your account. Please contact support to add devices before completing this step.';
```
##### accountOnboarding.hardware.handset
```ts
handset: string = 'handset';
```
##### accountOnboarding.hardware.handsets
```ts
handsets: string = 'handsets';
```
##### accountOnboarding.hardware.invalidIpei
```ts
invalidIpei: string = 'Enter a valid IPEI (hex digits only).';
```
##### accountOnboarding.hardware.invalidMac
```ts
invalidMac: string = 'Enter a valid 12-digit MAC address.';
```
##### accountOnboarding.hardware.ipeiLabel
```ts
ipeiLabel: string = 'Handset IPEI';
```
##### accountOnboarding.hardware.ipeiNotMac
```ts
ipeiNotMac: string = 'This looks like a MAC address, not an IPEI. An IPEI looks like 03AABB1234567890CCDD.';
```
##### accountOnboarding.hardware.ipeiPlaceholder
```ts
ipeiPlaceholder: string = '03AABB1234567890CCDD';
```
##### accountOnboarding.hardware.isDectBase
```ts
isDectBase: string = 'This is a cordless handset base station';
```
##### accountOnboarding.hardware.macLabel
```ts
macLabel: string = 'MAC Address';
```
##### accountOnboarding.hardware.macPlaceholder
```ts
macPlaceholder: string = '00:04:13:AA:BB:CC';
```
##### accountOnboarding.hardware.noDevices
```ts
noDevices: string = 'No devices are available for your account at the moment.';
```
##### accountOnboarding.hardware.noUsers
```ts
noUsers: string = 'No team members found. Add team members in the Account step first.';
```
##### accountOnboarding.hardware.removeBaseFailed
```ts
removeBaseFailed: string = 'Failed to remove cordless base.';
```
##### accountOnboarding.hardware.removeDevice
```ts
removeDevice: string = 'Remove';
```
##### accountOnboarding.hardware.save
```ts
save: string = 'Save';
```
##### accountOnboarding.hardware.saving
```ts
saving: string = 'Saving...';
```
##### accountOnboarding.hardware.selectUser
```ts
selectUser: string = 'Select a team member';
```
##### accountOnboarding.hardware.selectUserRequired
```ts
selectUserRequired: string = 'Please select a team member.';
```
##### accountOnboarding.hardware.shippingAddress
```ts
shippingAddress: string = 'Shipping Address';
```
##### accountOnboarding.hardware.submitOrder
```ts
submitOrder: string = 'Submit Order';
```
##### accountOnboarding.hardware.submitting
```ts
submitting: string = 'Submitting...';
```
##### accountOnboarding.hardware.subtitle
```ts
subtitle: string = 'Drag and drop devices to assign them to team members';
```
##### accountOnboarding.hardware.tableHeaderDevice
```ts
tableHeaderDevice: string = 'Assigned Device';
```
##### accountOnboarding.hardware.tableHeaderExtension
```ts
tableHeaderExtension: string = 'Extension';
```
##### accountOnboarding.hardware.tableHeaderName
```ts
tableHeaderName: string = 'Full name';
```
##### accountOnboarding.hardware.title
```ts
title: string = 'Assign Devices';
```
##### accountOnboarding.hardware.unassign
```ts
unassign: string = 'Unassign';
```
##### accountOnboarding.hardware.unsupportedVendor
```ts
unsupportedVendor: string = 'This device is not currently supported. Our support team has been notified and will follow up.';
```
##### accountOnboarding.hardware.userLabel
```ts
userLabel: string = 'Team Member';
```
##### accountOnboarding.legal
```ts
legal: object;
```
##### accountOnboarding.legal.and
```ts
and: string = 'and';
```
##### accountOnboarding.legal.prefix
```ts
prefix: string = 'By continuing, you agree to the';
```
##### accountOnboarding.legal.privacyPolicy
```ts
privacyPolicy: string = 'Privacy Policy';
```
##### accountOnboarding.legal.recipientTerms
```ts
recipientTerms: string = 'Recipient Terms of Service';
```
##### accountOnboarding.legal.termsOfService
```ts
termsOfService: string = 'Terms of Service';
```
##### accountOnboarding.loading
```ts
loading: string = 'Loading...';
```
##### accountOnboarding.nav
```ts
nav: object;
```
##### accountOnboarding.nav.back
```ts
back: string = 'Back';
```
##### accountOnboarding.nav.exit
```ts
exit: string = 'Finish';
```
##### accountOnboarding.nav.next
```ts
next: string = 'Next';
```
##### accountOnboarding.nav.skip
```ts
skip: string = 'Skip';
```
##### accountOnboarding.numbers
```ts
numbers: object;
```
##### accountOnboarding.numbers.callerId
```ts
callerId: object;
```
##### accountOnboarding.numbers.callerId.alreadySet
```ts
alreadySet: string = 'Already configured';
```
##### accountOnboarding.numbers.callerId.charCount
```ts
charCount: string = '{count}/15';
```
##### accountOnboarding.numbers.callerId.directoryListing
```ts
directoryListing: object;
```
##### accountOnboarding.numbers.callerId.directoryListing.info
```ts
info: string = 'To update your directory listing, contact {platformName} support.';
```
##### accountOnboarding.numbers.callerId.directoryListing.title
```ts
title: string = 'Directory Listing (DA/DL)';
```
##### accountOnboarding.numbers.callerId.error
```ts
error: object;
```
##### accountOnboarding.numbers.callerId.error.conflict
```ts
conflict: string = 'A caller ID update is already in progress for this number.';
```
##### accountOnboarding.numbers.callerId.error.submitFailed
```ts
submitFailed: string = 'Failed to set caller ID. Please try again.';
```
##### accountOnboarding.numbers.callerId.inputHelp
```ts
inputHelp: string = 'Max 15 characters. Letters, numbers, spaces, and hyphens only.';
```
##### accountOnboarding.numbers.callerId.inputLabel
```ts
inputLabel: string = 'Caller ID Name';
```
##### accountOnboarding.numbers.callerId.inputPlaceholder
```ts
inputPlaceholder: string = 'e.g. ACME Corp';
```
##### accountOnboarding.numbers.callerId.noDIDs
```ts
noDIDs: string = 'No active phone numbers to configure.';
```
##### accountOnboarding.numbers.callerId.partialError
```ts
partialError: string = 'Some caller IDs could not be set. Fix errors and retry, or skip.';
```
##### accountOnboarding.numbers.callerId.skipCallerId
```ts
skipCallerId: string = 'Skip';
```
##### accountOnboarding.numbers.callerId.submit
```ts
submit: string = 'Set Caller ID';
```
##### accountOnboarding.numbers.callerId.submitAll
```ts
submitAll: string = 'Set All Caller IDs';
```
##### accountOnboarding.numbers.callerId.submitted
```ts
submitted: string = 'Submitted';
```
##### accountOnboarding.numbers.callerId.submitting
```ts
submitting: string = 'Submitting...';
```
##### accountOnboarding.numbers.callerId.submittingAll
```ts
submittingAll: string = 'Submitting caller IDs...';
```
##### accountOnboarding.numbers.callerId.subtitle
```ts
subtitle: string = 'Configure the name displayed when making outbound calls';
```
##### accountOnboarding.numbers.callerId.title
```ts
title: string = 'Caller ID Setup';
```
##### accountOnboarding.numbers.callerId.validation
```ts
validation: object;
```
##### accountOnboarding.numbers.callerId.validation.invalidChars
```ts
invalidChars: string = 'Only letters, numbers, spaces, and hyphens allowed';
```
##### accountOnboarding.numbers.callerId.validation.required
```ts
required: string = 'Caller ID name is required';
```
##### accountOnboarding.numbers.callerId.validation.tooLong
```ts
tooLong: string = 'Must be 15 characters or fewer';
```
##### accountOnboarding.numbers.defaultDialPlanName
```ts
defaultDialPlanName: string = 'Onboarding Dial Plan';
```
##### accountOnboarding.numbers.directoryListing
```ts
directoryListing: object;
```
##### accountOnboarding.numbers.directoryListing.businessName
```ts
businessName: string = 'Business Name';
```
##### accountOnboarding.numbers.directoryListing.businessNameHelp
```ts
businessNameHelp: string = 'The name shown in directory listings and used for caller verification. Max 200 characters.';
```
##### accountOnboarding.numbers.directoryListing.businessNamePlaceholder
```ts
businessNamePlaceholder: string = 'Enter business name for listing';
```
##### accountOnboarding.numbers.directoryListing.noDIDs
```ts
noDIDs: string = 'No eligible phone numbers to configure.';
```
##### accountOnboarding.numbers.directoryListing.noneOption
```ts
noneOption: string = 'None \u2014 skip directory listing';
```
##### accountOnboarding.numbers.directoryListing.selectPrompt
```ts
selectPrompt: string = 'Select which number should be listed:';
```
##### accountOnboarding.numbers.directoryListing.subtitle
```ts
subtitle: string = 'A directory listing feeds your business information into online directories and data aggregators, helping customers find you. It also reduces the chance of your outbound calls being flagged as spam by call-screening apps.';
```
##### accountOnboarding.numbers.directoryListing.title
```ts
title: string = 'Directory Listing';
```
##### accountOnboarding.numbers.directoryListing.validation
```ts
validation: object;
```
##### accountOnboarding.numbers.directoryListing.validation.nameRequired
```ts
nameRequired: string = 'Business name is required for the directory listing.';
```
##### accountOnboarding.numbers.gate
```ts
gate: object;
```
##### accountOnboarding.numbers.gate.noDIDsAvailable
```ts
noDIDsAvailable: string = 'You need at least one phone number before selecting a primary number. Order or port a number first.';
```
##### accountOnboarding.numbers.gate.primaryRequired
```ts
primaryRequired: string = 'Please select a primary number to continue.';
```
##### accountOnboarding.numbers.nav
```ts
nav: object;
```
##### accountOnboarding.numbers.nav.back
```ts
back: string = 'Back';
```
##### accountOnboarding.numbers.nav.backToSearch
```ts
backToSearch: string = 'Back to Search';
```
##### accountOnboarding.numbers.nav.cancel
```ts
cancel: string = 'Cancel';
```
##### accountOnboarding.numbers.nav.confirm
```ts
confirm: string = 'Confirm';
```
##### accountOnboarding.numbers.nav.next
```ts
next: string = 'Next';
```
##### accountOnboarding.numbers.order
```ts
order: object;
```
##### accountOnboarding.numbers.order.areaCodeLabel
```ts
areaCodeLabel: string = 'Area Code';
```
##### accountOnboarding.numbers.order.areaCodePlaceholder
```ts
areaCodePlaceholder: string = '212';
```
##### accountOnboarding.numbers.order.carrierNote
```ts
carrierNote: string = 'Your order will be submitted to the carrier for fulfillment. This usually completes within seconds but may take longer.';
```
##### accountOnboarding.numbers.order.confirmSubtitle
```ts
confirmSubtitle: string = 'You are about to order {count} phone numbers';
```
##### accountOnboarding.numbers.order.confirmSubtitle\_one
```ts
confirmSubtitle_one: string = 'You are about to order {count} phone number';
```
##### accountOnboarding.numbers.order.confirmSubtitle\_other
```ts
confirmSubtitle_other: string = 'You are about to order {count} phone numbers';
```
##### accountOnboarding.numbers.order.confirmTitle
```ts
confirmTitle: string = 'Confirm Your Order';
```
##### accountOnboarding.numbers.order.continue
```ts
continue: string = 'Continue';
```
##### accountOnboarding.numbers.order.deselectAll
```ts
deselectAll: string = 'Deselect All';
```
##### accountOnboarding.numbers.order.done
```ts
done: string = 'Done';
```
##### accountOnboarding.numbers.order.error
```ts
error: string = 'An error occurred while placing the order.';
```
##### accountOnboarding.numbers.order.noResults
```ts
noResults: string = 'No numbers found. Try a different search.';
```
##### accountOnboarding.numbers.order.ordering
```ts
ordering: string = 'Ordering...';
```
##### accountOnboarding.numbers.order.orderMore
```ts
orderMore: string = 'Order More Numbers';
```
##### accountOnboarding.numbers.order.placeOrder
```ts
placeOrder: string = 'Place Order';
```
##### accountOnboarding.numbers.order.placing
```ts
placing: string = 'Placing Order...';
```
##### accountOnboarding.numbers.order.quantityLabel
```ts
quantityLabel: string = 'Quantity';
```
##### accountOnboarding.numbers.order.resultsSubtitle
```ts
resultsSubtitle: string = 'Select the numbers you would like to order.';
```
##### accountOnboarding.numbers.order.resultsTitle
```ts
resultsTitle: string = 'Available Numbers';
```
##### accountOnboarding.numbers.order.search
```ts
search: string = 'Search';
```
##### accountOnboarding.numbers.order.searchByAreaCode
```ts
searchByAreaCode: string = 'Area Code';
```
##### accountOnboarding.numbers.order.searchByZip
```ts
searchByZip: string = 'ZIP Code';
```
##### accountOnboarding.numbers.order.searching
```ts
searching: string = 'Searching...';
```
##### accountOnboarding.numbers.order.searchSubtitle
```ts
searchSubtitle: string = 'Find available numbers by entering an area code or ZIP code';
```
##### accountOnboarding.numbers.order.searchTitle
```ts
searchTitle: string = 'Search Available Numbers';
```
##### accountOnboarding.numbers.order.selectAll
```ts
selectAll: string = 'Select All';
```
##### accountOnboarding.numbers.order.selected
```ts
selected: string = 'selected';
```
##### accountOnboarding.numbers.order.state
```ts
state: string = 'State';
```
##### accountOnboarding.numbers.order.statusComplete
```ts
statusComplete: string = 'Your numbers have been activated.';
```
##### accountOnboarding.numbers.order.statusFailed
```ts
statusFailed: string = 'The order could not be completed.';
```
##### accountOnboarding.numbers.order.statusPartial
```ts
statusPartial: string = 'Some numbers were activated, but others failed.';
```
##### accountOnboarding.numbers.order.statusPending
```ts
statusPending: string = 'Your order has been submitted to the carrier. Fulfillment usually completes within seconds but may take longer.';
```
##### accountOnboarding.numbers.order.statusStalled
```ts
statusStalled: string = 'Your order has been submitted to the carrier. Fulfillment usually completes within seconds but may take longer.';
```
##### accountOnboarding.numbers.order.statusTitle
```ts
statusTitle: string = 'Order Submitted';
```
##### accountOnboarding.numbers.order.zipLabel
```ts
zipLabel: string = 'ZIP Code';
```
##### accountOnboarding.numbers.order.zipPlaceholder
```ts
zipPlaceholder: string = '10001';
```
##### accountOnboarding.numbers.overview
```ts
overview: object;
```
##### accountOnboarding.numbers.overview.empty
```ts
empty: string = 'No telephone numbers yet. Request new numbers or port your existing ones.';
```
##### accountOnboarding.numbers.overview.heading
```ts
heading: string = 'Your Numbers';
```
##### accountOnboarding.numbers.overview.loadError
```ts
loadError: string = 'Failed to load telephone numbers. Please try again.';
```
##### accountOnboarding.numbers.overview.phoneNumber
```ts
phoneNumber: string = 'Phone Number';
```
##### accountOnboarding.numbers.overview.portExisting
```ts
portExisting: string = 'Port Existing Number';
```
##### accountOnboarding.numbers.overview.portExistingDesc
```ts
portExistingDesc: string = 'Transfer your current business number to {platformName}. This typically takes 5–10 business days.';
```
##### accountOnboarding.numbers.overview.requestNew
```ts
requestNew: string = 'Request New Numbers';
```
##### accountOnboarding.numbers.overview.requestNewDesc
```ts
requestNewDesc: string = 'Get new business phone numbers instantly. Choose from available numbers in your area.';
```
##### accountOnboarding.numbers.overview.retry
```ts
retry: string = 'Retry';
```
##### accountOnboarding.numbers.overview.source
```ts
source: string = 'Source';
```
##### accountOnboarding.numbers.overview.status
```ts
status: string = 'Status';
```
##### accountOnboarding.numbers.overview.temporaryBanner
```ts
temporaryBanner: string = 'A temporary number has been assigned to your account while you set up your permanent numbers.';
```
##### accountOnboarding.numbers.overview.type
```ts
type: string = 'Type';
```
##### accountOnboarding.numbers.port
```ts
port: object;
```
##### accountOnboarding.numbers.port.accountNumberLabel
```ts
accountNumberLabel: string = 'Account Number';
```
##### accountOnboarding.numbers.port.accountNumberPlaceholder
```ts
accountNumberPlaceholder: string = 'From your current carrier';
```
##### accountOnboarding.numbers.port.accountRequired
```ts
accountRequired: string = 'Account # Required';
```
##### accountOnboarding.numbers.port.addAnother
```ts
addAnother: string = 'Add another number';
```
##### accountOnboarding.numbers.port.addressHeading
```ts
addressHeading: string = 'Service Address';
```
##### accountOnboarding.numbers.port.approve
```ts
approve: string = 'Approve & Submit';
```
##### accountOnboarding.numbers.port.approverNameLabel
```ts
approverNameLabel: string = 'Authorized Contact';
```
##### accountOnboarding.numbers.port.approverNamePlaceholder
```ts
approverNamePlaceholder: string = 'John Doe';
```
##### accountOnboarding.numbers.port.backToOverview
```ts
backToOverview: string = 'Back to Numbers';
```
##### accountOnboarding.numbers.port.billCopyDesc
```ts
billCopyDesc: string = 'A recent bill from your current carrier showing the numbers to be ported.';
```
##### accountOnboarding.numbers.port.billCopyLabel
```ts
billCopyLabel: string = 'Phone Bill Copy';
```
##### accountOnboarding.numbers.port.billCopyRequired
```ts
billCopyRequired: string = 'Required';
```
##### accountOnboarding.numbers.port.btnLabel
```ts
btnLabel: string = 'Billing Telephone Number (BTN)';
```
##### accountOnboarding.numbers.port.btnPlaceholder
```ts
btnPlaceholder: string = '(555) 123-4567';
```
##### accountOnboarding.numbers.port.businessNameLabel
```ts
businessNameLabel: string = 'Business Name';
```
##### accountOnboarding.numbers.port.businessNamePlaceholder
```ts
businessNamePlaceholder: string = 'Acme Corp';
```
##### accountOnboarding.numbers.port.carrier
```ts
carrier: string = 'Current Carrier';
```
##### accountOnboarding.numbers.port.carrierContinue
```ts
carrierContinue: string = 'Continue';
```
##### accountOnboarding.numbers.port.carrierGroupsSubtitle
```ts
carrierGroupsSubtitle: string = 'Your numbers are with different carriers. Each carrier requires a separate port request.';
```
##### accountOnboarding.numbers.port.carrierGroupsTitle
```ts
carrierGroupsTitle: string = 'Carrier Groups';
```
##### accountOnboarding.numbers.port.carrierStart
```ts
carrierStart: string = 'Start';
```
##### accountOnboarding.numbers.port.carrierSubmitted
```ts
carrierSubmitted: string = 'Submitted';
```
##### accountOnboarding.numbers.port.checkEligibility
```ts
checkEligibility: string = 'Check Eligibility';
```
##### accountOnboarding.numbers.port.checking
```ts
checking: string = 'Checking...';
```
##### accountOnboarding.numbers.port.cityLabel
```ts
cityLabel: string = 'City';
```
##### accountOnboarding.numbers.port.cityPlaceholder
```ts
cityPlaceholder: string = 'New York';
```
##### accountOnboarding.numbers.port.continueWithPortable
```ts
continueWithPortable: string = 'Continue with Portable Numbers';
```
##### accountOnboarding.numbers.port.csrDesc
```ts
csrDesc: string = 'Optional but recommended — speeds up the porting process.';
```
##### accountOnboarding.numbers.port.csrLabel
```ts
csrLabel: string = 'Customer Service Record (CSR)';
```
##### accountOnboarding.numbers.port.csrOptional
```ts
csrOptional: string = 'Optional';
```
##### accountOnboarding.numbers.port.documentsSection
```ts
documentsSection: string = 'Documents';
```
##### accountOnboarding.numbers.port.documentsSubtitle
```ts
documentsSubtitle: string = 'Upload your latest phone bill and optionally a Customer Service Record (CSR).';
```
##### accountOnboarding.numbers.port.documentsTitle
```ts
documentsTitle: string = 'Supporting Documents';
```
##### accountOnboarding.numbers.port.eligibilitySubtitle
```ts
eligibilitySubtitle: string = 'Review which numbers can be ported.';
```
##### accountOnboarding.numbers.port.eligibilityTitle
```ts
eligibilityTitle: string = 'Port Eligibility';
```
##### accountOnboarding.numbers.port.fileSelected
```ts
fileSelected: string = 'Selected:';
```
##### accountOnboarding.numbers.port.focDateLabel
```ts
focDateLabel: string = 'Port Date';
```
##### accountOnboarding.numbers.port.focSection
```ts
focSection: string = 'Port Date';
```
##### accountOnboarding.numbers.port.focSubtitle
```ts
focSubtitle: string = 'Choose when you want the numbers transferred. Must be at least 5 business days out.';
```
##### accountOnboarding.numbers.port.focTimeLabel
```ts
focTimeLabel: string = 'Port Time (Eastern)';
```
##### accountOnboarding.numbers.port.focTimePlaceholder
```ts
focTimePlaceholder: string = 'Select time';
```
##### accountOnboarding.numbers.port.focTitle
```ts
focTitle: string = 'Requested Port Date';
```
##### accountOnboarding.numbers.port.houseNumberLabel
```ts
houseNumberLabel: string = 'Street Number';
```
##### accountOnboarding.numbers.port.houseNumberPlaceholder
```ts
houseNumberPlaceholder: string = '123';
```
##### accountOnboarding.numbers.port.line2Label
```ts
line2Label: string = 'Suite / Unit';
```
##### accountOnboarding.numbers.port.line2Placeholder
```ts
line2Placeholder: string = 'Suite 100';
```
##### accountOnboarding.numbers.port.noFileSelected
```ts
noFileSelected: string = 'No file selected';
```
##### accountOnboarding.numbers.port.noPortable
```ts
noPortable: string = 'None of the entered numbers are eligible for porting.';
```
##### accountOnboarding.numbers.port.notPortable
```ts
notPortable: string = 'Not Portable';
```
##### accountOnboarding.numbers.port.numberPlural
```ts
numberPlural: string = 'numbers';
```
##### accountOnboarding.numbers.port.numberSingular
```ts
numberSingular: string = 'number';
```
##### accountOnboarding.numbers.port.numbersSection
```ts
numbersSection: string = 'Numbers';
```
##### accountOnboarding.numbers.port.numbersSubtitle
```ts
numbersSubtitle: string = 'Enter the phone numbers you want to transfer to {platformName}.';
```
##### accountOnboarding.numbers.port.numbersTitle
```ts
numbersTitle: string = 'Numbers to Port';
```
##### accountOnboarding.numbers.port.phoneLabel
```ts
phoneLabel: string = 'Phone Number';
```
##### accountOnboarding.numbers.port.phonePlaceholder
```ts
phonePlaceholder: string = '(555) 123-4567';
```
##### accountOnboarding.numbers.port.pinLabel
```ts
pinLabel: string = 'Account PIN';
```
##### accountOnboarding.numbers.port.pinPlaceholder
```ts
pinPlaceholder: string = '1234';
```
##### accountOnboarding.numbers.port.portable
```ts
portable: string = 'Portable';
```
##### accountOnboarding.numbers.port.removeNumber
```ts
removeNumber: string = 'Remove';
```
##### accountOnboarding.numbers.port.reviewSubtitle
```ts
reviewSubtitle: string = 'Verify all details before submitting your port request.';
```
##### accountOnboarding.numbers.port.reviewTitle
```ts
reviewTitle: string = 'Review & Approve';
```
##### accountOnboarding.numbers.port.signatureHelp
```ts
signatureHelp: string = 'By signing, you authorize the transfer of the listed numbers to {platformName}.';
```
##### accountOnboarding.numbers.port.signatureLabel
```ts
signatureLabel: string = 'Electronic Signature';
```
##### accountOnboarding.numbers.port.signaturePlaceholder
```ts
signaturePlaceholder: string = 'Type your full legal name';
```
##### accountOnboarding.numbers.port.stateLabel
```ts
stateLabel: string = 'State';
```
##### accountOnboarding.numbers.port.statePlaceholder
```ts
statePlaceholder: string = 'Select state';
```
##### accountOnboarding.numbers.port.streetNameLabel
```ts
streetNameLabel: string = 'Street Name';
```
##### accountOnboarding.numbers.port.streetNamePlaceholder
```ts
streetNamePlaceholder: string = 'Main St';
```
##### accountOnboarding.numbers.port.submittedStatus
```ts
submittedStatus: string = 'Status';
```
##### accountOnboarding.numbers.port.submittedSubtitle
```ts
submittedSubtitle: string = 'Your port request has been submitted and is being processed.';
```
##### accountOnboarding.numbers.port.submittedTitle
```ts
submittedTitle: string = 'Port Request Submitted';
```
##### accountOnboarding.numbers.port.submitting
```ts
submitting: string = 'Submitting...';
```
##### accountOnboarding.numbers.port.subscriberSection
```ts
subscriberSection: string = 'Subscriber';
```
##### accountOnboarding.numbers.port.subscriberSubtitle
```ts
subscriberSubtitle: string = 'Enter the details exactly as they appear on your current phone bill.';
```
##### accountOnboarding.numbers.port.subscriberTitle
```ts
subscriberTitle: string = 'Subscriber Information';
```
##### accountOnboarding.numbers.port.uploadFile
```ts
uploadFile: string = 'Choose File';
```
##### accountOnboarding.numbers.port.uploading
```ts
uploading: string = 'Uploading...';
```
##### accountOnboarding.numbers.port.wireless
```ts
wireless: string = 'Wireless';
```
##### accountOnboarding.numbers.port.wirelessNo
```ts
wirelessNo: string = 'No';
```
##### accountOnboarding.numbers.port.wirelessYes
```ts
wirelessYes: string = 'Yes';
```
##### accountOnboarding.numbers.port.zipLabel
```ts
zipLabel: string = 'ZIP Code';
```
##### accountOnboarding.numbers.port.zipPlaceholder
```ts
zipPlaceholder: string = '10001';
```
##### accountOnboarding.numbers.primaryNumber
```ts
primaryNumber: object;
```
##### accountOnboarding.numbers.primaryNumber.autoMatched
```ts
autoMatched: string = '{phone} matches your account phone and has been selected as the primary number for E911.';
```
##### accountOnboarding.numbers.primaryNumber.autoMatchedBadge
```ts
autoMatchedBadge: string = 'Account number — auto-selected';
```
##### accountOnboarding.numbers.primaryNumber.description
```ts
description: string = 'Select the primary phone number for this location. This number is registered with E911 emergency services.';
```
##### accountOnboarding.numbers.primaryNumber.heading
```ts
heading: string = 'Primary Number';
```
##### accountOnboarding.numbers.primaryNumber.loading
```ts
loading: string = 'Loading phone numbers...';
```
##### accountOnboarding.numbers.primaryNumber.noDIDs
```ts
noDIDs: string = 'No active phone numbers available yet. E911 will be configured once numbers are provisioned.';
```
##### accountOnboarding.numbers.primaryNumber.temporary
```ts
temporary: string = 'Temporary';
```
##### accountOnboarding.numbers.primaryNumber.temporaryNote
```ts
temporaryNote: string = 'This is a temporary number assigned to get you started. You can replace it with a permanent number at any time.';
```
##### accountOnboarding.numbers.source
```ts
source: object;
```
##### accountOnboarding.numbers.source.did
```ts
did: string = 'Account';
```
##### accountOnboarding.numbers.source.didTemporary
```ts
didTemporary: string = 'Temporary';
```
##### accountOnboarding.numbers.source.number\_order
```ts
number_order: string = 'New Order';
```
##### accountOnboarding.numbers.source.port\_order
```ts
port_order: string = 'Port';
```
##### accountOnboarding.numbers.status
```ts
status: object;
```
##### accountOnboarding.numbers.status.active
```ts
active: string = 'Active';
```
##### accountOnboarding.numbers.status.inactive
```ts
inactive: string = 'Inactive';
```
##### accountOnboarding.numbers.status.order\_failed
```ts
order_failed: string = 'Order Failed';
```
##### accountOnboarding.numbers.status.ordering
```ts
ordering: string = 'Ordering';
```
##### accountOnboarding.numbers.status.porting\_approved
```ts
porting_approved: string = 'Port Approved';
```
##### accountOnboarding.numbers.status.porting\_draft
```ts
porting_draft: string = 'Port Draft';
```
##### accountOnboarding.numbers.status.porting\_exception
```ts
porting_exception: string = 'Port Exception';
```
##### accountOnboarding.numbers.status.porting\_foc
```ts
porting_foc: string = 'Port Scheduled';
```
##### accountOnboarding.numbers.status.porting\_submitted
```ts
porting_submitted: string = 'Port Submitted';
```
##### accountOnboarding.numbers.status.released
```ts
released: string = 'Released';
```
##### accountOnboarding.numbers.subtitle
```ts
subtitle: string = "Choose how you'd like to set up your business numbers";
```
##### accountOnboarding.numbers.title
```ts
title: string = 'Phone Numbers';
```
##### accountOnboarding.numbers.validation
```ts
validation: object;
```
##### accountOnboarding.numbers.validation.approverNameRequired
```ts
approverNameRequired: string = 'Authorized contact name is required.';
```
##### accountOnboarding.numbers.validation.areaCodeFormat
```ts
areaCodeFormat: string = 'Enter a 3-digit area code.';
```
##### accountOnboarding.numbers.validation.areaCodeRequired
```ts
areaCodeRequired: string = 'Area code is required.';
```
##### accountOnboarding.numbers.validation.billCopyRequired
```ts
billCopyRequired: string = 'A phone bill copy is required.';
```
##### accountOnboarding.numbers.validation.btnInvalid
```ts
btnInvalid: string = 'Enter a valid US phone number.';
```
##### accountOnboarding.numbers.validation.btnRequired
```ts
btnRequired: string = 'BTN is required.';
```
##### accountOnboarding.numbers.validation.businessNameRequired
```ts
businessNameRequired: string = 'Business name is required.';
```
##### accountOnboarding.numbers.validation.cityRequired
```ts
cityRequired: string = 'City is required.';
```
##### accountOnboarding.numbers.validation.eligibilityError
```ts
eligibilityError: string = 'Failed to check eligibility. Please try again.';
```
##### accountOnboarding.numbers.validation.focDateRequired
```ts
focDateRequired: string = 'Port date is required.';
```
##### accountOnboarding.numbers.validation.focDateTooFar
```ts
focDateTooFar: string = 'Port date must be within 30 days.';
```
##### accountOnboarding.numbers.validation.focDateTooSoon
```ts
focDateTooSoon: string = 'Port date must be at least 5 business days from today.';
```
##### accountOnboarding.numbers.validation.focTimeRequired
```ts
focTimeRequired: string = 'Port time is required.';
```
##### accountOnboarding.numbers.validation.houseNumberRequired
```ts
houseNumberRequired: string = 'Street number is required.';
```
##### accountOnboarding.numbers.validation.phoneDuplicate
```ts
phoneDuplicate: string = 'This number has already been entered.';
```
##### accountOnboarding.numbers.validation.phoneInvalid
```ts
phoneInvalid: string = 'Enter a valid US phone number.';
```
##### accountOnboarding.numbers.validation.phoneRequired
```ts
phoneRequired: string = 'At least one phone number is required.';
```
##### accountOnboarding.numbers.validation.selectAtLeastOne
```ts
selectAtLeastOne: string = 'Select at least one number.';
```
##### accountOnboarding.numbers.validation.signatureRequired
```ts
signatureRequired: string = 'Signature is required.';
```
##### accountOnboarding.numbers.validation.stateRequired
```ts
stateRequired: string = 'State is required.';
```
##### accountOnboarding.numbers.validation.streetNameRequired
```ts
streetNameRequired: string = 'Street name is required.';
```
##### accountOnboarding.numbers.validation.submitError
```ts
submitError: string = 'Failed to submit port request. Please try again.';
```
##### accountOnboarding.numbers.validation.zipFormat
```ts
zipFormat: string = 'Enter a 5-digit ZIP code.';
```
##### accountOnboarding.numbers.validation.zipRequired
```ts
zipRequired: string = 'ZIP code is required.';
```
##### accountOnboarding.sidebar
```ts
sidebar: object;
```
##### accountOnboarding.sidebar.businessDetails
```ts
businessDetails: string = 'Business Details';
```
##### accountOnboarding.sidebar.businessDetailsDesc
```ts
businessDetailsDesc: string = 'Enter your company information';
```
##### accountOnboarding.sidebar.callerId
```ts
callerId: string = 'Caller ID';
```
##### accountOnboarding.sidebar.callerIdDesc
```ts
callerIdDesc: string = 'Set caller ID for your numbers';
```
##### accountOnboarding.sidebar.deviceAssignment
```ts
deviceAssignment: string = 'Device Assignment';
```
##### accountOnboarding.sidebar.deviceAssignmentDesc
```ts
deviceAssignmentDesc: string = 'Assign devices to users';
```
##### accountOnboarding.sidebar.directoryListing
```ts
directoryListing: string = 'Directory Listing';
```
##### accountOnboarding.sidebar.directoryListingDesc
```ts
directoryListingDesc: string = 'Configure 411 directory listing';
```
##### accountOnboarding.sidebar.finalCompletion
```ts
finalCompletion: string = 'Final Completion';
```
##### accountOnboarding.sidebar.finalCompletionDesc
```ts
finalCompletionDesc: string = 'Complete your onboarding';
```
##### accountOnboarding.sidebar.numberOptions
```ts
numberOptions: string = 'Number Options';
```
##### accountOnboarding.sidebar.numberOptionsDesc
```ts
numberOptionsDesc: string = 'Choose to port existing or get new numbers';
```
##### accountOnboarding.sidebar.numberSetup
```ts
numberSetup: string = 'Number Setup';
```
##### accountOnboarding.sidebar.numberSetupDesc
```ts
numberSetupDesc: string = 'Configure your phone numbers';
```
##### accountOnboarding.sidebar.primaryNumber
```ts
primaryNumber: string = 'Primary Number';
```
##### accountOnboarding.sidebar.primaryNumberDesc
```ts
primaryNumberDesc: string = 'Select your main E911 number';
```
##### accountOnboarding.sidebar.teamMembers
```ts
teamMembers: string = 'Team Members';
```
##### accountOnboarding.sidebar.teamMembersDesc
```ts
teamMembersDesc: string = 'Add users and assign extensions';
```
##### accountOnboarding.sidebar.verification
```ts
verification: string = 'Verification';
```
##### accountOnboarding.sidebar.verificationDesc
```ts
verificationDesc: string = 'Verify number status';
```
##### accountOnboarding.stepComplete
```ts
stepComplete: object;
```
##### accountOnboarding.stepComplete.done
```ts
done: string = 'Done';
```
##### accountOnboarding.stepComplete.subtitle
```ts
subtitle: string = 'This step has been completed successfully.';
```
##### accountOnboarding.stepComplete.title
```ts
title: string = '{stepName} Complete';
```
##### accountOnboarding.steps
```ts
steps: object;
```
##### accountOnboarding.steps.account
```ts
account: string = 'Account Setup';
```
##### accountOnboarding.steps.complete
```ts
complete: string = 'Complete';
```
##### accountOnboarding.steps.hardware
```ts
hardware: string = 'Hardware Setup';
```
##### accountOnboarding.steps.numbers
```ts
numbers: string = 'Phone Numbers';
```
##### accountOnboarding.title
```ts
title: string = 'Account Onboarding';
```
#### callHistory
```ts
callHistory: object;
```
##### callHistory.clickToCall
```ts
clickToCall: string = 'Click to call';
```
##### callHistory.empty
```ts
empty: string = 'No call history';
```
##### callHistory.error
```ts
error: string = 'Unable to load call history';
```
##### callHistory.loading
```ts
loading: string = 'Loading call history...';
```
##### callHistory.noPhoneNumber
```ts
noPhoneNumber: string = 'Please set a phone number to load call history';
```
##### callHistory.relativeTime
```ts
relativeTime: object;
```
##### callHistory.relativeTime.hourAgo
```ts
hourAgo: string = '1 hour ago';
```
##### callHistory.relativeTime.hoursAgo
```ts
hoursAgo: string = '{count} hours ago';
```
##### callHistory.relativeTime.justNow
```ts
justNow: string = 'Just now';
```
##### callHistory.relativeTime.minuteAgo
```ts
minuteAgo: string = '1 min ago';
```
##### callHistory.relativeTime.minutesAgo
```ts
minutesAgo: string = '{count} min ago';
```
##### callHistory.relativeTime.yesterday
```ts
yesterday: string = 'Yesterday';
```
##### callHistory.summaryNotAvailable
```ts
summaryNotAvailable: string = 'Summary not available';
```
##### callHistory.title
```ts
title: string = 'Call History';
```
#### callLogs
```ts
callLogs: object;
```
##### callLogs.calledBy
```ts
calledBy: string = 'Called by:';
```
##### callLogs.columns
```ts
columns: object;
```
##### callLogs.columns.date
```ts
date: string = 'Date';
```
##### callLogs.columns.direction
```ts
direction: string = 'Direction';
```
##### callLogs.columns.duration
```ts
duration: string = 'Duration';
```
##### callLogs.columns.from
```ts
from: string = 'From';
```
##### callLogs.columns.quality
```ts
quality: string = 'MOS';
```
##### callLogs.columns.status
```ts
status: string = 'Status';
```
##### callLogs.columns.to
```ts
to: string = 'To';
```
##### callLogs.directions
```ts
directions: object;
```
##### callLogs.directions.inbound
```ts
inbound: string = 'Inbound';
```
##### callLogs.directions.internal
```ts
internal: string = 'Internal';
```
##### callLogs.directions.outbound
```ts
outbound: string = 'Outbound';
```
##### callLogs.empty
```ts
empty: string = 'No call logs found';
```
##### callLogs.loading
```ts
loading: string = 'Loading call logs...';
```
##### callLogs.quality
```ts
quality: object;
```
##### callLogs.quality.fair
```ts
fair: string = 'Fair';
```
##### callLogs.quality.good
```ts
good: string = 'Good';
```
##### callLogs.quality.poor
```ts
poor: string = 'Poor';
```
##### callLogs.quality.unavailable
```ts
unavailable: string = 'N/A';
```
##### callLogs.quality.unavailableTooltip
```ts
unavailableTooltip: string = 'No quality data available';
```
##### callLogs.routedTo
```ts
routedTo: string = 'Routed to:';
```
##### callLogs.statuses
```ts
statuses: object;
```
##### callLogs.statuses.busy
```ts
busy: string = 'Busy';
```
##### callLogs.statuses.completed
```ts
completed: string = 'Completed';
```
##### callLogs.statuses.failed
```ts
failed: string = 'Failed';
```
##### callLogs.statuses.noAnswer
```ts
noAnswer: string = 'No Answer';
```
##### callLogs.statuses.voicemail
```ts
voicemail: string = 'Voicemail';
```
##### callLogs.title
```ts
title: string = 'Call Logs';
```
#### common
```ts
common: object;
```
##### common.call
```ts
call: string = 'Call';
```
##### common.cancel
```ts
cancel: string = 'Cancel';
```
##### common.confirm
```ts
confirm: string = 'Confirm';
```
##### common.delete
```ts
delete: string = 'Delete';
```
##### common.error
```ts
error: string = 'Error';
```
##### common.loading
```ts
loading: string = 'Loading...';
```
##### common.next
```ts
next: string = 'Next';
```
##### common.noResults
```ts
noResults: string = 'No results';
```
##### common.pause
```ts
pause: string = 'Pause';
```
##### common.perPage
```ts
perPage: string = 'Per page';
```
##### common.play
```ts
play: string = 'Play';
```
##### common.previous
```ts
previous: string = 'Previous';
```
##### common.showing
```ts
showing: string = 'Showing {start}-{end} of {total}';
```
#### dialPlan
```ts
dialPlan: object;
```
##### dialPlan.empty
```ts
empty: string = 'No dial plan found';
```
##### dialPlan.error
```ts
error: string = 'Failed to load dial plan';
```
##### dialPlan.exits
```ts
exits: object;
```
##### dialPlan.exits.closed
```ts
closed: string = 'Closed';
```
##### dialPlan.exits.next
```ts
next: string = 'No Answer';
```
##### dialPlan.exits.open
```ts
open: string = 'Open';
```
##### dialPlan.exits.timeout
```ts
timeout: string = 'Timeout';
```
##### dialPlan.loading
```ts
loading: string = 'Loading dial plan...';
```
##### dialPlan.nodeTypes
```ts
nodeTypes: object;
```
##### dialPlan.nodeTypes.externalDial
```ts
externalDial: string = 'External Number';
```
##### dialPlan.nodeTypes.internalDial
```ts
internalDial: string = 'Internal Extension';
```
##### dialPlan.nodeTypes.schedule
```ts
schedule: string = 'Schedule';
```
##### dialPlan.nodeTypes.start
```ts
start: string = 'Start';
```
##### dialPlan.nodeTypes.voiceApp
```ts
voiceApp: string = 'Voice App';
```
##### dialPlan.nodeTypes.voicemail
```ts
voicemail: string = 'Voicemail';
```
##### dialPlan.title
```ts
title: string = 'Dial Plan';
```
#### onboardingPortal
```ts
onboardingPortal: object;
```
##### onboardingPortal.back
```ts
back: string = 'Back';
```
##### onboardingPortal.helpSupport
```ts
helpSupport: string = 'Help & Support';
```
##### onboardingPortal.onboardingComplete
```ts
onboardingComplete: string = 'Onboarding complete';
```
##### onboardingPortal.onboardingFlows
```ts
onboardingFlows: string = 'ONBOARDING FLOWS';
```
##### onboardingPortal.overview
```ts
overview: object;
```
##### onboardingPortal.overview.accountDesc
```ts
accountDesc: string = 'Set up your business profile, add team members, and configure your dial plan';
```
##### onboardingPortal.overview.complete
```ts
complete: string = 'Complete';
```
##### onboardingPortal.overview.completeSetup
```ts
completeSetup: string = 'Complete Setup';
```
##### onboardingPortal.overview.continueSetup
```ts
continueSetup: string = 'Continue Setup';
```
##### onboardingPortal.overview.flowsComplete
```ts
flowsComplete: string = '{completed} of {total} flows complete';
```
##### onboardingPortal.overview.hardwareDesc
```ts
hardwareDesc: string = 'Assign phones to team members and track delivery';
```
##### onboardingPortal.overview.label
```ts
label: string = 'Overview';
```
##### onboardingPortal.overview.needHelp
```ts
needHelp: string = 'Need help?';
```
##### onboardingPortal.overview.needHelpSubtitle
```ts
needHelpSubtitle: string = 'Our team is here to help you get set up quickly';
```
##### onboardingPortal.overview.numbersDesc
```ts
numbersDesc: string = 'Port existing numbers or request new business lines';
```
##### onboardingPortal.overview.phoneStatusComplete
```ts
phoneStatusComplete: string = 'Complete';
```
##### onboardingPortal.overview.phoneStatusNumber
```ts
phoneStatusNumber: string = 'Phone Number';
```
##### onboardingPortal.overview.phoneStatusProcessing
```ts
phoneStatusProcessing: string = 'Processing';
```
##### onboardingPortal.overview.phoneStatusStatus
```ts
phoneStatusStatus: string = 'Status';
```
##### onboardingPortal.overview.phoneStatusSubtitle
```ts
phoneStatusSubtitle: string = 'Track the status of your phone numbers';
```
##### onboardingPortal.overview.phoneStatusTemporary
```ts
phoneStatusTemporary: string = 'Temporary';
```
##### onboardingPortal.overview.phoneStatusTitle
```ts
phoneStatusTitle: string = 'Phone number status';
```
##### onboardingPortal.overview.phoneStatusType
```ts
phoneStatusType: string = 'Type';
```
##### onboardingPortal.overview.phoneStatusTypeNew
```ts
phoneStatusTypeNew: string = 'New';
```
##### onboardingPortal.overview.phoneStatusTypePort
```ts
phoneStatusTypePort: string = 'Port';
```
##### onboardingPortal.overview.progress
```ts
progress: string = 'Progress';
```
##### onboardingPortal.overview.progressTitle
```ts
progressTitle: string = 'Onboarding Progress';
```
##### onboardingPortal.overview.review
```ts
review: string = 'Review';
```
##### onboardingPortal.overview.scheduleCall
```ts
scheduleCall: string = 'Schedule a Call';
```
##### onboardingPortal.overview.stepsTitle
```ts
stepsTitle: string = 'Onboarding Steps';
```
##### onboardingPortal.overview.subtitle
```ts
subtitle: string = 'Complete the steps below to set up your business phone system';
```
##### onboardingPortal.overview.title
```ts
title: string = 'Your Business Onboarding';
```
##### onboardingPortal.overview.viewDocs
```ts
viewDocs: string = 'View Documentation';
```
##### onboardingPortal.saveAndExit
```ts
saveAndExit: string = 'Save & Exit to Overview';
```
##### onboardingPortal.splash
```ts
splash: object;
```
##### onboardingPortal.splash.start
```ts
start: string = 'Start Onboarding';
```
##### onboardingPortal.splash.step1
```ts
step1: string = 'Account Details';
```
##### onboardingPortal.splash.step2
```ts
step2: string = 'Setup Phone Numbers';
```
##### onboardingPortal.splash.step3
```ts
step3: string = 'Assign Hardware';
```
##### onboardingPortal.splash.subtitle
```ts
subtitle: string = "Let's get your business set up in 3 easy steps";
```
##### onboardingPortal.splash.title
```ts
title: string = 'Welcome\nto {platformName}';
```
#### phoneNumberOrdering
```ts
phoneNumberOrdering: object;
```
##### phoneNumberOrdering.complete
```ts
complete: object;
```
##### phoneNumberOrdering.complete.assignmentHint
```ts
assignmentHint: string = 'Numbers added to your inventory still need to be assigned to an extension or dial plan before they can receive calls.';
```
##### phoneNumberOrdering.complete.checking
```ts
checking: string = 'Checking order status...';
```
##### phoneNumberOrdering.complete.descriptionCompleteOne
```ts
descriptionCompleteOne: string = 'Your phone number is now in your inventory and ready to be configured.';
```
##### phoneNumberOrdering.complete.descriptionCompleteOther
```ts
descriptionCompleteOther: string = 'Your phone numbers are now in your inventory and ready to be configured.';
```
##### phoneNumberOrdering.complete.descriptionPartialOne
```ts
descriptionPartialOne: string = 'Some numbers could not be fulfilled by the carrier.';
```
##### phoneNumberOrdering.complete.descriptionPartialOther
```ts
descriptionPartialOther: string = 'Some numbers could not be fulfilled by the carrier.';
```
##### phoneNumberOrdering.complete.descriptionPendingOne
```ts
descriptionPendingOne: string = 'Your order has been submitted to the carrier. Fulfillment usually completes within seconds but may take longer.';
```
##### phoneNumberOrdering.complete.descriptionPendingOther
```ts
descriptionPendingOther: string = 'Your order has been submitted to the carrier. Fulfillment usually completes within seconds but may take longer.';
```
##### phoneNumberOrdering.complete.orderMore
```ts
orderMore: string = 'Order More Numbers';
```
##### phoneNumberOrdering.complete.titleCompleteOne
```ts
titleCompleteOne: string = 'Number Ready';
```
##### phoneNumberOrdering.complete.titleCompleteOther
```ts
titleCompleteOther: string = 'Numbers Ready';
```
##### phoneNumberOrdering.complete.titlePartialOne
```ts
titlePartialOne: string = 'Partially Fulfilled';
```
##### phoneNumberOrdering.complete.titlePartialOther
```ts
titlePartialOther: string = 'Partially Fulfilled';
```
##### phoneNumberOrdering.complete.titlePendingOne
```ts
titlePendingOne: string = 'Order Submitted';
```
##### phoneNumberOrdering.complete.titlePendingOther
```ts
titlePendingOther: string = 'Order Submitted';
```
##### phoneNumberOrdering.confirm
```ts
confirm: object;
```
##### phoneNumberOrdering.confirm.back
```ts
back: string = 'Back';
```
##### phoneNumberOrdering.confirm.description
```ts
description: string = 'Your order will be submitted to the carrier for fulfillment. This usually completes within seconds but may take longer.';
```
##### phoneNumberOrdering.confirm.placeOrder
```ts
placeOrder: string = 'Place Order';
```
##### phoneNumberOrdering.confirm.subtitleOne
```ts
subtitleOne: string = 'You are about to order 1 phone number';
```
##### phoneNumberOrdering.confirm.subtitleOther
```ts
subtitleOther: string = 'You are about to order {count} phone numbers';
```
##### phoneNumberOrdering.confirm.title
```ts
title: string = 'Confirm Order';
```
##### phoneNumberOrdering.error
```ts
error: object;
```
##### phoneNumberOrdering.error.description
```ts
description: string = 'The carrier was unable to fulfill your order.';
```
##### phoneNumberOrdering.error.title
```ts
title: string = 'Order Failed';
```
##### phoneNumberOrdering.error.tryAgain
```ts
tryAgain: string = 'Try Again';
```
##### phoneNumberOrdering.ordering
```ts
ordering: object;
```
##### phoneNumberOrdering.ordering.title
```ts
title: string = 'Placing Order...';
```
##### phoneNumberOrdering.results
```ts
results: object;
```
##### phoneNumberOrdering.results.backToSearch
```ts
backToSearch: string = 'Back to Search';
```
##### phoneNumberOrdering.results.continue
```ts
continue: string = 'Continue';
```
##### phoneNumberOrdering.results.noResults
```ts
noResults: string = 'No numbers available for this search';
```
##### phoneNumberOrdering.results.phoneNumber
```ts
phoneNumber: string = 'Phone Number';
```
##### phoneNumberOrdering.results.selectAll
```ts
selectAll: string = 'Select all';
```
##### phoneNumberOrdering.results.selected
```ts
selected: string = '{count} selected';
```
##### phoneNumberOrdering.results.state
```ts
state: string = 'State';
```
##### phoneNumberOrdering.results.title
```ts
title: string = 'Available Numbers';
```
##### phoneNumberOrdering.search
```ts
search: object;
```
##### phoneNumberOrdering.search.areaCode
```ts
areaCode: string = 'Area Code';
```
##### phoneNumberOrdering.search.areaCodeLabel
```ts
areaCodeLabel: string = 'Area Code';
```
##### phoneNumberOrdering.search.areaCodePlaceholder
```ts
areaCodePlaceholder: string = 'e.g. 212';
```
##### phoneNumberOrdering.search.numberOfResults
```ts
numberOfResults: string = 'Quantity to display';
```
##### phoneNumberOrdering.search.search
```ts
search: string = 'Search';
```
##### phoneNumberOrdering.search.searchType
```ts
searchType: string = 'Search by';
```
##### phoneNumberOrdering.search.subtitle
```ts
subtitle: string = 'Find available phone numbers by entering an area code or ZIP code.';
```
##### phoneNumberOrdering.search.title
```ts
title: string = 'Search Available Numbers';
```
##### phoneNumberOrdering.search.zip
```ts
zip: string = 'ZIP Code';
```
##### phoneNumberOrdering.search.zipLabel
```ts
zipLabel: string = 'ZIP Code';
```
##### phoneNumberOrdering.search.zipPlaceholder
```ts
zipPlaceholder: string = 'e.g. 10001';
```
##### phoneNumberOrdering.statuses
```ts
statuses: object;
```
##### phoneNumberOrdering.statuses.complete
```ts
complete: string = 'Complete';
```
##### phoneNumberOrdering.statuses.failed
```ts
failed: string = 'Failed';
```
##### phoneNumberOrdering.statuses.partial
```ts
partial: string = 'Partial';
```
##### phoneNumberOrdering.statuses.pending
```ts
pending: string = 'Pending';
```
##### phoneNumberOrdering.steps
```ts
steps: object;
```
##### phoneNumberOrdering.steps.confirm
```ts
confirm: string = 'Confirm';
```
##### phoneNumberOrdering.steps.done
```ts
done: string = 'Done';
```
##### phoneNumberOrdering.steps.search
```ts
search: string = 'Search';
```
##### phoneNumberOrdering.steps.select
```ts
select: string = 'Select';
```
##### phoneNumberOrdering.steps.stepOf
```ts
stepOf: string = 'Step {current} of {total}';
```
##### phoneNumberOrdering.title
```ts
title: string = 'Order Phone Numbers';
```
#### phoneNumbers
```ts
phoneNumbers: object;
```
##### phoneNumbers.badges
```ts
badges: object;
```
##### phoneNumbers.badges.temporary
```ts
temporary: string = 'Temporary';
```
##### phoneNumbers.columns
```ts
columns: object;
```
##### phoneNumbers.columns.callerID
```ts
callerID: string = 'Caller ID';
```
##### phoneNumbers.columns.cancelledDate
```ts
cancelledDate: string = 'Date Cancelled';
```
##### phoneNumbers.columns.carrier
```ts
carrier: string = 'Carrier';
```
##### phoneNumbers.columns.outbound
```ts
outbound: string = 'Direction';
```
##### phoneNumbers.columns.phoneNumber
```ts
phoneNumber: string = 'Phone Number';
```
##### phoneNumbers.columns.routingTarget
```ts
routingTarget: string = 'Call Routing';
```
##### phoneNumbers.columns.status
```ts
status: string = 'Status';
```
##### phoneNumbers.columns.transferDate
```ts
transferDate: string = 'Transfer Date';
```
##### phoneNumbers.empty
```ts
empty: string = 'No phone numbers';
```
##### phoneNumbers.filterLabel
```ts
filterLabel: string = 'Filter by status';
```
##### phoneNumbers.filters
```ts
filters: object;
```
##### phoneNumbers.filters.active
```ts
active: string = 'Active';
```
##### phoneNumbers.filters.cancelled
```ts
cancelled: string = 'Cancelled';
```
##### phoneNumbers.filters.in\_progress
```ts
in_progress: string = 'In Progress';
```
##### phoneNumbers.loading
```ts
loading: string = 'Loading phone numbers...';
```
##### phoneNumbers.outbound
```ts
outbound: object;
```
##### phoneNumbers.outbound.disabled
```ts
disabled: string = 'Inbound only';
```
##### phoneNumbers.outbound.enabled
```ts
enabled: string = 'Two-way';
```
##### phoneNumbers.routingTarget
```ts
routingTarget: object;
```
##### phoneNumbers.routingTarget.notSet
```ts
notSet: string = 'Not set';
```
##### phoneNumbers.routingTargetTypes
```ts
routingTargetTypes: object;
```
##### phoneNumbers.routingTargetTypes.dialPlan
```ts
dialPlan: string = 'Dial Plan';
```
##### phoneNumbers.routingTargetTypes.ringGroup
```ts
ringGroup: string = 'Ring Group';
```
##### phoneNumbers.routingTargetTypes.user
```ts
user: string = 'User';
```
##### phoneNumbers.routingTargetTypes.voiceApp
```ts
voiceApp: string = 'Voice App';
```
##### phoneNumbers.statuses
```ts
statuses: object;
```
##### phoneNumbers.statuses.active
```ts
active: string = 'Active';
```
##### phoneNumbers.statuses.inactive
```ts
inactive: string = 'Inactive';
```
##### phoneNumbers.statuses.orderFailed
```ts
orderFailed: string = 'Order Failed';
```
##### phoneNumbers.statuses.ordering
```ts
ordering: string = 'Ordering';
```
##### phoneNumbers.statuses.portingApproved
```ts
portingApproved: string = 'Port Approved';
```
##### phoneNumbers.statuses.portingDraft
```ts
portingDraft: string = 'Port Draft';
```
##### phoneNumbers.statuses.portingException
```ts
portingException: string = 'Port Issue';
```
##### phoneNumbers.statuses.portingFoc
```ts
portingFoc: string = 'Port Scheduled';
```
##### phoneNumbers.statuses.portingSubmitted
```ts
portingSubmitted: string = 'Port Submitted';
```
##### phoneNumbers.statuses.released
```ts
released: string = 'Released';
```
##### phoneNumbers.title
```ts
title: string = 'Phone Numbers';
```
#### voicemails
```ts
voicemails: object;
```
##### voicemails.deleteConfirm
```ts
deleteConfirm: string = 'Delete this voicemail?';
```
##### voicemails.deleteTitle
```ts
deleteTitle: string = 'Delete Voicemail';
```
##### voicemails.empty
```ts
empty: string = 'No voicemails';
```
##### voicemails.loading
```ts
loading: string = 'Loading voicemails...';
```
##### voicemails.noUserId
```ts
noUserId: string = 'Please set a user ID to load voicemails';
```
##### voicemails.progress
```ts
progress: string = 'Playback progress';
```
##### voicemails.summary
```ts
summary: string = 'Summary';
```
##### voicemails.title
```ts
title: string = 'Voicemails';
```
##### voicemails.transcript
```ts
transcript: string = 'Full Transcript';
```
##### voicemails.transcription
```ts
transcription: string = 'Transcription';
```
##### voicemails.transcriptLoading
```ts
transcriptLoading: string = 'Loading transcript...';
```
##### voicemails.transcriptNotAvailable
```ts
transcriptNotAvailable: string = 'Transcript not available';
```
***
### onLoadError?
```ts
optional onLoadError?: (event) => void;
```
Defined in: [sdk/src/react/PhoneNumbers.tsx:69](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/PhoneNumbers.tsx#L69)
Callback when there's an error loading phone numbers
#### Parameters
##### event
[`LoadError`](../../index/interfaces/LoadError.md)
#### Returns
`void`
***
### onLoaderStart?
```ts
optional onLoaderStart?: (event) => void;
```
Defined in: [sdk/src/react/PhoneNumbers.tsx:64](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/PhoneNumbers.tsx#L64)
Callback when component starts loading
#### Parameters
##### event
[`LoaderStart`](../../index/interfaces/LoaderStart.md)
#### Returns
`void`
***
### onRowClick?
```ts
optional onRowClick?: (event) => void;
```
Defined in: [sdk/src/react/PhoneNumbers.tsx:74](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/PhoneNumbers.tsx#L74)
Callback when a row is clicked
#### Parameters
##### event
###### item
[`PhoneNumberItem`](../../index/interfaces/PhoneNumberItem.md)
###### phoneNumber
`string`
#### Returns
`void`
***
### style?
```ts
optional style?: CSSProperties;
```
Defined in: [sdk/src/react/PhoneNumbers.tsx:29](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/PhoneNumbers.tsx#L29)
Optional inline styles
---
## Interface: RingAllUsersNode
[@dialstack/sdk](../../index.md) / [react](../index.md) / RingAllUsersNode
# Interface: RingAllUsersNode
Defined in: [sdk/src/types/dial-plan.ts:97](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L97)
A ring-all-users node in the dial plan.
## Extends
- `DialPlanNodeBase`
## Properties
### config
```ts
config: RingAllUsersNodeConfig;
```
Defined in: [sdk/src/types/dial-plan.ts:99](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L99)
***
### id
```ts
id: string;
```
Defined in: [sdk/src/types/dial-plan.ts:73](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L73)
Unique identifier for this node within the dial plan
#### Inherited from
```ts
DialPlanNodeBase.id
```
***
### position?
```ts
optional position?: object;
```
Defined in: [sdk/src/types/dial-plan.ts:75](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L75)
Optional position for visual layout (if not provided, auto-layout is used)
#### x
```ts
x: number;
```
#### y
```ts
y: number;
```
#### Inherited from
```ts
DialPlanNodeBase.position
```
***
### type
```ts
type: "ring_all_users";
```
Defined in: [sdk/src/types/dial-plan.ts:98](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L98)
---
## Interface: RingAllUsersNodeConfig
[@dialstack/sdk](../../index.md) / [react](../index.md) / RingAllUsersNodeConfig
# Interface: RingAllUsersNodeConfig
Defined in: [sdk/src/types/dial-plan.ts:54](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L54)
Configuration for a ring-all-users node that rings every user in the account.
## Properties
### next?
```ts
optional next?: string;
```
Defined in: [sdk/src/types/dial-plan.ts:58](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L58)
Node ID to route to on timeout/no answer
***
### timeout
```ts
timeout: number;
```
Defined in: [sdk/src/types/dial-plan.ts:56](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L56)
Timeout in seconds before routing to next node
---
## Interface: ScheduleNode
[@dialstack/sdk](../../index.md) / [react](../index.md) / ScheduleNode
# Interface: ScheduleNode
Defined in: [sdk/src/types/dial-plan.ts:81](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L81)
A schedule node in the dial plan.
## Extends
- `DialPlanNodeBase`
## Properties
### config
```ts
config: ScheduleNodeConfig;
```
Defined in: [sdk/src/types/dial-plan.ts:83](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L83)
***
### id
```ts
id: string;
```
Defined in: [sdk/src/types/dial-plan.ts:73](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L73)
Unique identifier for this node within the dial plan
#### Inherited from
```ts
DialPlanNodeBase.id
```
***
### position?
```ts
optional position?: object;
```
Defined in: [sdk/src/types/dial-plan.ts:75](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L75)
Optional position for visual layout (if not provided, auto-layout is used)
#### x
```ts
x: number;
```
#### y
```ts
y: number;
```
#### Inherited from
```ts
DialPlanNodeBase.position
```
***
### type
```ts
type: "schedule";
```
Defined in: [sdk/src/types/dial-plan.ts:82](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L82)
---
## Interface: ScheduleNodeConfig
[@dialstack/sdk](../../index.md) / [react](../index.md) / ScheduleNodeConfig
# Interface: ScheduleNodeConfig
Defined in: [sdk/src/types/dial-plan.ts:16](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L16)
Configuration for a schedule node that routes calls based on time schedules.
Has two possible exits: open (business hours) and closed (including holidays).
## Properties
### closed?
```ts
optional closed?: string;
```
Defined in: [sdk/src/types/dial-plan.ts:22](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L22)
Node ID to route to when schedule is closed or on holiday
***
### open?
```ts
optional open?: string;
```
Defined in: [sdk/src/types/dial-plan.ts:20](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L20)
Node ID to route to when schedule is open
***
### schedule\_id
```ts
schedule_id: string;
```
Defined in: [sdk/src/types/dial-plan.ts:18](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L18)
Reference to the schedule definition
---
## Interface: VoiceAppNodeData
[@dialstack/sdk](../../index.md) / [react](../index.md) / VoiceAppNodeData
# Interface: VoiceAppNodeData
Defined in: [sdk/src/types/dial-plan.ts:290](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L290)
Data payload for a Voice App node in the graph.
## Extends
- `Record`\<`string`, `unknown`\>
## Indexable
```ts
[key: string]: unknown
```
## Properties
### label
```ts
label: string;
```
Defined in: [sdk/src/types/dial-plan.ts:291](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L291)
***
### locale?
```ts
optional locale?: DialPlanLocale;
```
Defined in: [sdk/src/types/dial-plan.ts:296](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L296)
***
### originalNode
```ts
originalNode: InternalDialNode;
```
Defined in: [sdk/src/types/dial-plan.ts:295](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L295)
***
### targetId
```ts
targetId: string;
```
Defined in: [sdk/src/types/dial-plan.ts:292](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L292)
***
### targetName?
```ts
optional targetName?: string;
```
Defined in: [sdk/src/types/dial-plan.ts:293](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L293)
***
### timeout?
```ts
optional timeout?: number;
```
Defined in: [sdk/src/types/dial-plan.ts:294](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L294)
---
## Interface: VoicemailsProps
[@dialstack/sdk](../../index.md) / [react](../index.md) / VoicemailsProps
# Interface: VoicemailsProps
Defined in: [sdk/src/react/Voicemails.tsx:22](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/Voicemails.tsx#L22)
## Properties
### behaviorOptions?
```ts
optional behaviorOptions?: VoicemailBehaviorOptions;
```
Defined in: [sdk/src/react/Voicemails.tsx:83](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/Voicemails.tsx#L83)
Behavior options for controlling component behavior
***
### classes?
```ts
optional classes?: VoicemailsClasses;
```
Defined in: [sdk/src/react/Voicemails.tsx:73](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/Voicemails.tsx#L73)
Custom CSS classes for styling integration
#### Example
```tsx
```
***
### className?
```ts
optional className?: string;
```
Defined in: [sdk/src/react/Voicemails.tsx:31](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/Voicemails.tsx#L31)
Optional CSS class name
***
### customRowRenderer?
```ts
optional customRowRenderer?: VoicemailRowRenderer;
```
Defined in: [sdk/src/react/Voicemails.tsx:88](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/Voicemails.tsx#L88)
Custom row renderer for collapsed voicemail items
***
### displayOptions?
```ts
optional displayOptions?: VoicemailDisplayOptions;
```
Defined in: [sdk/src/react/Voicemails.tsx:78](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/Voicemails.tsx#L78)
Display options for controlling field visibility
***
### formatting?
```ts
optional formatting?: FormattingOptions;
```
Defined in: [sdk/src/react/Voicemails.tsx:46](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/Voicemails.tsx#L46)
Formatting options for dates and phone numbers
***
### icons?
```ts
optional icons?: ComponentIcons;
```
Defined in: [sdk/src/react/Voicemails.tsx:51](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/Voicemails.tsx#L51)
Custom icons (partial override of defaults)
***
### layoutVariant?
```ts
optional layoutVariant?: LayoutVariant;
```
Defined in: [sdk/src/react/Voicemails.tsx:56](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/Voicemails.tsx#L56)
Layout variant (compact, comfortable, default)
***
### locale?
```ts
optional locale?: object;
```
Defined in: [sdk/src/react/Voicemails.tsx:41](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/Voicemails.tsx#L41)
Locale for UI strings
#### accountOnboarding
```ts
accountOnboarding: object;
```
##### accountOnboarding.account
```ts
account: object;
```
##### accountOnboarding.account.details
```ts
details: object;
```
##### accountOnboarding.account.details.companyNameLabel
```ts
companyNameLabel: string = 'Company Name';
```
##### accountOnboarding.account.details.companyNamePlaceholder
```ts
companyNamePlaceholder: string = 'Acme Corp';
```
##### accountOnboarding.account.details.companyNameRequired
```ts
companyNameRequired: string = 'Company name is required';
```
##### accountOnboarding.account.details.emailLabel
```ts
emailLabel: string = 'Primary Contact Email';
```
##### accountOnboarding.account.details.emailPlaceholder
```ts
emailPlaceholder: string = 'admin@company.com';
```
##### accountOnboarding.account.details.emailRequired
```ts
emailRequired: string = 'Primary contact email is required';
```
##### accountOnboarding.account.details.heading
```ts
heading: string = 'Account Details';
```
##### accountOnboarding.account.details.phoneInvalid
```ts
phoneInvalid: string = 'Enter a valid US phone number';
```
##### accountOnboarding.account.details.phoneLabel
```ts
phoneLabel: string = 'Primary Contact Phone Number';
```
##### accountOnboarding.account.details.phonePlaceholder
```ts
phonePlaceholder: string = '(555) 123-4567';
```
##### accountOnboarding.account.details.phoneRequired
```ts
phoneRequired: string = 'Primary contact phone number is required';
```
##### accountOnboarding.account.details.primaryContactLabel
```ts
primaryContactLabel: string = 'Primary Contact';
```
##### accountOnboarding.account.details.primaryContactPlaceholder
```ts
primaryContactPlaceholder: string = 'Jane Doe';
```
##### accountOnboarding.account.details.primaryContactRequired
```ts
primaryContactRequired: string = 'Primary contact is required';
```
##### accountOnboarding.account.details.regionLabel
```ts
regionLabel: string = 'Region';
```
##### accountOnboarding.account.details.regionPlaceholder
```ts
regionPlaceholder: string = 'Select a region';
```
##### accountOnboarding.account.details.timezoneLabel
```ts
timezoneLabel: string = 'Timezone';
```
##### accountOnboarding.account.details.timezonePlaceholder
```ts
timezonePlaceholder: string = 'Select a timezone';
```
##### accountOnboarding.account.details.timezoneRequired
```ts
timezoneRequired: string = 'Timezone is required';
```
##### accountOnboarding.account.location
```ts
location: object;
```
##### accountOnboarding.account.location.addressLabel
```ts
addressLabel: string = 'Address';
```
##### accountOnboarding.account.location.addressRequired
```ts
addressRequired: string = 'Address is required';
```
##### accountOnboarding.account.location.cityLabel
```ts
cityLabel: string = 'City';
```
##### accountOnboarding.account.location.cityPlaceholder
```ts
cityPlaceholder: string = 'New York';
```
##### accountOnboarding.account.location.description
```ts
description: string = 'Add your business address for E911 and caller ID.';
```
##### accountOnboarding.account.location.edit
```ts
edit: string = 'Edit';
```
##### accountOnboarding.account.location.enterManually
```ts
enterManually: string = 'Enter manually';
```
##### accountOnboarding.account.location.heading
```ts
heading: string = 'Business Location';
```
##### accountOnboarding.account.location.houseNumberLabel
```ts
houseNumberLabel: string = '#';
```
##### accountOnboarding.account.location.houseNumberPlaceholder
```ts
houseNumberPlaceholder: string = '123';
```
##### accountOnboarding.account.location.nameLabel
```ts
nameLabel: string = 'Location Name';
```
##### accountOnboarding.account.location.namePlaceholder
```ts
namePlaceholder: string = 'Main Office';
```
##### accountOnboarding.account.location.nameRequired
```ts
nameRequired: string = 'Location name is required';
```
##### accountOnboarding.account.location.noResults
```ts
noResults: string = 'No addresses found';
```
##### accountOnboarding.account.location.postalCodeLabel
```ts
postalCodeLabel: string = 'ZIP';
```
##### accountOnboarding.account.location.postalCodePlaceholder
```ts
postalCodePlaceholder: string = '10001';
```
##### accountOnboarding.account.location.searching
```ts
searching: string = 'Searching...';
```
##### accountOnboarding.account.location.searchInstead
```ts
searchInstead: string = 'Search instead';
```
##### accountOnboarding.account.location.searchPlaceholder
```ts
searchPlaceholder: string = 'Start typing an address...';
```
##### accountOnboarding.account.location.stateLabel
```ts
stateLabel: string = 'State';
```
##### accountOnboarding.account.location.statePlaceholder
```ts
statePlaceholder: string = 'Select';
```
##### accountOnboarding.account.location.streetLabel
```ts
streetLabel: string = 'Street';
```
##### accountOnboarding.account.location.streetPlaceholder
```ts
streetPlaceholder: string = 'Main St';
```
##### accountOnboarding.account.saveError
```ts
saveError: string = 'Failed to save. Please try again.';
```
##### accountOnboarding.account.saving
```ts
saving: string = 'Saving...';
```
##### accountOnboarding.account.subtitle
```ts
subtitle: string = 'Enter your company information';
```
##### accountOnboarding.account.title
```ts
title: string = 'Business Details';
```
##### accountOnboarding.account.users
```ts
users: object;
```
##### accountOnboarding.account.users.addUser
```ts
addUser: string = 'Add User';
```
##### accountOnboarding.account.users.atLeastOne
```ts
atLeastOne: string = 'Add at least one team member to continue.';
```
##### accountOnboarding.account.users.description
```ts
description: string = 'Add users who will have phone extensions';
```
##### accountOnboarding.account.users.duplicateEmail
```ts
duplicateEmail: string = 'A user with this email already exists.';
```
##### accountOnboarding.account.users.emailLabel
```ts
emailLabel: string = 'Email';
```
##### accountOnboarding.account.users.emailPlaceholder
```ts
emailPlaceholder: string = 'john@company.com';
```
##### accountOnboarding.account.users.extensionLabel
```ts
extensionLabel: string = 'Extension';
```
##### accountOnboarding.account.users.extensionPlaceholder
```ts
extensionPlaceholder: string = 'ex. 103';
```
##### accountOnboarding.account.users.heading
```ts
heading: string = 'Team Members';
```
##### accountOnboarding.account.users.nameLabel
```ts
nameLabel: string = 'Full name';
```
##### accountOnboarding.account.users.namePlaceholder
```ts
namePlaceholder: string = 'John Doe';
```
##### accountOnboarding.account.users.nameRequired
```ts
nameRequired: string = 'Name is required';
```
##### accountOnboarding.account.users.noUsers
```ts
noUsers: string = 'No team members added yet.';
```
##### accountOnboarding.account.users.removeUser
```ts
removeUser: string = 'Remove';
```
##### accountOnboarding.account.users.roleAdmin
```ts
roleAdmin: string = 'Admin';
```
##### accountOnboarding.account.users.roleLabel
```ts
roleLabel: string = 'Role';
```
##### accountOnboarding.account.users.roleUser
```ts
roleUser: string = 'User';
```
##### accountOnboarding.breadcrumbAriaLabel
```ts
breadcrumbAriaLabel: string = 'Onboarding progress';
```
##### accountOnboarding.complete
```ts
complete: object;
```
##### accountOnboarding.complete.e911
```ts
e911: object;
```
##### accountOnboarding.complete.e911.addressStandardized
```ts
addressStandardized: string = 'Your address was standardized for emergency services accuracy.';
```
##### accountOnboarding.complete.e911.deferred
```ts
deferred: string = 'E911 emergency services have not been fully configured. Each location with a phone number needs a verified emergency address before your phone service can be activated.';
```
##### accountOnboarding.complete.e911.errorDescription
```ts
errorDescription: string = 'There was an error configuring emergency services. You can retry or configure manually later.';
```
##### accountOnboarding.complete.e911.errorTitle
```ts
errorTitle: string = 'E911 configuration failed';
```
##### accountOnboarding.complete.e911.loading
```ts
loading: string = 'Configuring emergency services...';
```
##### accountOnboarding.complete.e911.pendingAfterPolling
```ts
pendingAfterPolling: string = 'E911 registration submitted. Your phone service is active — emergency address verification will complete shortly.';
```
##### accountOnboarding.complete.e911.pollingStatus
```ts
pollingStatus: string = 'Verifying emergency services registration...';
```
##### accountOnboarding.complete.e911.primaryAssigned
```ts
primaryAssigned: string = 'assigned as primary number for';
```
##### accountOnboarding.complete.e911.processing
```ts
processing: string = 'E911 registration is being processed. This may take a few minutes.';
```
##### accountOnboarding.complete.e911.retryButton
```ts
retryButton: string = 'Retry';
```
##### accountOnboarding.complete.e911.verified
```ts
verified: string = 'E911 emergency address is verified.';
```
##### accountOnboarding.complete.subtitle
```ts
subtitle: string = "It's time to start using your embedded voice system";
```
##### accountOnboarding.complete.title
```ts
title: string = 'Wahoo!';
```
##### accountOnboarding.error
```ts
error: object;
```
##### accountOnboarding.error.description
```ts
description: string = 'Something went wrong loading the onboarding wizard.';
```
##### accountOnboarding.error.retry
```ts
retry: string = 'Try Again';
```
##### accountOnboarding.error.title
```ts
title: string = 'Unable to Load';
```
##### accountOnboarding.hardware
```ts
hardware: object;
```
##### accountOnboarding.hardware.addDeviceButton
```ts
addDeviceButton: string = '+ Add Device';
```
##### accountOnboarding.hardware.addHandsetButton
```ts
addHandsetButton: string = '+ Handset';
```
##### accountOnboarding.hardware.allAssigned
```ts
allAssigned: string = 'All devices have been assigned';
```
##### accountOnboarding.hardware.assignAndComplete
```ts
assignAndComplete: string = 'Assign & Complete';
```
##### accountOnboarding.hardware.availableDevices
```ts
availableDevices: string = 'Available Devices';
```
##### accountOnboarding.hardware.cancel
```ts
cancel: string = 'Cancel';
```
##### accountOnboarding.hardware.clickToAssign
```ts
clickToAssign: string = 'Click to assign';
```
##### accountOnboarding.hardware.cordless
```ts
cordless: string = 'Cordless';
```
##### accountOnboarding.hardware.dectBase
```ts
dectBase: string = 'Cordless Base';
```
##### accountOnboarding.hardware.deskPhone
```ts
deskPhone: string = 'Desk phone';
```
##### accountOnboarding.hardware.deviceNotFound
```ts
deviceNotFound: string = 'Device was created but could not be found. Please try again.';
```
##### accountOnboarding.hardware.dragDropHint
```ts
dragDropHint: string = 'Drag and drop device here';
```
##### accountOnboarding.hardware.duplicateMac
```ts
duplicateMac: string = 'This MAC address is already registered.';
```
##### accountOnboarding.hardware.gate
```ts
gate: object;
```
##### accountOnboarding.hardware.gate.noDevices
```ts
noDevices: string = 'No devices are available for your account. Please contact support to add devices before completing this step.';
```
##### accountOnboarding.hardware.handset
```ts
handset: string = 'handset';
```
##### accountOnboarding.hardware.handsets
```ts
handsets: string = 'handsets';
```
##### accountOnboarding.hardware.invalidIpei
```ts
invalidIpei: string = 'Enter a valid IPEI (hex digits only).';
```
##### accountOnboarding.hardware.invalidMac
```ts
invalidMac: string = 'Enter a valid 12-digit MAC address.';
```
##### accountOnboarding.hardware.ipeiLabel
```ts
ipeiLabel: string = 'Handset IPEI';
```
##### accountOnboarding.hardware.ipeiNotMac
```ts
ipeiNotMac: string = 'This looks like a MAC address, not an IPEI. An IPEI looks like 03AABB1234567890CCDD.';
```
##### accountOnboarding.hardware.ipeiPlaceholder
```ts
ipeiPlaceholder: string = '03AABB1234567890CCDD';
```
##### accountOnboarding.hardware.isDectBase
```ts
isDectBase: string = 'This is a cordless handset base station';
```
##### accountOnboarding.hardware.macLabel
```ts
macLabel: string = 'MAC Address';
```
##### accountOnboarding.hardware.macPlaceholder
```ts
macPlaceholder: string = '00:04:13:AA:BB:CC';
```
##### accountOnboarding.hardware.noDevices
```ts
noDevices: string = 'No devices are available for your account at the moment.';
```
##### accountOnboarding.hardware.noUsers
```ts
noUsers: string = 'No team members found. Add team members in the Account step first.';
```
##### accountOnboarding.hardware.removeBaseFailed
```ts
removeBaseFailed: string = 'Failed to remove cordless base.';
```
##### accountOnboarding.hardware.removeDevice
```ts
removeDevice: string = 'Remove';
```
##### accountOnboarding.hardware.save
```ts
save: string = 'Save';
```
##### accountOnboarding.hardware.saving
```ts
saving: string = 'Saving...';
```
##### accountOnboarding.hardware.selectUser
```ts
selectUser: string = 'Select a team member';
```
##### accountOnboarding.hardware.selectUserRequired
```ts
selectUserRequired: string = 'Please select a team member.';
```
##### accountOnboarding.hardware.shippingAddress
```ts
shippingAddress: string = 'Shipping Address';
```
##### accountOnboarding.hardware.submitOrder
```ts
submitOrder: string = 'Submit Order';
```
##### accountOnboarding.hardware.submitting
```ts
submitting: string = 'Submitting...';
```
##### accountOnboarding.hardware.subtitle
```ts
subtitle: string = 'Drag and drop devices to assign them to team members';
```
##### accountOnboarding.hardware.tableHeaderDevice
```ts
tableHeaderDevice: string = 'Assigned Device';
```
##### accountOnboarding.hardware.tableHeaderExtension
```ts
tableHeaderExtension: string = 'Extension';
```
##### accountOnboarding.hardware.tableHeaderName
```ts
tableHeaderName: string = 'Full name';
```
##### accountOnboarding.hardware.title
```ts
title: string = 'Assign Devices';
```
##### accountOnboarding.hardware.unassign
```ts
unassign: string = 'Unassign';
```
##### accountOnboarding.hardware.unsupportedVendor
```ts
unsupportedVendor: string = 'This device is not currently supported. Our support team has been notified and will follow up.';
```
##### accountOnboarding.hardware.userLabel
```ts
userLabel: string = 'Team Member';
```
##### accountOnboarding.legal
```ts
legal: object;
```
##### accountOnboarding.legal.and
```ts
and: string = 'and';
```
##### accountOnboarding.legal.prefix
```ts
prefix: string = 'By continuing, you agree to the';
```
##### accountOnboarding.legal.privacyPolicy
```ts
privacyPolicy: string = 'Privacy Policy';
```
##### accountOnboarding.legal.recipientTerms
```ts
recipientTerms: string = 'Recipient Terms of Service';
```
##### accountOnboarding.legal.termsOfService
```ts
termsOfService: string = 'Terms of Service';
```
##### accountOnboarding.loading
```ts
loading: string = 'Loading...';
```
##### accountOnboarding.nav
```ts
nav: object;
```
##### accountOnboarding.nav.back
```ts
back: string = 'Back';
```
##### accountOnboarding.nav.exit
```ts
exit: string = 'Finish';
```
##### accountOnboarding.nav.next
```ts
next: string = 'Next';
```
##### accountOnboarding.nav.skip
```ts
skip: string = 'Skip';
```
##### accountOnboarding.numbers
```ts
numbers: object;
```
##### accountOnboarding.numbers.callerId
```ts
callerId: object;
```
##### accountOnboarding.numbers.callerId.alreadySet
```ts
alreadySet: string = 'Already configured';
```
##### accountOnboarding.numbers.callerId.charCount
```ts
charCount: string = '{count}/15';
```
##### accountOnboarding.numbers.callerId.directoryListing
```ts
directoryListing: object;
```
##### accountOnboarding.numbers.callerId.directoryListing.info
```ts
info: string = 'To update your directory listing, contact {platformName} support.';
```
##### accountOnboarding.numbers.callerId.directoryListing.title
```ts
title: string = 'Directory Listing (DA/DL)';
```
##### accountOnboarding.numbers.callerId.error
```ts
error: object;
```
##### accountOnboarding.numbers.callerId.error.conflict
```ts
conflict: string = 'A caller ID update is already in progress for this number.';
```
##### accountOnboarding.numbers.callerId.error.submitFailed
```ts
submitFailed: string = 'Failed to set caller ID. Please try again.';
```
##### accountOnboarding.numbers.callerId.inputHelp
```ts
inputHelp: string = 'Max 15 characters. Letters, numbers, spaces, and hyphens only.';
```
##### accountOnboarding.numbers.callerId.inputLabel
```ts
inputLabel: string = 'Caller ID Name';
```
##### accountOnboarding.numbers.callerId.inputPlaceholder
```ts
inputPlaceholder: string = 'e.g. ACME Corp';
```
##### accountOnboarding.numbers.callerId.noDIDs
```ts
noDIDs: string = 'No active phone numbers to configure.';
```
##### accountOnboarding.numbers.callerId.partialError
```ts
partialError: string = 'Some caller IDs could not be set. Fix errors and retry, or skip.';
```
##### accountOnboarding.numbers.callerId.skipCallerId
```ts
skipCallerId: string = 'Skip';
```
##### accountOnboarding.numbers.callerId.submit
```ts
submit: string = 'Set Caller ID';
```
##### accountOnboarding.numbers.callerId.submitAll
```ts
submitAll: string = 'Set All Caller IDs';
```
##### accountOnboarding.numbers.callerId.submitted
```ts
submitted: string = 'Submitted';
```
##### accountOnboarding.numbers.callerId.submitting
```ts
submitting: string = 'Submitting...';
```
##### accountOnboarding.numbers.callerId.submittingAll
```ts
submittingAll: string = 'Submitting caller IDs...';
```
##### accountOnboarding.numbers.callerId.subtitle
```ts
subtitle: string = 'Configure the name displayed when making outbound calls';
```
##### accountOnboarding.numbers.callerId.title
```ts
title: string = 'Caller ID Setup';
```
##### accountOnboarding.numbers.callerId.validation
```ts
validation: object;
```
##### accountOnboarding.numbers.callerId.validation.invalidChars
```ts
invalidChars: string = 'Only letters, numbers, spaces, and hyphens allowed';
```
##### accountOnboarding.numbers.callerId.validation.required
```ts
required: string = 'Caller ID name is required';
```
##### accountOnboarding.numbers.callerId.validation.tooLong
```ts
tooLong: string = 'Must be 15 characters or fewer';
```
##### accountOnboarding.numbers.defaultDialPlanName
```ts
defaultDialPlanName: string = 'Onboarding Dial Plan';
```
##### accountOnboarding.numbers.directoryListing
```ts
directoryListing: object;
```
##### accountOnboarding.numbers.directoryListing.businessName
```ts
businessName: string = 'Business Name';
```
##### accountOnboarding.numbers.directoryListing.businessNameHelp
```ts
businessNameHelp: string = 'The name shown in directory listings and used for caller verification. Max 200 characters.';
```
##### accountOnboarding.numbers.directoryListing.businessNamePlaceholder
```ts
businessNamePlaceholder: string = 'Enter business name for listing';
```
##### accountOnboarding.numbers.directoryListing.noDIDs
```ts
noDIDs: string = 'No eligible phone numbers to configure.';
```
##### accountOnboarding.numbers.directoryListing.noneOption
```ts
noneOption: string = 'None \u2014 skip directory listing';
```
##### accountOnboarding.numbers.directoryListing.selectPrompt
```ts
selectPrompt: string = 'Select which number should be listed:';
```
##### accountOnboarding.numbers.directoryListing.subtitle
```ts
subtitle: string = 'A directory listing feeds your business information into online directories and data aggregators, helping customers find you. It also reduces the chance of your outbound calls being flagged as spam by call-screening apps.';
```
##### accountOnboarding.numbers.directoryListing.title
```ts
title: string = 'Directory Listing';
```
##### accountOnboarding.numbers.directoryListing.validation
```ts
validation: object;
```
##### accountOnboarding.numbers.directoryListing.validation.nameRequired
```ts
nameRequired: string = 'Business name is required for the directory listing.';
```
##### accountOnboarding.numbers.gate
```ts
gate: object;
```
##### accountOnboarding.numbers.gate.noDIDsAvailable
```ts
noDIDsAvailable: string = 'You need at least one phone number before selecting a primary number. Order or port a number first.';
```
##### accountOnboarding.numbers.gate.primaryRequired
```ts
primaryRequired: string = 'Please select a primary number to continue.';
```
##### accountOnboarding.numbers.nav
```ts
nav: object;
```
##### accountOnboarding.numbers.nav.back
```ts
back: string = 'Back';
```
##### accountOnboarding.numbers.nav.backToSearch
```ts
backToSearch: string = 'Back to Search';
```
##### accountOnboarding.numbers.nav.cancel
```ts
cancel: string = 'Cancel';
```
##### accountOnboarding.numbers.nav.confirm
```ts
confirm: string = 'Confirm';
```
##### accountOnboarding.numbers.nav.next
```ts
next: string = 'Next';
```
##### accountOnboarding.numbers.order
```ts
order: object;
```
##### accountOnboarding.numbers.order.areaCodeLabel
```ts
areaCodeLabel: string = 'Area Code';
```
##### accountOnboarding.numbers.order.areaCodePlaceholder
```ts
areaCodePlaceholder: string = '212';
```
##### accountOnboarding.numbers.order.carrierNote
```ts
carrierNote: string = 'Your order will be submitted to the carrier for fulfillment. This usually completes within seconds but may take longer.';
```
##### accountOnboarding.numbers.order.confirmSubtitle
```ts
confirmSubtitle: string = 'You are about to order {count} phone numbers';
```
##### accountOnboarding.numbers.order.confirmSubtitle\_one
```ts
confirmSubtitle_one: string = 'You are about to order {count} phone number';
```
##### accountOnboarding.numbers.order.confirmSubtitle\_other
```ts
confirmSubtitle_other: string = 'You are about to order {count} phone numbers';
```
##### accountOnboarding.numbers.order.confirmTitle
```ts
confirmTitle: string = 'Confirm Your Order';
```
##### accountOnboarding.numbers.order.continue
```ts
continue: string = 'Continue';
```
##### accountOnboarding.numbers.order.deselectAll
```ts
deselectAll: string = 'Deselect All';
```
##### accountOnboarding.numbers.order.done
```ts
done: string = 'Done';
```
##### accountOnboarding.numbers.order.error
```ts
error: string = 'An error occurred while placing the order.';
```
##### accountOnboarding.numbers.order.noResults
```ts
noResults: string = 'No numbers found. Try a different search.';
```
##### accountOnboarding.numbers.order.ordering
```ts
ordering: string = 'Ordering...';
```
##### accountOnboarding.numbers.order.orderMore
```ts
orderMore: string = 'Order More Numbers';
```
##### accountOnboarding.numbers.order.placeOrder
```ts
placeOrder: string = 'Place Order';
```
##### accountOnboarding.numbers.order.placing
```ts
placing: string = 'Placing Order...';
```
##### accountOnboarding.numbers.order.quantityLabel
```ts
quantityLabel: string = 'Quantity';
```
##### accountOnboarding.numbers.order.resultsSubtitle
```ts
resultsSubtitle: string = 'Select the numbers you would like to order.';
```
##### accountOnboarding.numbers.order.resultsTitle
```ts
resultsTitle: string = 'Available Numbers';
```
##### accountOnboarding.numbers.order.search
```ts
search: string = 'Search';
```
##### accountOnboarding.numbers.order.searchByAreaCode
```ts
searchByAreaCode: string = 'Area Code';
```
##### accountOnboarding.numbers.order.searchByZip
```ts
searchByZip: string = 'ZIP Code';
```
##### accountOnboarding.numbers.order.searching
```ts
searching: string = 'Searching...';
```
##### accountOnboarding.numbers.order.searchSubtitle
```ts
searchSubtitle: string = 'Find available numbers by entering an area code or ZIP code';
```
##### accountOnboarding.numbers.order.searchTitle
```ts
searchTitle: string = 'Search Available Numbers';
```
##### accountOnboarding.numbers.order.selectAll
```ts
selectAll: string = 'Select All';
```
##### accountOnboarding.numbers.order.selected
```ts
selected: string = 'selected';
```
##### accountOnboarding.numbers.order.state
```ts
state: string = 'State';
```
##### accountOnboarding.numbers.order.statusComplete
```ts
statusComplete: string = 'Your numbers have been activated.';
```
##### accountOnboarding.numbers.order.statusFailed
```ts
statusFailed: string = 'The order could not be completed.';
```
##### accountOnboarding.numbers.order.statusPartial
```ts
statusPartial: string = 'Some numbers were activated, but others failed.';
```
##### accountOnboarding.numbers.order.statusPending
```ts
statusPending: string = 'Your order has been submitted to the carrier. Fulfillment usually completes within seconds but may take longer.';
```
##### accountOnboarding.numbers.order.statusStalled
```ts
statusStalled: string = 'Your order has been submitted to the carrier. Fulfillment usually completes within seconds but may take longer.';
```
##### accountOnboarding.numbers.order.statusTitle
```ts
statusTitle: string = 'Order Submitted';
```
##### accountOnboarding.numbers.order.zipLabel
```ts
zipLabel: string = 'ZIP Code';
```
##### accountOnboarding.numbers.order.zipPlaceholder
```ts
zipPlaceholder: string = '10001';
```
##### accountOnboarding.numbers.overview
```ts
overview: object;
```
##### accountOnboarding.numbers.overview.empty
```ts
empty: string = 'No telephone numbers yet. Request new numbers or port your existing ones.';
```
##### accountOnboarding.numbers.overview.heading
```ts
heading: string = 'Your Numbers';
```
##### accountOnboarding.numbers.overview.loadError
```ts
loadError: string = 'Failed to load telephone numbers. Please try again.';
```
##### accountOnboarding.numbers.overview.phoneNumber
```ts
phoneNumber: string = 'Phone Number';
```
##### accountOnboarding.numbers.overview.portExisting
```ts
portExisting: string = 'Port Existing Number';
```
##### accountOnboarding.numbers.overview.portExistingDesc
```ts
portExistingDesc: string = 'Transfer your current business number to {platformName}. This typically takes 5–10 business days.';
```
##### accountOnboarding.numbers.overview.requestNew
```ts
requestNew: string = 'Request New Numbers';
```
##### accountOnboarding.numbers.overview.requestNewDesc
```ts
requestNewDesc: string = 'Get new business phone numbers instantly. Choose from available numbers in your area.';
```
##### accountOnboarding.numbers.overview.retry
```ts
retry: string = 'Retry';
```
##### accountOnboarding.numbers.overview.source
```ts
source: string = 'Source';
```
##### accountOnboarding.numbers.overview.status
```ts
status: string = 'Status';
```
##### accountOnboarding.numbers.overview.temporaryBanner
```ts
temporaryBanner: string = 'A temporary number has been assigned to your account while you set up your permanent numbers.';
```
##### accountOnboarding.numbers.overview.type
```ts
type: string = 'Type';
```
##### accountOnboarding.numbers.port
```ts
port: object;
```
##### accountOnboarding.numbers.port.accountNumberLabel
```ts
accountNumberLabel: string = 'Account Number';
```
##### accountOnboarding.numbers.port.accountNumberPlaceholder
```ts
accountNumberPlaceholder: string = 'From your current carrier';
```
##### accountOnboarding.numbers.port.accountRequired
```ts
accountRequired: string = 'Account # Required';
```
##### accountOnboarding.numbers.port.addAnother
```ts
addAnother: string = 'Add another number';
```
##### accountOnboarding.numbers.port.addressHeading
```ts
addressHeading: string = 'Service Address';
```
##### accountOnboarding.numbers.port.approve
```ts
approve: string = 'Approve & Submit';
```
##### accountOnboarding.numbers.port.approverNameLabel
```ts
approverNameLabel: string = 'Authorized Contact';
```
##### accountOnboarding.numbers.port.approverNamePlaceholder
```ts
approverNamePlaceholder: string = 'John Doe';
```
##### accountOnboarding.numbers.port.backToOverview
```ts
backToOverview: string = 'Back to Numbers';
```
##### accountOnboarding.numbers.port.billCopyDesc
```ts
billCopyDesc: string = 'A recent bill from your current carrier showing the numbers to be ported.';
```
##### accountOnboarding.numbers.port.billCopyLabel
```ts
billCopyLabel: string = 'Phone Bill Copy';
```
##### accountOnboarding.numbers.port.billCopyRequired
```ts
billCopyRequired: string = 'Required';
```
##### accountOnboarding.numbers.port.btnLabel
```ts
btnLabel: string = 'Billing Telephone Number (BTN)';
```
##### accountOnboarding.numbers.port.btnPlaceholder
```ts
btnPlaceholder: string = '(555) 123-4567';
```
##### accountOnboarding.numbers.port.businessNameLabel
```ts
businessNameLabel: string = 'Business Name';
```
##### accountOnboarding.numbers.port.businessNamePlaceholder
```ts
businessNamePlaceholder: string = 'Acme Corp';
```
##### accountOnboarding.numbers.port.carrier
```ts
carrier: string = 'Current Carrier';
```
##### accountOnboarding.numbers.port.carrierContinue
```ts
carrierContinue: string = 'Continue';
```
##### accountOnboarding.numbers.port.carrierGroupsSubtitle
```ts
carrierGroupsSubtitle: string = 'Your numbers are with different carriers. Each carrier requires a separate port request.';
```
##### accountOnboarding.numbers.port.carrierGroupsTitle
```ts
carrierGroupsTitle: string = 'Carrier Groups';
```
##### accountOnboarding.numbers.port.carrierStart
```ts
carrierStart: string = 'Start';
```
##### accountOnboarding.numbers.port.carrierSubmitted
```ts
carrierSubmitted: string = 'Submitted';
```
##### accountOnboarding.numbers.port.checkEligibility
```ts
checkEligibility: string = 'Check Eligibility';
```
##### accountOnboarding.numbers.port.checking
```ts
checking: string = 'Checking...';
```
##### accountOnboarding.numbers.port.cityLabel
```ts
cityLabel: string = 'City';
```
##### accountOnboarding.numbers.port.cityPlaceholder
```ts
cityPlaceholder: string = 'New York';
```
##### accountOnboarding.numbers.port.continueWithPortable
```ts
continueWithPortable: string = 'Continue with Portable Numbers';
```
##### accountOnboarding.numbers.port.csrDesc
```ts
csrDesc: string = 'Optional but recommended — speeds up the porting process.';
```
##### accountOnboarding.numbers.port.csrLabel
```ts
csrLabel: string = 'Customer Service Record (CSR)';
```
##### accountOnboarding.numbers.port.csrOptional
```ts
csrOptional: string = 'Optional';
```
##### accountOnboarding.numbers.port.documentsSection
```ts
documentsSection: string = 'Documents';
```
##### accountOnboarding.numbers.port.documentsSubtitle
```ts
documentsSubtitle: string = 'Upload your latest phone bill and optionally a Customer Service Record (CSR).';
```
##### accountOnboarding.numbers.port.documentsTitle
```ts
documentsTitle: string = 'Supporting Documents';
```
##### accountOnboarding.numbers.port.eligibilitySubtitle
```ts
eligibilitySubtitle: string = 'Review which numbers can be ported.';
```
##### accountOnboarding.numbers.port.eligibilityTitle
```ts
eligibilityTitle: string = 'Port Eligibility';
```
##### accountOnboarding.numbers.port.fileSelected
```ts
fileSelected: string = 'Selected:';
```
##### accountOnboarding.numbers.port.focDateLabel
```ts
focDateLabel: string = 'Port Date';
```
##### accountOnboarding.numbers.port.focSection
```ts
focSection: string = 'Port Date';
```
##### accountOnboarding.numbers.port.focSubtitle
```ts
focSubtitle: string = 'Choose when you want the numbers transferred. Must be at least 5 business days out.';
```
##### accountOnboarding.numbers.port.focTimeLabel
```ts
focTimeLabel: string = 'Port Time (Eastern)';
```
##### accountOnboarding.numbers.port.focTimePlaceholder
```ts
focTimePlaceholder: string = 'Select time';
```
##### accountOnboarding.numbers.port.focTitle
```ts
focTitle: string = 'Requested Port Date';
```
##### accountOnboarding.numbers.port.houseNumberLabel
```ts
houseNumberLabel: string = 'Street Number';
```
##### accountOnboarding.numbers.port.houseNumberPlaceholder
```ts
houseNumberPlaceholder: string = '123';
```
##### accountOnboarding.numbers.port.line2Label
```ts
line2Label: string = 'Suite / Unit';
```
##### accountOnboarding.numbers.port.line2Placeholder
```ts
line2Placeholder: string = 'Suite 100';
```
##### accountOnboarding.numbers.port.noFileSelected
```ts
noFileSelected: string = 'No file selected';
```
##### accountOnboarding.numbers.port.noPortable
```ts
noPortable: string = 'None of the entered numbers are eligible for porting.';
```
##### accountOnboarding.numbers.port.notPortable
```ts
notPortable: string = 'Not Portable';
```
##### accountOnboarding.numbers.port.numberPlural
```ts
numberPlural: string = 'numbers';
```
##### accountOnboarding.numbers.port.numberSingular
```ts
numberSingular: string = 'number';
```
##### accountOnboarding.numbers.port.numbersSection
```ts
numbersSection: string = 'Numbers';
```
##### accountOnboarding.numbers.port.numbersSubtitle
```ts
numbersSubtitle: string = 'Enter the phone numbers you want to transfer to {platformName}.';
```
##### accountOnboarding.numbers.port.numbersTitle
```ts
numbersTitle: string = 'Numbers to Port';
```
##### accountOnboarding.numbers.port.phoneLabel
```ts
phoneLabel: string = 'Phone Number';
```
##### accountOnboarding.numbers.port.phonePlaceholder
```ts
phonePlaceholder: string = '(555) 123-4567';
```
##### accountOnboarding.numbers.port.pinLabel
```ts
pinLabel: string = 'Account PIN';
```
##### accountOnboarding.numbers.port.pinPlaceholder
```ts
pinPlaceholder: string = '1234';
```
##### accountOnboarding.numbers.port.portable
```ts
portable: string = 'Portable';
```
##### accountOnboarding.numbers.port.removeNumber
```ts
removeNumber: string = 'Remove';
```
##### accountOnboarding.numbers.port.reviewSubtitle
```ts
reviewSubtitle: string = 'Verify all details before submitting your port request.';
```
##### accountOnboarding.numbers.port.reviewTitle
```ts
reviewTitle: string = 'Review & Approve';
```
##### accountOnboarding.numbers.port.signatureHelp
```ts
signatureHelp: string = 'By signing, you authorize the transfer of the listed numbers to {platformName}.';
```
##### accountOnboarding.numbers.port.signatureLabel
```ts
signatureLabel: string = 'Electronic Signature';
```
##### accountOnboarding.numbers.port.signaturePlaceholder
```ts
signaturePlaceholder: string = 'Type your full legal name';
```
##### accountOnboarding.numbers.port.stateLabel
```ts
stateLabel: string = 'State';
```
##### accountOnboarding.numbers.port.statePlaceholder
```ts
statePlaceholder: string = 'Select state';
```
##### accountOnboarding.numbers.port.streetNameLabel
```ts
streetNameLabel: string = 'Street Name';
```
##### accountOnboarding.numbers.port.streetNamePlaceholder
```ts
streetNamePlaceholder: string = 'Main St';
```
##### accountOnboarding.numbers.port.submittedStatus
```ts
submittedStatus: string = 'Status';
```
##### accountOnboarding.numbers.port.submittedSubtitle
```ts
submittedSubtitle: string = 'Your port request has been submitted and is being processed.';
```
##### accountOnboarding.numbers.port.submittedTitle
```ts
submittedTitle: string = 'Port Request Submitted';
```
##### accountOnboarding.numbers.port.submitting
```ts
submitting: string = 'Submitting...';
```
##### accountOnboarding.numbers.port.subscriberSection
```ts
subscriberSection: string = 'Subscriber';
```
##### accountOnboarding.numbers.port.subscriberSubtitle
```ts
subscriberSubtitle: string = 'Enter the details exactly as they appear on your current phone bill.';
```
##### accountOnboarding.numbers.port.subscriberTitle
```ts
subscriberTitle: string = 'Subscriber Information';
```
##### accountOnboarding.numbers.port.uploadFile
```ts
uploadFile: string = 'Choose File';
```
##### accountOnboarding.numbers.port.uploading
```ts
uploading: string = 'Uploading...';
```
##### accountOnboarding.numbers.port.wireless
```ts
wireless: string = 'Wireless';
```
##### accountOnboarding.numbers.port.wirelessNo
```ts
wirelessNo: string = 'No';
```
##### accountOnboarding.numbers.port.wirelessYes
```ts
wirelessYes: string = 'Yes';
```
##### accountOnboarding.numbers.port.zipLabel
```ts
zipLabel: string = 'ZIP Code';
```
##### accountOnboarding.numbers.port.zipPlaceholder
```ts
zipPlaceholder: string = '10001';
```
##### accountOnboarding.numbers.primaryNumber
```ts
primaryNumber: object;
```
##### accountOnboarding.numbers.primaryNumber.autoMatched
```ts
autoMatched: string = '{phone} matches your account phone and has been selected as the primary number for E911.';
```
##### accountOnboarding.numbers.primaryNumber.autoMatchedBadge
```ts
autoMatchedBadge: string = 'Account number — auto-selected';
```
##### accountOnboarding.numbers.primaryNumber.description
```ts
description: string = 'Select the primary phone number for this location. This number is registered with E911 emergency services.';
```
##### accountOnboarding.numbers.primaryNumber.heading
```ts
heading: string = 'Primary Number';
```
##### accountOnboarding.numbers.primaryNumber.loading
```ts
loading: string = 'Loading phone numbers...';
```
##### accountOnboarding.numbers.primaryNumber.noDIDs
```ts
noDIDs: string = 'No active phone numbers available yet. E911 will be configured once numbers are provisioned.';
```
##### accountOnboarding.numbers.primaryNumber.temporary
```ts
temporary: string = 'Temporary';
```
##### accountOnboarding.numbers.primaryNumber.temporaryNote
```ts
temporaryNote: string = 'This is a temporary number assigned to get you started. You can replace it with a permanent number at any time.';
```
##### accountOnboarding.numbers.source
```ts
source: object;
```
##### accountOnboarding.numbers.source.did
```ts
did: string = 'Account';
```
##### accountOnboarding.numbers.source.didTemporary
```ts
didTemporary: string = 'Temporary';
```
##### accountOnboarding.numbers.source.number\_order
```ts
number_order: string = 'New Order';
```
##### accountOnboarding.numbers.source.port\_order
```ts
port_order: string = 'Port';
```
##### accountOnboarding.numbers.status
```ts
status: object;
```
##### accountOnboarding.numbers.status.active
```ts
active: string = 'Active';
```
##### accountOnboarding.numbers.status.inactive
```ts
inactive: string = 'Inactive';
```
##### accountOnboarding.numbers.status.order\_failed
```ts
order_failed: string = 'Order Failed';
```
##### accountOnboarding.numbers.status.ordering
```ts
ordering: string = 'Ordering';
```
##### accountOnboarding.numbers.status.porting\_approved
```ts
porting_approved: string = 'Port Approved';
```
##### accountOnboarding.numbers.status.porting\_draft
```ts
porting_draft: string = 'Port Draft';
```
##### accountOnboarding.numbers.status.porting\_exception
```ts
porting_exception: string = 'Port Exception';
```
##### accountOnboarding.numbers.status.porting\_foc
```ts
porting_foc: string = 'Port Scheduled';
```
##### accountOnboarding.numbers.status.porting\_submitted
```ts
porting_submitted: string = 'Port Submitted';
```
##### accountOnboarding.numbers.status.released
```ts
released: string = 'Released';
```
##### accountOnboarding.numbers.subtitle
```ts
subtitle: string = "Choose how you'd like to set up your business numbers";
```
##### accountOnboarding.numbers.title
```ts
title: string = 'Phone Numbers';
```
##### accountOnboarding.numbers.validation
```ts
validation: object;
```
##### accountOnboarding.numbers.validation.approverNameRequired
```ts
approverNameRequired: string = 'Authorized contact name is required.';
```
##### accountOnboarding.numbers.validation.areaCodeFormat
```ts
areaCodeFormat: string = 'Enter a 3-digit area code.';
```
##### accountOnboarding.numbers.validation.areaCodeRequired
```ts
areaCodeRequired: string = 'Area code is required.';
```
##### accountOnboarding.numbers.validation.billCopyRequired
```ts
billCopyRequired: string = 'A phone bill copy is required.';
```
##### accountOnboarding.numbers.validation.btnInvalid
```ts
btnInvalid: string = 'Enter a valid US phone number.';
```
##### accountOnboarding.numbers.validation.btnRequired
```ts
btnRequired: string = 'BTN is required.';
```
##### accountOnboarding.numbers.validation.businessNameRequired
```ts
businessNameRequired: string = 'Business name is required.';
```
##### accountOnboarding.numbers.validation.cityRequired
```ts
cityRequired: string = 'City is required.';
```
##### accountOnboarding.numbers.validation.eligibilityError
```ts
eligibilityError: string = 'Failed to check eligibility. Please try again.';
```
##### accountOnboarding.numbers.validation.focDateRequired
```ts
focDateRequired: string = 'Port date is required.';
```
##### accountOnboarding.numbers.validation.focDateTooFar
```ts
focDateTooFar: string = 'Port date must be within 30 days.';
```
##### accountOnboarding.numbers.validation.focDateTooSoon
```ts
focDateTooSoon: string = 'Port date must be at least 5 business days from today.';
```
##### accountOnboarding.numbers.validation.focTimeRequired
```ts
focTimeRequired: string = 'Port time is required.';
```
##### accountOnboarding.numbers.validation.houseNumberRequired
```ts
houseNumberRequired: string = 'Street number is required.';
```
##### accountOnboarding.numbers.validation.phoneDuplicate
```ts
phoneDuplicate: string = 'This number has already been entered.';
```
##### accountOnboarding.numbers.validation.phoneInvalid
```ts
phoneInvalid: string = 'Enter a valid US phone number.';
```
##### accountOnboarding.numbers.validation.phoneRequired
```ts
phoneRequired: string = 'At least one phone number is required.';
```
##### accountOnboarding.numbers.validation.selectAtLeastOne
```ts
selectAtLeastOne: string = 'Select at least one number.';
```
##### accountOnboarding.numbers.validation.signatureRequired
```ts
signatureRequired: string = 'Signature is required.';
```
##### accountOnboarding.numbers.validation.stateRequired
```ts
stateRequired: string = 'State is required.';
```
##### accountOnboarding.numbers.validation.streetNameRequired
```ts
streetNameRequired: string = 'Street name is required.';
```
##### accountOnboarding.numbers.validation.submitError
```ts
submitError: string = 'Failed to submit port request. Please try again.';
```
##### accountOnboarding.numbers.validation.zipFormat
```ts
zipFormat: string = 'Enter a 5-digit ZIP code.';
```
##### accountOnboarding.numbers.validation.zipRequired
```ts
zipRequired: string = 'ZIP code is required.';
```
##### accountOnboarding.sidebar
```ts
sidebar: object;
```
##### accountOnboarding.sidebar.businessDetails
```ts
businessDetails: string = 'Business Details';
```
##### accountOnboarding.sidebar.businessDetailsDesc
```ts
businessDetailsDesc: string = 'Enter your company information';
```
##### accountOnboarding.sidebar.callerId
```ts
callerId: string = 'Caller ID';
```
##### accountOnboarding.sidebar.callerIdDesc
```ts
callerIdDesc: string = 'Set caller ID for your numbers';
```
##### accountOnboarding.sidebar.deviceAssignment
```ts
deviceAssignment: string = 'Device Assignment';
```
##### accountOnboarding.sidebar.deviceAssignmentDesc
```ts
deviceAssignmentDesc: string = 'Assign devices to users';
```
##### accountOnboarding.sidebar.directoryListing
```ts
directoryListing: string = 'Directory Listing';
```
##### accountOnboarding.sidebar.directoryListingDesc
```ts
directoryListingDesc: string = 'Configure 411 directory listing';
```
##### accountOnboarding.sidebar.finalCompletion
```ts
finalCompletion: string = 'Final Completion';
```
##### accountOnboarding.sidebar.finalCompletionDesc
```ts
finalCompletionDesc: string = 'Complete your onboarding';
```
##### accountOnboarding.sidebar.numberOptions
```ts
numberOptions: string = 'Number Options';
```
##### accountOnboarding.sidebar.numberOptionsDesc
```ts
numberOptionsDesc: string = 'Choose to port existing or get new numbers';
```
##### accountOnboarding.sidebar.numberSetup
```ts
numberSetup: string = 'Number Setup';
```
##### accountOnboarding.sidebar.numberSetupDesc
```ts
numberSetupDesc: string = 'Configure your phone numbers';
```
##### accountOnboarding.sidebar.primaryNumber
```ts
primaryNumber: string = 'Primary Number';
```
##### accountOnboarding.sidebar.primaryNumberDesc
```ts
primaryNumberDesc: string = 'Select your main E911 number';
```
##### accountOnboarding.sidebar.teamMembers
```ts
teamMembers: string = 'Team Members';
```
##### accountOnboarding.sidebar.teamMembersDesc
```ts
teamMembersDesc: string = 'Add users and assign extensions';
```
##### accountOnboarding.sidebar.verification
```ts
verification: string = 'Verification';
```
##### accountOnboarding.sidebar.verificationDesc
```ts
verificationDesc: string = 'Verify number status';
```
##### accountOnboarding.stepComplete
```ts
stepComplete: object;
```
##### accountOnboarding.stepComplete.done
```ts
done: string = 'Done';
```
##### accountOnboarding.stepComplete.subtitle
```ts
subtitle: string = 'This step has been completed successfully.';
```
##### accountOnboarding.stepComplete.title
```ts
title: string = '{stepName} Complete';
```
##### accountOnboarding.steps
```ts
steps: object;
```
##### accountOnboarding.steps.account
```ts
account: string = 'Account Setup';
```
##### accountOnboarding.steps.complete
```ts
complete: string = 'Complete';
```
##### accountOnboarding.steps.hardware
```ts
hardware: string = 'Hardware Setup';
```
##### accountOnboarding.steps.numbers
```ts
numbers: string = 'Phone Numbers';
```
##### accountOnboarding.title
```ts
title: string = 'Account Onboarding';
```
#### callHistory
```ts
callHistory: object;
```
##### callHistory.clickToCall
```ts
clickToCall: string = 'Click to call';
```
##### callHistory.empty
```ts
empty: string = 'No call history';
```
##### callHistory.error
```ts
error: string = 'Unable to load call history';
```
##### callHistory.loading
```ts
loading: string = 'Loading call history...';
```
##### callHistory.noPhoneNumber
```ts
noPhoneNumber: string = 'Please set a phone number to load call history';
```
##### callHistory.relativeTime
```ts
relativeTime: object;
```
##### callHistory.relativeTime.hourAgo
```ts
hourAgo: string = '1 hour ago';
```
##### callHistory.relativeTime.hoursAgo
```ts
hoursAgo: string = '{count} hours ago';
```
##### callHistory.relativeTime.justNow
```ts
justNow: string = 'Just now';
```
##### callHistory.relativeTime.minuteAgo
```ts
minuteAgo: string = '1 min ago';
```
##### callHistory.relativeTime.minutesAgo
```ts
minutesAgo: string = '{count} min ago';
```
##### callHistory.relativeTime.yesterday
```ts
yesterday: string = 'Yesterday';
```
##### callHistory.summaryNotAvailable
```ts
summaryNotAvailable: string = 'Summary not available';
```
##### callHistory.title
```ts
title: string = 'Call History';
```
#### callLogs
```ts
callLogs: object;
```
##### callLogs.calledBy
```ts
calledBy: string = 'Called by:';
```
##### callLogs.columns
```ts
columns: object;
```
##### callLogs.columns.date
```ts
date: string = 'Date';
```
##### callLogs.columns.direction
```ts
direction: string = 'Direction';
```
##### callLogs.columns.duration
```ts
duration: string = 'Duration';
```
##### callLogs.columns.from
```ts
from: string = 'From';
```
##### callLogs.columns.quality
```ts
quality: string = 'MOS';
```
##### callLogs.columns.status
```ts
status: string = 'Status';
```
##### callLogs.columns.to
```ts
to: string = 'To';
```
##### callLogs.directions
```ts
directions: object;
```
##### callLogs.directions.inbound
```ts
inbound: string = 'Inbound';
```
##### callLogs.directions.internal
```ts
internal: string = 'Internal';
```
##### callLogs.directions.outbound
```ts
outbound: string = 'Outbound';
```
##### callLogs.empty
```ts
empty: string = 'No call logs found';
```
##### callLogs.loading
```ts
loading: string = 'Loading call logs...';
```
##### callLogs.quality
```ts
quality: object;
```
##### callLogs.quality.fair
```ts
fair: string = 'Fair';
```
##### callLogs.quality.good
```ts
good: string = 'Good';
```
##### callLogs.quality.poor
```ts
poor: string = 'Poor';
```
##### callLogs.quality.unavailable
```ts
unavailable: string = 'N/A';
```
##### callLogs.quality.unavailableTooltip
```ts
unavailableTooltip: string = 'No quality data available';
```
##### callLogs.routedTo
```ts
routedTo: string = 'Routed to:';
```
##### callLogs.statuses
```ts
statuses: object;
```
##### callLogs.statuses.busy
```ts
busy: string = 'Busy';
```
##### callLogs.statuses.completed
```ts
completed: string = 'Completed';
```
##### callLogs.statuses.failed
```ts
failed: string = 'Failed';
```
##### callLogs.statuses.noAnswer
```ts
noAnswer: string = 'No Answer';
```
##### callLogs.statuses.voicemail
```ts
voicemail: string = 'Voicemail';
```
##### callLogs.title
```ts
title: string = 'Call Logs';
```
#### common
```ts
common: object;
```
##### common.call
```ts
call: string = 'Call';
```
##### common.cancel
```ts
cancel: string = 'Cancel';
```
##### common.confirm
```ts
confirm: string = 'Confirm';
```
##### common.delete
```ts
delete: string = 'Delete';
```
##### common.error
```ts
error: string = 'Error';
```
##### common.loading
```ts
loading: string = 'Loading...';
```
##### common.next
```ts
next: string = 'Next';
```
##### common.noResults
```ts
noResults: string = 'No results';
```
##### common.pause
```ts
pause: string = 'Pause';
```
##### common.perPage
```ts
perPage: string = 'Per page';
```
##### common.play
```ts
play: string = 'Play';
```
##### common.previous
```ts
previous: string = 'Previous';
```
##### common.showing
```ts
showing: string = 'Showing {start}-{end} of {total}';
```
#### dialPlan
```ts
dialPlan: object;
```
##### dialPlan.empty
```ts
empty: string = 'No dial plan found';
```
##### dialPlan.error
```ts
error: string = 'Failed to load dial plan';
```
##### dialPlan.exits
```ts
exits: object;
```
##### dialPlan.exits.closed
```ts
closed: string = 'Closed';
```
##### dialPlan.exits.next
```ts
next: string = 'No Answer';
```
##### dialPlan.exits.open
```ts
open: string = 'Open';
```
##### dialPlan.exits.timeout
```ts
timeout: string = 'Timeout';
```
##### dialPlan.loading
```ts
loading: string = 'Loading dial plan...';
```
##### dialPlan.nodeTypes
```ts
nodeTypes: object;
```
##### dialPlan.nodeTypes.externalDial
```ts
externalDial: string = 'External Number';
```
##### dialPlan.nodeTypes.internalDial
```ts
internalDial: string = 'Internal Extension';
```
##### dialPlan.nodeTypes.schedule
```ts
schedule: string = 'Schedule';
```
##### dialPlan.nodeTypes.start
```ts
start: string = 'Start';
```
##### dialPlan.nodeTypes.voiceApp
```ts
voiceApp: string = 'Voice App';
```
##### dialPlan.nodeTypes.voicemail
```ts
voicemail: string = 'Voicemail';
```
##### dialPlan.title
```ts
title: string = 'Dial Plan';
```
#### onboardingPortal
```ts
onboardingPortal: object;
```
##### onboardingPortal.back
```ts
back: string = 'Back';
```
##### onboardingPortal.helpSupport
```ts
helpSupport: string = 'Help & Support';
```
##### onboardingPortal.onboardingComplete
```ts
onboardingComplete: string = 'Onboarding complete';
```
##### onboardingPortal.onboardingFlows
```ts
onboardingFlows: string = 'ONBOARDING FLOWS';
```
##### onboardingPortal.overview
```ts
overview: object;
```
##### onboardingPortal.overview.accountDesc
```ts
accountDesc: string = 'Set up your business profile, add team members, and configure your dial plan';
```
##### onboardingPortal.overview.complete
```ts
complete: string = 'Complete';
```
##### onboardingPortal.overview.completeSetup
```ts
completeSetup: string = 'Complete Setup';
```
##### onboardingPortal.overview.continueSetup
```ts
continueSetup: string = 'Continue Setup';
```
##### onboardingPortal.overview.flowsComplete
```ts
flowsComplete: string = '{completed} of {total} flows complete';
```
##### onboardingPortal.overview.hardwareDesc
```ts
hardwareDesc: string = 'Assign phones to team members and track delivery';
```
##### onboardingPortal.overview.label
```ts
label: string = 'Overview';
```
##### onboardingPortal.overview.needHelp
```ts
needHelp: string = 'Need help?';
```
##### onboardingPortal.overview.needHelpSubtitle
```ts
needHelpSubtitle: string = 'Our team is here to help you get set up quickly';
```
##### onboardingPortal.overview.numbersDesc
```ts
numbersDesc: string = 'Port existing numbers or request new business lines';
```
##### onboardingPortal.overview.phoneStatusComplete
```ts
phoneStatusComplete: string = 'Complete';
```
##### onboardingPortal.overview.phoneStatusNumber
```ts
phoneStatusNumber: string = 'Phone Number';
```
##### onboardingPortal.overview.phoneStatusProcessing
```ts
phoneStatusProcessing: string = 'Processing';
```
##### onboardingPortal.overview.phoneStatusStatus
```ts
phoneStatusStatus: string = 'Status';
```
##### onboardingPortal.overview.phoneStatusSubtitle
```ts
phoneStatusSubtitle: string = 'Track the status of your phone numbers';
```
##### onboardingPortal.overview.phoneStatusTemporary
```ts
phoneStatusTemporary: string = 'Temporary';
```
##### onboardingPortal.overview.phoneStatusTitle
```ts
phoneStatusTitle: string = 'Phone number status';
```
##### onboardingPortal.overview.phoneStatusType
```ts
phoneStatusType: string = 'Type';
```
##### onboardingPortal.overview.phoneStatusTypeNew
```ts
phoneStatusTypeNew: string = 'New';
```
##### onboardingPortal.overview.phoneStatusTypePort
```ts
phoneStatusTypePort: string = 'Port';
```
##### onboardingPortal.overview.progress
```ts
progress: string = 'Progress';
```
##### onboardingPortal.overview.progressTitle
```ts
progressTitle: string = 'Onboarding Progress';
```
##### onboardingPortal.overview.review
```ts
review: string = 'Review';
```
##### onboardingPortal.overview.scheduleCall
```ts
scheduleCall: string = 'Schedule a Call';
```
##### onboardingPortal.overview.stepsTitle
```ts
stepsTitle: string = 'Onboarding Steps';
```
##### onboardingPortal.overview.subtitle
```ts
subtitle: string = 'Complete the steps below to set up your business phone system';
```
##### onboardingPortal.overview.title
```ts
title: string = 'Your Business Onboarding';
```
##### onboardingPortal.overview.viewDocs
```ts
viewDocs: string = 'View Documentation';
```
##### onboardingPortal.saveAndExit
```ts
saveAndExit: string = 'Save & Exit to Overview';
```
##### onboardingPortal.splash
```ts
splash: object;
```
##### onboardingPortal.splash.start
```ts
start: string = 'Start Onboarding';
```
##### onboardingPortal.splash.step1
```ts
step1: string = 'Account Details';
```
##### onboardingPortal.splash.step2
```ts
step2: string = 'Setup Phone Numbers';
```
##### onboardingPortal.splash.step3
```ts
step3: string = 'Assign Hardware';
```
##### onboardingPortal.splash.subtitle
```ts
subtitle: string = "Let's get your business set up in 3 easy steps";
```
##### onboardingPortal.splash.title
```ts
title: string = 'Welcome\nto {platformName}';
```
#### phoneNumberOrdering
```ts
phoneNumberOrdering: object;
```
##### phoneNumberOrdering.complete
```ts
complete: object;
```
##### phoneNumberOrdering.complete.assignmentHint
```ts
assignmentHint: string = 'Numbers added to your inventory still need to be assigned to an extension or dial plan before they can receive calls.';
```
##### phoneNumberOrdering.complete.checking
```ts
checking: string = 'Checking order status...';
```
##### phoneNumberOrdering.complete.descriptionCompleteOne
```ts
descriptionCompleteOne: string = 'Your phone number is now in your inventory and ready to be configured.';
```
##### phoneNumberOrdering.complete.descriptionCompleteOther
```ts
descriptionCompleteOther: string = 'Your phone numbers are now in your inventory and ready to be configured.';
```
##### phoneNumberOrdering.complete.descriptionPartialOne
```ts
descriptionPartialOne: string = 'Some numbers could not be fulfilled by the carrier.';
```
##### phoneNumberOrdering.complete.descriptionPartialOther
```ts
descriptionPartialOther: string = 'Some numbers could not be fulfilled by the carrier.';
```
##### phoneNumberOrdering.complete.descriptionPendingOne
```ts
descriptionPendingOne: string = 'Your order has been submitted to the carrier. Fulfillment usually completes within seconds but may take longer.';
```
##### phoneNumberOrdering.complete.descriptionPendingOther
```ts
descriptionPendingOther: string = 'Your order has been submitted to the carrier. Fulfillment usually completes within seconds but may take longer.';
```
##### phoneNumberOrdering.complete.orderMore
```ts
orderMore: string = 'Order More Numbers';
```
##### phoneNumberOrdering.complete.titleCompleteOne
```ts
titleCompleteOne: string = 'Number Ready';
```
##### phoneNumberOrdering.complete.titleCompleteOther
```ts
titleCompleteOther: string = 'Numbers Ready';
```
##### phoneNumberOrdering.complete.titlePartialOne
```ts
titlePartialOne: string = 'Partially Fulfilled';
```
##### phoneNumberOrdering.complete.titlePartialOther
```ts
titlePartialOther: string = 'Partially Fulfilled';
```
##### phoneNumberOrdering.complete.titlePendingOne
```ts
titlePendingOne: string = 'Order Submitted';
```
##### phoneNumberOrdering.complete.titlePendingOther
```ts
titlePendingOther: string = 'Order Submitted';
```
##### phoneNumberOrdering.confirm
```ts
confirm: object;
```
##### phoneNumberOrdering.confirm.back
```ts
back: string = 'Back';
```
##### phoneNumberOrdering.confirm.description
```ts
description: string = 'Your order will be submitted to the carrier for fulfillment. This usually completes within seconds but may take longer.';
```
##### phoneNumberOrdering.confirm.placeOrder
```ts
placeOrder: string = 'Place Order';
```
##### phoneNumberOrdering.confirm.subtitleOne
```ts
subtitleOne: string = 'You are about to order 1 phone number';
```
##### phoneNumberOrdering.confirm.subtitleOther
```ts
subtitleOther: string = 'You are about to order {count} phone numbers';
```
##### phoneNumberOrdering.confirm.title
```ts
title: string = 'Confirm Order';
```
##### phoneNumberOrdering.error
```ts
error: object;
```
##### phoneNumberOrdering.error.description
```ts
description: string = 'The carrier was unable to fulfill your order.';
```
##### phoneNumberOrdering.error.title
```ts
title: string = 'Order Failed';
```
##### phoneNumberOrdering.error.tryAgain
```ts
tryAgain: string = 'Try Again';
```
##### phoneNumberOrdering.ordering
```ts
ordering: object;
```
##### phoneNumberOrdering.ordering.title
```ts
title: string = 'Placing Order...';
```
##### phoneNumberOrdering.results
```ts
results: object;
```
##### phoneNumberOrdering.results.backToSearch
```ts
backToSearch: string = 'Back to Search';
```
##### phoneNumberOrdering.results.continue
```ts
continue: string = 'Continue';
```
##### phoneNumberOrdering.results.noResults
```ts
noResults: string = 'No numbers available for this search';
```
##### phoneNumberOrdering.results.phoneNumber
```ts
phoneNumber: string = 'Phone Number';
```
##### phoneNumberOrdering.results.selectAll
```ts
selectAll: string = 'Select all';
```
##### phoneNumberOrdering.results.selected
```ts
selected: string = '{count} selected';
```
##### phoneNumberOrdering.results.state
```ts
state: string = 'State';
```
##### phoneNumberOrdering.results.title
```ts
title: string = 'Available Numbers';
```
##### phoneNumberOrdering.search
```ts
search: object;
```
##### phoneNumberOrdering.search.areaCode
```ts
areaCode: string = 'Area Code';
```
##### phoneNumberOrdering.search.areaCodeLabel
```ts
areaCodeLabel: string = 'Area Code';
```
##### phoneNumberOrdering.search.areaCodePlaceholder
```ts
areaCodePlaceholder: string = 'e.g. 212';
```
##### phoneNumberOrdering.search.numberOfResults
```ts
numberOfResults: string = 'Quantity to display';
```
##### phoneNumberOrdering.search.search
```ts
search: string = 'Search';
```
##### phoneNumberOrdering.search.searchType
```ts
searchType: string = 'Search by';
```
##### phoneNumberOrdering.search.subtitle
```ts
subtitle: string = 'Find available phone numbers by entering an area code or ZIP code.';
```
##### phoneNumberOrdering.search.title
```ts
title: string = 'Search Available Numbers';
```
##### phoneNumberOrdering.search.zip
```ts
zip: string = 'ZIP Code';
```
##### phoneNumberOrdering.search.zipLabel
```ts
zipLabel: string = 'ZIP Code';
```
##### phoneNumberOrdering.search.zipPlaceholder
```ts
zipPlaceholder: string = 'e.g. 10001';
```
##### phoneNumberOrdering.statuses
```ts
statuses: object;
```
##### phoneNumberOrdering.statuses.complete
```ts
complete: string = 'Complete';
```
##### phoneNumberOrdering.statuses.failed
```ts
failed: string = 'Failed';
```
##### phoneNumberOrdering.statuses.partial
```ts
partial: string = 'Partial';
```
##### phoneNumberOrdering.statuses.pending
```ts
pending: string = 'Pending';
```
##### phoneNumberOrdering.steps
```ts
steps: object;
```
##### phoneNumberOrdering.steps.confirm
```ts
confirm: string = 'Confirm';
```
##### phoneNumberOrdering.steps.done
```ts
done: string = 'Done';
```
##### phoneNumberOrdering.steps.search
```ts
search: string = 'Search';
```
##### phoneNumberOrdering.steps.select
```ts
select: string = 'Select';
```
##### phoneNumberOrdering.steps.stepOf
```ts
stepOf: string = 'Step {current} of {total}';
```
##### phoneNumberOrdering.title
```ts
title: string = 'Order Phone Numbers';
```
#### phoneNumbers
```ts
phoneNumbers: object;
```
##### phoneNumbers.badges
```ts
badges: object;
```
##### phoneNumbers.badges.temporary
```ts
temporary: string = 'Temporary';
```
##### phoneNumbers.columns
```ts
columns: object;
```
##### phoneNumbers.columns.callerID
```ts
callerID: string = 'Caller ID';
```
##### phoneNumbers.columns.cancelledDate
```ts
cancelledDate: string = 'Date Cancelled';
```
##### phoneNumbers.columns.carrier
```ts
carrier: string = 'Carrier';
```
##### phoneNumbers.columns.outbound
```ts
outbound: string = 'Direction';
```
##### phoneNumbers.columns.phoneNumber
```ts
phoneNumber: string = 'Phone Number';
```
##### phoneNumbers.columns.routingTarget
```ts
routingTarget: string = 'Call Routing';
```
##### phoneNumbers.columns.status
```ts
status: string = 'Status';
```
##### phoneNumbers.columns.transferDate
```ts
transferDate: string = 'Transfer Date';
```
##### phoneNumbers.empty
```ts
empty: string = 'No phone numbers';
```
##### phoneNumbers.filterLabel
```ts
filterLabel: string = 'Filter by status';
```
##### phoneNumbers.filters
```ts
filters: object;
```
##### phoneNumbers.filters.active
```ts
active: string = 'Active';
```
##### phoneNumbers.filters.cancelled
```ts
cancelled: string = 'Cancelled';
```
##### phoneNumbers.filters.in\_progress
```ts
in_progress: string = 'In Progress';
```
##### phoneNumbers.loading
```ts
loading: string = 'Loading phone numbers...';
```
##### phoneNumbers.outbound
```ts
outbound: object;
```
##### phoneNumbers.outbound.disabled
```ts
disabled: string = 'Inbound only';
```
##### phoneNumbers.outbound.enabled
```ts
enabled: string = 'Two-way';
```
##### phoneNumbers.routingTarget
```ts
routingTarget: object;
```
##### phoneNumbers.routingTarget.notSet
```ts
notSet: string = 'Not set';
```
##### phoneNumbers.routingTargetTypes
```ts
routingTargetTypes: object;
```
##### phoneNumbers.routingTargetTypes.dialPlan
```ts
dialPlan: string = 'Dial Plan';
```
##### phoneNumbers.routingTargetTypes.ringGroup
```ts
ringGroup: string = 'Ring Group';
```
##### phoneNumbers.routingTargetTypes.user
```ts
user: string = 'User';
```
##### phoneNumbers.routingTargetTypes.voiceApp
```ts
voiceApp: string = 'Voice App';
```
##### phoneNumbers.statuses
```ts
statuses: object;
```
##### phoneNumbers.statuses.active
```ts
active: string = 'Active';
```
##### phoneNumbers.statuses.inactive
```ts
inactive: string = 'Inactive';
```
##### phoneNumbers.statuses.orderFailed
```ts
orderFailed: string = 'Order Failed';
```
##### phoneNumbers.statuses.ordering
```ts
ordering: string = 'Ordering';
```
##### phoneNumbers.statuses.portingApproved
```ts
portingApproved: string = 'Port Approved';
```
##### phoneNumbers.statuses.portingDraft
```ts
portingDraft: string = 'Port Draft';
```
##### phoneNumbers.statuses.portingException
```ts
portingException: string = 'Port Issue';
```
##### phoneNumbers.statuses.portingFoc
```ts
portingFoc: string = 'Port Scheduled';
```
##### phoneNumbers.statuses.portingSubmitted
```ts
portingSubmitted: string = 'Port Submitted';
```
##### phoneNumbers.statuses.released
```ts
released: string = 'Released';
```
##### phoneNumbers.title
```ts
title: string = 'Phone Numbers';
```
#### voicemails
```ts
voicemails: object;
```
##### voicemails.deleteConfirm
```ts
deleteConfirm: string = 'Delete this voicemail?';
```
##### voicemails.deleteTitle
```ts
deleteTitle: string = 'Delete Voicemail';
```
##### voicemails.empty
```ts
empty: string = 'No voicemails';
```
##### voicemails.loading
```ts
loading: string = 'Loading voicemails...';
```
##### voicemails.noUserId
```ts
noUserId: string = 'Please set a user ID to load voicemails';
```
##### voicemails.progress
```ts
progress: string = 'Playback progress';
```
##### voicemails.summary
```ts
summary: string = 'Summary';
```
##### voicemails.title
```ts
title: string = 'Voicemails';
```
##### voicemails.transcript
```ts
transcript: string = 'Full Transcript';
```
##### voicemails.transcription
```ts
transcription: string = 'Transcription';
```
##### voicemails.transcriptLoading
```ts
transcriptLoading: string = 'Loading transcript...';
```
##### voicemails.transcriptNotAvailable
```ts
transcriptNotAvailable: string = 'Transcript not available';
```
***
### onCallBack?
```ts
optional onCallBack?: (event) => void;
```
Defined in: [sdk/src/react/Voicemails.tsx:123](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/Voicemails.tsx#L123)
Callback when call back button is clicked
#### Parameters
##### event
###### phoneNumber
`string`
#### Returns
`void`
***
### onDeleteRequest?
```ts
optional onDeleteRequest?: (voicemailId) => Promise;
```
Defined in: [sdk/src/react/Voicemails.tsx:128](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/Voicemails.tsx#L128)
Custom delete confirmation handler. Return true to proceed with deletion.
#### Parameters
##### voicemailId
`string`
#### Returns
`Promise`\<`boolean`\>
***
### onLoadError?
```ts
optional onLoadError?: (event) => void;
```
Defined in: [sdk/src/react/Voicemails.tsx:98](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/Voicemails.tsx#L98)
Callback when there's an error loading voicemails
#### Parameters
##### event
[`LoadError`](../../index/interfaces/LoadError.md)
#### Returns
`void`
***
### onLoaderStart?
```ts
optional onLoaderStart?: (event) => void;
```
Defined in: [sdk/src/react/Voicemails.tsx:93](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/Voicemails.tsx#L93)
Callback when component starts loading
#### Parameters
##### event
[`LoaderStart`](../../index/interfaces/LoaderStart.md)
#### Returns
`void`
***
### onVoicemailDelete?
```ts
optional onVoicemailDelete?: (event) => void;
```
Defined in: [sdk/src/react/Voicemails.tsx:118](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/Voicemails.tsx#L118)
Callback when a voicemail is deleted
#### Parameters
##### event
###### voicemailId
`string`
#### Returns
`void`
***
### onVoicemailPause?
```ts
optional onVoicemailPause?: (event) => void;
```
Defined in: [sdk/src/react/Voicemails.tsx:113](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/Voicemails.tsx#L113)
Callback when a voicemail is paused
#### Parameters
##### event
###### voicemailId
`string`
#### Returns
`void`
***
### onVoicemailPlay?
```ts
optional onVoicemailPlay?: (event) => void;
```
Defined in: [sdk/src/react/Voicemails.tsx:108](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/Voicemails.tsx#L108)
Callback when a voicemail starts playing
#### Parameters
##### event
###### voicemailId
`string`
#### Returns
`void`
***
### onVoicemailSelect?
```ts
optional onVoicemailSelect?: (event) => void;
```
Defined in: [sdk/src/react/Voicemails.tsx:103](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/Voicemails.tsx#L103)
Callback when a voicemail is selected
#### Parameters
##### event
###### voicemailId
`string`
#### Returns
`void`
***
### style?
```ts
optional style?: CSSProperties;
```
Defined in: [sdk/src/react/Voicemails.tsx:36](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/Voicemails.tsx#L36)
Optional inline styles
***
### userId
```ts
userId: string;
```
Defined in: [sdk/src/react/Voicemails.tsx:26](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/Voicemails.tsx#L26)
User ID to fetch voicemails for (required)
---
## Type Alias: DialPlanMode
[@dialstack/sdk](../../index.md) / [react](../index.md) / DialPlanMode
# Type Alias: DialPlanMode
```ts
type DialPlanMode = "view" | "edit" | "preview";
```
Defined in: [sdk/src/react/DialPlan.tsx:69](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/DialPlan.tsx#L69)
Display mode for the DialPlan component
---
## Type Alias: DialPlanNode
[@dialstack/sdk](../../index.md) / [react](../index.md) / DialPlanNode
# Type Alias: DialPlanNode
```ts
type DialPlanNode =
| ScheduleNode
| InternalDialNode
| RingAllUsersNode
| ExternalDialNode;
```
Defined in: [sdk/src/types/dial-plan.ts:113](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L113)
Union type for all dial plan node types.
---
## Type Alias: DialPlanNodeType
[@dialstack/sdk](../../index.md) / [react](../index.md) / DialPlanNodeType
# Type Alias: DialPlanNodeType
```ts
type DialPlanNodeType = "schedule" | "internal_dial" | "ring_all_users" | "external_dial";
```
Defined in: [sdk/src/types/dial-plan.ts:66](https://github.com/dialstack/dialstack-sdk/blob/main/src/types/dial-plan.ts#L66)
Supported dial plan node types (as sent by the API)
---
## Type Alias: ResourceType
[@dialstack/sdk](../../index.md) / [react](../index.md) / ResourceType
# Type Alias: ResourceType
```ts
type ResourceType =
| "schedule"
| "user"
| "ring_group"
| "dial_plan"
| "voice_app"
| "shared_voicemail";
```
Defined in: [sdk/src/react/dial-plan/registry-types.ts:13](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/dial-plan/registry-types.ts#L13)
---
## Variable: CallHistory
[@dialstack/sdk](../../index.md) / [react](../index.md) / CallHistory
# Variable: CallHistory
```ts
const CallHistory: React.FC;
```
Defined in: [sdk/src/react/CallHistory.tsx:109](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/CallHistory.tsx#L109)
CallHistory component displays recent calls for a specific phone number
Must be used within a DialstackComponentsProvider.
## Example
```tsx
```
---
## Variable: CallLogs
[@dialstack/sdk](../../index.md) / [react](../index.md) / CallLogs
# Variable: CallLogs
```ts
const CallLogs: React.FC;
```
Defined in: [sdk/src/react/CallLogs.tsx:127](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/CallLogs.tsx#L127)
CallLogs component displays a list of call logs for the authenticated account
Uses URL-based pagination with previous/next navigation. The component automatically
handles pagination state internally using the API's next_page_url and previous_page_url.
Must be used within a DialstackComponentsProvider.
## Example
```tsx
console.error(e.error)}
onRowClick={(e) => console.log('Selected call:', e.callId)}
/>
```
---
## Variable: DialPlan
[@dialstack/sdk](../../index.md) / [react](../index.md) / DialPlan
# Variable: DialPlan
```ts
const DialPlan: ForwardRefExoticComponent>;
```
Defined in: [sdk/src/react/DialPlan.tsx:1157](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/DialPlan.tsx#L1157)
---
## Variable: DialstackComponentsProvider
[@dialstack/sdk](../../index.md) / [react](../index.md) / DialstackComponentsProvider
# Variable: DialstackComponentsProvider
```ts
const DialstackComponentsProvider: React.FC;
```
Defined in: [sdk/src/react/DialstackComponentsProvider.tsx:46](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/DialstackComponentsProvider.tsx#L46)
Provider component that makes DialStack instance available to child components
## Example
```tsx
const dialstack = await loadDialstackAndInitialize({
publishableKey: 'pk_test_...',
fetchClientSecret: async () => {
const res = await fetch('/api/dialstack/session');
return (await res.json()).clientSecret;
}
});
```
---
## Variable: PhoneNumberOrdering
[@dialstack/sdk](../../index.md) / [react](../index.md) / PhoneNumberOrdering
# Variable: PhoneNumberOrdering
```ts
const PhoneNumberOrdering: React.FC;
```
Defined in: [sdk/src/react/PhoneNumberOrdering.tsx:100](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/PhoneNumberOrdering.tsx#L100)
PhoneNumberOrdering component enables searching and ordering phone numbers
Multi-step flow: search → results → confirm → order → complete
Must be used within a DialstackComponentsProvider.
## Example
```tsx
console.log('Ordered:', e.orderId)}
onOrderError={(e) => console.error('Failed:', e.error)}
/>
```
---
## Variable: PhoneNumbers
[@dialstack/sdk](../../index.md) / [react](../index.md) / PhoneNumbers
# Variable: PhoneNumbers
```ts
const PhoneNumbers: React.FC;
```
Defined in: [sdk/src/react/PhoneNumbers.tsx:94](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/PhoneNumbers.tsx#L94)
PhoneNumbers component displays a unified list of all phone numbers for the authenticated account.
Merges data from DIDs, number orders, and port orders into a single table with client-side pagination.
Must be used within a DialstackComponentsProvider.
## Example
```tsx
console.log('Selected:', e.phoneNumber)}
/>
```
---
## Variable: Voicemails
[@dialstack/sdk](../../index.md) / [react](../index.md) / Voicemails
# Variable: Voicemails
```ts
const Voicemails: React.FC;
```
Defined in: [sdk/src/react/Voicemails.tsx:148](https://github.com/dialstack/dialstack-sdk/blob/main/src/react/Voicemails.tsx#L148)
Voicemails component displays a list of voicemails for a specific user
Must be used within a DialstackComponentsProvider.
## Example
```tsx
console.error(e.error)}
onVoicemailSelect={(e) => console.log('Selected:', e.voicemailId)}
onCallBack={(e) => initiateCall(e.phoneNumber)}
/>
```
---
## Class: DialStack
[@dialstack/sdk](../../index.md) / [server](../index.md) / DialStack
# Class: DialStack
Defined in: [sdk/src/server/index.ts:669](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L669)
## Constructors
### Constructor
```ts
new DialStack(apiKey, config?): DialStack;
```
Defined in: [sdk/src/server/index.ts:680](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L680)
#### Parameters
##### apiKey
`string` \| `undefined`
##### config?
[`DialStackConfig`](../interfaces/DialStackConfig.md)
#### Returns
`DialStack`
## Properties
### accounts
```ts
accounts: object;
```
Defined in: [sdk/src/server/index.ts:917](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L917)
#### create
```ts
create: (params?, options?) => Promise;
```
##### Parameters
###### params?
[`AccountCreateParams`](../interfaces/AccountCreateParams.md)
###### options?
[`RequestOptions`](../interfaces/RequestOptions.md)
##### Returns
`Promise`\<[`Account`](../interfaces/Account.md)\>
#### del
```ts
del: (accountId, options?) => Promise;
```
##### Parameters
###### accountId
`string`
###### options?
[`RequestOptions`](../interfaces/RequestOptions.md)
##### Returns
`Promise`\<`void`\>
#### list
```ts
list: (params?, options?) => PaginatedList;
```
##### Parameters
###### params?
[`AccountListParams`](../interfaces/AccountListParams.md)
###### options?
[`RequestOptions`](../interfaces/RequestOptions.md)
##### Returns
[`PaginatedList`](../interfaces/PaginatedList.md)\<[`Account`](../interfaces/Account.md)\>
#### retrieve
```ts
retrieve: (accountId, options?) => Promise;
```
##### Parameters
###### accountId
`string`
###### options?
[`RequestOptions`](../interfaces/RequestOptions.md)
##### Returns
`Promise`\<[`Account`](../interfaces/Account.md)\>
#### update
```ts
update: (accountId, params, options?) => Promise;
```
##### Parameters
###### accountId
`string`
###### params
[`AccountUpdateParams`](../interfaces/AccountUpdateParams.md)
###### options?
[`RequestOptions`](../interfaces/RequestOptions.md)
##### Returns
`Promise`\<[`Account`](../interfaces/Account.md)\>
***
### accountSessions
```ts
accountSessions: object;
```
Defined in: [sdk/src/server/index.ts:1024](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L1024)
#### create
```ts
create: (params, options?) => Promise;
```
##### Parameters
###### params
[`AccountSessionCreateParams`](../interfaces/AccountSessionCreateParams.md)
###### options?
[`RequestOptions`](../interfaces/RequestOptions.md)
##### Returns
`Promise`\<[`AccountSessionCreateResponse`](../interfaces/AccountSessionCreateResponse.md)\>
***
### calls
```ts
calls: object;
```
Defined in: [sdk/src/server/index.ts:1033](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L1033)
#### retrieveTranscript
```ts
retrieveTranscript: (callId, options?) => Promise;
```
##### Parameters
###### callId
`string`
###### options?
[`RequestOptions`](../interfaces/RequestOptions.md)
##### Returns
`Promise`\<[`Transcript`](../interfaces/Transcript.md)\>
#### update
```ts
update: (callId, params, options) => Promise;
```
##### Parameters
###### callId
`string`
###### params
[`CallUpdateParams`](../interfaces/CallUpdateParams.md)
###### options
[`RequestOptions`](../interfaces/RequestOptions.md) & `object`
##### Returns
`Promise`\<`void`\>
***
### dialPlans
```ts
dialPlans: object;
```
Defined in: [sdk/src/server/index.ts:1130](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L1130)
#### create
```ts
create: (params, options) => Promise;
```
##### Parameters
###### params
[`DialPlanCreateParams`](../interfaces/DialPlanCreateParams.md)
###### options
[`RequestOptions`](../interfaces/RequestOptions.md) & `object`
##### Returns
`Promise`\<[`DialPlan`](../interfaces/DialPlan.md)\>
#### list
```ts
list: (params, options) => PaginatedList;
```
##### Parameters
###### params
[`DialPlanListParams`](../interfaces/DialPlanListParams.md) \| `undefined`
###### options
[`RequestOptions`](../interfaces/RequestOptions.md) & `object`
##### Returns
[`PaginatedList`](../interfaces/PaginatedList.md)\<[`DialPlan`](../interfaces/DialPlan.md)\>
#### retrieve
```ts
retrieve: (dialPlanId, options) => Promise;
```
##### Parameters
###### dialPlanId
`string`
###### options
[`RequestOptions`](../interfaces/RequestOptions.md) & `object`
##### Returns
`Promise`\<[`DialPlan`](../interfaces/DialPlan.md)\>
***
### extensions
```ts
extensions: object;
```
Defined in: [sdk/src/server/index.ts:1164](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L1164)
#### create
```ts
create: (params, options) => Promise;
```
##### Parameters
###### params
[`ExtensionCreateParams`](../interfaces/ExtensionCreateParams.md)
###### options
[`RequestOptions`](../interfaces/RequestOptions.md) & `object`
##### Returns
`Promise`\<[`Extension`](../interfaces/Extension.md)\>
#### del
```ts
del: (number, options) => Promise;
```
##### Parameters
###### number
`string`
###### options
[`RequestOptions`](../interfaces/RequestOptions.md) & `object`
##### Returns
`Promise`\<`void`\>
#### list
```ts
list: (params, options) => PaginatedList;
```
##### Parameters
###### params
\| [`ExtensionListParams`](../interfaces/ExtensionListParams.md)
\| `undefined`
###### options
[`RequestOptions`](../interfaces/RequestOptions.md) & `object`
##### Returns
[`PaginatedList`](../interfaces/PaginatedList.md)\<[`Extension`](../interfaces/Extension.md)\>
#### retrieve
```ts
retrieve: (number, options) => Promise;
```
##### Parameters
###### number
`string`
###### options
[`RequestOptions`](../interfaces/RequestOptions.md) & `object`
##### Returns
`Promise`\<[`Extension`](../interfaces/Extension.md)\>
#### update
```ts
update: (number, params, options) => Promise;
```
##### Parameters
###### number
`string`
###### params
[`ExtensionUpdateParams`](../interfaces/ExtensionUpdateParams.md)
###### options
[`RequestOptions`](../interfaces/RequestOptions.md) & `object`
##### Returns
`Promise`\<[`Extension`](../interfaces/Extension.md)\>
***
### phoneNumbers
```ts
phoneNumbers: object;
```
Defined in: [sdk/src/server/index.ts:1003](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L1003)
#### list
```ts
list: (params, options) => PaginatedList;
```
##### Parameters
###### params
\| [`PhoneNumberListParams`](../interfaces/PhoneNumberListParams.md)
\| `undefined`
###### options
[`RequestOptions`](../interfaces/RequestOptions.md) & `object`
##### Returns
[`PaginatedList`](../interfaces/PaginatedList.md)\<[`PhoneNumber`](../interfaces/PhoneNumber.md)\>
***
### queues
```ts
queues: object;
```
Defined in: [sdk/src/server/index.ts:1283](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L1283)
#### addMember
```ts
addMember: (queueId, params, options) => Promise;
```
##### Parameters
###### queueId
`string`
###### params
[`QueueAddMemberParams`](../interfaces/QueueAddMemberParams.md)
###### options
[`RequestOptions`](../interfaces/RequestOptions.md) & `object`
##### Returns
`Promise`\<[`QueueMember`](../interfaces/QueueMember.md)\>
#### create
```ts
create: (params, options) => Promise;
```
##### Parameters
###### params
[`QueueCreateParams`](../interfaces/QueueCreateParams.md)
###### options
[`RequestOptions`](../interfaces/RequestOptions.md) & `object`
##### Returns
`Promise`\<[`Queue`](../interfaces/Queue.md)\>
#### del
```ts
del: (queueId, options) => Promise;
```
##### Parameters
###### queueId
`string`
###### options
[`RequestOptions`](../interfaces/RequestOptions.md) & `object`
##### Returns
`Promise`\<`void`\>
#### list
```ts
list: (params, options) => PaginatedList;
```
##### Parameters
###### params
[`QueueListParams`](../interfaces/QueueListParams.md) \| `undefined`
###### options
[`RequestOptions`](../interfaces/RequestOptions.md) & `object`
##### Returns
[`PaginatedList`](../interfaces/PaginatedList.md)\<[`Queue`](../interfaces/Queue.md)\>
#### listMembers
```ts
listMembers: (queueId, params, options) => PaginatedList;
```
##### Parameters
###### queueId
`string`
###### params
\| [`QueueListMembersParams`](../interfaces/QueueListMembersParams.md)
\| `undefined`
###### options
[`RequestOptions`](../interfaces/RequestOptions.md) & `object`
##### Returns
[`PaginatedList`](../interfaces/PaginatedList.md)\<[`QueueMember`](../interfaces/QueueMember.md)\>
#### removeMember
```ts
removeMember: (queueId, memberId, options) => Promise;
```
##### Parameters
###### queueId
`string`
###### memberId
`string`
###### options
[`RequestOptions`](../interfaces/RequestOptions.md) & `object`
##### Returns
`Promise`\<`void`\>
#### retrieve
```ts
retrieve: (queueId, options) => Promise;
```
##### Parameters
###### queueId
`string`
###### options
[`RequestOptions`](../interfaces/RequestOptions.md) & `object`
##### Returns
`Promise`\<[`Queue`](../interfaces/Queue.md)\>
#### update
```ts
update: (queueId, params, options) => Promise;
```
##### Parameters
###### queueId
`string`
###### params
[`QueueUpdateParams`](../interfaces/QueueUpdateParams.md)
###### options
[`RequestOptions`](../interfaces/RequestOptions.md) & `object`
##### Returns
`Promise`\<[`Queue`](../interfaces/Queue.md)\>
***
### ringGroups
```ts
ringGroups: object;
```
Defined in: [sdk/src/server/index.ts:1213](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L1213)
#### addMember
```ts
addMember: (ringGroupId, params, options) => Promise;
```
##### Parameters
###### ringGroupId
`string`
###### params
[`RingGroupAddMemberParams`](../interfaces/RingGroupAddMemberParams.md)
###### options
[`RequestOptions`](../interfaces/RequestOptions.md) & `object`
##### Returns
`Promise`\<[`RingGroupMember`](../interfaces/RingGroupMember.md)\>
#### create
```ts
create: (params, options) => Promise;
```
##### Parameters
###### params
[`RingGroupCreateParams`](../interfaces/RingGroupCreateParams.md)
###### options
[`RequestOptions`](../interfaces/RequestOptions.md) & `object`
##### Returns
`Promise`\<[`RingGroup`](../interfaces/RingGroup.md)\>
#### del
```ts
del: (ringGroupId, options) => Promise;
```
##### Parameters
###### ringGroupId
`string`
###### options
[`RequestOptions`](../interfaces/RequestOptions.md) & `object`
##### Returns
`Promise`\<`void`\>
#### list
```ts
list: (params, options) => PaginatedList;
```
##### Parameters
###### params
\| [`RingGroupListParams`](../interfaces/RingGroupListParams.md)
\| `undefined`
###### options
[`RequestOptions`](../interfaces/RequestOptions.md) & `object`
##### Returns
[`PaginatedList`](../interfaces/PaginatedList.md)\<[`RingGroup`](../interfaces/RingGroup.md)\>
#### removeMember
```ts
removeMember: (ringGroupId, memberId, options) => Promise;
```
##### Parameters
###### ringGroupId
`string`
###### memberId
`string`
###### options
[`RequestOptions`](../interfaces/RequestOptions.md) & `object`
##### Returns
`Promise`\<`void`\>
#### retrieve
```ts
retrieve: (ringGroupId, options) => Promise;
```
##### Parameters
###### ringGroupId
`string`
###### options
[`RequestOptions`](../interfaces/RequestOptions.md) & `object`
##### Returns
`Promise`\<[`RingGroup`](../interfaces/RingGroup.md)\>
#### update
```ts
update: (ringGroupId, params, options) => Promise;
```
##### Parameters
###### ringGroupId
`string`
###### params
[`RingGroupUpdateParams`](../interfaces/RingGroupUpdateParams.md)
###### options
[`RequestOptions`](../interfaces/RequestOptions.md) & `object`
##### Returns
`Promise`\<[`RingGroup`](../interfaces/RingGroup.md)\>
***
### schedules
```ts
schedules: object;
```
Defined in: [sdk/src/server/index.ts:1096](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L1096)
#### create
```ts
create: (params, options) => Promise;
```
##### Parameters
###### params
[`ScheduleCreateParams`](../interfaces/ScheduleCreateParams.md)
###### options
[`RequestOptions`](../interfaces/RequestOptions.md) & `object`
##### Returns
`Promise`\<[`Schedule`](../interfaces/Schedule.md)\>
#### list
```ts
list: (params, options) => PaginatedList;
```
##### Parameters
###### params
[`ScheduleListParams`](../interfaces/ScheduleListParams.md) \| `undefined`
###### options
[`RequestOptions`](../interfaces/RequestOptions.md) & `object`
##### Returns
[`PaginatedList`](../interfaces/PaginatedList.md)\<[`Schedule`](../interfaces/Schedule.md)\>
#### retrieve
```ts
retrieve: (scheduleId, options) => Promise;
```
##### Parameters
###### scheduleId
`string`
###### options
[`RequestOptions`](../interfaces/RequestOptions.md) & `object`
##### Returns
`Promise`\<[`Schedule`](../interfaces/Schedule.md)\>
***
### users
```ts
users: object;
```
Defined in: [sdk/src/server/index.ts:954](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L954)
#### create
```ts
create: (params, options) => Promise;
```
##### Parameters
###### params
[`UserCreateParams`](../interfaces/UserCreateParams.md) \| `undefined`
###### options
[`RequestOptions`](../interfaces/RequestOptions.md) & `object`
##### Returns
`Promise`\<[`User`](../interfaces/User.md)\>
#### del
```ts
del: (userId, options) => Promise;
```
##### Parameters
###### userId
`string`
###### options
[`RequestOptions`](../interfaces/RequestOptions.md) & `object`
##### Returns
`Promise`\<`void`\>
#### list
```ts
list: (params, options) => PaginatedList;
```
##### Parameters
###### params
[`UserListParams`](../interfaces/UserListParams.md) \| `undefined`
###### options
[`RequestOptions`](../interfaces/RequestOptions.md) & `object`
##### Returns
[`PaginatedList`](../interfaces/PaginatedList.md)\<[`User`](../interfaces/User.md)\>
#### retrieve
```ts
retrieve: (userId, options) => Promise;
```
##### Parameters
###### userId
`string`
###### options
[`RequestOptions`](../interfaces/RequestOptions.md) & `object`
##### Returns
`Promise`\<[`User`](../interfaces/User.md)\>
#### update
```ts
update: (userId, params, options) => Promise;
```
##### Parameters
###### userId
`string`
###### params
[`UserUpdateParams`](../interfaces/UserUpdateParams.md)
###### options
[`RequestOptions`](../interfaces/RequestOptions.md) & `object`
##### Returns
`Promise`\<[`User`](../interfaces/User.md)\>
***
### voiceApps
```ts
voiceApps: object;
```
Defined in: [sdk/src/server/index.ts:1047](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L1047)
#### create
```ts
create: (params, options) => Promise;
```
##### Parameters
###### params
[`VoiceAppCreateParams`](../interfaces/VoiceAppCreateParams.md)
###### options
[`RequestOptions`](../interfaces/RequestOptions.md) & `object`
##### Returns
`Promise`\<[`VoiceApp`](../interfaces/VoiceApp.md)\>
#### del
```ts
del: (voiceAppId, options) => Promise;
```
##### Parameters
###### voiceAppId
`string`
###### options
[`RequestOptions`](../interfaces/RequestOptions.md) & `object`
##### Returns
`Promise`\<`void`\>
#### list
```ts
list: (params, options) => PaginatedList;
```
##### Parameters
###### params
[`VoiceAppListParams`](../interfaces/VoiceAppListParams.md) \| `undefined`
###### options
[`RequestOptions`](../interfaces/RequestOptions.md) & `object`
##### Returns
[`PaginatedList`](../interfaces/PaginatedList.md)\<[`VoiceApp`](../interfaces/VoiceApp.md)\>
#### retrieve
```ts
retrieve: (voiceAppId, options) => Promise;
```
##### Parameters
###### voiceAppId
`string`
###### options
[`RequestOptions`](../interfaces/RequestOptions.md) & `object`
##### Returns
`Promise`\<[`VoiceApp`](../interfaces/VoiceApp.md)\>
#### update
```ts
update: (voiceAppId, params, options) => Promise;
```
##### Parameters
###### voiceAppId
`string`
###### params
[`VoiceAppUpdateParams`](../interfaces/VoiceAppUpdateParams.md)
###### options
[`RequestOptions`](../interfaces/RequestOptions.md) & `object`
##### Returns
`Promise`\<[`VoiceApp`](../interfaces/VoiceApp.md)\>
***
### webhooks
```ts
static webhooks: object;
```
Defined in: [sdk/src/server/index.ts:1397](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L1397)
Verify webhook signature and construct event
#### constructEvent
```ts
constructEvent: (payload, signature, secret, tolerance) => T;
```
##### Type Parameters
###### T
`T` = [`WebhookEvent`](../interfaces/WebhookEvent.md)
##### Parameters
###### payload
`string` \| `Buffer`\<`ArrayBufferLike`\>
###### signature
`string`
###### secret
`string`
###### tolerance?
`number` = `300`
##### Returns
`T`
#### Example
```typescript
// For call webhooks
const event = DialStack.webhooks.constructEvent(
req.body,
req.headers['x-dialstack-signature'],
process.env.DIALSTACK_WEBHOOK_SECRET
);
// For appointments webhooks (with type parameter)
const event = DialStack.webhooks.constructEvent(
req.body,
req.headers['x-dialstack-signature'],
process.env.DIALSTACK_WEBHOOK_SECRET
);
```
## Methods
### off()
```ts
off(event, callback): void;
```
Defined in: [sdk/src/server/index.ts:728](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L728)
Unsubscribe from SDK events
#### Type Parameters
##### E
`E` *extends* `EventType`
#### Parameters
##### event
`E`
##### callback
`EventCallback`\<`E` *extends* `"request"` ? [`RequestEvent`](../interfaces/RequestEvent.md) : [`ResponseEvent`](../interfaces/ResponseEvent.md)\>
#### Returns
`void`
***
### on()
```ts
on(event, callback): void;
```
Defined in: [sdk/src/server/index.ts:714](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L714)
Subscribe to SDK events
#### Type Parameters
##### E
`E` *extends* `EventType`
#### Parameters
##### event
`E`
##### callback
`EventCallback`\<`E` *extends* `"request"` ? [`RequestEvent`](../interfaces/RequestEvent.md) : [`ResponseEvent`](../interfaces/ResponseEvent.md)\>
#### Returns
`void`
#### Example
```typescript
dialstack.on('request', (event) => {
console.log(`${event.method} ${event.path}`);
});
dialstack.on('response', (event) => {
console.log(`${event.statusCode} in ${event.elapsed}ms`);
});
```
---
## Class: DialStackAPIError
[@dialstack/sdk](../../index.md) / [server](../index.md) / DialStackAPIError
# Class: DialStackAPIError
Defined in: [sdk/src/server/errors.ts:196](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L196)
API error (5xx)
Server-side error
## Extends
- [`DialStackError`](DialStackError.md)
## Constructors
### Constructor
```ts
new DialStackAPIError(message, options): DialStackAPIError;
```
Defined in: [sdk/src/server/errors.ts:197](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L197)
#### Parameters
##### message
`string`
##### options
###### code?
`string`
###### docUrl?
`string`
###### param?
`string`
###### raw?
`RawError`
###### requestId?
`string`
###### statusCode
`number`
###### type?
`RawErrorType`
#### Returns
`DialStackAPIError`
#### Overrides
[`DialStackError`](DialStackError.md).[`constructor`](DialStackError.md#constructor)
## Properties
### code?
```ts
readonly optional code?: string;
```
Defined in: [sdk/src/server/errors.ts:31](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L31)
#### Inherited from
[`DialStackError`](DialStackError.md).[`code`](DialStackError.md#code)
***
### docUrl?
```ts
readonly optional docUrl?: string;
```
Defined in: [sdk/src/server/errors.ts:33](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L33)
#### Inherited from
[`DialStackError`](DialStackError.md).[`docUrl`](DialStackError.md#docurl)
***
### message
```ts
message: string;
```
Defined in: docs/node\_modules/typescript/lib/lib.es5.d.ts:1075
#### Inherited from
[`DialStackError`](DialStackError.md).[`message`](DialStackError.md#message)
***
### name
```ts
name: string;
```
Defined in: docs/node\_modules/typescript/lib/lib.es5.d.ts:1074
#### Inherited from
[`DialStackError`](DialStackError.md).[`name`](DialStackError.md#name)
***
### param?
```ts
readonly optional param?: string;
```
Defined in: [sdk/src/server/errors.ts:32](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L32)
#### Inherited from
[`DialStackError`](DialStackError.md).[`param`](DialStackError.md#param)
***
### raw?
```ts
readonly optional raw?: RawError;
```
Defined in: [sdk/src/server/errors.ts:34](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L34)
#### Inherited from
[`DialStackError`](DialStackError.md).[`raw`](DialStackError.md#raw)
***
### requestId?
```ts
readonly optional requestId?: string;
```
Defined in: [sdk/src/server/errors.ts:30](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L30)
#### Inherited from
[`DialStackError`](DialStackError.md).[`requestId`](DialStackError.md#requestid)
***
### stack?
```ts
optional stack?: string;
```
Defined in: docs/node\_modules/typescript/lib/lib.es5.d.ts:1076
#### Inherited from
[`DialStackError`](DialStackError.md).[`stack`](DialStackError.md#stack)
***
### statusCode
```ts
readonly statusCode: number;
```
Defined in: [sdk/src/server/errors.ts:29](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L29)
#### Inherited from
[`DialStackError`](DialStackError.md).[`statusCode`](DialStackError.md#statuscode)
***
### type
```ts
readonly type: RawErrorType;
```
Defined in: [sdk/src/server/errors.ts:28](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L28)
#### Inherited from
[`DialStackError`](DialStackError.md).[`type`](DialStackError.md#type)
***
### stackTraceLimit
```ts
static stackTraceLimit: number;
```
Defined in: node\_modules/@types/node/globals.d.ts:67
The `Error.stackTraceLimit` property specifies the number of stack frames
collected by a stack trace (whether generated by `new Error().stack` or
`Error.captureStackTrace(obj)`).
The default value is `10` but may be set to any valid JavaScript number. Changes
will affect any stack trace captured _after_ the value has been changed.
If set to a non-number value, or set to a negative number, stack traces will
not capture any frames.
#### Inherited from
[`DialStackError`](DialStackError.md).[`stackTraceLimit`](DialStackError.md#stacktracelimit)
## Methods
### captureStackTrace()
```ts
static captureStackTrace(targetObject, constructorOpt?): void;
```
Defined in: node\_modules/@types/node/globals.d.ts:51
Creates a `.stack` property on `targetObject`, which when accessed returns
a string representing the location in the code at which
`Error.captureStackTrace()` was called.
```js
const myObject = {};
Error.captureStackTrace(myObject);
myObject.stack; // Similar to `new Error().stack`
```
The first line of the trace will be prefixed with
`${myObject.name}: ${myObject.message}`.
The optional `constructorOpt` argument accepts a function. If given, all frames
above `constructorOpt`, including `constructorOpt`, will be omitted from the
generated stack trace.
The `constructorOpt` argument is useful for hiding implementation
details of error generation from the user. For instance:
```js
function a() {
b();
}
function b() {
c();
}
function c() {
// Create an error without stack trace to avoid calculating the stack trace twice.
const { stackTraceLimit } = Error;
Error.stackTraceLimit = 0;
const error = new Error();
Error.stackTraceLimit = stackTraceLimit;
// Capture the stack trace above function b
Error.captureStackTrace(error, b); // Neither function c, nor b is included in the stack trace
throw error;
}
a();
```
#### Parameters
##### targetObject
`object`
##### constructorOpt?
`Function`
#### Returns
`void`
#### Inherited from
[`DialStackError`](DialStackError.md).[`captureStackTrace`](DialStackError.md#capturestacktrace)
***
### generate()
```ts
static generate(
message,
statusCode,
raw?,
requestId?): DialStackError;
```
Defined in: [sdk/src/server/errors.ts:67](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L67)
Generate appropriate error subclass based on status code and error type
#### Parameters
##### message
`string`
##### statusCode
`number`
##### raw?
`RawError`
##### requestId?
`string`
#### Returns
[`DialStackError`](DialStackError.md)
#### Inherited from
[`DialStackError`](DialStackError.md).[`generate`](DialStackError.md#generate)
***
### prepareStackTrace()
```ts
static prepareStackTrace(err, stackTraces): any;
```
Defined in: node\_modules/@types/node/globals.d.ts:55
#### Parameters
##### err
`Error`
##### stackTraces
`CallSite`[]
#### Returns
`any`
#### See
https://v8.dev/docs/stack-trace-api#customizing-stack-traces
#### Inherited from
[`DialStackError`](DialStackError.md).[`prepareStackTrace`](DialStackError.md#preparestacktrace)
---
## Class: DialStackAuthenticationError
[@dialstack/sdk](../../index.md) / [server](../index.md) / DialStackAuthenticationError
# Class: DialStackAuthenticationError
Defined in: [sdk/src/server/errors.ts:113](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L113)
Authentication failed (401)
API key is invalid, expired, or missing
## Extends
- [`DialStackError`](DialStackError.md)
## Constructors
### Constructor
```ts
new DialStackAuthenticationError(message, options): DialStackAuthenticationError;
```
Defined in: [sdk/src/server/errors.ts:114](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L114)
#### Parameters
##### message
`string`
##### options
###### code?
`string`
###### docUrl?
`string`
###### param?
`string`
###### raw?
`RawError`
###### requestId?
`string`
###### statusCode
`number`
###### type?
`RawErrorType`
#### Returns
`DialStackAuthenticationError`
#### Overrides
[`DialStackError`](DialStackError.md).[`constructor`](DialStackError.md#constructor)
## Properties
### code?
```ts
readonly optional code?: string;
```
Defined in: [sdk/src/server/errors.ts:31](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L31)
#### Inherited from
[`DialStackError`](DialStackError.md).[`code`](DialStackError.md#code)
***
### docUrl?
```ts
readonly optional docUrl?: string;
```
Defined in: [sdk/src/server/errors.ts:33](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L33)
#### Inherited from
[`DialStackError`](DialStackError.md).[`docUrl`](DialStackError.md#docurl)
***
### message
```ts
message: string;
```
Defined in: docs/node\_modules/typescript/lib/lib.es5.d.ts:1075
#### Inherited from
[`DialStackError`](DialStackError.md).[`message`](DialStackError.md#message)
***
### name
```ts
name: string;
```
Defined in: docs/node\_modules/typescript/lib/lib.es5.d.ts:1074
#### Inherited from
[`DialStackError`](DialStackError.md).[`name`](DialStackError.md#name)
***
### param?
```ts
readonly optional param?: string;
```
Defined in: [sdk/src/server/errors.ts:32](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L32)
#### Inherited from
[`DialStackError`](DialStackError.md).[`param`](DialStackError.md#param)
***
### raw?
```ts
readonly optional raw?: RawError;
```
Defined in: [sdk/src/server/errors.ts:34](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L34)
#### Inherited from
[`DialStackError`](DialStackError.md).[`raw`](DialStackError.md#raw)
***
### requestId?
```ts
readonly optional requestId?: string;
```
Defined in: [sdk/src/server/errors.ts:30](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L30)
#### Inherited from
[`DialStackError`](DialStackError.md).[`requestId`](DialStackError.md#requestid)
***
### stack?
```ts
optional stack?: string;
```
Defined in: docs/node\_modules/typescript/lib/lib.es5.d.ts:1076
#### Inherited from
[`DialStackError`](DialStackError.md).[`stack`](DialStackError.md#stack)
***
### statusCode
```ts
readonly statusCode: number;
```
Defined in: [sdk/src/server/errors.ts:29](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L29)
#### Inherited from
[`DialStackError`](DialStackError.md).[`statusCode`](DialStackError.md#statuscode)
***
### type
```ts
readonly type: RawErrorType;
```
Defined in: [sdk/src/server/errors.ts:28](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L28)
#### Inherited from
[`DialStackError`](DialStackError.md).[`type`](DialStackError.md#type)
***
### stackTraceLimit
```ts
static stackTraceLimit: number;
```
Defined in: node\_modules/@types/node/globals.d.ts:67
The `Error.stackTraceLimit` property specifies the number of stack frames
collected by a stack trace (whether generated by `new Error().stack` or
`Error.captureStackTrace(obj)`).
The default value is `10` but may be set to any valid JavaScript number. Changes
will affect any stack trace captured _after_ the value has been changed.
If set to a non-number value, or set to a negative number, stack traces will
not capture any frames.
#### Inherited from
[`DialStackError`](DialStackError.md).[`stackTraceLimit`](DialStackError.md#stacktracelimit)
## Methods
### captureStackTrace()
```ts
static captureStackTrace(targetObject, constructorOpt?): void;
```
Defined in: node\_modules/@types/node/globals.d.ts:51
Creates a `.stack` property on `targetObject`, which when accessed returns
a string representing the location in the code at which
`Error.captureStackTrace()` was called.
```js
const myObject = {};
Error.captureStackTrace(myObject);
myObject.stack; // Similar to `new Error().stack`
```
The first line of the trace will be prefixed with
`${myObject.name}: ${myObject.message}`.
The optional `constructorOpt` argument accepts a function. If given, all frames
above `constructorOpt`, including `constructorOpt`, will be omitted from the
generated stack trace.
The `constructorOpt` argument is useful for hiding implementation
details of error generation from the user. For instance:
```js
function a() {
b();
}
function b() {
c();
}
function c() {
// Create an error without stack trace to avoid calculating the stack trace twice.
const { stackTraceLimit } = Error;
Error.stackTraceLimit = 0;
const error = new Error();
Error.stackTraceLimit = stackTraceLimit;
// Capture the stack trace above function b
Error.captureStackTrace(error, b); // Neither function c, nor b is included in the stack trace
throw error;
}
a();
```
#### Parameters
##### targetObject
`object`
##### constructorOpt?
`Function`
#### Returns
`void`
#### Inherited from
[`DialStackError`](DialStackError.md).[`captureStackTrace`](DialStackError.md#capturestacktrace)
***
### generate()
```ts
static generate(
message,
statusCode,
raw?,
requestId?): DialStackError;
```
Defined in: [sdk/src/server/errors.ts:67](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L67)
Generate appropriate error subclass based on status code and error type
#### Parameters
##### message
`string`
##### statusCode
`number`
##### raw?
`RawError`
##### requestId?
`string`
#### Returns
[`DialStackError`](DialStackError.md)
#### Inherited from
[`DialStackError`](DialStackError.md).[`generate`](DialStackError.md#generate)
***
### prepareStackTrace()
```ts
static prepareStackTrace(err, stackTraces): any;
```
Defined in: node\_modules/@types/node/globals.d.ts:55
#### Parameters
##### err
`Error`
##### stackTraces
`CallSite`[]
#### Returns
`any`
#### See
https://v8.dev/docs/stack-trace-api#customizing-stack-traces
#### Inherited from
[`DialStackError`](DialStackError.md).[`prepareStackTrace`](DialStackError.md#preparestacktrace)
---
## Class: DialStackConflictError
[@dialstack/sdk](../../index.md) / [server](../index.md) / DialStackConflictError
# Class: DialStackConflictError
Defined in: [sdk/src/server/errors.ts:145](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L145)
Conflict error (409)
Resource already exists or state conflict
## Extends
- [`DialStackError`](DialStackError.md)
## Constructors
### Constructor
```ts
new DialStackConflictError(message, options): DialStackConflictError;
```
Defined in: [sdk/src/server/errors.ts:146](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L146)
#### Parameters
##### message
`string`
##### options
###### code?
`string`
###### docUrl?
`string`
###### param?
`string`
###### raw?
`RawError`
###### requestId?
`string`
###### statusCode
`number`
###### type?
`RawErrorType`
#### Returns
`DialStackConflictError`
#### Overrides
[`DialStackError`](DialStackError.md).[`constructor`](DialStackError.md#constructor)
## Properties
### code?
```ts
readonly optional code?: string;
```
Defined in: [sdk/src/server/errors.ts:31](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L31)
#### Inherited from
[`DialStackError`](DialStackError.md).[`code`](DialStackError.md#code)
***
### docUrl?
```ts
readonly optional docUrl?: string;
```
Defined in: [sdk/src/server/errors.ts:33](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L33)
#### Inherited from
[`DialStackError`](DialStackError.md).[`docUrl`](DialStackError.md#docurl)
***
### message
```ts
message: string;
```
Defined in: docs/node\_modules/typescript/lib/lib.es5.d.ts:1075
#### Inherited from
[`DialStackError`](DialStackError.md).[`message`](DialStackError.md#message)
***
### name
```ts
name: string;
```
Defined in: docs/node\_modules/typescript/lib/lib.es5.d.ts:1074
#### Inherited from
[`DialStackError`](DialStackError.md).[`name`](DialStackError.md#name)
***
### param?
```ts
readonly optional param?: string;
```
Defined in: [sdk/src/server/errors.ts:32](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L32)
#### Inherited from
[`DialStackError`](DialStackError.md).[`param`](DialStackError.md#param)
***
### raw?
```ts
readonly optional raw?: RawError;
```
Defined in: [sdk/src/server/errors.ts:34](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L34)
#### Inherited from
[`DialStackError`](DialStackError.md).[`raw`](DialStackError.md#raw)
***
### requestId?
```ts
readonly optional requestId?: string;
```
Defined in: [sdk/src/server/errors.ts:30](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L30)
#### Inherited from
[`DialStackError`](DialStackError.md).[`requestId`](DialStackError.md#requestid)
***
### stack?
```ts
optional stack?: string;
```
Defined in: docs/node\_modules/typescript/lib/lib.es5.d.ts:1076
#### Inherited from
[`DialStackError`](DialStackError.md).[`stack`](DialStackError.md#stack)
***
### statusCode
```ts
readonly statusCode: number;
```
Defined in: [sdk/src/server/errors.ts:29](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L29)
#### Inherited from
[`DialStackError`](DialStackError.md).[`statusCode`](DialStackError.md#statuscode)
***
### type
```ts
readonly type: RawErrorType;
```
Defined in: [sdk/src/server/errors.ts:28](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L28)
#### Inherited from
[`DialStackError`](DialStackError.md).[`type`](DialStackError.md#type)
***
### stackTraceLimit
```ts
static stackTraceLimit: number;
```
Defined in: node\_modules/@types/node/globals.d.ts:67
The `Error.stackTraceLimit` property specifies the number of stack frames
collected by a stack trace (whether generated by `new Error().stack` or
`Error.captureStackTrace(obj)`).
The default value is `10` but may be set to any valid JavaScript number. Changes
will affect any stack trace captured _after_ the value has been changed.
If set to a non-number value, or set to a negative number, stack traces will
not capture any frames.
#### Inherited from
[`DialStackError`](DialStackError.md).[`stackTraceLimit`](DialStackError.md#stacktracelimit)
## Methods
### captureStackTrace()
```ts
static captureStackTrace(targetObject, constructorOpt?): void;
```
Defined in: node\_modules/@types/node/globals.d.ts:51
Creates a `.stack` property on `targetObject`, which when accessed returns
a string representing the location in the code at which
`Error.captureStackTrace()` was called.
```js
const myObject = {};
Error.captureStackTrace(myObject);
myObject.stack; // Similar to `new Error().stack`
```
The first line of the trace will be prefixed with
`${myObject.name}: ${myObject.message}`.
The optional `constructorOpt` argument accepts a function. If given, all frames
above `constructorOpt`, including `constructorOpt`, will be omitted from the
generated stack trace.
The `constructorOpt` argument is useful for hiding implementation
details of error generation from the user. For instance:
```js
function a() {
b();
}
function b() {
c();
}
function c() {
// Create an error without stack trace to avoid calculating the stack trace twice.
const { stackTraceLimit } = Error;
Error.stackTraceLimit = 0;
const error = new Error();
Error.stackTraceLimit = stackTraceLimit;
// Capture the stack trace above function b
Error.captureStackTrace(error, b); // Neither function c, nor b is included in the stack trace
throw error;
}
a();
```
#### Parameters
##### targetObject
`object`
##### constructorOpt?
`Function`
#### Returns
`void`
#### Inherited from
[`DialStackError`](DialStackError.md).[`captureStackTrace`](DialStackError.md#capturestacktrace)
***
### generate()
```ts
static generate(
message,
statusCode,
raw?,
requestId?): DialStackError;
```
Defined in: [sdk/src/server/errors.ts:67](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L67)
Generate appropriate error subclass based on status code and error type
#### Parameters
##### message
`string`
##### statusCode
`number`
##### raw?
`RawError`
##### requestId?
`string`
#### Returns
[`DialStackError`](DialStackError.md)
#### Inherited from
[`DialStackError`](DialStackError.md).[`generate`](DialStackError.md#generate)
***
### prepareStackTrace()
```ts
static prepareStackTrace(err, stackTraces): any;
```
Defined in: node\_modules/@types/node/globals.d.ts:55
#### Parameters
##### err
`Error`
##### stackTraces
`CallSite`[]
#### Returns
`any`
#### See
https://v8.dev/docs/stack-trace-api#customizing-stack-traces
#### Inherited from
[`DialStackError`](DialStackError.md).[`prepareStackTrace`](DialStackError.md#preparestacktrace)
---
## Class: DialStackConnectionError
[@dialstack/sdk](../../index.md) / [server](../index.md) / DialStackConnectionError
# Class: DialStackConnectionError
Defined in: [sdk/src/server/errors.ts:207](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L207)
Connection error
Network or connection failure
## Extends
- [`DialStackError`](DialStackError.md)
## Constructors
### Constructor
```ts
new DialStackConnectionError(message, options?): DialStackConnectionError;
```
Defined in: [sdk/src/server/errors.ts:210](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L210)
#### Parameters
##### message
`string`
##### options?
###### cause?
`Error`
#### Returns
`DialStackConnectionError`
#### Overrides
[`DialStackError`](DialStackError.md).[`constructor`](DialStackError.md#constructor)
## Properties
### code?
```ts
readonly optional code?: string;
```
Defined in: [sdk/src/server/errors.ts:31](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L31)
#### Inherited from
[`DialStackError`](DialStackError.md).[`code`](DialStackError.md#code)
***
### docUrl?
```ts
readonly optional docUrl?: string;
```
Defined in: [sdk/src/server/errors.ts:33](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L33)
#### Inherited from
[`DialStackError`](DialStackError.md).[`docUrl`](DialStackError.md#docurl)
***
### message
```ts
message: string;
```
Defined in: docs/node\_modules/typescript/lib/lib.es5.d.ts:1075
#### Inherited from
[`DialStackError`](DialStackError.md).[`message`](DialStackError.md#message)
***
### name
```ts
name: string;
```
Defined in: docs/node\_modules/typescript/lib/lib.es5.d.ts:1074
#### Inherited from
[`DialStackError`](DialStackError.md).[`name`](DialStackError.md#name)
***
### originalError?
```ts
readonly optional originalError?: Error;
```
Defined in: [sdk/src/server/errors.ts:208](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L208)
***
### param?
```ts
readonly optional param?: string;
```
Defined in: [sdk/src/server/errors.ts:32](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L32)
#### Inherited from
[`DialStackError`](DialStackError.md).[`param`](DialStackError.md#param)
***
### raw?
```ts
readonly optional raw?: RawError;
```
Defined in: [sdk/src/server/errors.ts:34](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L34)
#### Inherited from
[`DialStackError`](DialStackError.md).[`raw`](DialStackError.md#raw)
***
### requestId?
```ts
readonly optional requestId?: string;
```
Defined in: [sdk/src/server/errors.ts:30](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L30)
#### Inherited from
[`DialStackError`](DialStackError.md).[`requestId`](DialStackError.md#requestid)
***
### stack?
```ts
optional stack?: string;
```
Defined in: docs/node\_modules/typescript/lib/lib.es5.d.ts:1076
#### Inherited from
[`DialStackError`](DialStackError.md).[`stack`](DialStackError.md#stack)
***
### statusCode
```ts
readonly statusCode: number;
```
Defined in: [sdk/src/server/errors.ts:29](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L29)
#### Inherited from
[`DialStackError`](DialStackError.md).[`statusCode`](DialStackError.md#statuscode)
***
### type
```ts
readonly type: RawErrorType;
```
Defined in: [sdk/src/server/errors.ts:28](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L28)
#### Inherited from
[`DialStackError`](DialStackError.md).[`type`](DialStackError.md#type)
***
### stackTraceLimit
```ts
static stackTraceLimit: number;
```
Defined in: node\_modules/@types/node/globals.d.ts:67
The `Error.stackTraceLimit` property specifies the number of stack frames
collected by a stack trace (whether generated by `new Error().stack` or
`Error.captureStackTrace(obj)`).
The default value is `10` but may be set to any valid JavaScript number. Changes
will affect any stack trace captured _after_ the value has been changed.
If set to a non-number value, or set to a negative number, stack traces will
not capture any frames.
#### Inherited from
[`DialStackError`](DialStackError.md).[`stackTraceLimit`](DialStackError.md#stacktracelimit)
## Methods
### captureStackTrace()
```ts
static captureStackTrace(targetObject, constructorOpt?): void;
```
Defined in: node\_modules/@types/node/globals.d.ts:51
Creates a `.stack` property on `targetObject`, which when accessed returns
a string representing the location in the code at which
`Error.captureStackTrace()` was called.
```js
const myObject = {};
Error.captureStackTrace(myObject);
myObject.stack; // Similar to `new Error().stack`
```
The first line of the trace will be prefixed with
`${myObject.name}: ${myObject.message}`.
The optional `constructorOpt` argument accepts a function. If given, all frames
above `constructorOpt`, including `constructorOpt`, will be omitted from the
generated stack trace.
The `constructorOpt` argument is useful for hiding implementation
details of error generation from the user. For instance:
```js
function a() {
b();
}
function b() {
c();
}
function c() {
// Create an error without stack trace to avoid calculating the stack trace twice.
const { stackTraceLimit } = Error;
Error.stackTraceLimit = 0;
const error = new Error();
Error.stackTraceLimit = stackTraceLimit;
// Capture the stack trace above function b
Error.captureStackTrace(error, b); // Neither function c, nor b is included in the stack trace
throw error;
}
a();
```
#### Parameters
##### targetObject
`object`
##### constructorOpt?
`Function`
#### Returns
`void`
#### Inherited from
[`DialStackError`](DialStackError.md).[`captureStackTrace`](DialStackError.md#capturestacktrace)
***
### generate()
```ts
static generate(
message,
statusCode,
raw?,
requestId?): DialStackError;
```
Defined in: [sdk/src/server/errors.ts:67](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L67)
Generate appropriate error subclass based on status code and error type
#### Parameters
##### message
`string`
##### statusCode
`number`
##### raw?
`RawError`
##### requestId?
`string`
#### Returns
[`DialStackError`](DialStackError.md)
#### Inherited from
[`DialStackError`](DialStackError.md).[`generate`](DialStackError.md#generate)
***
### prepareStackTrace()
```ts
static prepareStackTrace(err, stackTraces): any;
```
Defined in: node\_modules/@types/node/globals.d.ts:55
#### Parameters
##### err
`Error`
##### stackTraces
`CallSite`[]
#### Returns
`any`
#### See
https://v8.dev/docs/stack-trace-api#customizing-stack-traces
#### Inherited from
[`DialStackError`](DialStackError.md).[`prepareStackTrace`](DialStackError.md#preparestacktrace)
---
## Class: DialStackError
[@dialstack/sdk](../../index.md) / [server](../index.md) / DialStackError
# Class: DialStackError
Defined in: [sdk/src/server/errors.ts:27](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L27)
Base error class for all DialStack errors
## Extends
- `Error`
## Extended by
- [`DialStackAuthenticationError`](DialStackAuthenticationError.md)
- [`DialStackPermissionError`](DialStackPermissionError.md)
- [`DialStackNotFoundError`](DialStackNotFoundError.md)
- [`DialStackConflictError`](DialStackConflictError.md)
- [`DialStackValidationError`](DialStackValidationError.md)
- [`DialStackInvalidRequestError`](DialStackInvalidRequestError.md)
- [`DialStackRateLimitError`](DialStackRateLimitError.md)
- [`DialStackAPIError`](DialStackAPIError.md)
- [`DialStackConnectionError`](DialStackConnectionError.md)
## Constructors
### Constructor
```ts
new DialStackError(message, options): DialStackError;
```
Defined in: [sdk/src/server/errors.ts:36](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L36)
#### Parameters
##### message
`string`
##### options
###### code?
`string`
###### docUrl?
`string`
###### param?
`string`
###### raw?
`RawError`
###### requestId?
`string`
###### statusCode
`number`
###### type?
`RawErrorType`
#### Returns
`DialStackError`
#### Overrides
```ts
Error.constructor
```
## Properties
### code?
```ts
readonly optional code?: string;
```
Defined in: [sdk/src/server/errors.ts:31](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L31)
***
### docUrl?
```ts
readonly optional docUrl?: string;
```
Defined in: [sdk/src/server/errors.ts:33](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L33)
***
### message
```ts
message: string;
```
Defined in: docs/node\_modules/typescript/lib/lib.es5.d.ts:1075
#### Inherited from
```ts
Error.message
```
***
### name
```ts
name: string;
```
Defined in: docs/node\_modules/typescript/lib/lib.es5.d.ts:1074
#### Inherited from
```ts
Error.name
```
***
### param?
```ts
readonly optional param?: string;
```
Defined in: [sdk/src/server/errors.ts:32](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L32)
***
### raw?
```ts
readonly optional raw?: RawError;
```
Defined in: [sdk/src/server/errors.ts:34](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L34)
***
### requestId?
```ts
readonly optional requestId?: string;
```
Defined in: [sdk/src/server/errors.ts:30](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L30)
***
### stack?
```ts
optional stack?: string;
```
Defined in: docs/node\_modules/typescript/lib/lib.es5.d.ts:1076
#### Inherited from
```ts
Error.stack
```
***
### statusCode
```ts
readonly statusCode: number;
```
Defined in: [sdk/src/server/errors.ts:29](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L29)
***
### type
```ts
readonly type: RawErrorType;
```
Defined in: [sdk/src/server/errors.ts:28](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L28)
***
### stackTraceLimit
```ts
static stackTraceLimit: number;
```
Defined in: node\_modules/@types/node/globals.d.ts:67
The `Error.stackTraceLimit` property specifies the number of stack frames
collected by a stack trace (whether generated by `new Error().stack` or
`Error.captureStackTrace(obj)`).
The default value is `10` but may be set to any valid JavaScript number. Changes
will affect any stack trace captured _after_ the value has been changed.
If set to a non-number value, or set to a negative number, stack traces will
not capture any frames.
#### Inherited from
```ts
Error.stackTraceLimit
```
## Methods
### captureStackTrace()
```ts
static captureStackTrace(targetObject, constructorOpt?): void;
```
Defined in: node\_modules/@types/node/globals.d.ts:51
Creates a `.stack` property on `targetObject`, which when accessed returns
a string representing the location in the code at which
`Error.captureStackTrace()` was called.
```js
const myObject = {};
Error.captureStackTrace(myObject);
myObject.stack; // Similar to `new Error().stack`
```
The first line of the trace will be prefixed with
`${myObject.name}: ${myObject.message}`.
The optional `constructorOpt` argument accepts a function. If given, all frames
above `constructorOpt`, including `constructorOpt`, will be omitted from the
generated stack trace.
The `constructorOpt` argument is useful for hiding implementation
details of error generation from the user. For instance:
```js
function a() {
b();
}
function b() {
c();
}
function c() {
// Create an error without stack trace to avoid calculating the stack trace twice.
const { stackTraceLimit } = Error;
Error.stackTraceLimit = 0;
const error = new Error();
Error.stackTraceLimit = stackTraceLimit;
// Capture the stack trace above function b
Error.captureStackTrace(error, b); // Neither function c, nor b is included in the stack trace
throw error;
}
a();
```
#### Parameters
##### targetObject
`object`
##### constructorOpt?
`Function`
#### Returns
`void`
#### Inherited from
```ts
Error.captureStackTrace
```
***
### generate()
```ts
static generate(
message,
statusCode,
raw?,
requestId?): DialStackError;
```
Defined in: [sdk/src/server/errors.ts:67](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L67)
Generate appropriate error subclass based on status code and error type
#### Parameters
##### message
`string`
##### statusCode
`number`
##### raw?
`RawError`
##### requestId?
`string`
#### Returns
`DialStackError`
***
### prepareStackTrace()
```ts
static prepareStackTrace(err, stackTraces): any;
```
Defined in: node\_modules/@types/node/globals.d.ts:55
#### Parameters
##### err
`Error`
##### stackTraces
`CallSite`[]
#### Returns
`any`
#### See
https://v8.dev/docs/stack-trace-api#customizing-stack-traces
#### Inherited from
```ts
Error.prepareStackTrace
```
---
## Class: DialStackInvalidRequestError
[@dialstack/sdk](../../index.md) / [server](../index.md) / DialStackInvalidRequestError
# Class: DialStackInvalidRequestError
Defined in: [sdk/src/server/errors.ts:167](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L167)
Invalid request (400)
Request parameters are invalid
## Extends
- [`DialStackError`](DialStackError.md)
## Constructors
### Constructor
```ts
new DialStackInvalidRequestError(message, options): DialStackInvalidRequestError;
```
Defined in: [sdk/src/server/errors.ts:168](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L168)
#### Parameters
##### message
`string`
##### options
###### code?
`string`
###### docUrl?
`string`
###### param?
`string`
###### raw?
`RawError`
###### requestId?
`string`
###### statusCode
`number`
###### type?
`RawErrorType`
#### Returns
`DialStackInvalidRequestError`
#### Overrides
[`DialStackError`](DialStackError.md).[`constructor`](DialStackError.md#constructor)
## Properties
### code?
```ts
readonly optional code?: string;
```
Defined in: [sdk/src/server/errors.ts:31](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L31)
#### Inherited from
[`DialStackError`](DialStackError.md).[`code`](DialStackError.md#code)
***
### docUrl?
```ts
readonly optional docUrl?: string;
```
Defined in: [sdk/src/server/errors.ts:33](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L33)
#### Inherited from
[`DialStackError`](DialStackError.md).[`docUrl`](DialStackError.md#docurl)
***
### message
```ts
message: string;
```
Defined in: docs/node\_modules/typescript/lib/lib.es5.d.ts:1075
#### Inherited from
[`DialStackError`](DialStackError.md).[`message`](DialStackError.md#message)
***
### name
```ts
name: string;
```
Defined in: docs/node\_modules/typescript/lib/lib.es5.d.ts:1074
#### Inherited from
[`DialStackError`](DialStackError.md).[`name`](DialStackError.md#name)
***
### param?
```ts
readonly optional param?: string;
```
Defined in: [sdk/src/server/errors.ts:32](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L32)
#### Inherited from
[`DialStackError`](DialStackError.md).[`param`](DialStackError.md#param)
***
### raw?
```ts
readonly optional raw?: RawError;
```
Defined in: [sdk/src/server/errors.ts:34](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L34)
#### Inherited from
[`DialStackError`](DialStackError.md).[`raw`](DialStackError.md#raw)
***
### requestId?
```ts
readonly optional requestId?: string;
```
Defined in: [sdk/src/server/errors.ts:30](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L30)
#### Inherited from
[`DialStackError`](DialStackError.md).[`requestId`](DialStackError.md#requestid)
***
### stack?
```ts
optional stack?: string;
```
Defined in: docs/node\_modules/typescript/lib/lib.es5.d.ts:1076
#### Inherited from
[`DialStackError`](DialStackError.md).[`stack`](DialStackError.md#stack)
***
### statusCode
```ts
readonly statusCode: number;
```
Defined in: [sdk/src/server/errors.ts:29](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L29)
#### Inherited from
[`DialStackError`](DialStackError.md).[`statusCode`](DialStackError.md#statuscode)
***
### type
```ts
readonly type: RawErrorType;
```
Defined in: [sdk/src/server/errors.ts:28](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L28)
#### Inherited from
[`DialStackError`](DialStackError.md).[`type`](DialStackError.md#type)
***
### stackTraceLimit
```ts
static stackTraceLimit: number;
```
Defined in: node\_modules/@types/node/globals.d.ts:67
The `Error.stackTraceLimit` property specifies the number of stack frames
collected by a stack trace (whether generated by `new Error().stack` or
`Error.captureStackTrace(obj)`).
The default value is `10` but may be set to any valid JavaScript number. Changes
will affect any stack trace captured _after_ the value has been changed.
If set to a non-number value, or set to a negative number, stack traces will
not capture any frames.
#### Inherited from
[`DialStackError`](DialStackError.md).[`stackTraceLimit`](DialStackError.md#stacktracelimit)
## Methods
### captureStackTrace()
```ts
static captureStackTrace(targetObject, constructorOpt?): void;
```
Defined in: node\_modules/@types/node/globals.d.ts:51
Creates a `.stack` property on `targetObject`, which when accessed returns
a string representing the location in the code at which
`Error.captureStackTrace()` was called.
```js
const myObject = {};
Error.captureStackTrace(myObject);
myObject.stack; // Similar to `new Error().stack`
```
The first line of the trace will be prefixed with
`${myObject.name}: ${myObject.message}`.
The optional `constructorOpt` argument accepts a function. If given, all frames
above `constructorOpt`, including `constructorOpt`, will be omitted from the
generated stack trace.
The `constructorOpt` argument is useful for hiding implementation
details of error generation from the user. For instance:
```js
function a() {
b();
}
function b() {
c();
}
function c() {
// Create an error without stack trace to avoid calculating the stack trace twice.
const { stackTraceLimit } = Error;
Error.stackTraceLimit = 0;
const error = new Error();
Error.stackTraceLimit = stackTraceLimit;
// Capture the stack trace above function b
Error.captureStackTrace(error, b); // Neither function c, nor b is included in the stack trace
throw error;
}
a();
```
#### Parameters
##### targetObject
`object`
##### constructorOpt?
`Function`
#### Returns
`void`
#### Inherited from
[`DialStackError`](DialStackError.md).[`captureStackTrace`](DialStackError.md#capturestacktrace)
***
### generate()
```ts
static generate(
message,
statusCode,
raw?,
requestId?): DialStackError;
```
Defined in: [sdk/src/server/errors.ts:67](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L67)
Generate appropriate error subclass based on status code and error type
#### Parameters
##### message
`string`
##### statusCode
`number`
##### raw?
`RawError`
##### requestId?
`string`
#### Returns
[`DialStackError`](DialStackError.md)
#### Inherited from
[`DialStackError`](DialStackError.md).[`generate`](DialStackError.md#generate)
***
### prepareStackTrace()
```ts
static prepareStackTrace(err, stackTraces): any;
```
Defined in: node\_modules/@types/node/globals.d.ts:55
#### Parameters
##### err
`Error`
##### stackTraces
`CallSite`[]
#### Returns
`any`
#### See
https://v8.dev/docs/stack-trace-api#customizing-stack-traces
#### Inherited from
[`DialStackError`](DialStackError.md).[`prepareStackTrace`](DialStackError.md#preparestacktrace)
---
## Class: DialStackNotFoundError
[@dialstack/sdk](../../index.md) / [server](../index.md) / DialStackNotFoundError
# Class: DialStackNotFoundError
Defined in: [sdk/src/server/errors.ts:134](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L134)
Resource not found (404)
## Extends
- [`DialStackError`](DialStackError.md)
## Constructors
### Constructor
```ts
new DialStackNotFoundError(message, options): DialStackNotFoundError;
```
Defined in: [sdk/src/server/errors.ts:135](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L135)
#### Parameters
##### message
`string`
##### options
###### code?
`string`
###### docUrl?
`string`
###### param?
`string`
###### raw?
`RawError`
###### requestId?
`string`
###### statusCode
`number`
###### type?
`RawErrorType`
#### Returns
`DialStackNotFoundError`
#### Overrides
[`DialStackError`](DialStackError.md).[`constructor`](DialStackError.md#constructor)
## Properties
### code?
```ts
readonly optional code?: string;
```
Defined in: [sdk/src/server/errors.ts:31](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L31)
#### Inherited from
[`DialStackError`](DialStackError.md).[`code`](DialStackError.md#code)
***
### docUrl?
```ts
readonly optional docUrl?: string;
```
Defined in: [sdk/src/server/errors.ts:33](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L33)
#### Inherited from
[`DialStackError`](DialStackError.md).[`docUrl`](DialStackError.md#docurl)
***
### message
```ts
message: string;
```
Defined in: docs/node\_modules/typescript/lib/lib.es5.d.ts:1075
#### Inherited from
[`DialStackError`](DialStackError.md).[`message`](DialStackError.md#message)
***
### name
```ts
name: string;
```
Defined in: docs/node\_modules/typescript/lib/lib.es5.d.ts:1074
#### Inherited from
[`DialStackError`](DialStackError.md).[`name`](DialStackError.md#name)
***
### param?
```ts
readonly optional param?: string;
```
Defined in: [sdk/src/server/errors.ts:32](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L32)
#### Inherited from
[`DialStackError`](DialStackError.md).[`param`](DialStackError.md#param)
***
### raw?
```ts
readonly optional raw?: RawError;
```
Defined in: [sdk/src/server/errors.ts:34](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L34)
#### Inherited from
[`DialStackError`](DialStackError.md).[`raw`](DialStackError.md#raw)
***
### requestId?
```ts
readonly optional requestId?: string;
```
Defined in: [sdk/src/server/errors.ts:30](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L30)
#### Inherited from
[`DialStackError`](DialStackError.md).[`requestId`](DialStackError.md#requestid)
***
### stack?
```ts
optional stack?: string;
```
Defined in: docs/node\_modules/typescript/lib/lib.es5.d.ts:1076
#### Inherited from
[`DialStackError`](DialStackError.md).[`stack`](DialStackError.md#stack)
***
### statusCode
```ts
readonly statusCode: number;
```
Defined in: [sdk/src/server/errors.ts:29](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L29)
#### Inherited from
[`DialStackError`](DialStackError.md).[`statusCode`](DialStackError.md#statuscode)
***
### type
```ts
readonly type: RawErrorType;
```
Defined in: [sdk/src/server/errors.ts:28](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L28)
#### Inherited from
[`DialStackError`](DialStackError.md).[`type`](DialStackError.md#type)
***
### stackTraceLimit
```ts
static stackTraceLimit: number;
```
Defined in: node\_modules/@types/node/globals.d.ts:67
The `Error.stackTraceLimit` property specifies the number of stack frames
collected by a stack trace (whether generated by `new Error().stack` or
`Error.captureStackTrace(obj)`).
The default value is `10` but may be set to any valid JavaScript number. Changes
will affect any stack trace captured _after_ the value has been changed.
If set to a non-number value, or set to a negative number, stack traces will
not capture any frames.
#### Inherited from
[`DialStackError`](DialStackError.md).[`stackTraceLimit`](DialStackError.md#stacktracelimit)
## Methods
### captureStackTrace()
```ts
static captureStackTrace(targetObject, constructorOpt?): void;
```
Defined in: node\_modules/@types/node/globals.d.ts:51
Creates a `.stack` property on `targetObject`, which when accessed returns
a string representing the location in the code at which
`Error.captureStackTrace()` was called.
```js
const myObject = {};
Error.captureStackTrace(myObject);
myObject.stack; // Similar to `new Error().stack`
```
The first line of the trace will be prefixed with
`${myObject.name}: ${myObject.message}`.
The optional `constructorOpt` argument accepts a function. If given, all frames
above `constructorOpt`, including `constructorOpt`, will be omitted from the
generated stack trace.
The `constructorOpt` argument is useful for hiding implementation
details of error generation from the user. For instance:
```js
function a() {
b();
}
function b() {
c();
}
function c() {
// Create an error without stack trace to avoid calculating the stack trace twice.
const { stackTraceLimit } = Error;
Error.stackTraceLimit = 0;
const error = new Error();
Error.stackTraceLimit = stackTraceLimit;
// Capture the stack trace above function b
Error.captureStackTrace(error, b); // Neither function c, nor b is included in the stack trace
throw error;
}
a();
```
#### Parameters
##### targetObject
`object`
##### constructorOpt?
`Function`
#### Returns
`void`
#### Inherited from
[`DialStackError`](DialStackError.md).[`captureStackTrace`](DialStackError.md#capturestacktrace)
***
### generate()
```ts
static generate(
message,
statusCode,
raw?,
requestId?): DialStackError;
```
Defined in: [sdk/src/server/errors.ts:67](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L67)
Generate appropriate error subclass based on status code and error type
#### Parameters
##### message
`string`
##### statusCode
`number`
##### raw?
`RawError`
##### requestId?
`string`
#### Returns
[`DialStackError`](DialStackError.md)
#### Inherited from
[`DialStackError`](DialStackError.md).[`generate`](DialStackError.md#generate)
***
### prepareStackTrace()
```ts
static prepareStackTrace(err, stackTraces): any;
```
Defined in: node\_modules/@types/node/globals.d.ts:55
#### Parameters
##### err
`Error`
##### stackTraces
`CallSite`[]
#### Returns
`any`
#### See
https://v8.dev/docs/stack-trace-api#customizing-stack-traces
#### Inherited from
[`DialStackError`](DialStackError.md).[`prepareStackTrace`](DialStackError.md#preparestacktrace)
---
## Class: DialStackPermissionError
[@dialstack/sdk](../../index.md) / [server](../index.md) / DialStackPermissionError
# Class: DialStackPermissionError
Defined in: [sdk/src/server/errors.ts:124](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L124)
Permission denied (403)
API key doesn't have permission for this resource
## Extends
- [`DialStackError`](DialStackError.md)
## Constructors
### Constructor
```ts
new DialStackPermissionError(message, options): DialStackPermissionError;
```
Defined in: [sdk/src/server/errors.ts:125](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L125)
#### Parameters
##### message
`string`
##### options
###### code?
`string`
###### docUrl?
`string`
###### param?
`string`
###### raw?
`RawError`
###### requestId?
`string`
###### statusCode
`number`
###### type?
`RawErrorType`
#### Returns
`DialStackPermissionError`
#### Overrides
[`DialStackError`](DialStackError.md).[`constructor`](DialStackError.md#constructor)
## Properties
### code?
```ts
readonly optional code?: string;
```
Defined in: [sdk/src/server/errors.ts:31](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L31)
#### Inherited from
[`DialStackError`](DialStackError.md).[`code`](DialStackError.md#code)
***
### docUrl?
```ts
readonly optional docUrl?: string;
```
Defined in: [sdk/src/server/errors.ts:33](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L33)
#### Inherited from
[`DialStackError`](DialStackError.md).[`docUrl`](DialStackError.md#docurl)
***
### message
```ts
message: string;
```
Defined in: docs/node\_modules/typescript/lib/lib.es5.d.ts:1075
#### Inherited from
[`DialStackError`](DialStackError.md).[`message`](DialStackError.md#message)
***
### name
```ts
name: string;
```
Defined in: docs/node\_modules/typescript/lib/lib.es5.d.ts:1074
#### Inherited from
[`DialStackError`](DialStackError.md).[`name`](DialStackError.md#name)
***
### param?
```ts
readonly optional param?: string;
```
Defined in: [sdk/src/server/errors.ts:32](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L32)
#### Inherited from
[`DialStackError`](DialStackError.md).[`param`](DialStackError.md#param)
***
### raw?
```ts
readonly optional raw?: RawError;
```
Defined in: [sdk/src/server/errors.ts:34](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L34)
#### Inherited from
[`DialStackError`](DialStackError.md).[`raw`](DialStackError.md#raw)
***
### requestId?
```ts
readonly optional requestId?: string;
```
Defined in: [sdk/src/server/errors.ts:30](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L30)
#### Inherited from
[`DialStackError`](DialStackError.md).[`requestId`](DialStackError.md#requestid)
***
### stack?
```ts
optional stack?: string;
```
Defined in: docs/node\_modules/typescript/lib/lib.es5.d.ts:1076
#### Inherited from
[`DialStackError`](DialStackError.md).[`stack`](DialStackError.md#stack)
***
### statusCode
```ts
readonly statusCode: number;
```
Defined in: [sdk/src/server/errors.ts:29](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L29)
#### Inherited from
[`DialStackError`](DialStackError.md).[`statusCode`](DialStackError.md#statuscode)
***
### type
```ts
readonly type: RawErrorType;
```
Defined in: [sdk/src/server/errors.ts:28](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L28)
#### Inherited from
[`DialStackError`](DialStackError.md).[`type`](DialStackError.md#type)
***
### stackTraceLimit
```ts
static stackTraceLimit: number;
```
Defined in: node\_modules/@types/node/globals.d.ts:67
The `Error.stackTraceLimit` property specifies the number of stack frames
collected by a stack trace (whether generated by `new Error().stack` or
`Error.captureStackTrace(obj)`).
The default value is `10` but may be set to any valid JavaScript number. Changes
will affect any stack trace captured _after_ the value has been changed.
If set to a non-number value, or set to a negative number, stack traces will
not capture any frames.
#### Inherited from
[`DialStackError`](DialStackError.md).[`stackTraceLimit`](DialStackError.md#stacktracelimit)
## Methods
### captureStackTrace()
```ts
static captureStackTrace(targetObject, constructorOpt?): void;
```
Defined in: node\_modules/@types/node/globals.d.ts:51
Creates a `.stack` property on `targetObject`, which when accessed returns
a string representing the location in the code at which
`Error.captureStackTrace()` was called.
```js
const myObject = {};
Error.captureStackTrace(myObject);
myObject.stack; // Similar to `new Error().stack`
```
The first line of the trace will be prefixed with
`${myObject.name}: ${myObject.message}`.
The optional `constructorOpt` argument accepts a function. If given, all frames
above `constructorOpt`, including `constructorOpt`, will be omitted from the
generated stack trace.
The `constructorOpt` argument is useful for hiding implementation
details of error generation from the user. For instance:
```js
function a() {
b();
}
function b() {
c();
}
function c() {
// Create an error without stack trace to avoid calculating the stack trace twice.
const { stackTraceLimit } = Error;
Error.stackTraceLimit = 0;
const error = new Error();
Error.stackTraceLimit = stackTraceLimit;
// Capture the stack trace above function b
Error.captureStackTrace(error, b); // Neither function c, nor b is included in the stack trace
throw error;
}
a();
```
#### Parameters
##### targetObject
`object`
##### constructorOpt?
`Function`
#### Returns
`void`
#### Inherited from
[`DialStackError`](DialStackError.md).[`captureStackTrace`](DialStackError.md#capturestacktrace)
***
### generate()
```ts
static generate(
message,
statusCode,
raw?,
requestId?): DialStackError;
```
Defined in: [sdk/src/server/errors.ts:67](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L67)
Generate appropriate error subclass based on status code and error type
#### Parameters
##### message
`string`
##### statusCode
`number`
##### raw?
`RawError`
##### requestId?
`string`
#### Returns
[`DialStackError`](DialStackError.md)
#### Inherited from
[`DialStackError`](DialStackError.md).[`generate`](DialStackError.md#generate)
***
### prepareStackTrace()
```ts
static prepareStackTrace(err, stackTraces): any;
```
Defined in: node\_modules/@types/node/globals.d.ts:55
#### Parameters
##### err
`Error`
##### stackTraces
`CallSite`[]
#### Returns
`any`
#### See
https://v8.dev/docs/stack-trace-api#customizing-stack-traces
#### Inherited from
[`DialStackError`](DialStackError.md).[`prepareStackTrace`](DialStackError.md#preparestacktrace)
---
## Class: DialStackRateLimitError
[@dialstack/sdk](../../index.md) / [server](../index.md) / DialStackRateLimitError
# Class: DialStackRateLimitError
Defined in: [sdk/src/server/errors.ts:177](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L177)
Rate limit exceeded (429)
## Extends
- [`DialStackError`](DialStackError.md)
## Constructors
### Constructor
```ts
new DialStackRateLimitError(message, options): DialStackRateLimitError;
```
Defined in: [sdk/src/server/errors.ts:180](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L180)
#### Parameters
##### message
`string`
##### options
`object` & `object`
#### Returns
`DialStackRateLimitError`
#### Overrides
[`DialStackError`](DialStackError.md).[`constructor`](DialStackError.md#constructor)
## Properties
### code?
```ts
readonly optional code?: string;
```
Defined in: [sdk/src/server/errors.ts:31](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L31)
#### Inherited from
[`DialStackError`](DialStackError.md).[`code`](DialStackError.md#code)
***
### docUrl?
```ts
readonly optional docUrl?: string;
```
Defined in: [sdk/src/server/errors.ts:33](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L33)
#### Inherited from
[`DialStackError`](DialStackError.md).[`docUrl`](DialStackError.md#docurl)
***
### message
```ts
message: string;
```
Defined in: docs/node\_modules/typescript/lib/lib.es5.d.ts:1075
#### Inherited from
[`DialStackError`](DialStackError.md).[`message`](DialStackError.md#message)
***
### name
```ts
name: string;
```
Defined in: docs/node\_modules/typescript/lib/lib.es5.d.ts:1074
#### Inherited from
[`DialStackError`](DialStackError.md).[`name`](DialStackError.md#name)
***
### param?
```ts
readonly optional param?: string;
```
Defined in: [sdk/src/server/errors.ts:32](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L32)
#### Inherited from
[`DialStackError`](DialStackError.md).[`param`](DialStackError.md#param)
***
### raw?
```ts
readonly optional raw?: RawError;
```
Defined in: [sdk/src/server/errors.ts:34](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L34)
#### Inherited from
[`DialStackError`](DialStackError.md).[`raw`](DialStackError.md#raw)
***
### requestId?
```ts
readonly optional requestId?: string;
```
Defined in: [sdk/src/server/errors.ts:30](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L30)
#### Inherited from
[`DialStackError`](DialStackError.md).[`requestId`](DialStackError.md#requestid)
***
### retryAfter?
```ts
readonly optional retryAfter?: number;
```
Defined in: [sdk/src/server/errors.ts:178](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L178)
***
### stack?
```ts
optional stack?: string;
```
Defined in: docs/node\_modules/typescript/lib/lib.es5.d.ts:1076
#### Inherited from
[`DialStackError`](DialStackError.md).[`stack`](DialStackError.md#stack)
***
### statusCode
```ts
readonly statusCode: number;
```
Defined in: [sdk/src/server/errors.ts:29](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L29)
#### Inherited from
[`DialStackError`](DialStackError.md).[`statusCode`](DialStackError.md#statuscode)
***
### type
```ts
readonly type: RawErrorType;
```
Defined in: [sdk/src/server/errors.ts:28](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L28)
#### Inherited from
[`DialStackError`](DialStackError.md).[`type`](DialStackError.md#type)
***
### stackTraceLimit
```ts
static stackTraceLimit: number;
```
Defined in: node\_modules/@types/node/globals.d.ts:67
The `Error.stackTraceLimit` property specifies the number of stack frames
collected by a stack trace (whether generated by `new Error().stack` or
`Error.captureStackTrace(obj)`).
The default value is `10` but may be set to any valid JavaScript number. Changes
will affect any stack trace captured _after_ the value has been changed.
If set to a non-number value, or set to a negative number, stack traces will
not capture any frames.
#### Inherited from
[`DialStackError`](DialStackError.md).[`stackTraceLimit`](DialStackError.md#stacktracelimit)
## Methods
### captureStackTrace()
```ts
static captureStackTrace(targetObject, constructorOpt?): void;
```
Defined in: node\_modules/@types/node/globals.d.ts:51
Creates a `.stack` property on `targetObject`, which when accessed returns
a string representing the location in the code at which
`Error.captureStackTrace()` was called.
```js
const myObject = {};
Error.captureStackTrace(myObject);
myObject.stack; // Similar to `new Error().stack`
```
The first line of the trace will be prefixed with
`${myObject.name}: ${myObject.message}`.
The optional `constructorOpt` argument accepts a function. If given, all frames
above `constructorOpt`, including `constructorOpt`, will be omitted from the
generated stack trace.
The `constructorOpt` argument is useful for hiding implementation
details of error generation from the user. For instance:
```js
function a() {
b();
}
function b() {
c();
}
function c() {
// Create an error without stack trace to avoid calculating the stack trace twice.
const { stackTraceLimit } = Error;
Error.stackTraceLimit = 0;
const error = new Error();
Error.stackTraceLimit = stackTraceLimit;
// Capture the stack trace above function b
Error.captureStackTrace(error, b); // Neither function c, nor b is included in the stack trace
throw error;
}
a();
```
#### Parameters
##### targetObject
`object`
##### constructorOpt?
`Function`
#### Returns
`void`
#### Inherited from
[`DialStackError`](DialStackError.md).[`captureStackTrace`](DialStackError.md#capturestacktrace)
***
### generate()
```ts
static generate(
message,
statusCode,
raw?,
requestId?): DialStackError;
```
Defined in: [sdk/src/server/errors.ts:67](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L67)
Generate appropriate error subclass based on status code and error type
#### Parameters
##### message
`string`
##### statusCode
`number`
##### raw?
`RawError`
##### requestId?
`string`
#### Returns
[`DialStackError`](DialStackError.md)
#### Inherited from
[`DialStackError`](DialStackError.md).[`generate`](DialStackError.md#generate)
***
### prepareStackTrace()
```ts
static prepareStackTrace(err, stackTraces): any;
```
Defined in: node\_modules/@types/node/globals.d.ts:55
#### Parameters
##### err
`Error`
##### stackTraces
`CallSite`[]
#### Returns
`any`
#### See
https://v8.dev/docs/stack-trace-api#customizing-stack-traces
#### Inherited from
[`DialStackError`](DialStackError.md).[`prepareStackTrace`](DialStackError.md#preparestacktrace)
---
## Class: DialStackValidationError
[@dialstack/sdk](../../index.md) / [server](../index.md) / DialStackValidationError
# Class: DialStackValidationError
Defined in: [sdk/src/server/errors.ts:156](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L156)
Validation error (422)
Request body validation failed
## Extends
- [`DialStackError`](DialStackError.md)
## Constructors
### Constructor
```ts
new DialStackValidationError(message, options): DialStackValidationError;
```
Defined in: [sdk/src/server/errors.ts:157](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L157)
#### Parameters
##### message
`string`
##### options
###### code?
`string`
###### docUrl?
`string`
###### param?
`string`
###### raw?
`RawError`
###### requestId?
`string`
###### statusCode
`number`
###### type?
`RawErrorType`
#### Returns
`DialStackValidationError`
#### Overrides
[`DialStackError`](DialStackError.md).[`constructor`](DialStackError.md#constructor)
## Properties
### code?
```ts
readonly optional code?: string;
```
Defined in: [sdk/src/server/errors.ts:31](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L31)
#### Inherited from
[`DialStackError`](DialStackError.md).[`code`](DialStackError.md#code)
***
### docUrl?
```ts
readonly optional docUrl?: string;
```
Defined in: [sdk/src/server/errors.ts:33](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L33)
#### Inherited from
[`DialStackError`](DialStackError.md).[`docUrl`](DialStackError.md#docurl)
***
### message
```ts
message: string;
```
Defined in: docs/node\_modules/typescript/lib/lib.es5.d.ts:1075
#### Inherited from
[`DialStackError`](DialStackError.md).[`message`](DialStackError.md#message)
***
### name
```ts
name: string;
```
Defined in: docs/node\_modules/typescript/lib/lib.es5.d.ts:1074
#### Inherited from
[`DialStackError`](DialStackError.md).[`name`](DialStackError.md#name)
***
### param?
```ts
readonly optional param?: string;
```
Defined in: [sdk/src/server/errors.ts:32](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L32)
#### Inherited from
[`DialStackError`](DialStackError.md).[`param`](DialStackError.md#param)
***
### raw?
```ts
readonly optional raw?: RawError;
```
Defined in: [sdk/src/server/errors.ts:34](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L34)
#### Inherited from
[`DialStackError`](DialStackError.md).[`raw`](DialStackError.md#raw)
***
### requestId?
```ts
readonly optional requestId?: string;
```
Defined in: [sdk/src/server/errors.ts:30](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L30)
#### Inherited from
[`DialStackError`](DialStackError.md).[`requestId`](DialStackError.md#requestid)
***
### stack?
```ts
optional stack?: string;
```
Defined in: docs/node\_modules/typescript/lib/lib.es5.d.ts:1076
#### Inherited from
[`DialStackError`](DialStackError.md).[`stack`](DialStackError.md#stack)
***
### statusCode
```ts
readonly statusCode: number;
```
Defined in: [sdk/src/server/errors.ts:29](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L29)
#### Inherited from
[`DialStackError`](DialStackError.md).[`statusCode`](DialStackError.md#statuscode)
***
### type
```ts
readonly type: RawErrorType;
```
Defined in: [sdk/src/server/errors.ts:28](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L28)
#### Inherited from
[`DialStackError`](DialStackError.md).[`type`](DialStackError.md#type)
***
### stackTraceLimit
```ts
static stackTraceLimit: number;
```
Defined in: node\_modules/@types/node/globals.d.ts:67
The `Error.stackTraceLimit` property specifies the number of stack frames
collected by a stack trace (whether generated by `new Error().stack` or
`Error.captureStackTrace(obj)`).
The default value is `10` but may be set to any valid JavaScript number. Changes
will affect any stack trace captured _after_ the value has been changed.
If set to a non-number value, or set to a negative number, stack traces will
not capture any frames.
#### Inherited from
[`DialStackError`](DialStackError.md).[`stackTraceLimit`](DialStackError.md#stacktracelimit)
## Methods
### captureStackTrace()
```ts
static captureStackTrace(targetObject, constructorOpt?): void;
```
Defined in: node\_modules/@types/node/globals.d.ts:51
Creates a `.stack` property on `targetObject`, which when accessed returns
a string representing the location in the code at which
`Error.captureStackTrace()` was called.
```js
const myObject = {};
Error.captureStackTrace(myObject);
myObject.stack; // Similar to `new Error().stack`
```
The first line of the trace will be prefixed with
`${myObject.name}: ${myObject.message}`.
The optional `constructorOpt` argument accepts a function. If given, all frames
above `constructorOpt`, including `constructorOpt`, will be omitted from the
generated stack trace.
The `constructorOpt` argument is useful for hiding implementation
details of error generation from the user. For instance:
```js
function a() {
b();
}
function b() {
c();
}
function c() {
// Create an error without stack trace to avoid calculating the stack trace twice.
const { stackTraceLimit } = Error;
Error.stackTraceLimit = 0;
const error = new Error();
Error.stackTraceLimit = stackTraceLimit;
// Capture the stack trace above function b
Error.captureStackTrace(error, b); // Neither function c, nor b is included in the stack trace
throw error;
}
a();
```
#### Parameters
##### targetObject
`object`
##### constructorOpt?
`Function`
#### Returns
`void`
#### Inherited from
[`DialStackError`](DialStackError.md).[`captureStackTrace`](DialStackError.md#capturestacktrace)
***
### generate()
```ts
static generate(
message,
statusCode,
raw?,
requestId?): DialStackError;
```
Defined in: [sdk/src/server/errors.ts:67](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/errors.ts#L67)
Generate appropriate error subclass based on status code and error type
#### Parameters
##### message
`string`
##### statusCode
`number`
##### raw?
`RawError`
##### requestId?
`string`
#### Returns
[`DialStackError`](DialStackError.md)
#### Inherited from
[`DialStackError`](DialStackError.md).[`generate`](DialStackError.md#generate)
***
### prepareStackTrace()
```ts
static prepareStackTrace(err, stackTraces): any;
```
Defined in: node\_modules/@types/node/globals.d.ts:55
#### Parameters
##### err
`Error`
##### stackTraces
`CallSite`[]
#### Returns
`any`
#### See
https://v8.dev/docs/stack-trace-api#customizing-stack-traces
#### Inherited from
[`DialStackError`](DialStackError.md).[`prepareStackTrace`](DialStackError.md#preparestacktrace)
---
## Class: MediaStream
[@dialstack/sdk](../../index.md) / [server](../index.md) / MediaStream
# Class: MediaStream
Defined in: [sdk/src/server/media-stream.ts:87](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/media-stream.ts#L87)
## Extends
- `EventEmitter`
## Constructors
### Constructor
```ts
new MediaStream(ws): MediaStream;
```
Defined in: [sdk/src/server/media-stream.ts:93](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/media-stream.ts#L93)
#### Parameters
##### ws
[`WebSocketLike`](../interfaces/WebSocketLike.md)
#### Returns
`MediaStream`
#### Overrides
```ts
EventEmitter.constructor
```
## Accessors
### accountId
#### Get Signature
```ts
get accountId(): string | null;
```
Defined in: [sdk/src/server/media-stream.ts:109](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/media-stream.ts#L109)
Account ID (available after 'begin' event)
##### Returns
`string` \| `null`
***
### audioFormat
#### Get Signature
```ts
get audioFormat(): AudioFormat | null;
```
Defined in: [sdk/src/server/media-stream.ts:116](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/media-stream.ts#L116)
Audio format specification (available after 'begin' event)
##### Returns
[`AudioFormat`](../interfaces/AudioFormat.md) \| `null`
***
### callId
#### Get Signature
```ts
get callId(): string | null;
```
Defined in: [sdk/src/server/media-stream.ts:102](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/media-stream.ts#L102)
Call ID (available after 'begin' event)
##### Returns
`string` \| `null`
## Methods
### \[captureRejectionSymbol\]()?
```ts
optional [captureRejectionSymbol](
error,
event, ...
args): void;
```
Defined in: node\_modules/@types/node/events.d.ts:87
The `Symbol.for('nodejs.rejection')` method is called in case a
promise rejection happens when emitting an event and
`captureRejections` is enabled on the emitter.
It is possible to use `events.captureRejectionSymbol` in
place of `Symbol.for('nodejs.rejection')`.
```js
import { EventEmitter, captureRejectionSymbol } from 'node:events';
class MyClass extends EventEmitter {
constructor() {
super({ captureRejections: true });
}
[captureRejectionSymbol](err, event, ...args) {
console.log('rejection happened for', event, 'with', err, ...args);
this.destroy(err);
}
destroy(err) {
// Tear the resource down here.
}
}
```
#### Parameters
##### error
`Error`
##### event
`string` \| `symbol`
##### args
...`any`[]
#### Returns
`void`
#### Since
v13.4.0, v12.16.0
#### Inherited from
```ts
EventEmitter.[captureRejectionSymbol]
```
***
### addListener()
```ts
addListener(eventName, listener): this;
```
Defined in: node\_modules/@types/node/events.d.ts:92
Alias for `emitter.on(eventName, listener)`.
#### Type Parameters
##### E
`E` *extends* `string` \| `symbol`
#### Parameters
##### eventName
`string` \| `symbol`
##### listener
(...`args`) => `void`
#### Returns
`this`
#### Since
v0.1.26
#### Inherited from
```ts
EventEmitter.addListener
```
***
### close()
```ts
close(): void;
```
Defined in: [sdk/src/server/media-stream.ts:177](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/media-stream.ts#L177)
Close the media stream
#### Returns
`void`
***
### emit()
```ts
emit(event, ...args): boolean;
```
Defined in: [sdk/src/server/media-stream.ts:194](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/media-stream.ts#L194)
Synchronously calls each of the listeners registered for the event named
`eventName`, in the order they were registered, passing the supplied arguments
to each.
Returns `true` if the event had listeners, `false` otherwise.
```js
import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
```
#### Type Parameters
##### K
`K` *extends* keyof [`MediaStreamEvents`](../interfaces/MediaStreamEvents.md)
#### Parameters
##### event
`K`
##### args
...`Parameters`\<[`MediaStreamEvents`](../interfaces/MediaStreamEvents.md)\[`K`\]\>
#### Returns
`boolean`
#### Since
v0.1.26
#### Overrides
```ts
EventEmitter.emit
```
***
### eventNames()
```ts
eventNames(): (string | symbol)[];
```
Defined in: node\_modules/@types/node/events.d.ts:154
Returns an array listing the events for which the emitter has registered
listeners.
```js
import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => {});
myEE.on('bar', () => {});
const sym = Symbol('symbol');
myEE.on(sym, () => {});
console.log(myEE.eventNames());
// Prints: [ 'foo', 'bar', Symbol(symbol) ]
```
#### Returns
(`string` \| `symbol`)[]
#### Since
v6.0.0
#### Inherited from
```ts
EventEmitter.eventNames
```
***
### getMaxListeners()
```ts
getMaxListeners(): number;
```
Defined in: node\_modules/@types/node/events.d.ts:161
Returns the current max listener value for the `EventEmitter` which is either
set by `emitter.setMaxListeners(n)` or defaults to
`events.defaultMaxListeners`.
#### Returns
`number`
#### Since
v1.0.0
#### Inherited from
```ts
EventEmitter.getMaxListeners
```
***
### listenerCount()
```ts
listenerCount(eventName, listener?): number;
```
Defined in: node\_modules/@types/node/events.d.ts:170
Returns the number of listeners listening for the event named `eventName`.
If `listener` is provided, it will return how many times the listener is found
in the list of the listeners of the event.
#### Type Parameters
##### E
`E` *extends* `string` \| `symbol`
#### Parameters
##### eventName
`string` \| `symbol`
The name of the event being listened for
##### listener?
(...`args`) => `void`
The event handler function
#### Returns
`number`
#### Since
v3.2.0
#### Inherited from
```ts
EventEmitter.listenerCount
```
***
### listeners()
```ts
listeners(eventName): (...args) => void[];
```
Defined in: node\_modules/@types/node/events.d.ts:186
Returns a copy of the array of listeners for the event named `eventName`.
```js
server.on('connection', (stream) => {
console.log('someone connected!');
});
console.log(util.inspect(server.listeners('connection')));
// Prints: [ [Function] ]
```
#### Type Parameters
##### E
`E` *extends* `string` \| `symbol`
#### Parameters
##### eventName
`string` \| `symbol`
#### Returns
(...`args`) => `void`[]
#### Since
v0.1.26
#### Inherited from
```ts
EventEmitter.listeners
```
***
### off()
```ts
off(event, listener): this;
```
Defined in: [sdk/src/server/media-stream.ts:190](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/media-stream.ts#L190)
Alias for `emitter.removeListener()`.
#### Type Parameters
##### K
`K` *extends* keyof [`MediaStreamEvents`](../interfaces/MediaStreamEvents.md)
#### Parameters
##### event
`K`
##### listener
[`MediaStreamEvents`](../interfaces/MediaStreamEvents.md)\[`K`\]
#### Returns
`this`
#### Since
v10.0.0
#### Overrides
```ts
EventEmitter.off
```
***
### on()
```ts
on(event, listener): this;
```
Defined in: [sdk/src/server/media-stream.ts:182](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/media-stream.ts#L182)
Adds the `listener` function to the end of the listeners array for the
event named `eventName`. No checks are made to see if the `listener` has
already been added. Multiple calls passing the same combination of `eventName`
and `listener` will result in the `listener` being added, and called, multiple
times.
```js
server.on('connection', (stream) => {
console.log('someone connected!');
});
```
Returns a reference to the `EventEmitter`, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The
`emitter.prependListener()` method can be used as an alternative to add the
event listener to the beginning of the listeners array.
```js
import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
```
#### Type Parameters
##### K
`K` *extends* keyof [`MediaStreamEvents`](../interfaces/MediaStreamEvents.md)
#### Parameters
##### event
`K`
##### listener
[`MediaStreamEvents`](../interfaces/MediaStreamEvents.md)\[`K`\]
The callback function
#### Returns
`this`
#### Since
v0.1.101
#### Overrides
```ts
EventEmitter.on
```
***
### once()
```ts
once(event, listener): this;
```
Defined in: [sdk/src/server/media-stream.ts:186](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/media-stream.ts#L186)
Adds a **one-time** `listener` function for the event named `eventName`. The
next time `eventName` is triggered, this listener is removed and then invoked.
```js
server.once('connection', (stream) => {
console.log('Ah, we have our first user!');
});
```
Returns a reference to the `EventEmitter`, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The
`emitter.prependOnceListener()` method can be used as an alternative to add the
event listener to the beginning of the listeners array.
```js
import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
```
#### Type Parameters
##### K
`K` *extends* keyof [`MediaStreamEvents`](../interfaces/MediaStreamEvents.md)
#### Parameters
##### event
`K`
##### listener
[`MediaStreamEvents`](../interfaces/MediaStreamEvents.md)\[`K`\]
The callback function
#### Returns
`this`
#### Since
v0.3.0
#### Overrides
```ts
EventEmitter.once
```
***
### prependListener()
```ts
prependListener(eventName, listener): this;
```
Defined in: node\_modules/@types/node/events.d.ts:275
Adds the `listener` function to the _beginning_ of the listeners array for the
event named `eventName`. No checks are made to see if the `listener` has
already been added. Multiple calls passing the same combination of `eventName`
and `listener` will result in the `listener` being added, and called, multiple
times.
```js
server.prependListener('connection', (stream) => {
console.log('someone connected!');
});
```
Returns a reference to the `EventEmitter`, so that calls can be chained.
#### Type Parameters
##### E
`E` *extends* `string` \| `symbol`
#### Parameters
##### eventName
`string` \| `symbol`
The name of the event.
##### listener
(...`args`) => `void`
The callback function
#### Returns
`this`
#### Since
v6.0.0
#### Inherited from
```ts
EventEmitter.prependListener
```
***
### prependOnceListener()
```ts
prependOnceListener(eventName, listener): this;
```
Defined in: node\_modules/@types/node/events.d.ts:292
Adds a **one-time** `listener` function for the event named `eventName` to the
_beginning_ of the listeners array. The next time `eventName` is triggered, this
listener is removed, and then invoked.
```js
server.prependOnceListener('connection', (stream) => {
console.log('Ah, we have our first user!');
});
```
Returns a reference to the `EventEmitter`, so that calls can be chained.
#### Type Parameters
##### E
`E` *extends* `string` \| `symbol`
#### Parameters
##### eventName
`string` \| `symbol`
The name of the event.
##### listener
(...`args`) => `void`
The callback function
#### Returns
`this`
#### Since
v6.0.0
#### Inherited from
```ts
EventEmitter.prependOnceListener
```
***
### rawListeners()
```ts
rawListeners(eventName): (...args) => void[];
```
Defined in: node\_modules/@types/node/events.d.ts:326
Returns a copy of the array of listeners for the event named `eventName`,
including any wrappers (such as those created by `.once()`).
```js
import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.once('log', () => console.log('log once'));
// Returns a new Array with a function `onceWrapper` which has a property
// `listener` which contains the original listener bound above
const listeners = emitter.rawListeners('log');
const logFnWrapper = listeners[0];
// Logs "log once" to the console and does not unbind the `once` event
logFnWrapper.listener();
// Logs "log once" to the console and removes the listener
logFnWrapper();
emitter.on('log', () => console.log('log persistently'));
// Will return a new Array with a single function bound by `.on()` above
const newListeners = emitter.rawListeners('log');
// Logs "log persistently" twice
newListeners[0]();
emitter.emit('log');
```
#### Type Parameters
##### E
`E` *extends* `string` \| `symbol`
#### Parameters
##### eventName
`string` \| `symbol`
#### Returns
(...`args`) => `void`[]
#### Since
v9.4.0
#### Inherited from
```ts
EventEmitter.rawListeners
```
***
### removeAllListeners()
```ts
removeAllListeners(eventName?): this;
```
Defined in: node\_modules/@types/node/events.d.ts:338
Removes all listeners, or those of the specified `eventName`.
It is bad practice to remove listeners added elsewhere in the code,
particularly when the `EventEmitter` instance was created by some other
component or module (e.g. sockets or file streams).
Returns a reference to the `EventEmitter`, so that calls can be chained.
#### Type Parameters
##### E
`E` *extends* `string` \| `symbol`
#### Parameters
##### eventName?
`string` \| `symbol`
#### Returns
`this`
#### Since
v0.1.26
#### Inherited from
```ts
EventEmitter.removeAllListeners
```
***
### removeListener()
```ts
removeListener(eventName, listener): this;
```
Defined in: node\_modules/@types/node/events.d.ts:425
Removes the specified `listener` from the listener array for the event named
`eventName`.
```js
const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
```
`removeListener()` will remove, at most, one instance of a listener from the
listener array. If any single listener has been added multiple times to the
listener array for the specified `eventName`, then `removeListener()` must be
called multiple times to remove each instance.
Once an event is emitted, all listeners attached to it at the
time of emitting are called in order. This implies that any
`removeListener()` or `removeAllListeners()` calls _after_ emitting and
_before_ the last listener finishes execution will not remove them from
`emit()` in progress. Subsequent events behave as expected.
```js
import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
```
Because listeners are managed using an internal array, calling this will
change the position indexes of any listener registered _after_ the listener
being removed. This will not impact the order in which listeners are called,
but it means that any copies of the listener array as returned by
the `emitter.listeners()` method will need to be recreated.
When a single function has been added as a handler multiple times for a single
event (as in the example below), `removeListener()` will remove the most
recently added instance. In the example the `once('ping')`
listener is removed:
```js
import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
```
Returns a reference to the `EventEmitter`, so that calls can be chained.
#### Type Parameters
##### E
`E` *extends* `string` \| `symbol`
#### Parameters
##### eventName
`string` \| `symbol`
##### listener
(...`args`) => `void`
#### Returns
`this`
#### Since
v0.1.26
#### Inherited from
```ts
EventEmitter.removeListener
```
***
### sendAudio()
```ts
sendAudio(payload): void;
```
Defined in: [sdk/src/server/media-stream.ts:153](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/media-stream.ts#L153)
Send audio to the caller
#### Parameters
##### payload
`string`
Base64-encoded mulaw audio data
#### Returns
`void`
***
### sendAudioBuffer()
```ts
sendAudioBuffer(buffer): void;
```
Defined in: [sdk/src/server/media-stream.ts:170](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/media-stream.ts#L170)
Send raw audio buffer to the caller (will be base64-encoded)
#### Parameters
##### buffer
`Buffer`
Raw mulaw audio buffer
#### Returns
`void`
***
### setMaxListeners()
```ts
setMaxListeners(n): this;
```
Defined in: node\_modules/@types/node/events.d.ts:436
By default `EventEmitter`s will print a warning if more than `10` listeners are
added for a particular event. This is a useful default that helps finding
memory leaks. The `emitter.setMaxListeners()` method allows the limit to be
modified for this specific `EventEmitter` instance. The value can be set to
`Infinity` (or `0`) to indicate an unlimited number of listeners.
Returns a reference to the `EventEmitter`, so that calls can be chained.
#### Parameters
##### n
`number`
#### Returns
`this`
#### Since
v0.3.5
#### Inherited from
```ts
EventEmitter.setMaxListeners
```
---
## server
[@dialstack/sdk](../index.md) / server
# server
## Classes
- [DialStack](classes/DialStack.md)
- [DialStackAPIError](classes/DialStackAPIError.md)
- [DialStackAuthenticationError](classes/DialStackAuthenticationError.md)
- [DialStackConflictError](classes/DialStackConflictError.md)
- [DialStackConnectionError](classes/DialStackConnectionError.md)
- [DialStackError](classes/DialStackError.md)
- [DialStackInvalidRequestError](classes/DialStackInvalidRequestError.md)
- [DialStackNotFoundError](classes/DialStackNotFoundError.md)
- [DialStackPermissionError](classes/DialStackPermissionError.md)
- [DialStackRateLimitError](classes/DialStackRateLimitError.md)
- [DialStackValidationError](classes/DialStackValidationError.md)
- [MediaStream](classes/MediaStream.md)
## Interfaces
- [Account](interfaces/Account.md)
- [AccountConfig](interfaces/AccountConfig.md)
- [AccountCreateParams](interfaces/AccountCreateParams.md)
- [AccountListParams](interfaces/AccountListParams.md)
- [AccountSessionCreateParams](interfaces/AccountSessionCreateParams.md)
- [AccountSessionCreateResponse](interfaces/AccountSessionCreateResponse.md)
- [AccountUpdateParams](interfaces/AccountUpdateParams.md)
- [AppInfo](interfaces/AppInfo.md)
- [AttachAction](interfaces/AttachAction.md)
- [AudioFormat](interfaces/AudioFormat.md)
- [AvailabilitySearchResponse](interfaces/AvailabilitySearchResponse.md)
- [AvailabilitySearchWebhook](interfaces/AvailabilitySearchWebhook.md)
- [AvailabilitySlot](interfaces/AvailabilitySlot.md)
- [BookingResponse](interfaces/BookingResponse.md)
- [CallUpdateParams](interfaces/CallUpdateParams.md)
- [ComponentConfig](interfaces/ComponentConfig.md)
- [CreateBookingWebhook](interfaces/CreateBookingWebhook.md)
- [CustomerLookupResponse](interfaces/CustomerLookupResponse.md)
- [CustomerLookupWebhook](interfaces/CustomerLookupWebhook.md)
- [DateRange](interfaces/DateRange.md)
- [DialPlan](interfaces/DialPlan.md)
- [DialPlanCreateParams](interfaces/DialPlanCreateParams.md)
- [DialPlanListParams](interfaces/DialPlanListParams.md)
- [DialStackConfig](interfaces/DialStackConfig.md)
- [Extension](interfaces/Extension.md)
- [ExtensionCreateParams](interfaces/ExtensionCreateParams.md)
- [ExtensionListParams](interfaces/ExtensionListParams.md)
- [ExtensionUpdateParams](interfaces/ExtensionUpdateParams.md)
- [ExternalDialNode](interfaces/ExternalDialNode.md)
- [ExternalDialNodeConfig](interfaces/ExternalDialNodeConfig.md)
- [InternalDialNode](interfaces/InternalDialNode.md)
- [InternalDialNodeConfig](interfaces/InternalDialNodeConfig.md)
- [MediaStreamAudioEvent](interfaces/MediaStreamAudioEvent.md)
- [MediaStreamBeginEvent](interfaces/MediaStreamBeginEvent.md)
- [MediaStreamEvents](interfaces/MediaStreamEvents.md)
- [PaginatedList](interfaces/PaginatedList.md)
- [PhoneNumber](interfaces/PhoneNumber.md)
- [PhoneNumberListParams](interfaces/PhoneNumberListParams.md)
- [Queue](interfaces/Queue.md)
- [QueueAddMemberParams](interfaces/QueueAddMemberParams.md)
- [QueueCreateParams](interfaces/QueueCreateParams.md)
- [QueueListMembersParams](interfaces/QueueListMembersParams.md)
- [QueueListParams](interfaces/QueueListParams.md)
- [QueueMember](interfaces/QueueMember.md)
- [QueueUpdateParams](interfaces/QueueUpdateParams.md)
- [RequestEvent](interfaces/RequestEvent.md)
- [RequestOptions](interfaces/RequestOptions.md)
- [ResponseEvent](interfaces/ResponseEvent.md)
- [RingAllUsersNode](interfaces/RingAllUsersNode.md)
- [RingAllUsersNodeConfig](interfaces/RingAllUsersNodeConfig.md)
- [RingGroup](interfaces/RingGroup.md)
- [RingGroupAddMemberParams](interfaces/RingGroupAddMemberParams.md)
- [RingGroupCreateParams](interfaces/RingGroupCreateParams.md)
- [RingGroupListParams](interfaces/RingGroupListParams.md)
- [RingGroupMember](interfaces/RingGroupMember.md)
- [RingGroupUpdateParams](interfaces/RingGroupUpdateParams.md)
- [Schedule](interfaces/Schedule.md)
- [ScheduleCreateParams](interfaces/ScheduleCreateParams.md)
- [ScheduleListParams](interfaces/ScheduleListParams.md)
- [ScheduleNode](interfaces/ScheduleNode.md)
- [ScheduleNodeConfig](interfaces/ScheduleNodeConfig.md)
- [TimeRange](interfaces/TimeRange.md)
- [Transcript](interfaces/Transcript.md)
- [TransferAction](interfaces/TransferAction.md)
- [User](interfaces/User.md)
- [UserCreateParams](interfaces/UserCreateParams.md)
- [UserListParams](interfaces/UserListParams.md)
- [UserUpdateParams](interfaces/UserUpdateParams.md)
- [VoiceApp](interfaces/VoiceApp.md)
- [VoiceAppCreateParams](interfaces/VoiceAppCreateParams.md)
- [VoiceAppListParams](interfaces/VoiceAppListParams.md)
- [VoiceAppUpdateParams](interfaces/VoiceAppUpdateParams.md)
- [WebhookErrorResponse](interfaces/WebhookErrorResponse.md)
- [WebhookEvent](interfaces/WebhookEvent.md)
- [WebSocketLike](interfaces/WebSocketLike.md)
## Type Aliases
- [BookingStatus](type-aliases/BookingStatus.md)
- [CallAction](type-aliases/CallAction.md)
- [DialPlanNode](type-aliases/DialPlanNode.md)
- [ExtensionStatus](type-aliases/ExtensionStatus.md)
- [MediaStreamMessage](type-aliases/MediaStreamMessage.md)
- [TranscriptStatus](type-aliases/TranscriptStatus.md)
---
## Interface: Account
[@dialstack/sdk](../../index.md) / [server](../index.md) / Account
# Interface: Account
Defined in: [sdk/src/server/index.ts:117](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L117)
## Properties
### config
```ts
config: AccountConfig;
```
Defined in: [sdk/src/server/index.ts:120](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L120)
***
### created\_at
```ts
created_at: string;
```
Defined in: [sdk/src/server/index.ts:121](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L121)
***
### email
```ts
email: string | null;
```
Defined in: [sdk/src/server/index.ts:119](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L119)
***
### id
```ts
id: string;
```
Defined in: [sdk/src/server/index.ts:118](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L118)
***
### updated\_at
```ts
updated_at: string;
```
Defined in: [sdk/src/server/index.ts:122](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L122)
---
## Interface: AccountConfig
[@dialstack/sdk](../../index.md) / [server](../index.md) / AccountConfig
# Interface: AccountConfig
Defined in: [sdk/src/server/index.ts:125](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L125)
## Properties
### extension\_length?
```ts
optional extension_length?: number;
```
Defined in: [sdk/src/server/index.ts:129](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L129)
Number of digits for extension numbers, 3-6 (default: 4)
***
### region?
```ts
optional region?: string;
```
Defined in: [sdk/src/server/index.ts:127](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L127)
ISO 3166-1 alpha-2 country code (default: "US")
***
### timezone?
```ts
optional timezone?: string;
```
Defined in: [sdk/src/server/index.ts:133](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L133)
IANA timezone (default: "UTC")
***
### transcription\_enabled?
```ts
optional transcription_enabled?: boolean;
```
Defined in: [sdk/src/server/index.ts:131](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L131)
Whether calls are recorded and transcribed (default: true)
---
## Interface: AccountCreateParams
[@dialstack/sdk](../../index.md) / [server](../index.md) / AccountCreateParams
# Interface: AccountCreateParams
Defined in: [sdk/src/server/index.ts:136](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L136)
## Properties
### config?
```ts
optional config?: AccountConfig;
```
Defined in: [sdk/src/server/index.ts:138](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L138)
***
### email?
```ts
optional email?: string;
```
Defined in: [sdk/src/server/index.ts:137](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L137)
---
## Interface: AccountListParams
[@dialstack/sdk](../../index.md) / [server](../index.md) / AccountListParams
# Interface: AccountListParams
Defined in: [sdk/src/server/index.ts:146](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L146)
## Properties
### limit?
```ts
optional limit?: number;
```
Defined in: [sdk/src/server/index.ts:147](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L147)
***
### page?
```ts
optional page?: string;
```
Defined in: [sdk/src/server/index.ts:148](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L148)
---
## Interface: AccountSessionCreateParams
[@dialstack/sdk](../../index.md) / [server](../index.md) / AccountSessionCreateParams
# Interface: AccountSessionCreateParams
Defined in: [sdk/src/server/index.ts:191](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L191)
## Properties
### account
```ts
account: string;
```
Defined in: [sdk/src/server/index.ts:192](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L192)
***
### components
```ts
components: object;
```
Defined in: [sdk/src/server/index.ts:194](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L194)
Components to enable for this session. At least one must be enabled.
#### Index Signature
```ts
[key: string]: ComponentConfig | undefined
```
#### account\_onboarding?
```ts
optional account_onboarding?: ComponentConfig;
```
#### call\_history?
```ts
optional call_history?: ComponentConfig;
```
#### call\_logs?
```ts
optional call_logs?: ComponentConfig;
```
#### dial\_plan?
```ts
optional dial_plan?: ComponentConfig;
```
#### phone\_number\_ordering?
```ts
optional phone_number_ordering?: ComponentConfig;
```
#### phone\_numbers?
```ts
optional phone_numbers?: ComponentConfig;
```
#### voicemails?
```ts
optional voicemails?: ComponentConfig;
```
---
## Interface: AccountSessionCreateResponse
[@dialstack/sdk](../../index.md) / [server](../index.md) / AccountSessionCreateResponse
# Interface: AccountSessionCreateResponse
Defined in: [sdk/src/server/index.ts:206](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L206)
## Properties
### account\_id
```ts
account_id: string;
```
Defined in: [sdk/src/server/index.ts:207](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L207)
***
### client\_secret
```ts
client_secret: string;
```
Defined in: [sdk/src/server/index.ts:208](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L208)
***
### expires\_at
```ts
expires_at: string;
```
Defined in: [sdk/src/server/index.ts:209](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L209)
---
## Interface: AccountUpdateParams
[@dialstack/sdk](../../index.md) / [server](../index.md) / AccountUpdateParams
# Interface: AccountUpdateParams
Defined in: [sdk/src/server/index.ts:141](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L141)
## Properties
### config?
```ts
optional config?: AccountConfig;
```
Defined in: [sdk/src/server/index.ts:143](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L143)
***
### email?
```ts
optional email?: string;
```
Defined in: [sdk/src/server/index.ts:142](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L142)
---
## Interface: AppInfo
[@dialstack/sdk](../../index.md) / [server](../index.md) / AppInfo
# Interface: AppInfo
Defined in: [sdk/src/server/index.ts:76](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L76)
## Properties
### name
```ts
name: string;
```
Defined in: [sdk/src/server/index.ts:77](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L77)
***
### url?
```ts
optional url?: string;
```
Defined in: [sdk/src/server/index.ts:79](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L79)
***
### version?
```ts
optional version?: string;
```
Defined in: [sdk/src/server/index.ts:78](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L78)
---
## Interface: AttachAction
[@dialstack/sdk](../../index.md) / [server](../index.md) / AttachAction
# Interface: AttachAction
Defined in: [sdk/src/server/index.ts:499](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L499)
## Properties
### type
```ts
type: "attach";
```
Defined in: [sdk/src/server/index.ts:500](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L500)
***
### url
```ts
url: string;
```
Defined in: [sdk/src/server/index.ts:501](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L501)
---
## Interface: AudioFormat
[@dialstack/sdk](../../index.md) / [server](../index.md) / AudioFormat
# Interface: AudioFormat
Defined in: [sdk/src/server/media-stream.ts:55](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/media-stream.ts#L55)
## Properties
### channels
```ts
channels: 1;
```
Defined in: [sdk/src/server/media-stream.ts:58](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/media-stream.ts#L58)
***
### encoding
```ts
encoding: "audio/x-mulaw";
```
Defined in: [sdk/src/server/media-stream.ts:56](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/media-stream.ts#L56)
***
### sample\_rate
```ts
sample_rate: 8000;
```
Defined in: [sdk/src/server/media-stream.ts:57](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/media-stream.ts#L57)
---
## Interface: AvailabilitySearchResponse
[@dialstack/sdk](../../index.md) / [server](../index.md) / AvailabilitySearchResponse
# Interface: AvailabilitySearchResponse
Defined in: [sdk/src/server/index.ts:563](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L563)
## Properties
### availabilities
```ts
availabilities: AvailabilitySlot[];
```
Defined in: [sdk/src/server/index.ts:564](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L564)
---
## Interface: AvailabilitySearchWebhook
[@dialstack/sdk](../../index.md) / [server](../index.md) / AvailabilitySearchWebhook
# Interface: AvailabilitySearchWebhook
Defined in: [sdk/src/server/index.ts:546](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L546)
## Properties
### account\_id
```ts
account_id: string;
```
Defined in: [sdk/src/server/index.ts:547](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L547)
***
### query
```ts
query: object;
```
Defined in: [sdk/src/server/index.ts:548](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L548)
#### filter
```ts
filter: object;
```
##### filter.start\_at\_range
```ts
start_at_range: object;
```
##### filter.start\_at\_range.end\_at
```ts
end_at: string;
```
##### filter.start\_at\_range.start\_at
```ts
start_at: string;
```
---
## Interface: AvailabilitySlot
[@dialstack/sdk](../../index.md) / [server](../index.md) / AvailabilitySlot
# Interface: AvailabilitySlot
Defined in: [sdk/src/server/index.ts:558](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L558)
## Properties
### duration\_minutes
```ts
duration_minutes: number;
```
Defined in: [sdk/src/server/index.ts:560](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L560)
***
### start\_at
```ts
start_at: string;
```
Defined in: [sdk/src/server/index.ts:559](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L559)
---
## Interface: BookingResponse
[@dialstack/sdk](../../index.md) / [server](../index.md) / BookingResponse
# Interface: BookingResponse
Defined in: [sdk/src/server/index.ts:584](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L584)
## Properties
### booking
```ts
booking: object;
```
Defined in: [sdk/src/server/index.ts:585](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L585)
#### created\_at?
```ts
optional created_at?: string;
```
#### customer?
```ts
optional customer?: object;
```
##### customer.name
```ts
name: string;
```
##### customer.phone
```ts
phone: string;
```
#### end\_at
```ts
end_at: string;
```
#### id
```ts
id: string;
```
#### location?
```ts
optional location?: object;
```
##### location.address
```ts
address: string;
```
##### location.name
```ts
name: string;
```
#### notes?
```ts
optional notes?: string;
```
#### start\_at
```ts
start_at: string;
```
#### status
```ts
status: BookingStatus;
```
---
## Interface: CallUpdateParams
[@dialstack/sdk](../../index.md) / [server](../index.md) / CallUpdateParams
# Interface: CallUpdateParams
Defined in: [sdk/src/server/index.ts:511](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L511)
## Properties
### actions
```ts
actions: CallAction[];
```
Defined in: [sdk/src/server/index.ts:512](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L512)
---
## Interface: ComponentConfig
[@dialstack/sdk](../../index.md) / [server](../index.md) / ComponentConfig
# Interface: ComponentConfig
Defined in: [sdk/src/server/index.ts:187](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L187)
## Properties
### enabled
```ts
enabled: boolean;
```
Defined in: [sdk/src/server/index.ts:188](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L188)
---
## Interface: CreateBookingWebhook
[@dialstack/sdk](../../index.md) / [server](../index.md) / CreateBookingWebhook
# Interface: CreateBookingWebhook
Defined in: [sdk/src/server/index.ts:569](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L569)
## Properties
### account\_id
```ts
account_id: string;
```
Defined in: [sdk/src/server/index.ts:570](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L570)
***
### booking
```ts
booking: object;
```
Defined in: [sdk/src/server/index.ts:572](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L572)
#### customer
```ts
customer: object;
```
##### customer.email?
```ts
optional email?: string;
```
##### customer.name
```ts
name: string;
```
##### customer.phone
```ts
phone: string;
```
#### duration\_minutes
```ts
duration_minutes: number;
```
#### notes?
```ts
optional notes?: string;
```
#### start\_at
```ts
start_at: string;
```
***
### idempotency\_key
```ts
idempotency_key: string;
```
Defined in: [sdk/src/server/index.ts:571](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L571)
---
## Interface: CustomerLookupResponse
[@dialstack/sdk](../../index.md) / [server](../index.md) / CustomerLookupResponse
# Interface: CustomerLookupResponse
Defined in: [sdk/src/server/index.ts:532](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L532)
## Properties
### customer?
```ts
optional customer?: object;
```
Defined in: [sdk/src/server/index.ts:534](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L534)
#### existing\_appointment?
```ts
optional existing_appointment?: object;
```
##### existing\_appointment.end\_at
```ts
end_at: string;
```
##### existing\_appointment.start\_at
```ts
start_at: string;
```
##### existing\_appointment.status
```ts
status: string;
```
#### name
```ts
name: string;
```
#### phone
```ts
phone: string;
```
***
### found
```ts
found: boolean;
```
Defined in: [sdk/src/server/index.ts:533](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L533)
---
## Interface: CustomerLookupWebhook
[@dialstack/sdk](../../index.md) / [server](../index.md) / CustomerLookupWebhook
# Interface: CustomerLookupWebhook
Defined in: [sdk/src/server/index.ts:525](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L525)
## Properties
### account\_id
```ts
account_id: string;
```
Defined in: [sdk/src/server/index.ts:526](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L526)
***
### customer
```ts
customer: object;
```
Defined in: [sdk/src/server/index.ts:527](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L527)
#### phone
```ts
phone: string;
```
---
## Interface: DateRange(Interfaces)
[@dialstack/sdk](../../index.md) / [server](../index.md) / DateRange
# Interface: DateRange
Defined in: [sdk/src/server/index.ts:258](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L258)
## Properties
### end
```ts
end: string;
```
Defined in: [sdk/src/server/index.ts:262](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L262)
End date in YYYY-MM-DD format
***
### start
```ts
start: string;
```
Defined in: [sdk/src/server/index.ts:260](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L260)
Start date in YYYY-MM-DD format
---
## Interface: DialPlan
[@dialstack/sdk](../../index.md) / [server](../index.md) / DialPlan
# Interface: DialPlan
Defined in: [sdk/src/server/index.ts:342](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L342)
## Properties
### created\_at
```ts
created_at: string;
```
Defined in: [sdk/src/server/index.ts:347](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L347)
***
### entry\_node
```ts
entry_node: string;
```
Defined in: [sdk/src/server/index.ts:345](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L345)
***
### id
```ts
id: string;
```
Defined in: [sdk/src/server/index.ts:343](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L343)
***
### name
```ts
name: string;
```
Defined in: [sdk/src/server/index.ts:344](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L344)
***
### nodes
```ts
nodes: DialPlanNode[];
```
Defined in: [sdk/src/server/index.ts:346](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L346)
***
### updated\_at
```ts
updated_at: string;
```
Defined in: [sdk/src/server/index.ts:348](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L348)
---
## Interface: DialPlanCreateParams
[@dialstack/sdk](../../index.md) / [server](../index.md) / DialPlanCreateParams
# Interface: DialPlanCreateParams
Defined in: [sdk/src/server/index.ts:351](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L351)
## Properties
### entry\_node
```ts
entry_node: string;
```
Defined in: [sdk/src/server/index.ts:353](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L353)
***
### name
```ts
name: string;
```
Defined in: [sdk/src/server/index.ts:352](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L352)
***
### nodes
```ts
nodes: DialPlanNode[];
```
Defined in: [sdk/src/server/index.ts:354](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L354)
---
## Interface: DialPlanListParams
[@dialstack/sdk](../../index.md) / [server](../index.md) / DialPlanListParams
# Interface: DialPlanListParams
Defined in: [sdk/src/server/index.ts:357](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L357)
## Properties
### limit?
```ts
optional limit?: number;
```
Defined in: [sdk/src/server/index.ts:358](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L358)
***
### page?
```ts
optional page?: string;
```
Defined in: [sdk/src/server/index.ts:359](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L359)
---
## Interface: DialStackConfig
[@dialstack/sdk](../../index.md) / [server](../index.md) / DialStackConfig
# Interface: DialStackConfig
Defined in: [sdk/src/server/index.ts:63](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L63)
## Properties
### apiUrl?
```ts
optional apiUrl?: string;
```
Defined in: [sdk/src/server/index.ts:65](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L65)
Base URL for API requests (default: https://api.dialstack.ai)
***
### appInfo?
```ts
optional appInfo?: AppInfo;
```
Defined in: [sdk/src/server/index.ts:73](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L73)
Application info for user-agent
***
### maxNetworkRetries?
```ts
optional maxNetworkRetries?: number;
```
Defined in: [sdk/src/server/index.ts:69](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L69)
Maximum number of retries for failed requests (default: 2)
***
### telemetry?
```ts
optional telemetry?: boolean;
```
Defined in: [sdk/src/server/index.ts:71](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L71)
Enable telemetry (default: true)
***
### timeout?
```ts
optional timeout?: number;
```
Defined in: [sdk/src/server/index.ts:67](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L67)
Request timeout in milliseconds (default: 80000)
---
## Interface: Extension
[@dialstack/sdk](../../index.md) / [server](../index.md) / Extension
# Interface: Extension
Defined in: [sdk/src/server/index.ts:365](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L365)
## Properties
### created\_at
```ts
created_at: string;
```
Defined in: [sdk/src/server/index.ts:369](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L369)
***
### number
```ts
number: string;
```
Defined in: [sdk/src/server/index.ts:366](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L366)
***
### status
```ts
status: ExtensionStatus;
```
Defined in: [sdk/src/server/index.ts:368](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L368)
***
### target
```ts
target: string;
```
Defined in: [sdk/src/server/index.ts:367](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L367)
***
### updated\_at
```ts
updated_at: string;
```
Defined in: [sdk/src/server/index.ts:370](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L370)
---
## Interface: ExtensionCreateParams
[@dialstack/sdk](../../index.md) / [server](../index.md) / ExtensionCreateParams
# Interface: ExtensionCreateParams
Defined in: [sdk/src/server/index.ts:373](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L373)
## Properties
### number
```ts
number: string;
```
Defined in: [sdk/src/server/index.ts:374](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L374)
***
### target
```ts
target: string;
```
Defined in: [sdk/src/server/index.ts:375](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L375)
---
## Interface: ExtensionListParams
[@dialstack/sdk](../../index.md) / [server](../index.md) / ExtensionListParams
# Interface: ExtensionListParams
Defined in: [sdk/src/server/index.ts:382](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L382)
## Properties
### limit?
```ts
optional limit?: number;
```
Defined in: [sdk/src/server/index.ts:383](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L383)
***
### target?
```ts
optional target?: string;
```
Defined in: [sdk/src/server/index.ts:384](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L384)
---
## Interface: ExtensionUpdateParams
[@dialstack/sdk](../../index.md) / [server](../index.md) / ExtensionUpdateParams
# Interface: ExtensionUpdateParams
Defined in: [sdk/src/server/index.ts:378](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L378)
## Properties
### target?
```ts
optional target?: string;
```
Defined in: [sdk/src/server/index.ts:379](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L379)
---
## Interface: ExternalDialNode(Interfaces)
[@dialstack/sdk](../../index.md) / [server](../index.md) / ExternalDialNode
# Interface: ExternalDialNode
Defined in: [sdk/src/server/index.ts:335](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L335)
## Extends
- `DialPlanNodeBase`
## Properties
### config
```ts
config: ExternalDialNodeConfig;
```
Defined in: [sdk/src/server/index.ts:337](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L337)
***
### id
```ts
id: string;
```
Defined in: [sdk/src/server/index.ts:316](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L316)
#### Inherited from
```ts
DialPlanNodeBase.id
```
***
### position?
```ts
optional position?: object;
```
Defined in: [sdk/src/server/index.ts:317](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L317)
#### x
```ts
x: number;
```
#### y
```ts
y: number;
```
#### Inherited from
```ts
DialPlanNodeBase.position
```
***
### type
```ts
type: "external_dial";
```
Defined in: [sdk/src/server/index.ts:336](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L336)
---
## Interface: ExternalDialNodeConfig(Interfaces)
[@dialstack/sdk](../../index.md) / [server](../index.md) / ExternalDialNodeConfig
# Interface: ExternalDialNodeConfig
Defined in: [sdk/src/server/index.ts:309](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L309)
## Properties
### next?
```ts
optional next?: string;
```
Defined in: [sdk/src/server/index.ts:312](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L312)
***
### phone\_number
```ts
phone_number: string;
```
Defined in: [sdk/src/server/index.ts:310](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L310)
***
### timeout
```ts
timeout: number;
```
Defined in: [sdk/src/server/index.ts:311](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L311)
---
## Interface: InternalDialNode(Interfaces)
[@dialstack/sdk](../../index.md) / [server](../index.md) / InternalDialNode
# Interface: InternalDialNode
Defined in: [sdk/src/server/index.ts:325](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L325)
## Extends
- `DialPlanNodeBase`
## Properties
### config
```ts
config: InternalDialNodeConfig;
```
Defined in: [sdk/src/server/index.ts:327](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L327)
***
### id
```ts
id: string;
```
Defined in: [sdk/src/server/index.ts:316](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L316)
#### Inherited from
```ts
DialPlanNodeBase.id
```
***
### position?
```ts
optional position?: object;
```
Defined in: [sdk/src/server/index.ts:317](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L317)
#### x
```ts
x: number;
```
#### y
```ts
y: number;
```
#### Inherited from
```ts
DialPlanNodeBase.position
```
***
### type
```ts
type: "internal_dial";
```
Defined in: [sdk/src/server/index.ts:326](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L326)
---
## Interface: InternalDialNodeConfig(Interfaces)
[@dialstack/sdk](../../index.md) / [server](../index.md) / InternalDialNodeConfig
# Interface: InternalDialNodeConfig
Defined in: [sdk/src/server/index.ts:298](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L298)
## Properties
### next?
```ts
optional next?: string;
```
Defined in: [sdk/src/server/index.ts:301](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L301)
***
### target\_id
```ts
target_id: string;
```
Defined in: [sdk/src/server/index.ts:299](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L299)
***
### timeout?
```ts
optional timeout?: number;
```
Defined in: [sdk/src/server/index.ts:300](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L300)
---
## Interface: MediaStreamAudioEvent
[@dialstack/sdk](../../index.md) / [server](../index.md) / MediaStreamAudioEvent
# Interface: MediaStreamAudioEvent
Defined in: [sdk/src/server/media-stream.ts:68](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/media-stream.ts#L68)
## Properties
### event
```ts
event: "audio";
```
Defined in: [sdk/src/server/media-stream.ts:69](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/media-stream.ts#L69)
***
### payload
```ts
payload: string;
```
Defined in: [sdk/src/server/media-stream.ts:71](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/media-stream.ts#L71)
***
### timestamp
```ts
timestamp: number;
```
Defined in: [sdk/src/server/media-stream.ts:70](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/media-stream.ts#L70)
---
## Interface: MediaStreamBeginEvent
[@dialstack/sdk](../../index.md) / [server](../index.md) / MediaStreamBeginEvent
# Interface: MediaStreamBeginEvent
Defined in: [sdk/src/server/media-stream.ts:61](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/media-stream.ts#L61)
## Properties
### account\_id
```ts
account_id: string;
```
Defined in: [sdk/src/server/media-stream.ts:64](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/media-stream.ts#L64)
***
### audio\_format
```ts
audio_format: AudioFormat;
```
Defined in: [sdk/src/server/media-stream.ts:65](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/media-stream.ts#L65)
***
### call\_id
```ts
call_id: string;
```
Defined in: [sdk/src/server/media-stream.ts:63](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/media-stream.ts#L63)
***
### event
```ts
event: "begin";
```
Defined in: [sdk/src/server/media-stream.ts:62](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/media-stream.ts#L62)
---
## Interface: MediaStreamEvents
[@dialstack/sdk](../../index.md) / [server](../index.md) / MediaStreamEvents
# Interface: MediaStreamEvents
Defined in: [sdk/src/server/media-stream.ts:76](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/media-stream.ts#L76)
## Properties
### audio
```ts
audio: (event) => void;
```
Defined in: [sdk/src/server/media-stream.ts:78](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/media-stream.ts#L78)
#### Parameters
##### event
[`MediaStreamAudioEvent`](MediaStreamAudioEvent.md)
#### Returns
`void`
***
### begin
```ts
begin: (event) => void;
```
Defined in: [sdk/src/server/media-stream.ts:77](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/media-stream.ts#L77)
#### Parameters
##### event
[`MediaStreamBeginEvent`](MediaStreamBeginEvent.md)
#### Returns
`void`
***
### close
```ts
close: (code, reason) => void;
```
Defined in: [sdk/src/server/media-stream.ts:79](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/media-stream.ts#L79)
#### Parameters
##### code
`number`
##### reason
`string`
#### Returns
`void`
***
### error
```ts
error: (error) => void;
```
Defined in: [sdk/src/server/media-stream.ts:80](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/media-stream.ts#L80)
#### Parameters
##### error
`Error`
#### Returns
`void`
---
## Interface: PaginatedList\
[@dialstack/sdk](../../index.md) / [server](../index.md) / PaginatedList
# Interface: PaginatedList\
Defined in: [sdk/src/server/index.ts:622](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L622)
## Extends
- `Promise`\<`ListResponse`\<`T`\>\>
## Type Parameters
### T
`T`
## Properties
### \[toStringTag\]
```ts
readonly [toStringTag]: string;
```
Defined in: docs/node\_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts:174
#### Inherited from
```ts
Promise.[toStringTag]
```
## Methods
### autoPagingEach()
```ts
autoPagingEach(): AsyncIterableIterator;
```
Defined in: [sdk/src/server/index.ts:623](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L623)
#### Returns
`AsyncIterableIterator`\<`T`\>
***
### autoPagingToArray()
```ts
autoPagingToArray(options?): Promise;
```
Defined in: [sdk/src/server/index.ts:624](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L624)
#### Parameters
##### options?
###### limit?
`number`
#### Returns
`Promise`\<`T`[]\>
***
### catch()
```ts
catch(onrejected?): Promise | TResult>;
```
Defined in: docs/node\_modules/typescript/lib/lib.es5.d.ts:1562
Attaches a callback for only the rejection of the Promise.
#### Type Parameters
##### TResult
`TResult` = `never`
#### Parameters
##### onrejected?
((`reason`) => `TResult` \| `PromiseLike`\<`TResult`\>) \| `null`
The callback to execute when the Promise is rejected.
#### Returns
`Promise`\<`ListResponse`\<`T`\> \| `TResult`\>
A Promise for the completion of the callback.
#### Inherited from
```ts
Promise.catch
```
***
### finally()
```ts
finally(onfinally?): Promise>;
```
Defined in: docs/node\_modules/typescript/lib/lib.es2018.promise.d.ts:27
Attaches a callback that is invoked when the Promise is settled (fulfilled or rejected). The
resolved value cannot be modified from the callback.
#### Parameters
##### onfinally?
(() => `void`) \| `null`
The callback to execute when the Promise is settled (fulfilled or rejected).
#### Returns
`Promise`\<`ListResponse`\<`T`\>\>
A Promise for the completion of the callback.
#### Inherited from
```ts
Promise.finally
```
***
### then()
```ts
then(onfulfilled?, onrejected?): Promise;
```
Defined in: docs/node\_modules/typescript/lib/lib.es5.d.ts:1555
Attaches callbacks for the resolution and/or rejection of the Promise.
#### Type Parameters
##### TResult1
`TResult1` = `ListResponse`\<`T`\>
##### TResult2
`TResult2` = `never`
#### Parameters
##### onfulfilled?
((`value`) => `TResult1` \| `PromiseLike`\<`TResult1`\>) \| `null`
The callback to execute when the Promise is resolved.
##### onrejected?
((`reason`) => `TResult2` \| `PromiseLike`\<`TResult2`\>) \| `null`
The callback to execute when the Promise is rejected.
#### Returns
`Promise`\<`TResult1` \| `TResult2`\>
A Promise for the completion of which ever callback is executed.
#### Inherited from
```ts
Promise.then
```
---
## Interface: PhoneNumber
[@dialstack/sdk](../../index.md) / [server](../index.md) / PhoneNumber
# Interface: PhoneNumber
Defined in: [sdk/src/server/index.ts:174](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L174)
## Properties
### created\_at
```ts
created_at: string;
```
Defined in: [sdk/src/server/index.ts:178](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L178)
***
### id
```ts
id: string;
```
Defined in: [sdk/src/server/index.ts:175](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L175)
***
### phone\_number
```ts
phone_number: string;
```
Defined in: [sdk/src/server/index.ts:176](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L176)
***
### status
```ts
status: "pending" | "active" | "inactive";
```
Defined in: [sdk/src/server/index.ts:177](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L177)
---
## Interface: PhoneNumberListParams
[@dialstack/sdk](../../index.md) / [server](../index.md) / PhoneNumberListParams
# Interface: PhoneNumberListParams
Defined in: [sdk/src/server/index.ts:181](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L181)
## Properties
### limit?
```ts
optional limit?: number;
```
Defined in: [sdk/src/server/index.ts:182](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L182)
***
### page?
```ts
optional page?: string;
```
Defined in: [sdk/src/server/index.ts:183](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L183)
***
### status?
```ts
optional status?: "pending" | "active" | "inactive";
```
Defined in: [sdk/src/server/index.ts:184](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L184)
---
## Interface: Queue
[@dialstack/sdk](../../index.md) / [server](../index.md) / Queue
# Interface: Queue
Defined in: [sdk/src/server/index.ts:432](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L432)
## Properties
### created\_at
```ts
created_at: string;
```
Defined in: [sdk/src/server/index.ts:446](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L446)
***
### extensions?
```ts
optional extensions?: ListResponse;
```
Defined in: [sdk/src/server/index.ts:445](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L445)
Populated only when the request includes `expand[]=extensions`.
***
### id
```ts
id: string;
```
Defined in: [sdk/src/server/index.ts:433](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L433)
***
### join\_empty
```ts
join_empty: string;
```
Defined in: [sdk/src/server/index.ts:440](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L440)
***
### leave\_when\_empty
```ts
leave_when_empty: string;
```
Defined in: [sdk/src/server/index.ts:441](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L441)
***
### max\_queue\_length
```ts
max_queue_length: number;
```
Defined in: [sdk/src/server/index.ts:439](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L439)
***
### members?
```ts
optional members?: ListResponse;
```
Defined in: [sdk/src/server/index.ts:443](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L443)
Populated only when the request includes `expand[]=members`.
***
### name
```ts
name: string;
```
Defined in: [sdk/src/server/index.ts:434](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L434)
***
### strategy
```ts
strategy: string;
```
Defined in: [sdk/src/server/index.ts:435](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L435)
***
### timeout\_action
```ts
timeout_action: string | null;
```
Defined in: [sdk/src/server/index.ts:437](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L437)
***
### timeout\_seconds
```ts
timeout_seconds: number;
```
Defined in: [sdk/src/server/index.ts:436](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L436)
***
### timeout\_target
```ts
timeout_target: string | null;
```
Defined in: [sdk/src/server/index.ts:438](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L438)
***
### updated\_at
```ts
updated_at: string;
```
Defined in: [sdk/src/server/index.ts:447](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L447)
---
## Interface: QueueAddMemberParams
[@dialstack/sdk](../../index.md) / [server](../index.md) / QueueAddMemberParams
# Interface: QueueAddMemberParams
Defined in: [sdk/src/server/index.ts:486](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L486)
## Properties
### penalty?
```ts
optional penalty?: number;
```
Defined in: [sdk/src/server/index.ts:488](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L488)
***
### position?
```ts
optional position?: number;
```
Defined in: [sdk/src/server/index.ts:489](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L489)
***
### user\_id
```ts
user_id: string;
```
Defined in: [sdk/src/server/index.ts:487](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L487)
---
## Interface: QueueCreateParams
[@dialstack/sdk](../../index.md) / [server](../index.md) / QueueCreateParams
# Interface: QueueCreateParams
Defined in: [sdk/src/server/index.ts:459](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L459)
## Properties
### join\_empty?
```ts
optional join_empty?: string;
```
Defined in: [sdk/src/server/index.ts:466](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L466)
***
### leave\_when\_empty?
```ts
optional leave_when_empty?: string;
```
Defined in: [sdk/src/server/index.ts:467](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L467)
***
### max\_queue\_length?
```ts
optional max_queue_length?: number;
```
Defined in: [sdk/src/server/index.ts:465](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L465)
***
### name
```ts
name: string;
```
Defined in: [sdk/src/server/index.ts:460](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L460)
***
### strategy?
```ts
optional strategy?: string;
```
Defined in: [sdk/src/server/index.ts:461](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L461)
***
### timeout\_action?
```ts
optional timeout_action?: string | null;
```
Defined in: [sdk/src/server/index.ts:463](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L463)
***
### timeout\_seconds?
```ts
optional timeout_seconds?: number;
```
Defined in: [sdk/src/server/index.ts:462](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L462)
***
### timeout\_target?
```ts
optional timeout_target?: string | null;
```
Defined in: [sdk/src/server/index.ts:464](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L464)
---
## Interface: QueueListMembersParams
[@dialstack/sdk](../../index.md) / [server](../index.md) / QueueListMembersParams
# Interface: QueueListMembersParams
Defined in: [sdk/src/server/index.ts:492](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L492)
## Properties
### ending\_before?
```ts
optional ending_before?: string;
```
Defined in: [sdk/src/server/index.ts:495](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L495)
***
### limit?
```ts
optional limit?: number;
```
Defined in: [sdk/src/server/index.ts:493](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L493)
***
### starting\_after?
```ts
optional starting_after?: string;
```
Defined in: [sdk/src/server/index.ts:494](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L494)
---
## Interface: QueueListParams
[@dialstack/sdk](../../index.md) / [server](../index.md) / QueueListParams
# Interface: QueueListParams
Defined in: [sdk/src/server/index.ts:481](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L481)
## Properties
### limit?
```ts
optional limit?: number;
```
Defined in: [sdk/src/server/index.ts:482](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L482)
***
### page?
```ts
optional page?: string;
```
Defined in: [sdk/src/server/index.ts:483](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L483)
---
## Interface: QueueMember
[@dialstack/sdk](../../index.md) / [server](../index.md) / QueueMember
# Interface: QueueMember
Defined in: [sdk/src/server/index.ts:450](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L450)
## Properties
### created\_at
```ts
created_at: string;
```
Defined in: [sdk/src/server/index.ts:456](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L456)
***
### id
```ts
id: string;
```
Defined in: [sdk/src/server/index.ts:451](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L451)
***
### penalty
```ts
penalty: number;
```
Defined in: [sdk/src/server/index.ts:454](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L454)
***
### position
```ts
position: number;
```
Defined in: [sdk/src/server/index.ts:455](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L455)
***
### queue\_id
```ts
queue_id: string;
```
Defined in: [sdk/src/server/index.ts:452](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L452)
***
### user\_id
```ts
user_id: string;
```
Defined in: [sdk/src/server/index.ts:453](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L453)
---
## Interface: QueueUpdateParams
[@dialstack/sdk](../../index.md) / [server](../index.md) / QueueUpdateParams
# Interface: QueueUpdateParams
Defined in: [sdk/src/server/index.ts:470](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L470)
## Properties
### join\_empty?
```ts
optional join_empty?: string;
```
Defined in: [sdk/src/server/index.ts:477](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L477)
***
### leave\_when\_empty?
```ts
optional leave_when_empty?: string;
```
Defined in: [sdk/src/server/index.ts:478](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L478)
***
### max\_queue\_length?
```ts
optional max_queue_length?: number;
```
Defined in: [sdk/src/server/index.ts:476](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L476)
***
### name?
```ts
optional name?: string;
```
Defined in: [sdk/src/server/index.ts:471](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L471)
***
### strategy?
```ts
optional strategy?: string;
```
Defined in: [sdk/src/server/index.ts:472](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L472)
***
### timeout\_action?
```ts
optional timeout_action?: string | null;
```
Defined in: [sdk/src/server/index.ts:474](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L474)
***
### timeout\_seconds?
```ts
optional timeout_seconds?: number;
```
Defined in: [sdk/src/server/index.ts:473](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L473)
***
### timeout\_target?
```ts
optional timeout_target?: string | null;
```
Defined in: [sdk/src/server/index.ts:475](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L475)
---
## Interface: RequestEvent
[@dialstack/sdk](../../index.md) / [server](../index.md) / RequestEvent
# Interface: RequestEvent
Defined in: [sdk/src/server/index.ts:93](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L93)
## Properties
### dialstackAccount?
```ts
optional dialstackAccount?: string;
```
Defined in: [sdk/src/server/index.ts:96](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L96)
***
### idempotencyKey?
```ts
optional idempotencyKey?: string;
```
Defined in: [sdk/src/server/index.ts:97](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L97)
***
### method
```ts
method: string;
```
Defined in: [sdk/src/server/index.ts:94](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L94)
***
### path
```ts
path: string;
```
Defined in: [sdk/src/server/index.ts:95](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L95)
***
### requestStartTime
```ts
requestStartTime: number;
```
Defined in: [sdk/src/server/index.ts:98](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L98)
---
## Interface: RequestOptions
[@dialstack/sdk](../../index.md) / [server](../index.md) / RequestOptions
# Interface: RequestOptions
Defined in: [sdk/src/server/index.ts:82](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L82)
## Properties
### dialstackAccount?
```ts
optional dialstackAccount?: string;
```
Defined in: [sdk/src/server/index.ts:90](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L90)
Account ID for multi-tenant requests (passed as DialStack-Account header)
***
### idempotencyKey?
```ts
optional idempotencyKey?: string;
```
Defined in: [sdk/src/server/index.ts:84](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L84)
Idempotency key for safe retries
***
### maxNetworkRetries?
```ts
optional maxNetworkRetries?: number;
```
Defined in: [sdk/src/server/index.ts:88](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L88)
Max retries override for this request
***
### timeout?
```ts
optional timeout?: number;
```
Defined in: [sdk/src/server/index.ts:86](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L86)
Request timeout override in milliseconds
---
## Interface: ResponseEvent
[@dialstack/sdk](../../index.md) / [server](../index.md) / ResponseEvent
# Interface: ResponseEvent
Defined in: [sdk/src/server/index.ts:101](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L101)
## Properties
### dialstackAccount?
```ts
optional dialstackAccount?: string;
```
Defined in: [sdk/src/server/index.ts:106](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L106)
***
### elapsed
```ts
elapsed: number;
```
Defined in: [sdk/src/server/index.ts:107](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L107)
***
### method
```ts
method: string;
```
Defined in: [sdk/src/server/index.ts:102](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L102)
***
### path
```ts
path: string;
```
Defined in: [sdk/src/server/index.ts:103](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L103)
***
### requestId?
```ts
optional requestId?: string;
```
Defined in: [sdk/src/server/index.ts:105](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L105)
***
### statusCode
```ts
statusCode: number;
```
Defined in: [sdk/src/server/index.ts:104](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L104)
---
## Interface: RingAllUsersNode(Interfaces)
[@dialstack/sdk](../../index.md) / [server](../index.md) / RingAllUsersNode
# Interface: RingAllUsersNode
Defined in: [sdk/src/server/index.ts:330](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L330)
## Extends
- `DialPlanNodeBase`
## Properties
### config
```ts
config: RingAllUsersNodeConfig;
```
Defined in: [sdk/src/server/index.ts:332](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L332)
***
### id
```ts
id: string;
```
Defined in: [sdk/src/server/index.ts:316](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L316)
#### Inherited from
```ts
DialPlanNodeBase.id
```
***
### position?
```ts
optional position?: object;
```
Defined in: [sdk/src/server/index.ts:317](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L317)
#### x
```ts
x: number;
```
#### y
```ts
y: number;
```
#### Inherited from
```ts
DialPlanNodeBase.position
```
***
### type
```ts
type: "ring_all_users";
```
Defined in: [sdk/src/server/index.ts:331](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L331)
---
## Interface: RingAllUsersNodeConfig(Interfaces)
[@dialstack/sdk](../../index.md) / [server](../index.md) / RingAllUsersNodeConfig
# Interface: RingAllUsersNodeConfig
Defined in: [sdk/src/server/index.ts:304](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L304)
## Properties
### next?
```ts
optional next?: string;
```
Defined in: [sdk/src/server/index.ts:306](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L306)
***
### timeout
```ts
timeout: number;
```
Defined in: [sdk/src/server/index.ts:305](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L305)
---
## Interface: RingGroup
[@dialstack/sdk](../../index.md) / [server](../index.md) / RingGroup
# Interface: RingGroup
Defined in: [sdk/src/server/index.ts:388](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L388)
## Properties
### confirm\_external
```ts
confirm_external: boolean;
```
Defined in: [sdk/src/server/index.ts:393](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L393)
***
### created\_at
```ts
created_at: string;
```
Defined in: [sdk/src/server/index.ts:395](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L395)
***
### id
```ts
id: string;
```
Defined in: [sdk/src/server/index.ts:389](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L389)
***
### ignore\_forwarding
```ts
ignore_forwarding: boolean;
```
Defined in: [sdk/src/server/index.ts:392](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L392)
***
### members
```ts
members: RingGroupMember[];
```
Defined in: [sdk/src/server/index.ts:394](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L394)
***
### name
```ts
name: string;
```
Defined in: [sdk/src/server/index.ts:390](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L390)
***
### timeout\_seconds
```ts
timeout_seconds: number;
```
Defined in: [sdk/src/server/index.ts:391](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L391)
***
### updated\_at
```ts
updated_at: string;
```
Defined in: [sdk/src/server/index.ts:396](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L396)
---
## Interface: RingGroupAddMemberParams
[@dialstack/sdk](../../index.md) / [server](../index.md) / RingGroupAddMemberParams
# Interface: RingGroupAddMemberParams
Defined in: [sdk/src/server/index.ts:426](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L426)
## Properties
### extension?
```ts
optional extension?: string;
```
Defined in: [sdk/src/server/index.ts:427](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L427)
***
### phone\_number?
```ts
optional phone_number?: string;
```
Defined in: [sdk/src/server/index.ts:428](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L428)
---
## Interface: RingGroupCreateParams
[@dialstack/sdk](../../index.md) / [server](../index.md) / RingGroupCreateParams
# Interface: RingGroupCreateParams
Defined in: [sdk/src/server/index.ts:407](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L407)
## Properties
### confirm\_external?
```ts
optional confirm_external?: boolean;
```
Defined in: [sdk/src/server/index.ts:411](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L411)
***
### ignore\_forwarding?
```ts
optional ignore_forwarding?: boolean;
```
Defined in: [sdk/src/server/index.ts:410](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L410)
***
### name
```ts
name: string;
```
Defined in: [sdk/src/server/index.ts:408](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L408)
***
### timeout\_seconds?
```ts
optional timeout_seconds?: number;
```
Defined in: [sdk/src/server/index.ts:409](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L409)
---
## Interface: RingGroupListParams
[@dialstack/sdk](../../index.md) / [server](../index.md) / RingGroupListParams
# Interface: RingGroupListParams
Defined in: [sdk/src/server/index.ts:421](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L421)
## Properties
### limit?
```ts
optional limit?: number;
```
Defined in: [sdk/src/server/index.ts:422](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L422)
***
### page?
```ts
optional page?: string;
```
Defined in: [sdk/src/server/index.ts:423](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L423)
---
## Interface: RingGroupMember
[@dialstack/sdk](../../index.md) / [server](../index.md) / RingGroupMember
# Interface: RingGroupMember
Defined in: [sdk/src/server/index.ts:399](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L399)
## Properties
### created\_at
```ts
created_at: string;
```
Defined in: [sdk/src/server/index.ts:404](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L404)
***
### extension
```ts
extension: string | null;
```
Defined in: [sdk/src/server/index.ts:402](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L402)
***
### id
```ts
id: string;
```
Defined in: [sdk/src/server/index.ts:400](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L400)
***
### phone\_number
```ts
phone_number: string | null;
```
Defined in: [sdk/src/server/index.ts:403](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L403)
***
### ring\_group\_id
```ts
ring_group_id: string;
```
Defined in: [sdk/src/server/index.ts:401](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L401)
---
## Interface: RingGroupUpdateParams
[@dialstack/sdk](../../index.md) / [server](../index.md) / RingGroupUpdateParams
# Interface: RingGroupUpdateParams
Defined in: [sdk/src/server/index.ts:414](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L414)
## Properties
### confirm\_external?
```ts
optional confirm_external?: boolean;
```
Defined in: [sdk/src/server/index.ts:418](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L418)
***
### ignore\_forwarding?
```ts
optional ignore_forwarding?: boolean;
```
Defined in: [sdk/src/server/index.ts:417](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L417)
***
### name?
```ts
optional name?: string;
```
Defined in: [sdk/src/server/index.ts:415](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L415)
***
### timeout\_seconds?
```ts
optional timeout_seconds?: number;
```
Defined in: [sdk/src/server/index.ts:416](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L416)
---
## Interface: Schedule
[@dialstack/sdk](../../index.md) / [server](../index.md) / Schedule
# Interface: Schedule
Defined in: [sdk/src/server/index.ts:265](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L265)
## Properties
### created\_at
```ts
created_at: string;
```
Defined in: [sdk/src/server/index.ts:271](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L271)
***
### holidays
```ts
holidays: DateRange[];
```
Defined in: [sdk/src/server/index.ts:270](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L270)
***
### id
```ts
id: string;
```
Defined in: [sdk/src/server/index.ts:266](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L266)
***
### name
```ts
name: string;
```
Defined in: [sdk/src/server/index.ts:267](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L267)
***
### ranges
```ts
ranges: TimeRange[];
```
Defined in: [sdk/src/server/index.ts:269](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L269)
***
### timezone
```ts
timezone: string;
```
Defined in: [sdk/src/server/index.ts:268](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L268)
***
### updated\_at
```ts
updated_at: string;
```
Defined in: [sdk/src/server/index.ts:272](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L272)
---
## Interface: ScheduleCreateParams
[@dialstack/sdk](../../index.md) / [server](../index.md) / ScheduleCreateParams
# Interface: ScheduleCreateParams
Defined in: [sdk/src/server/index.ts:275](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L275)
## Properties
### holidays?
```ts
optional holidays?: DateRange[];
```
Defined in: [sdk/src/server/index.ts:279](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L279)
***
### name
```ts
name: string;
```
Defined in: [sdk/src/server/index.ts:276](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L276)
***
### ranges
```ts
ranges: TimeRange[];
```
Defined in: [sdk/src/server/index.ts:278](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L278)
***
### timezone?
```ts
optional timezone?: string;
```
Defined in: [sdk/src/server/index.ts:277](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L277)
---
## Interface: ScheduleListParams
[@dialstack/sdk](../../index.md) / [server](../index.md) / ScheduleListParams
# Interface: ScheduleListParams
Defined in: [sdk/src/server/index.ts:282](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L282)
## Properties
### limit?
```ts
optional limit?: number;
```
Defined in: [sdk/src/server/index.ts:283](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L283)
***
### page?
```ts
optional page?: string;
```
Defined in: [sdk/src/server/index.ts:284](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L284)
---
## Interface: ScheduleNode(Interfaces)
[@dialstack/sdk](../../index.md) / [server](../index.md) / ScheduleNode
# Interface: ScheduleNode
Defined in: [sdk/src/server/index.ts:320](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L320)
## Extends
- `DialPlanNodeBase`
## Properties
### config
```ts
config: ScheduleNodeConfig;
```
Defined in: [sdk/src/server/index.ts:322](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L322)
***
### id
```ts
id: string;
```
Defined in: [sdk/src/server/index.ts:316](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L316)
#### Inherited from
```ts
DialPlanNodeBase.id
```
***
### position?
```ts
optional position?: object;
```
Defined in: [sdk/src/server/index.ts:317](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L317)
#### x
```ts
x: number;
```
#### y
```ts
y: number;
```
#### Inherited from
```ts
DialPlanNodeBase.position
```
***
### type
```ts
type: "schedule";
```
Defined in: [sdk/src/server/index.ts:321](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L321)
---
## Interface: ScheduleNodeConfig(Interfaces)
[@dialstack/sdk](../../index.md) / [server](../index.md) / ScheduleNodeConfig
# Interface: ScheduleNodeConfig
Defined in: [sdk/src/server/index.ts:292](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L292)
## Properties
### closed?
```ts
optional closed?: string;
```
Defined in: [sdk/src/server/index.ts:295](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L295)
***
### open?
```ts
optional open?: string;
```
Defined in: [sdk/src/server/index.ts:294](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L294)
***
### schedule\_id
```ts
schedule_id: string;
```
Defined in: [sdk/src/server/index.ts:293](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L293)
---
## Interface: TimeRange
[@dialstack/sdk](../../index.md) / [server](../index.md) / TimeRange
# Interface: TimeRange
Defined in: [sdk/src/server/index.ts:249](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L249)
## Properties
### day
```ts
day: number;
```
Defined in: [sdk/src/server/index.ts:251](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L251)
Day of week (0=Sunday, 6=Saturday)
***
### end
```ts
end: string;
```
Defined in: [sdk/src/server/index.ts:255](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L255)
End time in HH:MM format
***
### start
```ts
start: string;
```
Defined in: [sdk/src/server/index.ts:253](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L253)
Start time in HH:MM format
---
## Interface: Transcript
[@dialstack/sdk](../../index.md) / [server](../index.md) / Transcript
# Interface: Transcript
Defined in: [sdk/src/server/index.ts:215](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L215)
## Properties
### call\_id
```ts
call_id: string;
```
Defined in: [sdk/src/server/index.ts:216](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L216)
***
### status
```ts
status: TranscriptStatus;
```
Defined in: [sdk/src/server/index.ts:217](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L217)
***
### text
```ts
text: string | null;
```
Defined in: [sdk/src/server/index.ts:218](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L218)
---
## Interface: TransferAction
[@dialstack/sdk](../../index.md) / [server](../index.md) / TransferAction
# Interface: TransferAction
Defined in: [sdk/src/server/index.ts:504](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L504)
## Properties
### extension
```ts
extension: string;
```
Defined in: [sdk/src/server/index.ts:506](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L506)
***
### type
```ts
type: "transfer";
```
Defined in: [sdk/src/server/index.ts:505](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L505)
---
## Interface: User
[@dialstack/sdk](../../index.md) / [server](../index.md) / User
# Interface: User
Defined in: [sdk/src/server/index.ts:151](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L151)
## Properties
### created\_at
```ts
created_at: string;
```
Defined in: [sdk/src/server/index.ts:155](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L155)
***
### email
```ts
email: string | null;
```
Defined in: [sdk/src/server/index.ts:154](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L154)
***
### id
```ts
id: string;
```
Defined in: [sdk/src/server/index.ts:152](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L152)
***
### name
```ts
name: string | null;
```
Defined in: [sdk/src/server/index.ts:153](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L153)
***
### updated\_at
```ts
updated_at: string;
```
Defined in: [sdk/src/server/index.ts:156](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L156)
---
## Interface: UserCreateParams
[@dialstack/sdk](../../index.md) / [server](../index.md) / UserCreateParams
# Interface: UserCreateParams
Defined in: [sdk/src/server/index.ts:159](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L159)
## Properties
### email?
```ts
optional email?: string;
```
Defined in: [sdk/src/server/index.ts:161](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L161)
***
### name?
```ts
optional name?: string;
```
Defined in: [sdk/src/server/index.ts:160](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L160)
---
## Interface: UserListParams
[@dialstack/sdk](../../index.md) / [server](../index.md) / UserListParams
# Interface: UserListParams
Defined in: [sdk/src/server/index.ts:169](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L169)
## Properties
### limit?
```ts
optional limit?: number;
```
Defined in: [sdk/src/server/index.ts:170](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L170)
***
### page?
```ts
optional page?: string;
```
Defined in: [sdk/src/server/index.ts:171](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L171)
---
## Interface: UserUpdateParams
[@dialstack/sdk](../../index.md) / [server](../index.md) / UserUpdateParams
# Interface: UserUpdateParams
Defined in: [sdk/src/server/index.ts:164](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L164)
## Properties
### email?
```ts
optional email?: string;
```
Defined in: [sdk/src/server/index.ts:166](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L166)
***
### name?
```ts
optional name?: string;
```
Defined in: [sdk/src/server/index.ts:165](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L165)
---
## Interface: VoiceApp
[@dialstack/sdk](../../index.md) / [server](../index.md) / VoiceApp
# Interface: VoiceApp
Defined in: [sdk/src/server/index.ts:222](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L222)
## Properties
### created\_at
```ts
created_at: string;
```
Defined in: [sdk/src/server/index.ts:228](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L228)
***
### id
```ts
id: string;
```
Defined in: [sdk/src/server/index.ts:223](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L223)
***
### name
```ts
name: string;
```
Defined in: [sdk/src/server/index.ts:224](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L224)
***
### secret
```ts
secret: string;
```
Defined in: [sdk/src/server/index.ts:227](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L227)
***
### status
```ts
status: "active" | "inactive";
```
Defined in: [sdk/src/server/index.ts:226](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L226)
***
### updated\_at
```ts
updated_at: string;
```
Defined in: [sdk/src/server/index.ts:229](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L229)
***
### url
```ts
url: string;
```
Defined in: [sdk/src/server/index.ts:225](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L225)
---
## Interface: VoiceAppCreateParams
[@dialstack/sdk](../../index.md) / [server](../index.md) / VoiceAppCreateParams
# Interface: VoiceAppCreateParams
Defined in: [sdk/src/server/index.ts:232](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L232)
## Properties
### name
```ts
name: string;
```
Defined in: [sdk/src/server/index.ts:233](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L233)
***
### url
```ts
url: string;
```
Defined in: [sdk/src/server/index.ts:234](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L234)
---
## Interface: VoiceAppListParams
[@dialstack/sdk](../../index.md) / [server](../index.md) / VoiceAppListParams
# Interface: VoiceAppListParams
Defined in: [sdk/src/server/index.ts:243](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L243)
## Properties
### limit?
```ts
optional limit?: number;
```
Defined in: [sdk/src/server/index.ts:244](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L244)
***
### page?
```ts
optional page?: string;
```
Defined in: [sdk/src/server/index.ts:245](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L245)
---
## Interface: VoiceAppUpdateParams
[@dialstack/sdk](../../index.md) / [server](../index.md) / VoiceAppUpdateParams
# Interface: VoiceAppUpdateParams
Defined in: [sdk/src/server/index.ts:237](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L237)
## Properties
### name?
```ts
optional name?: string;
```
Defined in: [sdk/src/server/index.ts:238](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L238)
***
### status?
```ts
optional status?: "active" | "inactive";
```
Defined in: [sdk/src/server/index.ts:240](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L240)
***
### url?
```ts
optional url?: string;
```
Defined in: [sdk/src/server/index.ts:239](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L239)
---
## Interface: WebSocketLike
[@dialstack/sdk](../../index.md) / [server](../index.md) / WebSocketLike
# Interface: WebSocketLike
Defined in: [sdk/src/server/media-stream.ts:44](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/media-stream.ts#L44)
Minimal WebSocket interface compatible with the 'ws' package.
This allows the SDK to work without requiring 'ws' types.
## Properties
### readyState
```ts
readyState: number;
```
Defined in: [sdk/src/server/media-stream.ts:45](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/media-stream.ts#L45)
## Methods
### close()
```ts
close(): void;
```
Defined in: [sdk/src/server/media-stream.ts:52](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/media-stream.ts#L52)
#### Returns
`void`
***
### on()
#### Call Signature
```ts
on(event, listener): this;
```
Defined in: [sdk/src/server/media-stream.ts:46](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/media-stream.ts#L46)
##### Parameters
###### event
`"message"`
###### listener
(`data`) => `void`
##### Returns
`this`
#### Call Signature
```ts
on(event, listener): this;
```
Defined in: [sdk/src/server/media-stream.ts:47](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/media-stream.ts#L47)
##### Parameters
###### event
`"close"`
###### listener
(`code`, `reason`) => `void`
##### Returns
`this`
#### Call Signature
```ts
on(event, listener): this;
```
Defined in: [sdk/src/server/media-stream.ts:48](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/media-stream.ts#L48)
##### Parameters
###### event
`"error"`
###### listener
(`error`) => `void`
##### Returns
`this`
#### Call Signature
```ts
on(event, listener): this;
```
Defined in: [sdk/src/server/media-stream.ts:50](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/media-stream.ts#L50)
##### Parameters
###### event
`string`
###### listener
(...`args`) => `void`
##### Returns
`this`
***
### send()
```ts
send(data): void;
```
Defined in: [sdk/src/server/media-stream.ts:51](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/media-stream.ts#L51)
#### Parameters
##### data
`string`
#### Returns
`void`
---
## Interface: WebhookErrorResponse
[@dialstack/sdk](../../index.md) / [server](../index.md) / WebhookErrorResponse
# Interface: WebhookErrorResponse
Defined in: [sdk/src/server/index.ts:603](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L603)
## Properties
### error
```ts
error: object;
```
Defined in: [sdk/src/server/index.ts:604](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L604)
#### code
```ts
code: string;
```
#### message
```ts
message: string;
```
---
## Interface: WebhookEvent
[@dialstack/sdk](../../index.md) / [server](../index.md) / WebhookEvent
# Interface: WebhookEvent
Defined in: [sdk/src/server/index.ts:516](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L516)
## Properties
### account\_id
```ts
account_id: string;
```
Defined in: [sdk/src/server/index.ts:518](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L518)
***
### call\_id
```ts
call_id: string;
```
Defined in: [sdk/src/server/index.ts:517](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L517)
***
### from\_name
```ts
from_name: string | null;
```
Defined in: [sdk/src/server/index.ts:520](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L520)
***
### from\_number
```ts
from_number: string;
```
Defined in: [sdk/src/server/index.ts:519](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L519)
***
### to\_number
```ts
to_number: string;
```
Defined in: [sdk/src/server/index.ts:521](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L521)
---
## Type Alias: BookingStatus
[@dialstack/sdk](../../index.md) / [server](../index.md) / BookingStatus
# Type Alias: BookingStatus
```ts
type BookingStatus = "pending" | "accepted" | "cancelled" | "declined" | "no_show";
```
Defined in: [sdk/src/server/index.ts:567](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L567)
---
## Type Alias: CallAction
[@dialstack/sdk](../../index.md) / [server](../index.md) / CallAction
# Type Alias: CallAction
```ts
type CallAction =
| AttachAction
| TransferAction;
```
Defined in: [sdk/src/server/index.ts:509](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L509)
---
## Type Alias: DialPlanNode(Type-aliases)
[@dialstack/sdk](../../index.md) / [server](../index.md) / DialPlanNode
# Type Alias: DialPlanNode
```ts
type DialPlanNode =
| ScheduleNode
| InternalDialNode
| RingAllUsersNode
| ExternalDialNode;
```
Defined in: [sdk/src/server/index.ts:340](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L340)
---
## Type Alias: ExtensionStatus
[@dialstack/sdk](../../index.md) / [server](../index.md) / ExtensionStatus
# Type Alias: ExtensionStatus
```ts
type ExtensionStatus = "active" | "inactive";
```
Defined in: [sdk/src/server/index.ts:363](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L363)
---
## Type Alias: MediaStreamMessage
[@dialstack/sdk](../../index.md) / [server](../index.md) / MediaStreamMessage
# Type Alias: MediaStreamMessage
```ts
type MediaStreamMessage =
| MediaStreamBeginEvent
| MediaStreamAudioEvent;
```
Defined in: [sdk/src/server/media-stream.ts:74](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/media-stream.ts#L74)
---
## Type Alias: TranscriptStatus
[@dialstack/sdk](../../index.md) / [server](../index.md) / TranscriptStatus
# Type Alias: TranscriptStatus
```ts
type TranscriptStatus = "pending" | "processing" | "completed" | "failed";
```
Defined in: [sdk/src/server/index.ts:213](https://github.com/dialstack/dialstack-sdk/blob/main/src/server/index.ts#L213)
---
## Authentication(Sdks)
The SDK uses account-scoped sessions for secure client-side authentication. This architecture keeps your API keys safe on the server while allowing embedded components to fetch data.
## How It Works
```
┌─────────────┐ 1. Request session ┌─────────────────┐
│ Browser │ ─────────────────────────────▶│ Your Backend │
│ (SDK) │ │ │
│ │ ◀───────────────────────────── │ │
│ │ 4. Return client_secret │ │
└─────────────┘ └────────┬────────┘
│ │
│ 5. API calls with 2. Create session
│ client_secret with API key
│ │
▼ ▼
┌─────────────────────────────────────────────────────────────────┐
│ DialStack API │
└─────────────────────────────────────────────────────────────────┘
```
1. Your frontend requests a session from your backend
2. Your backend creates a session using the Server SDK with your API key
3. DialStack returns a `client_secret` scoped to a specific account
4. Your backend returns the `client_secret` to the frontend
5. The SDK uses the `client_secret` for all API calls
## Server-Side: Creating Sessions
Use the Server SDK to create account sessions:
```typescript
import { DialStack } from '@dialstack/sdk/server';
const dialstack = new DialStack(process.env.DIALSTACK_API_KEY);
// Express.js example
app.post('/api/create-session', async (req, res) => {
const { accountId } = req.body;
const session = await dialstack.accountSessions.create({
account: accountId,
components: {
call_logs: { enabled: true },
voicemails: { enabled: true },
},
});
res.json({
client_secret: session.client_secret,
expires_at: session.expires_at,
});
});
```
### Session Response
```typescript
interface AccountSessionCreateResponse {
client_secret: string; // Token for client-side use
expires_at: string; // ISO 8601 timestamp
}
```
## Client-Side: Using Sessions
### React
```tsx
import { initialize, DialstackComponentsProvider, CallLogs } from '@dialstack/sdk';
import { useEffect, useState } from 'react';
const dialstack = initialize({
publishableKey: 'pk_live_YOUR_KEY',
});
function App() {
const [clientSecret, setClientSecret] = useState(null);
useEffect(() => {
fetch('/api/create-session', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ accountId: 'acct_01h2xcejqtf2nbrexx3vqjhp41' }),
})
.then((res) => res.json())
.then((data) => setClientSecret(data.client_secret));
}, []);
if (!clientSecret) {
return Loading...;
}
return (
);
}
```
### Vanilla JavaScript
```javascript
const dialstack = DialStack.initialize({
publishableKey: 'pk_live_YOUR_KEY',
});
// Fetch session from your backend
const response = await fetch('/api/create-session', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ accountId: 'acct_01h2xcejqtf2nbrexx3vqjhp41' }),
});
const { client_secret } = await response.json();
// Set on components
const callLogs = document.querySelector('dialstack-call-logs');
callLogs.setClientSecret(client_secret);
```
## Session Expiry
Sessions expire after **1 hour** by default. The SDK handles token refresh automatically when you provide the full session response:
```tsx
// Pass the full response object for automatic refresh handling
```
The SDK refreshes the session 5 minutes before expiry. If you only pass the `client_secret` string, you're responsible for refreshing expired sessions.
## Component Permissions
Control which components a session can access:
```typescript
const session = await dialstack.accountSessions.create({
account: accountId,
components: {
call_logs: { enabled: true },
voicemails: { enabled: false }, // Disabled
},
});
```
Components will show an error if the session doesn't have permission.
## Security Best Practices
### Keep API Keys Server-Side
:::danger[Never expose API keys]
API keys (`sk_live_*`) must never appear in client-side code. Only use `client_secret` tokens in the browser.
:::
```typescript
// Server-side only
const dialstack = new DialStack(process.env.DIALSTACK_API_KEY);
```
### Validate Account Access
Before creating a session, verify the user has permission to access the requested account:
```typescript
app.post('/api/create-session', async (req, res) => {
const { accountId } = req.body;
const userId = req.user.id; // From your auth middleware
// Verify user has access to this account
const hasAccess = await verifyAccountAccess(userId, accountId);
if (!hasAccess) {
return res.status(403).json({ error: 'Access denied' });
}
const session = await dialstack.accountSessions.create({
account: accountId,
});
res.json(session);
});
```
### Session Token Security
- Session tokens cannot create new sessions (prevents escalation)
- Tokens are scoped to a single account
- Tokens expire after 1 hour
- Tokens can only access enabled components
## Error Handling
### Invalid Session
```tsx
{
if (event.error.includes('session')) {
// Refresh session and retry
refreshSession();
}
}}
/>
```
### Missing Provider
If you forget the provider, you'll see:
```
Error: Could not find DialStack context; You need to wrap your app
in a provider.
```
## Next Steps
- [React Components](/sdks/react) - Build with React
- [Server SDK](/sdks/server) - Full server-side API
- [Theming](/sdks/theming) - Customize appearance
---
## Internationalization (i18n)
Customize all UI strings in DialStack components for localization or branding.
## Quick Start
```tsx
import { en } from '@dialstack/sdk/locales';
// Create French locale
const fr = {
...en,
common: {
...en.common,
loading: 'Chargement...',
error: 'Erreur',
noResults: 'Aucun résultat',
},
callLogs: {
...en.callLogs,
title: 'Journal des appels',
empty: 'Aucun appel trouvé',
},
};
;
```
## Locale Structure
The locale object has three main sections:
```typescript
interface Locale {
common: CommonStrings;
voicemails: VoicemailStrings;
callLogs: CallLogStrings;
}
```
### Common Strings
Shared across all components:
```typescript
interface CommonStrings {
loading: string; // 'Loading...'
error: string; // 'Error'
noResults: string; // 'No results'
delete: string; // 'Delete'
call: string; // 'Call'
cancel: string; // 'Cancel'
confirm: string; // 'Confirm'
previous: string; // 'Previous'
next: string; // 'Next'
perPage: string; // 'Per page'
showing: string; // 'Showing {start}-{end} of {total}'
play: string; // 'Play'
pause: string; // 'Pause'
}
```
### Voicemail Strings
```typescript
interface VoicemailStrings {
title: string; // 'Voicemails'
loading: string; // 'Loading voicemails...'
empty: string; // 'No voicemails'
noUserId: string; // 'Please set a user ID to load voicemails'
transcription: string; // 'Transcription'
deleteConfirm: string; // 'Delete this voicemail?'
deleteTitle: string; // 'Delete Voicemail'
progress: string; // 'Playback progress'
}
```
### Call Log Strings
```typescript
interface CallLogStrings {
title: string; // 'Call Logs'
loading: string; // 'Loading call logs...'
empty: string; // 'No call logs found'
columns: {
date: string; // 'Date'
direction: string; // 'Direction'
from: string; // 'From'
to: string; // 'To'
duration: string; // 'Duration'
status: string; // 'Status'
};
directions: {
inbound: string; // 'Inbound'
outbound: string; // 'Outbound'
internal: string; // 'Internal'
};
statuses: {
completed: string; // 'Completed'
noAnswer: string; // 'No Answer'
busy: string; // 'Busy'
failed: string; // 'Failed'
voicemail: string; // 'Voicemail'
};
}
```
## Built-in Locales
Currently, English is the only built-in locale:
```typescript
import { en } from '@dialstack/sdk/locales';
```
## Creating Custom Locales
### Full Custom Locale
```typescript
import type { Locale } from '@dialstack/sdk/locales';
const de: Locale = {
common: {
loading: 'Laden...',
error: 'Fehler',
noResults: 'Keine Ergebnisse',
delete: 'Löschen',
call: 'Anrufen',
cancel: 'Abbrechen',
confirm: 'Bestätigen',
previous: 'Zurück',
next: 'Weiter',
perPage: 'Pro Seite',
showing: 'Zeige {start}-{end} von {total}',
play: 'Abspielen',
pause: 'Pause',
},
voicemails: {
title: 'Sprachnachrichten',
loading: 'Sprachnachrichten werden geladen...',
empty: 'Keine Sprachnachrichten',
noUserId: 'Bitte setzen Sie eine Benutzer-ID',
transcription: 'Transkription',
deleteConfirm: 'Diese Sprachnachricht löschen?',
deleteTitle: 'Sprachnachricht löschen',
progress: 'Wiedergabefortschritt',
},
callLogs: {
title: 'Anrufliste',
loading: 'Anrufliste wird geladen...',
empty: 'Keine Anrufe gefunden',
columns: {
date: 'Datum',
direction: 'Richtung',
from: 'Von',
to: 'An',
duration: 'Dauer',
status: 'Status',
},
directions: {
inbound: 'Eingehend',
outbound: 'Ausgehend',
internal: 'Intern',
},
statuses: {
completed: 'Abgeschlossen',
noAnswer: 'Keine Antwort',
busy: 'Besetzt',
failed: 'Fehlgeschlagen',
voicemail: 'Sprachnachricht',
},
},
};
```
### Extending English Locale
Override only specific strings:
```typescript
import { en } from '@dialstack/sdk/locales';
const customEn = {
...en,
common: {
...en.common,
noResults: 'Nothing to show',
},
callLogs: {
...en.callLogs,
title: 'Call History',
empty: 'No calls yet',
},
};
```
### Partial Override
Override only the section you need:
```typescript
import { en } from '@dialstack/sdk/locales';
const brandedLocale = {
...en,
voicemails: {
...en.voicemails,
title: 'Messages',
empty: 'Your inbox is empty',
},
};
```
## Using Locales
### Per-Component
```tsx
```
### With Web Components
```javascript
const callLogs = document.querySelector('dialstack-call-logs');
callLogs.setLocale(customLocale);
```
## Dynamic Locale Switching
Change locale at runtime:
```tsx
function Dashboard() {
const [locale, setLocale] = useState(en);
return (
);
}
```
## Interpolation
Some strings support placeholders:
```typescript
// 'showing' uses {start}, {end}, {total}
showing: 'Showing {start}-{end} of {total}';
// Result: "Showing 1-20 of 150"
```
## Complete Example
```tsx
import { useState } from 'react';
import { initialize, DialstackComponentsProvider, CallLogs, Voicemails } from '@dialstack/sdk';
import { en } from '@dialstack/sdk/locales';
import type { Locale } from '@dialstack/sdk/locales';
// Define locales
const locales: Record = {
en,
es: {
common: {
loading: 'Cargando...',
error: 'Error',
noResults: 'Sin resultados',
delete: 'Eliminar',
call: 'Llamar',
cancel: 'Cancelar',
confirm: 'Confirmar',
previous: 'Anterior',
next: 'Siguiente',
perPage: 'Por página',
showing: 'Mostrando {start}-{end} de {total}',
play: 'Reproducir',
pause: 'Pausar',
},
voicemails: {
title: 'Buzón de voz',
loading: 'Cargando mensajes...',
empty: 'No hay mensajes de voz',
noUserId: 'Por favor establezca un ID de usuario',
transcription: 'Transcripción',
deleteConfirm: '¿Eliminar este mensaje de voz?',
deleteTitle: 'Eliminar mensaje',
progress: 'Progreso de reproducción',
},
callLogs: {
title: 'Registro de llamadas',
loading: 'Cargando llamadas...',
empty: 'No hay llamadas',
columns: {
date: 'Fecha',
direction: 'Dirección',
from: 'De',
to: 'Para',
duration: 'Duración',
status: 'Estado',
},
directions: {
inbound: 'Entrante',
outbound: 'Saliente',
internal: 'Interno',
},
statuses: {
completed: 'Completada',
noAnswer: 'Sin respuesta',
busy: 'Ocupado',
failed: 'Fallida',
voicemail: 'Buzón de voz',
},
},
},
};
const dialstack = initialize({
publishableKey: 'pk_live_YOUR_KEY',
});
function App() {
const [currentLocale, setCurrentLocale] = useState('en');
return (
{locales[currentLocale].callLogs.title}
{locales[currentLocale].voicemails.title}
);
}
```
## TypeScript
Import the `Locale` type for type safety:
```typescript
import type { Locale } from '@dialstack/sdk/locales';
const myLocale: Locale = {
// TypeScript will enforce the correct structure
};
```
## Next Steps
- [Theming](/sdks/theming) - Customize appearance
- [CallLogs](/sdks/react/call-logs) - CallLogs component
- [Voicemails](/sdks/react/voicemails) - Voicemails component
---
## SDK
# JavaScript SDK
The official JavaScript SDK for DialStack lets you embed voice capabilities directly into your application with ready-to-use components for call logs, voicemails, and more.
## Distribution Targets
The SDK is available in three distribution formats:
| Target | Import | Use Case |
| ---------- | ----------------------- | -------------------------------------------------- |
| **Main** | `@dialstack/sdk` | React applications with full component support |
| **Pure** | `@dialstack/sdk/pure` | Vanilla JavaScript / Web Components only |
| **Server** | `@dialstack/sdk/server` | Node.js backend for session creation and API calls |
## Installation
```bash
npm install @dialstack/sdk
```
## Quick Example
```tsx
import { initialize, DialstackComponentsProvider, CallLogs } from '@dialstack/sdk';
const dialstack = initialize({
publishableKey: 'pk_live_YOUR_KEY',
});
function App() {
return (
);
}
```
## What's Included
### Embedded Components
- **[CallHistory](/sdks/react/call-history)** - Display recent call history in a compact format
- **[CallLogs](/sdks/react/call-logs)** - Display call history with filtering, pagination, and formatting
- **[Voicemails](/sdks/react/voicemails)** - List voicemails with audio playback and transcription
### Server SDK
- **[Accounts](/sdks/server/accounts)** - Create and manage customer accounts
- **[Users](/sdks/server/users)** - Manage users within accounts
- **[Sessions](/sdks/server/sessions)** - Create secure session tokens for embedded components
## Next Steps
- [Installation](/sdks/installation) - Detailed installation instructions
- [Authentication](/sdks/authentication) - Learn about session-based authentication
- [React Components](/sdks/react) - Get started with React
- [Web Components](/sdks/web-components) - Use with vanilla JavaScript
- [Server SDK](/sdks/server) - Backend API integration
---
## Installation
Install the DialStack SDK using your preferred package manager.
## Package Managers
```bash
# npm
npm install @dialstack/sdk
# yarn
yarn add @dialstack/sdk
# pnpm
pnpm add @dialstack/sdk
```
## CDN (Vanilla JavaScript)
For non-bundled applications, use the UMD build via CDN:
```html
```
## Import Patterns
### React Applications
```typescript
// Full SDK with React components
import { initialize, DialstackComponentsProvider, CallLogs, Voicemails } from '@dialstack/sdk';
// Types
import type { DialStackInstance, CallLog, AppearanceOptions } from '@dialstack/sdk';
```
### Vanilla JavaScript / Web Components
```typescript
// Pure Web Components (no React dependency)
import { loadDialstackAndInitialize } from '@dialstack/sdk/pure';
const dialstack = await loadDialstackAndInitialize({
publishableKey: 'pk_live_YOUR_KEY',
});
```
### Server-Side (Node.js)
```typescript
// Server SDK for API calls
import { DialStack } from '@dialstack/sdk/server';
const dialstack = new DialStack(process.env.DIALSTACK_API_KEY);
```
## TypeScript Configuration
The SDK includes full TypeScript support. Ensure your `tsconfig.json` includes:
```json
{
"compilerOptions": {
"moduleResolution": "bundler",
"esModuleInterop": true
}
}
```
For older TypeScript configurations using `"moduleResolution": "node"`, you may need to use explicit subpath imports:
```typescript
import { DialStack } from '@dialstack/sdk/server';
```
## Peer Dependencies
The main SDK (`@dialstack/sdk`) requires React as a peer dependency:
```json
{
"peerDependencies": {
"react": ">=16.8.0",
"react-dom": ">=16.8.0"
}
}
```
If you're not using React, use the pure Web Components build:
```typescript
import { loadDialstackAndInitialize } from '@dialstack/sdk/pure';
```
## Browser Compatibility
| Browser | Minimum Version |
| ------- | --------------- |
| Chrome | 80+ |
| Firefox | 75+ |
| Safari | 13.1+ |
| Edge | 80+ |
**Requirements:**
- ES2015+ (ES6) support
- Web Components v1 (Custom Elements, Shadow DOM)
- Fetch API
:::warning
Internet Explorer is not supported.
:::
## Next Steps
- [Authentication](/sdks/authentication) - Set up session-based authentication
- [React Components](/sdks/react) - Start building with React
- [Web Components](/sdks/web-components) - Use without React
---
## CallHistory
Display a compact call history list for a specific phone number with direction indicators and AI-generated summaries.
## Basic Usage
```tsx
import { CallHistory } from '@dialstack/sdk';
function PatientPanel({ phoneNumber }: { phoneNumber: string }) {
return ;
}
```
:::warning[Required Prop]
The `phoneNumber` prop is required and must be in E.164 format (e.g., `+14155551234`). Without it, the component will display an error state.
:::
## Props
| Prop | Type | Default | Description |
| ---------------- | ----------------------------------------- | ------------ | ----------------------------------------- |
| `phoneNumber` | `string` | **Required** | Phone number to fetch history for (E.164) |
| `limit` | `number` | `5` | Maximum number of calls to display (1-20) |
| `locale` | `Locale` | English | Custom locale for UI strings |
| `formatting` | `FormattingOptions` | - | Date/phone formatting options |
| `icons` | `ComponentIcons` | - | Custom SVG icons |
| `layoutVariant` | `'compact' \| 'comfortable' \| 'default'` | `'default'` | Layout density |
| `classes` | `CallHistoryClasses` | - | Custom CSS classes |
| `displayOptions` | `CallHistoryDisplayOptions` | - | Show/hide UI elements |
| `onLoaderStart` | `(event) => void` | - | Loading started callback |
| `onLoadError` | `(event) => void` | - | Loading failed callback |
## Display Options
Control which UI elements are visible:
```tsx
```
### CallHistoryDisplayOptions
| Option | Type | Default | Description |
| ------------------- | --------- | ------- | ----------------------------- |
| `showDuration` | `boolean` | `true` | Display call length |
| `showRelativeTime` | `boolean` | `true` | Show relative timestamps |
| `showDirectionIcon` | `boolean` | `true` | Show direction indicator icon |
## Call Types and Icons
The component displays different icons based on call type:
| Type | Icon Color | Description |
| -------------------- | ---------- | ------------------------------------ |
| Inbound (completed) | Green | Successfully answered incoming call |
| Outbound (completed) | Blue | Successfully connected outgoing call |
| Missed | Red | Unanswered incoming call |
| Voicemail | Purple | Caller left a voicemail |
## AI Summaries
For completed calls and voicemails, the component displays an AI-generated summary of the conversation. The summary appears below the call information with a distinctive "AI Summary" badge.
```tsx
// AI summaries are shown automatically for:
// - Completed inbound calls
// - Completed outbound calls
// - Voicemails
```
The summary provides a concise overview of the call content, making it easy to quickly understand what was discussed without listening to recordings.
## Limiting Results
Control how many calls are displayed:
```tsx
```
## Formatting
Customize date and time formatting:
```tsx
```
### FormattingOptions
| Option | Type | Default | Description |
| --------------- | --------- | --------- | -------------------------- |
| `dateLocale` | `string` | `'en-US'` | Locale for date formatting |
| `use24HourTime` | `boolean` | `false` | Use 24-hour time format |
## Custom Styling
### CSS Classes
Apply custom classes for framework integration:
```tsx
```
### CallHistoryClasses
| Class | Default | Description |
| --------------- | ------------------------------------------ | ----------------- |
| `base` | `'dialstack-component'` | Container element |
| `loading` | `'dialstack-component--loading'` | Loading state |
| `error` | `'dialstack-component--error'` | Error state |
| `empty` | `'dialstack-component--empty'` | No calls state |
| `list` | `'dialstack-call-history-list'` | List container |
| `item` | `'dialstack-call-history-item'` | Call item |
| `itemInbound` | `'dialstack-call-history-item--inbound'` | Inbound call |
| `itemOutbound` | `'dialstack-call-history-item--outbound'` | Outbound call |
| `itemMissed` | `'dialstack-call-history-item--missed'` | Missed call |
| `itemVoicemail` | `'dialstack-call-history-item--voicemail'` | Voicemail |
| `icon` | `'dialstack-call-history-icon'` | Direction icon |
| `time` | `'dialstack-call-history-time'` | Time display |
| `duration` | `'dialstack-call-history-duration'` | Duration display |
### Layout Variants
```tsx
```
## CallLog Data Model
The component uses the `CallLog` type internally:
```typescript
interface CallLog {
id: string;
user_id?: string;
endpoint_id?: string;
did_id?: string;
direction: 'inbound' | 'outbound' | 'internal';
from_number: string;
to_number: string;
started_at: string;
answered_at?: string;
ended_at?: string;
duration_seconds?: number;
status: 'completed' | 'no-answer' | 'busy' | 'failed' | 'voicemail';
}
```
## Complete Example
```tsx
import { CallHistory } from '@dialstack/sdk';
function PatientDetailPanel({ patient }: { patient: Patient }) {
if (!patient.phone) {
return No phone number on file;
}
return (
Call History
{
console.error('Failed to load call history:', event.error);
}}
/>
);
}
```
## Use Cases
### Customer Context Panel
Display recent interactions when a customer calls in:
```tsx
function ScreenPopPanel({ phoneNumber }: { phoneNumber: string }) {
return (
);
}
```
### Patient Records
Show call history in a healthcare patient record:
```tsx
function PatientRecord({ patient }: { patient: Patient }) {
return (
);
}
```
## Next Steps
- [CallLogs](/sdks/react/call-logs) - Full call logs table with pagination
- [Voicemails](/sdks/react/voicemails) - Voicemail component with playback
- [Theming](/sdks/theming) - Customize appearance
- [i18n](/sdks/i18n) - Internationalization
---
## CallLogs
Display a paginated table of call history with filtering, sorting, and customization options.
## Basic Usage
```tsx
import { CallLogs } from '@dialstack/sdk';
function Dashboard() {
return ;
}
```
:::info[Automatic Pagination]
Pagination is handled automatically by the component using cursor-based pagination. You don't need to manage cursors or page state manually. The component automatically loads more data as users scroll or click "Load More". See the [Pagination Guide](/guides/pagination) for details.
:::
## Props
| Prop | Type | Default | Description |
| ------------------- | ----------------------------------------- | ----------- | ------------------------------- |
| `dateRange` | `{ start?: string; end?: string }` | - | Filter by date range (ISO 8601) |
| `locale` | `Locale` | English | Custom locale for UI strings |
| `formatting` | `FormattingOptions` | - | Date/phone formatting options |
| `icons` | `ComponentIcons` | - | Custom SVG icons |
| `layoutVariant` | `'compact' \| 'comfortable' \| 'default'` | `'default'` | Layout density |
| `classes` | `CallLogsClasses` | - | Custom CSS classes |
| `displayOptions` | `CallLogDisplayOptions` | - | Show/hide columns |
| `customRowRenderer` | `(call: CallLog) => string` | - | Custom row rendering |
| `onLoaderStart` | `(event) => void` | - | Loading started callback |
| `onLoadError` | `(event) => void` | - | Loading failed callback |
| `onRowClick` | `(event) => void` | - | Row clicked callback |
## Date Range Filtering
Filter calls by date range using ISO 8601 date strings:
```tsx
```
Filter from a specific date to now:
```tsx
```
## Display Options
Control which columns are visible:
```tsx
```
### CallLogDisplayOptions
| Option | Type | Default | Description |
| --------------- | --------- | ------- | ------------------------ |
| `showDate` | `boolean` | `true` | Show date/time column |
| `showDirection` | `boolean` | `true` | Show direction indicator |
| `showFrom` | `boolean` | `true` | Show from number |
| `showTo` | `boolean` | `true` | Show to number |
| `showDuration` | `boolean` | `true` | Show call duration |
| `showStatus` | `boolean` | `true` | Show call status |
## Formatting
Customize date and phone number formatting:
```tsx
```
### FormattingOptions
| Option | Type | Default | Description |
| ---------------- | --------- | --------- | ---------------------------- |
| `defaultCountry` | `string` | `'US'` | Country for phone formatting |
| `dateLocale` | `string` | `'en-US'` | Locale for dates |
| `use24HourTime` | `boolean` | `false` | Use 24-hour time format |
| `showTimezone` | `boolean` | `true` | Show timezone in dates |
## Callbacks
### onRowClick
Handle row clicks:
```tsx
{
console.log('Call ID:', event.callId);
console.log('Full call data:', event.call);
// Navigate to call detail
navigate(`/calls/${event.callId}`);
}}
/>
```
### onLoadError
Handle errors:
```tsx
{
console.error('Load failed:', event.error);
showToast('Failed to load call logs');
}}
/>
```
## Custom Styling
### CSS Classes
Apply custom classes for framework integration:
```tsx
```
### CallLogsClasses
| Class | Default | Description |
| ------------- | ------------------------------------- | ------------------- |
| `base` | `'dialstack-component'` | Container element |
| `loading` | `'dialstack-component--loading'` | Loading state |
| `error` | `'dialstack-component--error'` | Error state |
| `empty` | `'dialstack-component--empty'` | No data state |
| `table` | `'dialstack-call-logs-table'` | Table element |
| `header` | `'dialstack-call-logs-header'` | Table header |
| `row` | `'dialstack-call-logs-row'` | Table row |
| `rowInbound` | `'dialstack-call-logs-row--inbound'` | Inbound call row |
| `rowOutbound` | `'dialstack-call-logs-row--outbound'` | Outbound call row |
| `pagination` | `'dialstack-call-logs-pagination'` | Pagination controls |
### Layout Variants
Adjust spacing density:
```tsx
// Tighter spacing
// Standard spacing
// More breathing room
```
## CallLog Data Model
The `CallLog` type represents a single call record:
```typescript
interface CallLog {
id: string;
user_id?: string;
endpoint_id?: string;
did_id?: string;
direction: 'inbound' | 'outbound' | 'internal';
from_number: string;
to_number: string;
started_at: string;
answered_at?: string;
ended_at?: string;
duration_seconds?: number;
status: 'completed' | 'no-answer' | 'busy' | 'failed' | 'voicemail';
}
```
## Complete Example
```tsx
import { CallLogs } from '@dialstack/sdk';
import { useState } from 'react';
function CallLogsPage() {
const [selectedCall, setSelectedCall] = useState(null);
// Calculate date range (last 30 days)
const thirtyDaysAgo = new Date();
thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30);
return (
Call History
{
setSelectedCall(event.callId);
}}
onLoadError={(event) => {
console.error('Failed to load calls:', event.error);
}}
/>
{selectedCall && (
setSelectedCall(null)} />
)}
);
}
```
## Next Steps
- [Voicemails](/sdks/react/voicemails) - Voicemail component
- [Theming](/sdks/theming) - Global appearance customization
- [i18n](/sdks/i18n) - Internationalization
---
## DialPlan
Embed the DialStack visual dial-plan editor directly in your app. One component, three display modes: read-only viewer, full editor, or static thumbnail.
## Basic Usage
```tsx
import { DialPlan } from '@dialstack/sdk/react';
function Routing({ dialPlanId }: { dialPlanId: string }) {
return ;
}
```
The default mode is `view` — a read-only flow diagram with pan/zoom and controls.
## Modes
```tsx
// Read-only diagram (default)
// Full editor: node library, drag-and-drop, config panel, save
// Static thumbnail: no controls, no background, no interaction
// Create mode: no dialPlanId + mode="edit" starts a blank dial plan
console.log('Created', dp.id)} />
```
| Mode | Editable | Pan/zoom | Controls | Use case |
| --------- | -------- | -------- | -------- | ----------------------------- |
| `view` | No | Yes | Yes | Inspect an existing dial plan |
| `edit` | Yes | Yes | Yes | Build or modify a dial plan |
| `preview` | No | No | No | Thumbnail in a list or card |
## Props
| Prop | Type | Default | Description |
| ------------------ | -------------------------------------- | --------- | ---------------------------------------------------- |
| `dialPlanId` | `string` | - | Dial plan to load. Omit in `edit` mode to create one |
| `mode` | `'view' \| 'edit' \| 'preview'` | `'view'` | Display mode |
| `locale` | `DialPlanLocale` | English | i18n strings (labels, exits, descriptions) |
| `theme` | `'light' \| 'dark'` | `'light'` | Color theme |
| `className` | `string` | - | Container class |
| `style` | `React.CSSProperties` | - | Container inline style |
| `onNodeClick` | `(nodeId, node) => void` | - | Node click callback (view mode) |
| `onLoaderStart` | `() => void` | - | Fired when loading starts |
| `onLoaderEnd` | `(dialPlan) => void` | - | Fired when loading finishes |
| `onLoadError` | `(error) => void` | - | Fired on load failure |
| `onSave` | `(dialPlan) => void` | - | Fired after a successful save (edit mode) |
| `onDirtyChange` | `(isDirty) => void` | - | Fired when the editor's dirty state changes |
| `onError` | `(error) => void` | - | Alias for `onLoadError`, used in edit mode |
| `onCreateResource` | `(type) => Promise<{ id, name, ... }>` | - | Host hook to open a "create new …" modal |
| `onOpenResource` | `(resourceId) => void` | - | Host hook to navigate to a resource detail page |
## Imperative Handle
Pass a `ref` to trigger actions programmatically:
```tsx
import { useRef } from 'react';
import { DialPlan, type DialPlanHandle } from '@dialstack/sdk/react';
function Editor() {
const ref = useRef(null);
return (
<>
>
);
}
```
| Method | Returns | Description |
| -------- | --------------- | -------------------------------------------- |
| `save()` | `Promise` | Persist pending changes; resolves on success |
## Node Types
The editor supports four node types. The `config` payload is type-specific — the shape is determined by `type`.
| Type | Purpose | Exits |
| ---------------- | -------------------------------------------------------------------------------------------- | ---------------- |
| `schedule` | Route by schedule (open or closed; holidays count as closed) | `open`, `closed` |
| `internal_dial` | Ring an internal target — user, ring group, nested dial plan, voice app, or shared voicemail | `next` |
| `ring_all_users` | Ring every user in the account at the same time | `next` |
| `external_dial` | Dial an external phone number over the PSTN | `next` |
:::info[Editor aliases]
The editor renders some `internal_dial` nodes as distinct visual tiles — **Voicemail** (for shared-voicemail targets or `timeout: 0`) and **Voice App** (for voice-app targets). The serialized node type stays `internal_dial`; only the on-canvas presentation differs.
:::
### `ScheduleNodeConfig`
| Field | Type | Description |
| ------------- | ---------------- | ---------------------------------------------------------- |
| `schedule_id` | `string` | ID of the schedule to check (required) |
| `open` | `string \| null` | Node to route to when the schedule is open |
| `closed` | `string \| null` | Node to route to when the schedule is closed or on holiday |
### `InternalDialNodeConfig`
| Field | Type | Description |
| ----------- | ---------------- | -------------------------------------------------------------------------------------- |
| `target_id` | `string` | ID of the target to dial — user, ring group, dial plan, voice app, or shared voicemail |
| `timeout` | `number` | Ring timeout in seconds (0–300). `0` routes straight to voicemail |
| `next` | `string \| null` | Node to route to on no-answer or busy |
### `RingAllUsersNodeConfig`
| Field | Type | Description |
| --------- | ---------------- | ------------------------------- |
| `timeout` | `number` | Ring timeout in seconds (1–300) |
| `next` | `string \| null` | Node to route to on no-answer |
### `ExternalDialNodeConfig`
| Field | Type | Description |
| -------------- | ---------------- | -------------------------------------------- |
| `phone_number` | `string` | Destination in E.164 format (`+14155551234`) |
| `timeout` | `number` | Ring timeout in seconds (1–120) |
| `next` | `string \| null` | Node to route to on no-answer or busy |
## Host Integration (`edit` mode)
The editor lets users pick targets from your directory. Provide two host hooks so the UI can list resources and create new ones on the fly:
```tsx
{
// type: 'schedule' | 'user' | 'ring_group' | 'dial_plan' | 'voice_app' | 'shared_voicemail'
const created = await openCreateModal(type);
return created; // { id, name, extension_number? }
}}
onOpenResource={(resourceId) => {
router.push(`/resources/${resourceId}`);
}}
/>
```
- `onCreateResource(type)` — called when the user selects "Create new …" in a target combobox. Return the new resource's `{ id, name }` to auto-select it.
- `onOpenResource(id)` — called when the user clicks the "Open target details" link next to a selected target.
Resource lists themselves come from the DialStack API; nothing extra to wire.
## Events
```tsx
setLoading(true)}
onLoaderEnd={(dp) => {
setLoading(false);
setName(dp.name);
}}
onDirtyChange={setUnsaved}
onSave={(dp) => toast.success(`Saved ${dp.name}`)}
onError={(err) => toast.error(err.message)}
/>
```
## Internationalization
Supply a `locale` object to override every UI string. All fields are required on the type — see `DialPlanLocale` for the full shape.
```tsx
```
## TypeScript
```tsx
import type {
DialPlanProps,
DialPlanMode,
DialPlanHandle,
DialPlanData,
DialPlanNode,
DialPlanNodeType,
ScheduleNode,
InternalDialNode,
RingAllUsersNode,
ExternalDialNode,
ScheduleNodeConfig,
InternalDialNodeConfig,
RingAllUsersNodeConfig,
ExternalDialNodeConfig,
ResourceType,
} from '@dialstack/sdk/react';
```
`DialPlanNode` is a discriminated union — narrow on `node.type` to get the typed `config`.
## Complete Example
```tsx
import { useRef, useState } from 'react';
import { DialPlan, type DialPlanHandle } from '@dialstack/sdk/react';
export function DialPlanEditorPage({ id }: { id: string }) {
const ref = useRef(null);
const [dirty, setDirty] = useState(false);
const [saving, setSaving] = useState(false);
async function handleSave() {
setSaving(true);
try {
await ref.current?.save();
} finally {
setSaving(false);
}
}
return (
Edit dial plan
setDirty(false)}
onError={(err) => console.error(err)}
onCreateResource={async (type) => openCreateModal(type)}
onOpenResource={(rid) => router.push(`/resources/${rid}`)}
/>
);
}
```
## Next Steps
- [CallLogs](/sdks/react/call-logs) — Call history table
- [Voicemails](/sdks/react/voicemails) — Voicemail component
- [Theming](/sdks/theming) — Customize appearance
- [i18n](/sdks/i18n) — Internationalization
---
## React SDK
The React SDK provides type-safe components for embedding call logs and voicemails into your React application.
## Quick Start
```tsx
import { initialize, DialstackComponentsProvider, CallLogs, Voicemails } from '@dialstack/sdk';
// Initialize once at app startup
const dialstack = initialize({
publishableKey: 'pk_live_YOUR_KEY',
});
function VoiceDashboard({ clientSecret }: { clientSecret: string }) {
return (
Voice Dashboard
);
}
```
## Setup
### 1. Initialize the SDK
Initialize the SDK once at app startup, outside of any component:
```tsx
import { initialize } from '@dialstack/sdk';
const dialstack = initialize({
publishableKey: 'pk_live_YOUR_KEY',
appearance: {
theme: 'auto', // 'light' | 'dark' | 'auto'
},
});
```
### 2. Wrap with Provider
Wrap your app (or the part using DialStack components) with the provider:
```tsx
import { DialstackComponentsProvider } from '@dialstack/sdk';
function App() {
const [clientSecret, setClientSecret] = useState(null);
useEffect(() => {
// Fetch from your backend
fetch('/api/dialstack/session', { method: 'POST' })
.then((res) => res.json())
.then((data) => setClientSecret(data.client_secret));
}, []);
if (!clientSecret) return ;
return (
);
}
```
### 3. Use Components
Components automatically connect to the provider:
```tsx
import { CallLogs, Voicemails } from '@dialstack/sdk';
function Dashboard() {
return (
);
}
```
## Available Components
| Component | Description | Required Props |
| ------------------------------------------------- | ------------------------------------------------ | -------------- |
| [CallHistory](/sdks/react/call-history) | Compact call history for a phone number | `phoneNumber` |
| [CallLogs](/sdks/react/call-logs) | Call history table with filtering and pagination | None |
| [DialPlan](/sdks/react/dial-plan) | Visual dial-plan viewer / editor | None |
| [OnboardingPortal](/sdks/react/onboarding-portal) | Multi-step account onboarding wizard | None |
| [Voicemails](/sdks/react/voicemails) | Voicemail list with audio playback | `userId` |
## Hooks
### useDialstackComponents
Access the DialStack instance inside the provider:
```tsx
import { useDialstackComponents } from '@dialstack/sdk';
function CustomComponent() {
const { dialstack, clientSecret } = useDialstackComponents();
// Use for custom integrations
return Connected: {!!clientSecret};
}
```
## TypeScript
All components are fully typed. Import types as needed:
```tsx
import type {
DialStackInstance,
CallLog,
CallLogDisplayOptions,
VoicemailDisplayOptions,
AppearanceOptions,
} from '@dialstack/sdk';
```
## Error Handling
Handle component errors with callbacks:
```tsx
console.log('Loading...')}
onLoadError={(event) => {
console.error('Failed to load:', event.error);
// Show error UI or retry
}}
/>
```
## Next Steps
- [DialstackComponentsProvider](/sdks/react/provider) - Provider configuration
- [CallHistory](/sdks/react/call-history) - Compact call history for a phone number
- [CallLogs](/sdks/react/call-logs) - Call history table with pagination
- [DialPlan](/sdks/react/dial-plan) - Visual dial-plan viewer / editor
- [OnboardingPortal](/sdks/react/onboarding-portal) - Multi-step account onboarding wizard
- [Voicemails](/sdks/react/voicemails) - Voicemail component
- [Theming](/sdks/theming) - Customize appearance
---
## OnboardingPortal
A full-screen, multi-step onboarding wizard that guides new accounts through business setup, phone number configuration, and hardware assignment.
## Basic Usage
```tsx
import { DialstackComponentsProvider } from '@dialstack/sdk';
import { OnboardingPortal } from '@dialstack/sdk/react/onboarding';
function OnboardingPage({ dialstack, clientSecret }) {
return (
);
}
```
:::info[Separate Import Path]
The `OnboardingPortal` is imported from `@dialstack/sdk/react/onboarding`, not from the main `@dialstack/sdk` entry point. This keeps the onboarding bundle separate from the lighter-weight components.
:::
:::info[Automatic Progress Saving]
The portal automatically saves onboarding progress to the server. Users can leave and return at any time — the wizard resumes where they left off.
:::
## How It Works
The onboarding portal presents three main steps, each with its own substeps:
| Step | Description | Substeps |
| ------------ | ---------------------------------- | ----------------------------------------------------------------------------------- |
| **Account** | Business profile and team setup | Business Details, Team Members |
| **Numbers** | Phone number ordering and porting | Number options, ordering/porting flow, primary number, caller ID, directory listing |
| **Hardware** | Device assignment for team members | Device Assignment |
The portal has three view modes that users progress through:
1. **Splash screen** — a welcome screen shown on first visit
2. **Overview** — a dashboard showing progress across all steps with status indicators
3. **Wizard** — the step-by-step form workflow
When all steps are complete, a celebration screen is shown. After that, the overview screen serves as the landing page where users can review or revise any step.
## Props
| Prop | Type | Default | Description |
| ---------------------------- | ----------------------------------------------------------------------- | --------- | ----------------------------------------------------- |
| `locale` | `Locale` | English | Custom locale for UI strings |
| `formatting` | `FormattingOptions` | - | Date/phone formatting options |
| `icons` | `ComponentIcons` | - | Custom SVG icons |
| `collectionOptions` | `OnboardingCollectionOptions` | - | Control which steps to show |
| `theme` | `'light' \| 'dark'` | `'light'` | Color theme |
| `appearance` | `{ variables?: { colorPrimary?: string; colorPrimaryHover?: string } }` | - | Brand color overrides |
| `logoHtml` | `string` | - | HTML string for sidebar logo |
| `platformName` | `string` | - | Platform name shown in the UI |
| `onBack` | `() => void` | - | Back button callback (shows button when provided) |
| `backLabel` | `string` | - | Label for the back button |
| `fullTermsOfServiceUrl` | `string` | - | Link to full terms of service |
| `recipientTermsOfServiceUrl` | `string` | - | Link to recipient terms of service |
| `privacyPolicyUrl` | `string` | - | Link to privacy policy |
| `documentationUrl` | `string` | - | Link shown on the overview screen |
| `onScheduleCall` | `() => void` | - | Callback for "Schedule a Call" on the overview screen |
| `onHelpSupport` | `() => void` | - | Callback for "Help & Support" in the sidebar |
| `onStepChange` | `(event: { step: AccountOnboardingStep }) => void` | - | Called when the active step changes |
| `className` | `string` | - | Additional CSS class for the root element |
| `style` | `React.CSSProperties` | - | Inline styles for the root element |
## Controlling Steps
Use `collectionOptions` to show or hide specific steps. The final completion screen is always shown regardless of these options.
### Show only specific steps
```tsx
```
### Exclude specific steps
```tsx
```
### OnboardingCollectionOptions
| Option | Type | Description |
| --------------- | ------------------------- | --------------------- |
| `steps.include` | `AccountOnboardingStep[]` | Show only these steps |
| `steps.exclude` | `AccountOnboardingStep[]` | Hide these steps |
When both `include` and `exclude` are set, `include` is applied first, then `exclude` removes from that result.
### AccountOnboardingStep
The available step values are:
| Value | Description |
| ------------------ | ------------------------------------------------- |
| `'account'` | Business details and team members |
| `'numbers'` | Phone number ordering, porting, and configuration |
| `'hardware'` | Device assignment |
| `'final_complete'` | Completion screen (always shown) |
## White-Labeling
Customize the portal's branding to match your platform:
```tsx
```
The `appearance.variables` colors are applied to the sidebar, buttons, and accent elements throughout the wizard. When not provided, the portal uses the colors set via `initialize()`.
## Dark Theme
```tsx
```
The theme can also be set globally via the `appearance.theme` option in `initialize()`. The component-level `theme` prop takes precedence.
## Navigation Callbacks
### onBack
Provide an `onBack` callback to show a back button in the sidebar. Use this to let users navigate back to your application:
```tsx
router.push('/dashboard')} backLabel="Back to Dashboard" />
```
### onStepChange
Track which step the user is on:
```tsx
{
analytics.track('onboarding_step', { step: event.step });
}}
/>
```
## Help and Support
The overview screen and sidebar can link to help resources:
```tsx
{
window.open('https://calendly.com/example/onboarding', '_blank');
}}
onHelpSupport={() => {
window.Intercom('showNewMessage', 'I need help with onboarding');
}}
/>
```
- `documentationUrl` — shows a "View Documentation" link on the overview screen
- `onScheduleCall` — shows a "Schedule a Call" button on the overview screen
- `onHelpSupport` — shows a "Help & Support" link in the sidebar
## Legal Links
Display terms and privacy links on the completion screen:
```tsx
```
## Complete Example
```tsx
import { initialize, DialstackComponentsProvider } from '@dialstack/sdk';
import { OnboardingPortal } from '@dialstack/sdk/react/onboarding';
import { useEffect, useState } from 'react';
const dialstack = initialize({
publishableKey: 'pk_live_YOUR_KEY',
appearance: {
theme: 'light',
},
});
function OnboardingApp() {
const [clientSecret, setClientSecret] = useState(null);
useEffect(() => {
fetch('/api/dialstack/session', { method: 'POST' })
.then((res) => res.json())
.then((data) => setClientSecret(data.client_secret));
}, []);
if (!clientSecret) return Loading...;
return (
(window.location.href = '/dashboard')}
backLabel="Back to Dashboard"
documentationUrl="https://docs.example.com/setup"
onScheduleCall={() => window.open('https://calendly.com/example')}
onHelpSupport={() => window.Intercom?.('show')}
onStepChange={(event) => {
console.log('Step changed:', event.step);
}}
fullTermsOfServiceUrl="https://example.com/terms"
privacyPolicyUrl="https://example.com/privacy"
/>
);
}
```
## Next Steps
- [DialstackComponentsProvider](/sdks/react/provider) - Provider configuration
- [Theming](/sdks/theming) - Global appearance customization
- [i18n](/sdks/i18n) - Internationalization
---
## DialstackComponentsProvider
The provider makes the DialStack instance and client secret available to all child components.
## Usage
```tsx
import { initialize, DialstackComponentsProvider } from '@dialstack/sdk';
const dialstack = initialize({
publishableKey: 'pk_live_YOUR_KEY',
});
function App() {
return (
);
}
```
## Props
| Prop | Type | Required | Description |
| -------------- | -------------------------------- | -------- | ------------------------------- |
| `dialstack` | `DialStackInstance` | Yes | Instance from `initialize()` |
| `clientSecret` | `string \| ClientSecretResponse` | Yes | Session token from your backend |
| `children` | `ReactNode` | Yes | Child components |
### clientSecret
The `clientSecret` prop accepts either a string or the full session response object:
```tsx
// String only - you handle refresh
// Full response - SDK handles refresh automatically
```
## useDialstackComponents Hook
Access the provider context in child components:
```tsx
import { useDialstackComponents } from '@dialstack/sdk';
function StatusIndicator() {
const { dialstack, clientSecret } = useDialstackComponents();
return {clientSecret ? 'Connected' : 'Not connected'};
}
```
### Return Value
```typescript
interface UseDialstackComponentsReturn {
dialstack: DialStackInstance;
clientSecret: string | ClientSecretResponse;
}
```
## Error: Missing Provider
If you use a component outside the provider, you'll see this error:
```
Error: Could not find DialStack context; You need to wrap your app
in a provider.
See https://docs.dialstack.ai/sdks/react for setup instructions.
```
**Fix:** Wrap your component tree with the provider:
```tsx
// Before (error)
function App() {
return ;
}
// After (working)
function App() {
return (
);
}
```
## Multiple Providers
You can use multiple providers for different accounts:
```tsx
function MultiAccountDashboard() {
return (
Account A
Account B
);
}
```
## Complete Example
```tsx
import { useState, useEffect } from 'react';
import { initialize, DialstackComponentsProvider, CallLogs, Voicemails } from '@dialstack/sdk';
const dialstack = initialize({
publishableKey: 'pk_live_YOUR_KEY',
appearance: {
theme: 'auto',
variables: {
colorPrimary: '#6772E5',
},
},
});
interface Session {
client_secret: string;
expires_at: string;
}
function App() {
const [session, setSession] = useState(null);
const [error, setError] = useState(null);
useEffect(() => {
async function fetchSession() {
try {
const response = await fetch('/api/dialstack/session', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ accountId: 'acct_123' }),
});
if (!response.ok) {
throw new Error('Failed to create session');
}
const data = await response.json();
setSession(data);
} catch (err) {
setError(err instanceof Error ? err.message : 'Unknown error');
}
}
fetchSession();
}, []);
if (error) {
return Error: {error};
}
if (!session) {
return Loading...;
}
return (
Voice Dashboard
);
}
export default App;
```
## Next Steps
- [CallHistory](/sdks/react/call-history) - Compact call history for a phone number
- [CallLogs](/sdks/react/call-logs) - Call history table with pagination
- [Voicemails](/sdks/react/voicemails) - Voicemail component
- [Authentication](/sdks/authentication) - Session management
---
## Voicemails
Display a list of voicemails with audio playback, transcription, and action buttons.
## Basic Usage
```tsx
import { Voicemails } from '@dialstack/sdk';
function Dashboard() {
return ;
}
```
:::warning[Required Prop]
The `userId` prop is required. Without it, the component will display an error state.
:::
:::info[Automatic Pagination]
Pagination is handled automatically by the component using cursor-based pagination. The component automatically loads more voicemails as users scroll or interact with the list. See the [Pagination Guide](/guides/pagination) for details.
:::
## Props
| Prop | Type | Default | Description |
| ------------------- | ----------------------------------------- | ------------ | --------------------------------- |
| `userId` | `string` | **Required** | User ID to fetch voicemails for |
| `locale` | `Locale` | English | Custom locale for UI strings |
| `formatting` | `FormattingOptions` | - | Date/phone formatting options |
| `icons` | `ComponentIcons` | - | Custom SVG icons |
| `layoutVariant` | `'compact' \| 'comfortable' \| 'default'` | `'default'` | Layout density |
| `classes` | `VoicemailsClasses` | - | Custom CSS classes |
| `displayOptions` | `VoicemailDisplayOptions` | - | Show/hide UI elements |
| `behaviorOptions` | `VoicemailBehaviorOptions` | - | Playback and interaction behavior |
| `customRowRenderer` | `(voicemail) => string` | - | Custom row rendering |
| `onLoaderStart` | `(event) => void` | - | Loading started callback |
| `onLoadError` | `(event) => void` | - | Loading failed callback |
| `onVoicemailSelect` | `(event) => void` | - | Voicemail selected callback |
| `onVoicemailPlay` | `(event) => void` | - | Playback started callback |
| `onVoicemailPause` | `(event) => void` | - | Playback paused callback |
| `onVoicemailDelete` | `(event) => void` | - | Voicemail deleted callback |
| `onCallBack` | `(event) => void` | - | Call back button clicked |
| `onDeleteRequest` | `(id) => Promise` | - | Custom delete confirmation |
## Display Options
Control which UI elements are visible:
```tsx
```
### VoicemailDisplayOptions
| Option | Type | Default | Description |
| -------------------- | --------- | ------- | ------------------------ |
| `showDuration` | `boolean` | `true` | Display voicemail length |
| `showTranscription` | `boolean` | `true` | Show transcription text |
| `showCallbackButton` | `boolean` | `true` | Enable call back action |
| `showDeleteButton` | `boolean` | `true` | Enable delete action |
| `showProgressBar` | `boolean` | `true` | Show audio progress bar |
| `showTimestamp` | `boolean` | `true` | Display received time |
## Behavior Options
Control playback and interaction behavior:
```tsx
```
### VoicemailBehaviorOptions
| Option | Type | Default | Description |
| --------------------- | --------- | ------- | ------------------------------ |
| `autoPlayOnExpand` | `boolean` | `true` | Start playback when expanding |
| `confirmBeforeDelete` | `boolean` | `true` | Show confirmation dialog |
| `markAsReadOnPlay` | `boolean` | `true` | Mark as read on first play |
| `allowSeeking` | `boolean` | `true` | Enable seeking in progress bar |
## Callbacks
### onVoicemailSelect
Triggered when a voicemail is expanded:
```tsx
{
console.log('Selected voicemail:', event.voicemailId);
}}
/>
```
### onVoicemailPlay / onVoicemailPause
Track playback state:
```tsx
{
analytics.track('voicemail_played', { id: event.voicemailId });
}}
onVoicemailPause={(event) => {
analytics.track('voicemail_paused', { id: event.voicemailId });
}}
/>
```
### onCallBack
Handle call back button clicks:
```tsx
{
// Initiate call to the number
initiateCall(event.phoneNumber);
}}
/>
```
### onVoicemailDelete
Triggered after a voicemail is deleted:
```tsx
{
showToast('Voicemail deleted');
}}
/>
```
### onDeleteRequest
Custom delete confirmation logic:
```tsx
{
// Show custom confirmation dialog
const confirmed = await showConfirmDialog({
title: 'Delete Voicemail',
message: 'Are you sure? This cannot be undone.',
});
return confirmed; // Return true to proceed, false to cancel
}}
/>
```
## Custom Styling
### CSS Classes
Apply custom classes:
```tsx
```
### VoicemailsClasses
| Class | Default | Description |
| -------------- | -------------------------------------- | ------------------- |
| `base` | `'dialstack-component'` | Container element |
| `loading` | `'dialstack-component--loading'` | Loading state |
| `error` | `'dialstack-component--error'` | Error state |
| `empty` | `'dialstack-component--empty'` | No voicemails state |
| `list` | `'dialstack-voicemail-list'` | List container |
| `item` | `'dialstack-voicemail-item'` | Voicemail item |
| `itemExpanded` | `'dialstack-voicemail-item--expanded'` | Expanded item |
| `itemUnread` | `'dialstack-voicemail-item--unread'` | Unread item |
| `player` | `'dialstack-voicemail-player'` | Audio player |
| `actions` | `'dialstack-voicemail-actions'` | Action buttons |
### Layout Variants
```tsx
```
## Voicemail Data Model
```typescript
interface Voicemail {
id: string;
from_name: string;
from_number: string;
created_at: string;
duration_seconds: number;
is_read: boolean;
transcription?: string;
}
```
## Complete Example
```tsx
import { Voicemails } from '@dialstack/sdk';
import { useCallback, useState } from 'react';
function VoicemailInbox({ userId }: { userId: string }) {
const [lastPlayed, setLastPlayed] = useState(null);
const handleCallBack = useCallback((event: { phoneNumber: string }) => {
// Open phone dialer or initiate WebRTC call
window.location.href = `tel:${event.phoneNumber}`;
}, []);
const handleDeleteRequest = useCallback(async (voicemailId: string) => {
const confirmed = window.confirm('Are you sure you want to delete this voicemail?');
return confirmed;
}, []);
return (
Voicemails
{
console.log('Selected:', event.voicemailId);
}}
onVoicemailPlay={(event) => {
setLastPlayed(event.voicemailId);
}}
onCallBack={handleCallBack}
onDeleteRequest={handleDeleteRequest}
onVoicemailDelete={(event) => {
console.log('Deleted:', event.voicemailId);
}}
onLoadError={(event) => {
console.error('Load error:', event.error);
}}
/>
);
}
```
## Accessibility
The Voicemails component includes:
- **ARIA labels** for all interactive elements
- **Keyboard navigation** (Tab, Enter, Space)
- **Focus management** when expanding/collapsing items
- **Screen reader announcements** for state changes
- **Visible focus indicators**
## Next Steps
- [CallLogs](/sdks/react/call-logs) - Call history component
- [Theming](/sdks/theming) - Customize appearance
- [i18n](/sdks/i18n) - Internationalization
---
## Accounts
Accounts represent your customers in DialStack. Each account is isolated and can have multiple users, phone numbers, and devices.
## Create an Account
```typescript
const account = await dialstack.accounts.create({
email: 'customer@example.com',
});
console.log(account.id); // 'acct_01h2xcejqtf2nbrexx3vqjhp41'
```
### Parameters
| Parameter | Type | Required | Description |
| --------- | -------- | -------- | --------------------- |
| `email` | `string` | No | Account email address |
### Response
```typescript
interface Account {
id: string;
email: string | null;
created_at: string;
updated_at: string;
}
```
## Retrieve an Account
```typescript
const account = await dialstack.accounts.retrieve('acct_01h2xcejqtf2nbrexx3vqjhp41');
console.log(account.email);
```
### Parameters
| Parameter | Type | Required | Description |
| ----------- | -------- | -------- | ----------- |
| `accountId` | `string` | Yes | Account ID |
## Update an Account
```typescript
const account = await dialstack.accounts.update('acct_01h2xcejqtf2nbrexx3vqjhp41', {
email: 'newemail@example.com',
});
```
### Parameters
| Parameter | Type | Required | Description |
| ----------- | -------- | -------- | ----------------- |
| `accountId` | `string` | Yes | Account ID |
| `email` | `string` | No | New email address |
## Delete an Account
```typescript
await dialstack.accounts.del('acct_01h2xcejqtf2nbrexx3vqjhp41');
```
:::danger[Destructive Action]
Deleting an account removes all associated users, devices, and data. This action cannot be undone.
:::
### Parameters
| Parameter | Type | Required | Description |
| ----------- | -------- | -------- | ----------- |
| `accountId` | `string` | Yes | Account ID |
## List Accounts
```typescript
const response = await dialstack.accounts.list({
limit: 20,
});
for (const account of response.data) {
console.log(account.id, account.email);
}
if (response.has_more) {
// Fetch next page
}
```
### Parameters
| Parameter | Type | Default | Description |
| ---------------- | -------- | ------- | -------------------------- |
| `limit` | `number` | `10` | Results per page (max 100) |
| `starting_after` | `string` | - | Cursor for next page |
| `ending_before` | `string` | - | Cursor for previous page |
### Response
```typescript
interface ListResponse {
data: Account[];
has_more: boolean;
}
```
## Auto-Pagination
### Iterate All Accounts
```typescript
for await (const account of dialstack.accounts.list().autoPagingEach()) {
console.log(account.id);
}
```
### Collect to Array
```typescript
const allAccounts = await dialstack.accounts.list().autoPagingToArray({ limit: 1000 });
console.log(`Total accounts: ${allAccounts.length}`);
```
## Examples
### Create Account with Error Handling
```typescript
import { DialStack, DialStackValidationError, DialStackError } from '@dialstack/sdk/server';
async function createAccount(email: string) {
try {
const account = await dialstack.accounts.create({ email });
return { success: true, account };
} catch (error) {
if (error instanceof DialStackValidationError) {
return { success: false, error: 'Invalid email format' };
}
throw error;
}
}
```
### Sync Accounts from External System
```typescript
async function syncAccounts(externalAccounts: ExternalAccount[]) {
const results = [];
for (const ext of externalAccounts) {
// Check if account exists
let account: Account | null = null;
try {
account = await dialstack.accounts.retrieve(ext.dialstackId);
} catch (error) {
if (!(error instanceof DialStackNotFoundError)) {
throw error;
}
}
if (account) {
// Update existing
account = await dialstack.accounts.update(ext.dialstackId, {
email: ext.email,
});
} else {
// Create new
account = await dialstack.accounts.create({
email: ext.email,
});
}
results.push(account);
}
return results;
}
```
### List with Pagination
```typescript
async function getAllAccounts() {
const accounts: Account[] = [];
let hasMore = true;
let startingAfter: string | undefined;
while (hasMore) {
const response = await dialstack.accounts.list({
limit: 100,
starting_after: startingAfter,
});
accounts.push(...response.data);
hasMore = response.has_more;
if (response.data.length > 0) {
startingAfter = response.data[response.data.length - 1].id;
}
}
return accounts;
}
```
## Next Steps
- [Users](/sdks/server/users) - Manage users in accounts
- [Sessions](/sdks/server/sessions) - Create session tokens
---
## Server SDK
The Server SDK provides a type-safe Node.js client for the DialStack API. Use it to manage accounts, users, and create session tokens for embedded components.
## Installation
```bash
npm install @dialstack/sdk
```
## Quick Start
```typescript
import { DialStack } from '@dialstack/sdk/server';
const dialstack = new DialStack(process.env.DIALSTACK_API_KEY);
// Create an account
const account = await dialstack.accounts.create({
email: 'customer@example.com',
});
// Create a user (account context passed in options)
const user = await dialstack.users.create(
{ name: 'John Doe', email: 'john@example.com' },
{ dialstackAccount: account.id }
);
// Create a session for embedded components
const session = await dialstack.accountSessions.create({
account: account.id,
components: {
call_logs: { enabled: true },
voicemails: { enabled: true },
},
});
// Return session to frontend
console.log(session.client_secret);
```
## Configuration
### Basic Configuration
```typescript
const dialstack = new DialStack(process.env.DIALSTACK_API_KEY);
```
### Advanced Configuration
```typescript
const dialstack = new DialStack(process.env.DIALSTACK_API_KEY, {
apiUrl: 'https://api.dialstack.ai', // Custom API URL
timeout: 80000, // Request timeout (ms)
maxNetworkRetries: 2, // Retry count
telemetry: true, // Enable telemetry
appInfo: {
// Your app info (for User-Agent)
name: 'MyApp',
version: '1.0.0',
url: 'https://myapp.com',
},
});
```
### DialStackConfig Options
| Option | Type | Default | Description |
| ------------------- | --------- | -------------------------- | -------------------------- |
| `apiUrl` | `string` | `https://api.dialstack.ai` | API base URL |
| `timeout` | `number` | `80000` | Request timeout in ms |
| `maxNetworkRetries` | `number` | `2` | Max retry attempts |
| `telemetry` | `boolean` | `true` | Send usage telemetry |
| `appInfo` | `AppInfo` | - | Application identification |
## Resources
The SDK provides these resource namespaces:
| Resource | Description |
| ------------------------------------------ | ----------------------------------- |
| [`accounts`](/sdks/server/accounts) | Create and manage customer accounts |
| [`users`](/sdks/server/users) | Manage users within accounts |
| [`accountSessions`](/sdks/server/sessions) | Create session tokens |
## Request Options
All methods accept an optional `RequestOptions` parameter:
```typescript
const account = await dialstack.accounts.retrieve('acct_123', {
timeout: 30000, // Override timeout
maxNetworkRetries: 5, // Override retries
idempotencyKey: 'abc123', // For safe retries
});
```
### RequestOptions
| Option | Type | Description |
| ------------------- | -------- | ---------------------------------------- |
| `timeout` | `number` | Override request timeout |
| `maxNetworkRetries` | `number` | Override retry count |
| `idempotencyKey` | `string` | Idempotency key for safe retries |
| `dialstackAccount` | `string` | Account context (for account-scoped ops) |
## Auto-Pagination
List methods return paginated results with auto-pagination helpers:
### Iterate with autoPagingEach
```typescript
for await (const account of dialstack.accounts.list().autoPagingEach()) {
console.log(account.id);
}
```
### Collect with autoPagingToArray
```typescript
const accounts = await dialstack.accounts.list().autoPagingToArray({ limit: 100 });
console.log(`Found ${accounts.length} accounts`);
```
### Manual Pagination
```typescript
// First page
const page1 = await dialstack.accounts.list({ limit: 10 });
console.log(page1.data);
console.log('Has more:', page1.has_more);
// Next page
if (page1.has_more) {
const lastId = page1.data[page1.data.length - 1].id;
const page2 = await dialstack.accounts.list({
limit: 10,
starting_after: lastId,
});
}
```
## Event Listeners
Monitor SDK activity:
```typescript
dialstack.on('request', (event) => {
console.log(`${event.method} ${event.path}`);
});
dialstack.on('response', (event) => {
console.log(`${event.statusCode} in ${event.elapsed}ms`);
});
```
### Event Types
**RequestEvent:**
```typescript
interface RequestEvent {
method: string;
path: string;
dialstackAccount?: string;
idempotencyKey?: string;
requestStartTime: number;
}
```
**ResponseEvent:**
```typescript
interface ResponseEvent {
method: string;
path: string;
statusCode: number;
requestId?: string;
dialstackAccount?: string;
elapsed: number;
}
```
## Error Handling
The SDK throws typed errors:
```typescript
import {
DialStack,
DialStackError,
DialStackAuthenticationError,
DialStackNotFoundError,
DialStackRateLimitError,
} from '@dialstack/sdk/server';
try {
await dialstack.accounts.retrieve('invalid_id');
} catch (error) {
if (error instanceof DialStackNotFoundError) {
console.log('Account not found');
} else if (error instanceof DialStackAuthenticationError) {
console.log('Invalid API key');
} else if (error instanceof DialStackRateLimitError) {
console.log(`Rate limited. Retry after ${error.retryAfter}s`);
} else if (error instanceof DialStackError) {
console.log('API error:', error.message);
}
}
```
### Error Classes
| Error | HTTP Status | Description |
| ------------------------------ | ----------- | ------------------- |
| `DialStackAuthenticationError` | 401 | Invalid API key |
| `DialStackPermissionError` | 403 | Access denied |
| `DialStackNotFoundError` | 404 | Resource not found |
| `DialStackConflictError` | 409 | Resource conflict |
| `DialStackValidationError` | 400 | Validation failed |
| `DialStackInvalidRequestError` | 400 | Invalid request |
| `DialStackRateLimitError` | 429 | Rate limit exceeded |
| `DialStackAPIError` | 5xx | Server error |
| `DialStackConnectionError` | - | Network error |
## TypeScript
Full TypeScript support with exported types:
```typescript
import { DialStack } from '@dialstack/sdk/server';
import type {
Account,
AccountCreateParams,
User,
UserCreateParams,
AccountSessionCreateParams,
AccountSessionCreateResponse,
DialStackConfig,
RequestOptions,
} from '@dialstack/sdk/server';
```
## Next Steps
- [Accounts](/sdks/server/accounts) - Manage accounts
- [Users](/sdks/server/users) - Manage users
- [Sessions](/sdks/server/sessions) - Create session tokens
- [Authentication](/sdks/authentication) - Session-based auth flow
---
## Phone Numbers(Server)
Phone numbers (DIDs) are assigned to accounts for inbound and outbound calling.
## List Phone Numbers
```typescript
const acct = { dialstackAccount: 'acct_01h2xcejqtf2nbrexx3vqjhp41' };
const response = await dialstack.phoneNumbers.list({ limit: 10, status: 'active' }, acct);
for (const phoneNumber of response.data) {
console.log(phoneNumber.phone_number); // '+14155551234'
}
```
### Parameters
| Parameter | Type | Default | Description |
| ------------------ | -------- | -------- | ------------------------------------------------- |
| `limit` | `number` | `10` | Results per page (max 100) |
| `status` | `string` | - | Filter by status: `active`, `inactive`, `pending` |
| `dialstackAccount` | `string` | Required | Account ID |
### Response
```typescript
interface PhoneNumber {
id: string;
phone_number: string; // E.164 format (e.g., '+14155551234')
status: 'active' | 'inactive' | 'pending';
created_at: string;
}
```
## Auto-Pagination
### Iterate All Phone Numbers
```typescript
const acct = { dialstackAccount: 'acct_01h2xcejqtf2nbrexx3vqjhp41' };
for await (const pn of dialstack.phoneNumbers.list(undefined, acct).autoPagingEach()) {
console.log(pn.phone_number, pn.status);
}
```
### Collect to Array
```typescript
const acct = { dialstackAccount: 'acct_01h2xcejqtf2nbrexx3vqjhp41' };
const allNumbers = await dialstack.phoneNumbers
.list({ status: 'active' }, acct)
.autoPagingToArray({ limit: 100 });
console.log(`Active phone numbers: ${allNumbers.length}`);
```
## Examples
### Get Primary Phone Number
```typescript
async function getPrimaryPhoneNumber(accountId: string): Promise {
const acct = { dialstackAccount: accountId };
const response = await dialstack.phoneNumbers.list({ limit: 1, status: 'active' }, acct);
return response.data[0]?.phone_number ?? null;
}
```
### Display Phone Numbers in UI
```typescript
async function getPhoneNumbersForDisplay(accountId: string) {
const acct = { dialstackAccount: accountId };
const phoneNumbers = await dialstack.phoneNumbers
.list({ status: 'active' }, acct)
.autoPagingToArray();
return phoneNumbers.map((pn) => ({
id: pn.id,
display: formatE164(pn.phone_number), // '+1 (415) 555-1234'
raw: pn.phone_number,
}));
}
function formatE164(e164: string): string {
const match = e164.match(/^\+1(\d{3})(\d{3})(\d{4})$/);
if (match) {
return `+1 (${match[1]}) ${match[2]}-${match[3]}`;
}
return e164;
}
```
## Next Steps
- [Users](/sdks/server/users) - Manage users
- [Sessions](/sdks/server/sessions) - Create session tokens
---
## Account Sessions
Account sessions provide secure, scoped tokens for client-side embedded components. Sessions are tied to a specific account and can be restricted to specific components.
## Create a Session
```typescript
const session = await dialstack.accountSessions.create({
account: 'acct_01h2xcejqtf2nbrexx3vqjhp41',
});
console.log(session.client_secret); // 'cs_live_...'
console.log(session.expires_at); // '2025-01-15T13:00:00Z'
```
### Parameters
| Parameter | Type | Required | Description |
| ------------ | -------- | -------- | ---------------------------------- |
| `account` | `string` | Yes | Account ID to scope the session to |
| `components` | `object` | No | Component permissions |
### Response
```typescript
interface AccountSessionCreateResponse {
client_secret: string;
expires_at: string;
}
```
## Component Permissions
Control which embedded components the session can access:
```typescript
const session = await dialstack.accountSessions.create({
account: 'acct_01h2xcejqtf2nbrexx3vqjhp41',
components: {
call_logs: { enabled: true },
voicemails: { enabled: true },
},
});
```
### Available Components
| Component | Description |
| ------------ | ---------------------- |
| `call_logs` | Access to call history |
| `voicemails` | Access to voicemails |
### Restricting Access
```typescript
// Only allow voicemails
const session = await dialstack.accountSessions.create({
account: accountId,
components: {
call_logs: { enabled: false },
voicemails: { enabled: true },
},
});
```
If a disabled component is used, it will show an error state.
## Session Lifecycle
### Expiration
Sessions expire after **1 hour** by default. The `expires_at` field indicates when the session becomes invalid.
### Client-Side Handling
Pass the full session response to enable automatic refresh:
```typescript
// Server
app.post('/api/dialstack/session', async (req, res) => {
const session = await dialstack.accountSessions.create({
account: req.body.accountId,
});
// Return both fields
res.json({
client_secret: session.client_secret,
expires_at: session.expires_at,
});
});
```
```tsx
// Client (React)
```
### Manual Refresh
If the session expires and you only passed the `client_secret` string:
```typescript
// Client-side
async function refreshSession() {
const response = await fetch('/api/dialstack/session', {
method: 'POST',
body: JSON.stringify({ accountId }),
});
const session = await response.json();
setClientSecret(session.client_secret);
}
```
## Security
### API Key Required
Sessions can only be created with an API key (`sk_live_*`). This prevents clients from creating their own sessions.
```typescript
// This works (server-side with API key)
const dialstack = new DialStack(process.env.DIALSTACK_API_KEY);
const session = await dialstack.accountSessions.create({ account: accountId });
// Client-side tokens cannot create sessions
// (no accountSessions.create method available)
```
### Account Isolation
Each session is scoped to a single account. The `client_secret` can only access data belonging to that account.
### Token Security
- Tokens cannot be used to create new sessions
- Tokens are short-lived (1 hour)
- Tokens have limited scope (only enabled components)
## Examples
### Express.js Session Endpoint
```typescript
import express from 'express';
import { DialStack } from '@dialstack/sdk/server';
const app = express();
const dialstack = new DialStack(process.env.DIALSTACK_API_KEY);
app.use(express.json());
app.post('/api/dialstack/session', async (req, res) => {
try {
const { accountId } = req.body;
// Verify user has access to this account
const userId = req.user?.id; // From auth middleware
const hasAccess = await verifyAccountAccess(userId, accountId);
if (!hasAccess) {
return res.status(403).json({ error: 'Access denied' });
}
// Create session
const session = await dialstack.accountSessions.create({
account: accountId,
components: {
call_logs: { enabled: true },
voicemails: { enabled: true },
},
});
res.json(session);
} catch (error) {
console.error('Session creation failed:', error);
res.status(500).json({ error: 'Failed to create session' });
}
});
```
### Next.js API Route
```typescript
// pages/api/dialstack/session.ts
import type { NextApiRequest, NextApiResponse } from 'next';
import { DialStack } from '@dialstack/sdk/server';
import { getServerSession } from 'next-auth';
const dialstack = new DialStack(process.env.DIALSTACK_API_KEY!);
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
if (req.method !== 'POST') {
return res.status(405).json({ error: 'Method not allowed' });
}
// Check authentication
const authSession = await getServerSession(req, res);
if (!authSession) {
return res.status(401).json({ error: 'Unauthorized' });
}
const { accountId } = req.body;
// Verify user owns this account
const userAccount = await db.accounts.findFirst({
where: {
dialstackAccountId: accountId,
userId: authSession.user.id,
},
});
if (!userAccount) {
return res.status(403).json({ error: 'Access denied' });
}
// Create session
const session = await dialstack.accountSessions.create({
account: accountId,
});
res.json(session);
}
```
### Component-Specific Sessions
```typescript
// Only voicemails for this user
async function getVoicemailSession(accountId: string) {
return dialstack.accountSessions.create({
account: accountId,
components: {
call_logs: { enabled: false },
voicemails: { enabled: true },
},
});
}
// Only call logs for analytics dashboard
async function getAnalyticsSession(accountId: string) {
return dialstack.accountSessions.create({
account: accountId,
components: {
call_logs: { enabled: true },
voicemails: { enabled: false },
},
});
}
```
## Deprecated: sessions
The `sessions` property is deprecated. Use `accountSessions` instead:
```typescript
// Deprecated
const session = await dialstack.sessions.create({ account: accountId });
// Use this instead
const session = await dialstack.accountSessions.create({ account: accountId });
```
## Next Steps
- [Authentication](/sdks/authentication) - Full authentication flow
- [React Components](/sdks/react) - Use sessions in React
- [Web Components](/sdks/web-components) - Use sessions in vanilla JS
---
## Users
Users belong to accounts and represent individuals who can make/receive calls and access voicemails.
## Create a User
```typescript
const user = await dialstack.users.create(
{ name: 'John Doe', email: 'john@example.com' },
{ dialstackAccount: 'acct_01h2xcejqtf2nbrexx3vqjhp41' }
);
console.log(user.id); // 'user_01h2xcejqtf2nbrexx3vqjhp42'
```
### Parameters
| Parameter | Type | Required | Description |
| ------------------ | -------- | -------- | -------------------- |
| `name` | `string` | No | User's display name |
| `email` | `string` | No | User's email address |
| `dialstackAccount` | `string` | Yes | Parent account ID |
### Response
```typescript
interface User {
id: string;
name: string | null;
email: string | null;
created_at: string;
updated_at: string;
}
```
## Retrieve a User
```typescript
const user = await dialstack.users.retrieve('user_01h2xcejqtf2nbrexx3vqjhp42', {
dialstackAccount: 'acct_01h2xcejqtf2nbrexx3vqjhp41',
});
console.log(user.name);
```
### Parameters
| Parameter | Type | Required | Description |
| ------------------ | -------- | -------- | ----------- |
| `userId` | `string` | Yes | User ID |
| `dialstackAccount` | `string` | Yes | Account ID |
## Update a User
```typescript
const user = await dialstack.users.update(
'user_01h2xcejqtf2nbrexx3vqjhp42',
{ name: 'Jane Doe', email: 'jane@example.com' },
{ dialstackAccount: 'acct_01h2xcejqtf2nbrexx3vqjhp41' }
);
```
### Parameters
| Parameter | Type | Required | Description |
| ------------------ | -------- | -------- | ----------------- |
| `userId` | `string` | Yes | User ID |
| `name` | `string` | No | New display name |
| `email` | `string` | No | New email address |
| `dialstackAccount` | `string` | Yes | Account ID |
## Delete a User
```typescript
await dialstack.users.del('user_01h2xcejqtf2nbrexx3vqjhp42', {
dialstackAccount: 'acct_01h2xcejqtf2nbrexx3vqjhp41',
});
```
### Parameters
| Parameter | Type | Required | Description |
| ------------------ | -------- | -------- | ----------- |
| `userId` | `string` | Yes | User ID |
| `dialstackAccount` | `string` | Yes | Account ID |
## List Users
```typescript
const acct = { dialstackAccount: 'acct_01h2xcejqtf2nbrexx3vqjhp41' };
const response = await dialstack.users.list({ limit: 20 }, acct);
for (const user of response.data) {
console.log(user.id, user.name);
}
```
### Parameters
| Parameter | Type | Default | Description |
| ------------------ | -------- | -------- | -------------------------- |
| `limit` | `number` | `10` | Results per page (max 100) |
| `starting_after` | `string` | - | Cursor for next page |
| `ending_before` | `string` | - | Cursor for previous page |
| `dialstackAccount` | `string` | Required | Account ID |
### Response
```typescript
interface ListResponse {
data: User[];
has_more: boolean;
}
```
## Auto-Pagination
### Iterate All Users
```typescript
const acct = { dialstackAccount: 'acct_01h2xcejqtf2nbrexx3vqjhp41' };
for await (const user of dialstack.users.list(undefined, acct).autoPagingEach()) {
console.log(user.id, user.name);
}
```
### Collect to Array
```typescript
const acct = { dialstackAccount: 'acct_01h2xcejqtf2nbrexx3vqjhp41' };
const allUsers = await dialstack.users.list(undefined, acct).autoPagingToArray({ limit: 500 });
console.log(`Total users: ${allUsers.length}`);
```
## Examples
### Create User for New Customer
```typescript
async function onboardCustomer(customerData: CustomerData) {
// Create account
const account = await dialstack.accounts.create({
email: customerData.companyEmail,
});
const acct = { dialstackAccount: account.id };
// Create primary user
const user = await dialstack.users.create(
{ name: customerData.primaryContactName, email: customerData.primaryContactEmail },
acct
);
return { account, user };
}
```
### Sync Users from External System
```typescript
async function syncUsers(accountId: string, externalUsers: ExternalUser[]) {
const acct = { dialstackAccount: accountId };
// Get existing users
const existingUsers = await dialstack.users.list(undefined, acct).autoPagingToArray();
const existingByEmail = new Map(existingUsers.map((u) => [u.email, u]));
for (const ext of externalUsers) {
const existing = existingByEmail.get(ext.email);
if (existing) {
// Update if changed
if (existing.name !== ext.name) {
await dialstack.users.update(existing.id, { name: ext.name }, acct);
}
} else {
// Create new
await dialstack.users.create({ name: ext.name, email: ext.email }, acct);
}
}
}
```
### Get User's Voicemails Session
```typescript
async function getUserVoicemailsSession(accountId: string, userId: string) {
const acct = { dialstackAccount: accountId };
// Verify user exists
const user = await dialstack.users.retrieve(userId, acct);
// Create session scoped to voicemails only
const session = await dialstack.accountSessions.create({
account: accountId,
components: {
call_logs: { enabled: false },
voicemails: { enabled: true },
},
});
return {
userId: user.id,
clientSecret: session.client_secret,
expiresAt: session.expires_at,
};
}
```
### Delete All Users in Account
```typescript
async function deleteAllUsers(accountId: string) {
const acct = { dialstackAccount: accountId };
const users = await dialstack.users.list(undefined, acct).autoPagingToArray();
for (const user of users) {
await dialstack.users.del(user.id, acct);
}
console.log(`Deleted ${users.length} users`);
}
```
## Next Steps
- [Sessions](/sdks/server/sessions) - Create session tokens
- [Accounts](/sdks/server/accounts) - Manage accounts
---
## Theming
Customize the appearance of DialStack components using CSS variables, theme presets, and layout variants.
## Quick Start
```typescript
const dialstack = initialize({
publishableKey: 'pk_live_YOUR_KEY',
appearance: {
theme: 'light',
variables: {
colorPrimary: '#6772E5',
fontFamily: 'Inter, system-ui, sans-serif',
borderRadius: '8px',
},
},
});
```
## Theme Variants
Choose a base theme:
| Theme | Description |
| --------- | -------------------------------------------------- |
| `'light'` | Light background with dark text |
| `'dark'` | Dark background with light text |
| `'auto'` | Follows system preference (`prefers-color-scheme`) |
```typescript
// Follow system preference
initialize({
publishableKey: 'pk_live_YOUR_KEY',
appearance: {
theme: 'auto',
},
});
```
## Layout Variants
Adjust component density with `layoutVariant`:
| Variant | Description |
| --------------- | ----------------------------- |
| `'compact'` | Minimal padding, dense layout |
| `'default'` | Standard spacing |
| `'comfortable'` | Extra padding, breathing room |
```tsx
```
## CSS Variables
Customize components using CSS variables in the `variables` option:
### Colors
```typescript
variables: {
// Primary brand color
colorPrimary: '#6772E5',
colorPrimaryHover: '#5469D4',
// Base colors
colorBackground: '#ffffff',
colorText: '#1a1a1a',
colorTextSecondary: '#6b7280',
// Semantic colors
colorDanger: '#e5484d',
colorSuccess: '#30a46c',
colorWarning: '#f5a623',
// Surface colors
colorSurfaceSubtle: '#f9fafb',
colorBorder: '#e5e7eb',
colorBorderSubtle: '#f3f4f6',
}
```
### Typography
```typescript
variables: {
fontFamily: 'Inter, system-ui, sans-serif',
fontSizeBase: '14px',
fontSizeSmall: '12px',
fontSizeLarge: '16px',
fontSizeXLarge: '18px',
fontWeightNormal: '400',
fontWeightMedium: '500',
fontWeightBold: '600',
lineHeight: '1.5',
}
```
### Spacing
```typescript
variables: {
spacingUnit: '8px',
spacingXs: '4px',
spacingSm: '8px',
spacingMd: '16px',
spacingLg: '24px',
spacingXl: '32px',
}
```
### Border & Effects
```typescript
variables: {
borderRadius: '6px',
borderRadiusSmall: '4px',
borderRadiusLarge: '12px',
transitionDuration: '150ms',
focusRingColor: 'rgba(59, 130, 246, 0.5)',
focusRingWidth: '2px',
}
```
### Component-Specific
```typescript
variables: {
// Icons
iconSize: '20px',
iconSizeSmall: '16px',
// Audio player
playerButtonSize: '40px',
playerProgressHeight: '4px',
playerProgressHandleSize: '12px',
// Indicators
unreadIndicatorSize: '8px',
spinnerSize: '24px',
// Time display
timeDisplayWidth: '48px',
}
```
## Complete Variables Reference
| Variable | Default (Light) | Description |
| -------------------- | ------------------------- | ---------------------- |
| **Colors** | | |
| `colorPrimary` | `#2563eb` | Primary brand color |
| `colorPrimaryHover` | `#1d4ed8` | Primary color on hover |
| `colorBackground` | `#ffffff` | Background color |
| `colorText` | `#111827` | Primary text color |
| `colorTextSecondary` | `#6b7280` | Secondary text color |
| `colorDanger` | `#dc2626` | Error/danger color |
| `colorSuccess` | `#16a34a` | Success color |
| `colorWarning` | `#d97706` | Warning color |
| `colorSurfaceSubtle` | `#f9fafb` | Subtle surface color |
| `colorBorder` | `#e5e7eb` | Border color |
| `colorBorderSubtle` | `#f3f4f6` | Subtle border color |
| **Typography** | | |
| `fontFamily` | `system-ui, sans-serif` | Font family |
| `fontSizeBase` | `14px` | Base font size |
| `fontSizeSmall` | `12px` | Small text |
| `fontSizeLarge` | `16px` | Large text |
| `fontSizeXLarge` | `18px` | Extra large text |
| `fontWeightNormal` | `400` | Normal weight |
| `fontWeightMedium` | `500` | Medium weight |
| `fontWeightBold` | `600` | Bold weight |
| `lineHeight` | `1.5` | Line height |
| **Spacing** | | |
| `spacingUnit` | `8px` | Base spacing unit |
| `spacingXs` | `4px` | Extra small |
| `spacingSm` | `8px` | Small |
| `spacingMd` | `16px` | Medium |
| `spacingLg` | `24px` | Large |
| `spacingXl` | `32px` | Extra large |
| **Border** | | |
| `borderRadius` | `6px` | Default radius |
| `borderRadiusSmall` | `4px` | Small radius |
| `borderRadiusLarge` | `12px` | Large radius |
| **Effects** | | |
| `transitionDuration` | `150ms` | Animation duration |
| `focusRingColor` | `rgba(59, 130, 246, 0.5)` | Focus outline color |
| `focusRingWidth` | `2px` | Focus outline width |
## CSS Class Overrides
Apply custom CSS classes using the `classes` prop:
### CallLogs Classes
```tsx
```
### Voicemails Classes
```tsx
```
## Updating Theme at Runtime
Use the `update()` method to change appearance after initialization:
```typescript
const dialstack = initialize({
publishableKey: 'pk_live_YOUR_KEY',
appearance: { theme: 'light' },
});
// Later: switch to dark mode
dialstack.update({
appearance: {
theme: 'dark',
variables: {
colorPrimary: '#8B5CF6',
},
},
});
```
## Custom Icons
Replace default icons with custom SVG:
```typescript
...',
outbound: '',
play: '',
pause: '',
phone: '',
trash: '',
chevronLeft: '',
chevronRight: '',
chevronDown: '',
spinner: '',
}}
/>
```
## Framework Integration
### Tailwind CSS
```tsx
```
### Bootstrap
```tsx
```
## Complete Example
```tsx
import { initialize, DialstackComponentsProvider, CallLogs, Voicemails } from '@dialstack/sdk';
const dialstack = initialize({
publishableKey: 'pk_live_YOUR_KEY',
appearance: {
theme: 'auto',
variables: {
// Brand colors
colorPrimary: '#6366F1',
colorPrimaryHover: '#4F46E5',
// Typography
fontFamily: '"Inter", -apple-system, sans-serif',
fontSizeBase: '14px',
// Spacing
spacingUnit: '8px',
borderRadius: '8px',
// Focus states
focusRingColor: 'rgba(99, 102, 241, 0.5)',
focusRingWidth: '3px',
},
},
});
function App() {
return (
Voice Dashboard
);
}
```
## Next Steps
- [i18n](/sdks/i18n) - Internationalization
- [CallLogs](/sdks/react/call-logs) - CallLogs component reference
- [Voicemails](/sdks/react/voicemails) - Voicemails component reference
---
## dialstack-call-history
The call history Web Component displays a compact call history list for a specific phone number with direction indicators and AI-generated summaries.
## Usage
```html
```
:::warning[Required: Phone Number]
You must call `setPhoneNumber()` before the component will load data. The phone number must be in E.164 format (e.g., `+14155551234`).
:::
## Methods
### Common Methods
| Method | Parameters | Description |
| ------------------ | -------------------------------------------------- | ------------------------- |
| `setClientSecret` | `secret: string` | Set session token |
| `setInstance` | `instance: DialStackInstance` | Set SDK instance |
| `setLocale` | `locale: Locale` | Set UI strings |
| `setFormatting` | `options: FormattingOptions` | Set date/phone formatting |
| `setIcons` | `icons: ComponentIcons` | Set custom SVG icons |
| `setLayoutVariant` | `variant: 'compact' \| 'comfortable' \| 'default'` | Set layout density |
| `setClasses` | `classes: CallHistoryClasses` | Set CSS classes |
| `setOnLoaderStart` | `callback: (event) => void` | Set loading callback |
| `setOnLoadError` | `callback: (event) => void` | Set error callback |
### CallHistory-Specific Methods
| Method | Parameters | Description |
| ------------------- | ------------------------------------ | --------------------------------------------- |
| `setPhoneNumber` | `phoneNumber: string` | **Required.** Set phone number (E.164 format) |
| `setLimit` | `limit: number` | Max calls to display (1-20, default 5) |
| `setDisplayOptions` | `options: CallHistoryDisplayOptions` | Show/hide UI elements |
## Configuration Examples
### Phone Number and Limit
```javascript
const callHistory = document.querySelector('dialstack-call-history');
callHistory.setPhoneNumber('+14155551234');
callHistory.setLimit(10); // Show up to 10 calls (default is 5)
```
### Display Options
```javascript
callHistory.setDisplayOptions({
showDuration: true, // Show call duration
showRelativeTime: true, // Show "2 min ago", "Yesterday", etc.
showDirectionIcon: true, // Show inbound/outbound/missed/voicemail icon
});
```
### Formatting
```javascript
callHistory.setFormatting({
dateLocale: 'en-US', // BCP 47 language tag
use24HourTime: false, // 12-hour vs 24-hour
});
```
### Layout and Styling
```javascript
callHistory.setLayoutVariant('comfortable');
callHistory.setClasses({
base: 'my-call-history',
list: 'my-list',
item: 'my-item',
itemInbound: 'my-item--inbound',
itemOutbound: 'my-item--outbound',
itemMissed: 'my-item--missed',
itemVoicemail: 'my-item--voicemail',
icon: 'my-icon',
time: 'my-time',
duration: 'my-duration',
});
```
## Call Types and Icons
The component displays different icons based on call type:
| Type | Icon Color | Description |
| -------------------- | ---------- | ------------------------------------ |
| Inbound (completed) | Green | Successfully answered incoming call |
| Outbound (completed) | Blue | Successfully connected outgoing call |
| Missed | Red | Unanswered incoming call |
| Voicemail | Purple | Caller left a voicemail |
## AI Summaries
For completed calls and voicemails, the component displays an AI-generated summary of the conversation. The summary appears below the call information with a distinctive "AI Summary" badge.
```javascript
// AI summaries are shown automatically for:
// - Completed inbound calls
// - Completed outbound calls
// - Voicemails
```
The summary provides a concise overview of the call content, making it easy to quickly understand what was discussed without listening to recordings.
## Event Handlers
### onLoadError
```javascript
callHistory.setOnLoadError((event) => {
console.error('Error:', event.error);
console.error('Element:', event.elementTagName);
});
```
### onLoaderStart
```javascript
callHistory.setOnLoaderStart((event) => {
console.log('Loading call history...');
});
```
## Complete Example
```html
Recent Calls
```
## Use Cases
### Customer Context Panel
Display recent interactions when a customer calls in:
```html
Customer History
```
### Patient Records
Show call history in a healthcare patient record:
```html
Recent Calls
```
## Next Steps
- [call-logs Element](/sdks/web-components/call-logs) - Full call logs table with pagination
- [voicemails Element](/sdks/web-components/voicemails) - Voicemails reference
- [Theming](/sdks/theming) - Customize appearance
- [i18n](/sdks/i18n) - Internationalization
---
## dialstack-call-logs
The call logs Web Component displays a paginated table of call history.
## Usage
```html
```
## Methods
### Common Methods
| Method | Parameters | Description |
| ------------------ | -------------------------------------------------- | ------------------------- |
| `setClientSecret` | `secret: string` | Set session token |
| `setInstance` | `instance: DialStackInstance` | Set SDK instance |
| `setLocale` | `locale: Locale` | Set UI strings |
| `setFormatting` | `options: FormattingOptions` | Set date/phone formatting |
| `setIcons` | `icons: ComponentIcons` | Set custom SVG icons |
| `setLayoutVariant` | `variant: 'compact' \| 'comfortable' \| 'default'` | Set layout density |
| `setClasses` | `classes: CallLogsClasses` | Set CSS classes |
| `setOnLoaderStart` | `callback: (event) => void` | Set loading callback |
| `setOnLoadError` | `callback: (event) => void` | Set error callback |
### CallLogs-Specific Methods
| Method | Parameters | Description |
| ---------------------- | ---------------------------------- | -------------------- |
| `setDateRange` | `{ start?: string; end?: string }` | Filter by date range |
| `setDisplayOptions` | `options: CallLogDisplayOptions` | Show/hide columns |
| `setCustomRowRenderer` | `renderer: (call) => string` | Custom row HTML |
| `setOnRowClick` | `callback: (event) => void` | Row click callback |
:::info[Automatic Pagination]
Pagination is handled automatically by the component using cursor-based pagination. You don't need to manage cursors, offsets, or page state manually. The component automatically loads more data as needed. See the [Pagination Guide](/guides/pagination) for details.
:::
## Configuration Examples
### Date Range Filtering
```javascript
const callLogs = document.querySelector('dialstack-call-logs');
callLogs.setDateRange({
start: '2025-01-01',
end: '2025-01-31',
});
```
### Display Options
```javascript
callLogs.setDisplayOptions({
showDate: true,
showDirection: true,
showFrom: true,
showTo: true,
showDuration: true,
showStatus: true,
});
```
### Formatting
```javascript
callLogs.setFormatting({
defaultCountry: 'US',
dateLocale: 'en-US',
use24HourTime: false,
showTimezone: true,
});
```
### Layout and Styling
```javascript
callLogs.setLayoutVariant('comfortable');
callLogs.setClasses({
base: 'my-call-logs',
table: 'my-table',
row: 'my-row',
rowInbound: 'my-row--inbound',
rowOutbound: 'my-row--outbound',
pagination: 'my-pagination',
});
```
## Event Handlers
### onRowClick
```javascript
callLogs.setOnRowClick((event) => {
console.log('Call ID:', event.callId);
console.log('Call data:', event.call);
// Navigate to detail view
showCallDetail(event.call);
});
```
### onLoadError
```javascript
callLogs.setOnLoadError((event) => {
console.error('Error:', event.error);
console.error('Element:', event.elementTagName);
});
```
## Custom Row Renderer
Provide a function that returns HTML for each row:
```javascript
callLogs.setCustomRowRenderer((call) => {
const icon = call.direction === 'inbound' ? '📥' : '📤';
const status = call.status === 'completed' ? '✓' : '✗';
return `
${icon}
${call.from_number} → ${call.to_number}
${call.duration_seconds}s
${status}
`;
});
```
## Complete Example
```html
Call History
```
## Next Steps
- [voicemails Element](/sdks/web-components/voicemails) - Voicemails reference
- [Theming](/sdks/theming) - Customize appearance
- [i18n](/sdks/i18n) - Internationalization
---
## Web Components
Use DialStack components in any JavaScript application without React. The SDK provides native Web Components (Custom Elements) that work in vanilla JavaScript, Vue, Angular, Svelte, or any framework.
## Quick Start
### Using CDN
```html
```
### Using ES Modules (Pure Import)
For bundled applications without React:
```typescript
import { loadDialstackAndInitialize } from '@dialstack/sdk/pure';
async function init() {
const dialstack = await loadDialstackAndInitialize({
publishableKey: 'pk_live_YOUR_KEY',
appearance: {
theme: 'auto',
},
});
// Create components programmatically
const callLogs = dialstack.create('call-logs');
document.getElementById('call-logs-container').appendChild(callLogs);
// Set client secret
const session = await fetchSession();
callLogs.setClientSecret(session.client_secret);
}
init();
```
## Initialization
### UMD (Browser Global)
When using the CDN, DialStack is available as a global:
```javascript
const dialstack = DialStack.initialize({
publishableKey: 'pk_live_YOUR_KEY',
appearance: {
theme: 'light',
variables: {
colorPrimary: '#6772E5',
},
},
});
```
### ES Module (Pure)
For bundled apps, use the pure import:
```typescript
import { loadDialstackAndInitialize } from '@dialstack/sdk/pure';
const dialstack = await loadDialstackAndInitialize({
publishableKey: 'pk_live_YOUR_KEY',
});
```
## DialStackInstance API
The instance returned from `initialize()` or `loadDialstackAndInitialize()` provides these methods:
### create(tagName)
Create a component element:
```javascript
const callLogs = dialstack.create('call-logs');
const voicemails = dialstack.create('voicemails');
// Append to DOM
document.getElementById('container').appendChild(callLogs);
```
### update(options)
Update appearance for all components:
```javascript
dialstack.update({
appearance: {
theme: 'dark',
variables: {
colorPrimary: '#8B5CF6',
},
},
});
```
### logout()
Clear session and destroy all components:
```javascript
dialstack.logout();
```
## Component Element Methods
All component elements share these common methods:
| Method | Description |
| ---------------------------- | -------------------------- |
| `setClientSecret(secret)` | Set the session token |
| `setInstance(instance)` | Set the DialStack instance |
| `setLocale(locale)` | Set UI locale |
| `setFormatting(options)` | Set date/phone formatting |
| `setIcons(icons)` | Set custom icons |
| `setLayoutVariant(variant)` | Set layout density |
| `setClasses(classes)` | Set CSS classes |
| `setOnLoaderStart(callback)` | Set loading callback |
| `setOnLoadError(callback)` | Set error callback |
## Available Components
| Tag Name | Description |
| -------------------------- | ---------------------------------------------------------------------------- |
| `` | [Compact call history for a phone number](/sdks/web-components/call-history) |
| `` | [Call history table](/sdks/web-components/call-logs) |
| `` | [Voicemail list with playback](/sdks/web-components/voicemails) |
## Event Handling
Set event handlers using setter methods:
```javascript
const callLogs = document.querySelector('dialstack-call-logs');
callLogs.setOnLoadError((event) => {
console.error('Load failed:', event.error);
});
callLogs.setOnRowClick((event) => {
console.log('Clicked call:', event.callId);
});
```
## Framework Integration
### Vue.js
```vue
```
### Angular
```typescript
import { Component, ElementRef, OnInit, ViewChild } from '@angular/core';
import { loadDialstackAndInitialize } from '@dialstack/sdk/pure';
@Component({
selector: 'app-voice-dashboard',
template: ` `,
})
export class VoiceDashboardComponent implements OnInit {
@ViewChild('callLogs') callLogsRef!: ElementRef;
async ngOnInit() {
const dialstack = await loadDialstackAndInitialize({
publishableKey: 'pk_live_YOUR_KEY',
});
const session = await this.sessionService.create();
this.callLogsRef.nativeElement.setClientSecret(session.client_secret);
}
}
```
### Svelte
```svelte
```
## Next Steps
- [call-history Element](/sdks/web-components/call-history) - Compact call history reference
- [call-logs Element](/sdks/web-components/call-logs) - Call logs reference
- [voicemails Element](/sdks/web-components/voicemails) - Voicemails reference
- [Theming](/sdks/theming) - Customize appearance
---
## dialstack-voicemails
The voicemails Web Component displays a list of voicemails with audio playback and actions.
## Usage
```html
```
:::warning[Required: User ID]
You must call `setUserId()` before the component will load data.
:::
:::info[Automatic Pagination]
Pagination is handled automatically by the component using cursor-based pagination. You don't need to manage cursors or page state manually. The component automatically loads more voicemails as needed. See the [Pagination Guide](/guides/pagination) for details.
:::
## Methods
### Common Methods
| Method | Parameters | Description |
| ------------------ | -------------------------------------------------- | ------------------------- |
| `setClientSecret` | `secret: string` | Set session token |
| `setInstance` | `instance: DialStackInstance` | Set SDK instance |
| `setLocale` | `locale: Locale` | Set UI strings |
| `setFormatting` | `options: FormattingOptions` | Set date/phone formatting |
| `setIcons` | `icons: ComponentIcons` | Set custom SVG icons |
| `setLayoutVariant` | `variant: 'compact' \| 'comfortable' \| 'default'` | Set layout density |
| `setClasses` | `classes: VoicemailsClasses` | Set CSS classes |
| `setOnLoaderStart` | `callback: (event) => void` | Set loading callback |
| `setOnLoadError` | `callback: (event) => void` | Set error callback |
### Voicemails-Specific Methods
| Method | Parameters | Description |
| ---------------------- | ------------------------------------ | ------------------------- |
| `setUserId` | `userId: string` | **Required.** Set user ID |
| `setDisplayOptions` | `options: VoicemailDisplayOptions` | Show/hide UI elements |
| `setBehaviorOptions` | `options: VoicemailBehaviorOptions` | Configure behavior |
| `setCustomRowRenderer` | `renderer: (voicemail) => string` | Custom row HTML |
| `setOnVoicemailSelect` | `callback: (event) => void` | Selection callback |
| `setOnVoicemailPlay` | `callback: (event) => void` | Play callback |
| `setOnVoicemailPause` | `callback: (event) => void` | Pause callback |
| `setOnVoicemailDelete` | `callback: (event) => void` | Delete callback |
| `setOnCallBack` | `callback: (event) => void` | Call back callback |
| `setOnDeleteRequest` | `callback: (id) => Promise` | Custom delete confirm |
## Configuration Examples
### Display Options
```javascript
const voicemails = document.querySelector('dialstack-voicemails');
voicemails.setDisplayOptions({
showDuration: true,
showTranscription: true,
showCallbackButton: true,
showDeleteButton: true,
showProgressBar: true,
showTimestamp: true,
});
```
### Behavior Options
```javascript
voicemails.setBehaviorOptions({
autoPlayOnExpand: true,
confirmBeforeDelete: true,
markAsReadOnPlay: true,
allowSeeking: true,
});
```
### Formatting
```javascript
voicemails.setFormatting({
defaultCountry: 'US',
dateLocale: 'en-US',
use24HourTime: false,
showTimezone: false,
});
```
### Layout and Styling
```javascript
voicemails.setLayoutVariant('comfortable');
voicemails.setClasses({
base: 'my-voicemails',
list: 'my-list',
item: 'my-item',
itemExpanded: 'my-item--expanded',
itemUnread: 'my-item--unread',
player: 'my-player',
actions: 'my-actions',
});
```
## Event Handlers
### onVoicemailSelect
```javascript
voicemails.setOnVoicemailSelect((event) => {
console.log('Selected:', event.voicemailId);
});
```
### onVoicemailPlay / onVoicemailPause
```javascript
voicemails.setOnVoicemailPlay((event) => {
console.log('Playing:', event.voicemailId);
});
voicemails.setOnVoicemailPause((event) => {
console.log('Paused:', event.voicemailId);
});
```
### onCallBack
```javascript
voicemails.setOnCallBack((event) => {
console.log('Call back:', event.phoneNumber);
// Initiate call
window.location.href = `tel:${event.phoneNumber}`;
});
```
### onDeleteRequest
Custom delete confirmation:
```javascript
voicemails.setOnDeleteRequest(async (voicemailId) => {
// Show custom modal
const confirmed = await showConfirmModal('Delete voicemail?');
return confirmed; // Return true to delete, false to cancel
});
```
### onVoicemailDelete
```javascript
voicemails.setOnVoicemailDelete((event) => {
console.log('Deleted:', event.voicemailId);
showNotification('Voicemail deleted');
});
```
## Custom Row Renderer
```javascript
voicemails.setCustomRowRenderer((voicemail) => {
const unreadClass = voicemail.is_read ? '' : 'unread';
const duration = formatDuration(voicemail.duration_seconds);
return `
${voicemail.from_name || 'Unknown'}
${voicemail.from_number}
${duration}
${new Date(voicemail.created_at).toLocaleDateString()}
${
voicemail.transcription
? `
${voicemail.transcription}
`
: ''
}
`;
});
```
## Complete Example
```html
Voicemail Inbox
```
## Next Steps
- [call-logs Element](/sdks/web-components/call-logs) - Call logs reference
- [Theming](/sdks/theming) - Customize appearance
- [i18n](/sdks/i18n) - Internationalization
---
## Automotive
Voice for dealerships, service centers, and automotive SaaS.
## Why it matters
- **DMS-integrated Screen Pop** — customer, vehicle, open RO, and warranty on the first ring.
- **Service appointment booking over voice** — AI Scheduling books service slots without a human.
- **Department routing** — one number, smart routing to Sales / Service / Parts / BDC.
- **Activity Logging** — every call attached to the RO or customer card for CRM and compliance.
## Pattern: DMS Screen Pop on the service advisor's desk
```mermaid
sequenceDiagram
participant Caller
participant DS as DialStack
participant DMS as Your DMS backend
participant UI as Advisor's app
Caller->>DS: Inbound call
DS-->>DMS: Webhook call.incoming
DMS->>DMS: ANI lookup → customer + vehicle + open RO
DMS-->>UI: Push "open record" (WebSocket / SSE)
UI->>UI: Customer + RO opens
DS->>UI: Endpoint rings
Caller->>UI: Advisor answers with full context
```
### DMS-lookup webhook handler
```ts
app.post('/webhooks/dialstack', express.raw({ type: 'application/json' }), async (req, res) => {
verifySignature(req);
const event = JSON.parse(req.body);
if (event.type === 'call.incoming') {
const customer = await dms.customers.findByPhone(event.data.from_number);
if (customer) {
const [vehicle, openRO] = await Promise.all([
dms.vehicles.findOne({ customer_id: customer.id, primary: true }),
dms.repairOrders.findOne({ customer_id: customer.id, status: 'open' }),
]);
pusher.trigger(`user-${event.data.user_id}`, 'screen-pop', {
customerId: customer.id,
vehicle,
openRO,
callId: event.data.call_id,
});
}
}
res.status(200).end();
});
```
DMS lookups can be slow — if yours take more than a second or two, queue the push and return `200` immediately. Full pattern: [Screen Pop](/guides/screen-pop).
## Pattern: department routing
One published number, smart routing based on time-of-day, extensions, or caller history.
```ts
await ds.dialPlans.create(
{
name: 'Main dealership line',
entry_node: 'dept_schedule',
nodes: [
{
id: 'dept_schedule',
type: 'schedule',
config: { schedule_id: 'sch_service_hours', open: 'ring_service', closed: 'after_hours' },
},
{ id: 'ring_service', type: 'ring_all_users', config: { timeout: 20, next: 'after_hours' } },
{ id: 'after_hours', type: 'internal_dial', config: { target_id: 'va_after_hours_ai' } },
],
},
{ dialstackAccount: account.id }
);
```
Publish extensions for direct access — sales `100`, service `200`, parts `300` — via the [Extensions API](/api#tag/Extensions). Each extension points at a user, ring group, or dial plan.
## Pattern: service appointment booking over voice
Service scheduling is complex. Rather than rebuilding that logic, use the Notify node to stream call audio directly to your platform's existing AI assistant. Your bespoke VoiceAI handles the conversation, collects vehicle details, and books the appointment directly in your DMS — you maintain total control over the experience.
Full flow: [BYO VoiceAI](/guides/voiceai-byo).
## Build this with DialStack
- [Screen Pop](/guides/screen-pop) — pop the customer / vehicle / RO.
- [Dial Plans](/guides/dial-plans) — department routing + time-of-day.
- [Extensions](/api#tag/Extensions) — direct-access codes per department.
- [AI Scheduling](/guides/voiceai-scheduling) — service appointment booking over voice.
- [Click-to-Call](/guides/click-to-call) — BDC follow-up from the CRM.
- [Activity Logging](/guides/activity-logging) — attach every call to the RO.
---
## Field Services
Voice for dispatch-driven businesses — HVAC, plumbing, electrical, pest control, security, vehicle rental, etc.
## Why it matters
- **Every missed call is a lost job.** Route to the right dispatcher instantly, fall back to AI when nobody's free.
- **Click-to-Call velocity** — dispatchers return leads from inside your scheduler, not their personal phones.
- **Activity Logging** — every call written to the job record for audit and coaching.
- **On-call rotations** — dial plans that change by hour-of-day and on-call roster.
## Pattern: business-hour routing with AI overflow
```mermaid
sequenceDiagram
participant Caller
participant DS as DialStack
participant Team as Dispatch team
participant AI as Voice App (AI receptionist)
Caller->>DS: Inbound call
DS->>DS: Check schedule
alt Business hours
DS->>Team: Ring all dispatchers (25s)
alt Someone answers
Team->>Caller: Connect
else Timeout / all busy
DS->>AI: Route to AI
AI->>Caller: "All our dispatchers are busy — I can help"
AI-->>DS: Webhook: customer + urgency + callback
DS-->>Team: Ops notified via your on-call tool
end
else After hours
DS->>AI: Route to AI directly
end
```
### Dial plan that does this
```ts
await ds.dialPlans.create(
{
name: 'Main dispatch line',
entry_node: 'hours',
nodes: [
{
id: 'hours',
type: 'schedule',
config: { schedule_id: 'sch_business_hours', open: 'ring_dispatch', closed: 'ai_intake' },
},
{
id: 'ring_dispatch',
type: 'ring_all_users',
config: { timeout: 25, next: 'ai_intake' },
},
{
id: 'ai_intake',
type: 'internal_dial',
config: { target_id: 'va_dispatch_ai' },
},
],
},
{ dialstackAccount: account.id }
);
```
The AI Voice App fires a webhook to your on-call rotation system when it captures an after-hours job. Full Voice App setup: [Voice Apps](/guides/voice-apps).
## Pattern: dispatcher click-to-call from the job screen
Give dispatchers a button on every job card that dials the customer. Alice's own endpoints ring first, then DialStack dials the customer and bridges the audio.
```tsx
import { useDialstack } from '@dialstack/sdk/react';
function JobCard({ job, dispatcher }) {
const { api } = useDialstack();
return (
);
}
```
Full behavior (ring-all endpoints, dial string formats, errors): [Click-to-Call](/guides/click-to-call).
## Pattern: log every call to the job record
```ts
if (event.type === 'call.end') {
const job = await db.jobs.findOne({ customer_phone: event.data.from_number });
if (job) {
await db.jobActivity.insert({
job_id: job.id,
call_id: event.data.call_id,
user_id: event.data.user_id,
direction: event.data.direction,
duration: event.data.duration_seconds,
status: event.data.status,
ended_at: event.data.ended_at,
});
}
}
```
Full event surface: [Activity Logging](/guides/activity-logging).
## Build this with DialStack
- [Dial Plans](/guides/dial-plans) — hour-of-day and on-call-roster logic.
- [Ring Groups](/guides/ring-groups) — route by team or territory.
- [Click-to-Call](/guides/click-to-call) — dispatcher velocity from the job screen.
- [Screen Pop](/guides/screen-pop) — customer record on first ring.
- [Activity Logging](/guides/activity-logging) — every call on the job record.
- [Voice Apps](/guides/voice-apps) — AI intake for after-hours / overflow.
---
## Healthcare
Embedded Voice for practices, clinics, and specialty-health SaaS.
## Why it matters
- **HIPAA-aware** — encrypted media, BAA available, audit logs on every call.
- **Screen Pop on the patient chart** — the chart opens on the first ring, before anyone says hello.
- **AI Scheduling** — callers book their own appointments via voice. No hold music, no phone tag.
- **After-hours triage** — urgent calls to the on-call provider, everything else to voicemail with transcription.
## Pattern: Screen Pop on the patient chart
```mermaid
sequenceDiagram
participant Caller
participant DS as DialStack
participant EHR as Your EHR backend
participant UI as Clinician's app
Caller->>DS: Inbound call
DS-->>EHR: Webhook call.incoming
EHR->>EHR: Lookup patient by from_number
EHR-->>UI: Push "open chart" (WebSocket / SSE / Pusher)
UI->>UI: Patient chart opens
Note over Caller,DS: Phone still ringing
DS->>UI: Endpoint rings
Caller->>UI: Clinician answers, chart already on screen
```
### Minimal webhook handler
```ts
app.post('/webhooks/dialstack', express.raw({ type: 'application/json' }), async (req, res) => {
verifySignature(req);
const event = JSON.parse(req.body);
if (event.type === 'call.incoming') {
const patient = await db.patients.findOne({ phone: event.data.from_number });
if (patient) {
// push to the clinician's open browser tab via your realtime channel
pusher.trigger(`user-${event.data.user_id}`, 'screen-pop', {
patientId: patient.id,
lastVisit: patient.last_visit,
callId: event.data.call_id,
});
}
}
res.status(200).end();
});
```
The webhook is fire-and-forget — respond `200` fast. See [Screen Pop](/guides/screen-pop) for the full pattern, including the frontend-only variant using the SSE event stream.
## Pattern: AI Scheduling for after-hours booking
Route closed-hours calls to a Voice App in Notify mode that collects the booking request and calls your availability / booking APIs back.
```ts
await ds.dialPlans.create(
{
name: 'Main line',
entry_node: 'hours',
nodes: [
{
id: 'hours',
type: 'schedule',
config: { schedule_id: 'sch_business_hours', open: 'ring_front_desk', closed: 'ai_book' },
},
{ id: 'ring_front_desk', type: 'ring_all_users', config: { timeout: 30, next: 'ai_book' } },
{ id: 'ai_book', type: 'internal_dial', config: { target_id: 'va_booking_agent' } },
],
},
{ dialstackAccount: account.id }
);
```
The booking agent is a Voice App configured with your availability + booking endpoints. Full flow: [AI Scheduling](/guides/voiceai-scheduling).
## HIPAA notes
- **Encryption** — media in transit is SRTP; recordings and voicemails are encrypted at rest.
- **BAA** — available on request for platforms handling PHI.
- **Audit logs** — every call and admin action is retained in the platform audit log.
- **Recording consent** — recording is per-account opt-in. Ensure you obtain consent before enabling it if your jurisdiction requires two-party consent.
Specific compliance commitments are platform-agreement-level — reach out and we'll scope.
## Build this with DialStack
- [Screen Pop](/guides/screen-pop) — pop the patient chart on first ring.
- [Activity Logging](/guides/activity-logging) — write every call to the patient record.
- [Click-to-Call](/guides/click-to-call) — outbound from the chart.
- [AI Scheduling](/guides/voiceai-scheduling) — native booking over voice.
- [Appointment Webhooks](/guides/appointment-webhooks) — sync bookings back to your calendar.
---
## Calling & Call Control
Make and receive phone calls, and control them with hold, transfer, mute, and DTMF.
## Making Calls
### Outbound Call Flow
```javascript
// Dial a phone number (E.164 format)
const call = await phone.call('+14155551234');
// Or dial an extension
const call = await phone.call('105');
// Optional: specify caller ID
const call = await phone.call('+14155551234', {
callerId: '+14155559876',
});
```
The call object emits events as the call progresses:
| Event | Description |
| ---------- | -------------------------------- |
| `trying` | Server is processing the call |
| `ringing` | Remote party's phone is ringing |
| `answered` | Call connected, audio is flowing |
| `held` | Call placed on hold |
| `resumed` | Call resumed from hold |
| `ended` | Call ended (with reason) |
### Inbound Call Flow
```javascript
phone.on('incoming', (call) => {
// call.id — call identifier
// call.from — caller's number (E.164)
// call.fromName — caller's display name (if available)
// call.to — called number or extension
// Answer
call.answer();
// Or reject
call.reject(); // silent decline
call.reject('busy'); // send busy signal
});
```
If the user doesn't answer within 30 seconds, the call ends with reason `no-answer`.
:::tip[Multiple devices]
When a call arrives, it rings **all** of the user's registered devices simultaneously (SIP desk phones, WebRTC softphones). The first device to answer wins — all others stop ringing.
:::
### Call Ended Reasons
```javascript
call.on('ended', (reason) => {
switch (reason) {
case 'hangup':
// Normal hangup by either party
break;
case 'busy':
// Destination is busy
break;
case 'no-answer':
// No one answered
break;
case 'failed':
// Call setup failed (invalid number, network error)
break;
case 'transferred':
// Call was transferred
break;
case 'rejected':
// Remote party rejected the call
break;
}
});
```
## Call Control
### Hold and Resume
```javascript
// Place the call on hold (remote party hears hold music)
call.hold();
// Resume the call
call.resume();
// Listen for hold events (local or remote hold)
call.on('held', (heldBy) => {
if (heldBy === 'remote') {
console.log('The other party put you on hold');
}
});
call.on('resumed', () => {
console.log('Call resumed');
});
```
### Mute
```javascript
// Client-side mute (stops sending audio from the microphone)
call.mute();
call.unmute();
// Check mute state
console.log(call.isMuted); // true or false
```
The SDK both disables the local microphone track and sends a `call.mute` message to the server. Server-side mute is authoritative — even if the client sends audio, it is not forwarded to the remote party.
### DTMF
```javascript
// Send a single digit
call.sendDtmf('5');
// Navigate an IVR menu
for (const digit of '1234#') {
call.sendDtmf(digit);
}
```
### Blind Transfer
Transfer the call to another destination immediately:
```javascript
// Transfer to an extension
call.transfer('105');
// Transfer to a phone number
call.transfer('+14155551234');
// The call ends for you after the transfer
call.on('ended', (reason) => {
console.log(reason); // 'transferred'
});
```
### Attended Transfer
Consult with the transfer target before completing the transfer:
```javascript
// Step 1: Consult — your current call is held, a new call is placed
const consultCall = await call.attendedTransfer('105');
consultCall.on('answered', () => {
console.log('Consulting with transfer target...');
// Step 2: Complete — connect the original caller to the target
call.completeTransfer();
// Or cancel — hang up the consultation call, original call resumes
// consultCall.hangup();
});
```
If the consultation call fails (busy, no-answer), the original call is automatically resumed.
## Multi-Call Handling
A single WebSocket connection supports multiple simultaneous calls. This enables call waiting, call swap, and conferencing workflows.
### Call Waiting
When a second call arrives while you're on a call, the `incoming` event fires as usual:
```javascript
phone.on('incoming', (call) => {
if (phone.activeCalls.length > 0) {
// Already on a call — this is call waiting
showCallWaitingUI(call);
} else {
showIncomingCallUI(call);
}
});
```
### Swapping Calls
Hold the current call and answer or resume another:
```javascript
// Hold current call and answer the waiting call
currentCall.hold();
waitingCall.answer();
// Later, swap back
waitingCall.hold();
currentCall.resume();
```
### Active Calls
```javascript
// List all active calls
const calls = phone.activeCalls;
// [{ id, from, to, state: 'active' | 'held' | 'ringing', direction }]
// Find a specific call
const call = phone.getCall(callId);
```
## Direct WebSocket Usage
If you're not using the SDK, you can interact with the signalling protocol directly. See the [Signalling Protocol reference](./protocol) for the complete message specification.
### Making a Call (Raw WebSocket)
```javascript
// 1. Initiate the call
ws.send(
JSON.stringify({
type: 'call.create',
destination: '+14155551234',
client_call_id: 'my-call-1',
})
);
// 2. Handle server messages
ws.onmessage = async (event) => {
const msg = JSON.parse(event.data);
switch (msg.type) {
case 'call.trying':
// Server assigned a call_id
const callId = msg.call_id;
break;
case 'sdp.offer':
// Set remote description and create answer
await pc.setRemoteDescription({ type: 'offer', sdp: msg.sdp });
const answer = await pc.createAnswer();
await pc.setLocalDescription(answer);
ws.send(
JSON.stringify({
type: 'sdp.answer',
call_id: msg.call_id,
sdp: answer.sdp,
})
);
break;
case 'ice.candidate':
await pc.addIceCandidate({
candidate: msg.candidate,
sdpMid: msg.sdp_mid,
sdpMLineIndex: msg.sdp_m_line_index,
});
break;
case 'call.ringing':
// Play ringback tone
break;
case 'call.answered':
// Call connected — audio is flowing
break;
case 'call.ended':
pc.close();
break;
}
};
// 3. Send local ICE candidates
pc.onicecandidate = (event) => {
if (event.candidate) {
ws.send(
JSON.stringify({
type: 'ice.candidate',
call_id: callId,
candidate: event.candidate.candidate,
sdp_mid: event.candidate.sdpMid,
sdp_m_line_index: event.candidate.sdpMLineIndex,
})
);
} else {
ws.send(JSON.stringify({ type: 'ice.done', call_id: callId }));
}
};
```
---
## WebRTC
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
# WebRTC
:::info[Coming soon]
The WebRTC API (including user authentication, signalling, and media) is currently undergoing implementation and will be available shortly. The surface documented below reflects the target design; specifics may change before release.
:::
Build softphone experiences for web, mobile, and desktop using DialStack's WebRTC API.
## Overview
The WebRTC API enables your application to make and receive phone calls directly from a browser or native app. It consists of three parts:
1. **User authentication** — end users authenticate to get a token ([Authentication guide](/authentication#user-tokens))
2. **Signalling** — a WebSocket connection at `wss://api.dialstack.ai/v1/webrtc` handles call setup, control, and presence
3. **Media** — WebRTC peer connections carry the actual audio between the client and DialStack
A single WebSocket connection handles all signalling for one user, including multiple simultaneous calls.
## Architecture
```
┌───────────────────────────────────────────────────────────┐
│ Your Application (browser / mobile / desktop) │
│ │
│ ┌─────────────┐ ┌──────────────────┐ ┌─────────────┐ │
│ │ Your UI │ │ DialStack SDK │ │ WebRTC │ │
│ │ (dial pad, │──│ (signalling, │──│ Media │ │
│ │ contacts) │ │ call control) │ │ (audio) │ │
│ └─────────────┘ └────────┬─────────┘ └──────┬──────┘ │
│ │ │ │
└────────────────────────────┼───────────────────┼──────────┘
│ WSS │ SRTP
│ (signalling) │ (encrypted audio)
▼ ▼
┌────────────────────────────────────────┐
│ DialStack │
│ │
│ Signalling ──── Media ──── PSTN │
│ Server Gateway Gateway │
└────────────────────────────────────────┘
```
- **Signalling** travels over a single WebSocket (JSON messages)
- **Media** flows directly via WebRTC (ICE/DTLS-SRTP) — encrypted end-to-end between client and DialStack
- **PSTN connectivity** is handled server-side — your client just sends and receives audio
## Quick Start
### 1. Get a user token
Your backend exchanges the user's identity for a DialStack user token:
```javascript
// Your backend
import { DialStack } from '@dialstack/sdk/server';
const dialstack = new DialStack(process.env.DIALSTACK_API_KEY);
const { token } = await dialstack.auth.createToken({
grant_type: 'token_exchange',
subject_token: userJwt,
subject_token_type: 'urn:ietf:params:oauth:token-type:jwt',
account_id: 'acct_01h2xcejqtf2nbrexx3vqjhp41',
});
```
### 2. Connect the softphone
```javascript
// Your frontend
import { DialStackPhone } from '@dialstack/sdk/webrtc';
const phone = new DialStackPhone({
token,
onTokenExpiring: async () => {
const { token } = await fetch('/api/dialstack/user-token', {
method: 'POST',
headers: { Authorization: `Bearer ${sessionToken}` },
}).then((r) => r.json());
return token;
},
});
await phone.connect();
console.log('Phone connected, ready for calls');
```
### 3. Make a call
```javascript
const call = await phone.call('+14155551234');
call.on('ringing', () => console.log('Ringing...'));
call.on('answered', () => console.log('Connected!'));
call.on('ended', (reason) => console.log('Call ended:', reason));
```
### 4. Receive a call
```javascript
phone.on('incoming', (call) => {
console.log('Incoming call from', call.from, call.fromName);
// Show UI, then:
call.answer();
// Or reject:
// call.reject();
});
```
## Connecting
### WebSocket Connection
The SDK manages the WebSocket connection automatically. Under the hood, it:
1. Opens a WebSocket to `wss://api.dialstack.ai/v1/webrtc`
2. Sends an `authenticate` message with the user token
3. Receives `authenticated` confirming the session
4. Sends `ping` every 30 seconds to keep the connection alive
```javascript
const phone = new DialStackPhone({ token });
phone.on('connected', () => {
// WebSocket connected and authenticated
});
phone.on('disconnected', () => {
// WebSocket lost — SDK will reconnect automatically
});
phone.on('reconnected', () => {
// Reconnected — active calls are restored
});
await phone.connect();
```
### Reconnection
If the WebSocket connection drops (network change, brief outage), the SDK reconnects automatically with exponential backoff. Active calls survive brief disconnections (up to 30 seconds) — the server preserves call state during the gap.
On reconnection, the SDK:
1. Authenticates with the current token
2. Receives `call.restored` for each active call
3. Closes the old `RTCPeerConnection` and creates a new one
4. Completes a full SDP offer/answer exchange to re-establish media
This adds ~1 second to call recovery but is simpler and more reliable than attempting an ICE restart on the existing connection. The SDK handles this automatically — your code just sees the `reconnected` event.
### Session Limits
A single user can have up to **3 concurrent WebRTC sessions** (e.g., laptop, phone, tablet). All connected sessions ring on incoming calls. If a user attempts a 4th connection, the oldest session is disconnected.
```javascript
phone.on('error', (error) => {
if (error.code === 'session_limit') {
// User has too many active sessions
showMessage('You are connected on too many devices. Close another session and try again.');
}
});
```
### Token Refresh
User tokens expire after 1 hour. The `onTokenExpiring` callback is called ~5 minutes before expiry so you can fetch a fresh token without interrupting the session:
```javascript
const phone = new DialStackPhone({
token: initialToken,
onTokenExpiring: async () => {
// Fetch a new token from your backend
const { token } = await fetch('/api/dialstack/user-token', {
method: 'POST',
}).then((r) => r.json());
return token;
},
});
```
### Error Handling
```javascript
phone.on('error', (error) => {
switch (error.code) {
case 'auth_failed':
// Token is invalid — get a new one
break;
case 'auth_expired':
// Token expired — should have been refreshed via onTokenExpiring
break;
case 'rate_limited':
// Too many requests — back off
break;
}
});
```
## What's Next
- [Calling & Call Control](./calling) — Make and receive calls, hold, transfer, DTMF
- [Presence](./presence) — Real-time user status and BLF
- [Mobile & Push Notifications](./mobile) — Push notifications, E911, background audio
- [Network & Troubleshooting](./network) — Codecs, firewall configuration, debugging
- [Signalling Protocol](./protocol) — Low-level WebSocket message reference
- [Client SDK Reference](./sdk) — Complete TypeScript API
---
## Mobile & Push Notifications
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
# Mobile & Push Notifications
Build mobile softphone apps with push notifications for incoming calls and E911 compliance.
## Push Notifications
When a mobile app is in the background or closed, the WebRTC signalling connection is not active. Push notifications bridge this gap — DialStack notifies your backend via webhook, and your backend sends a push to wake the app.
### How It Works
```
┌──────────┐ ┌──────────────┐ ┌───────────┐ ┌──────────┐
│ Caller │ │ DialStack │ │ Your │ │ User's │
│ │ │ │ │ Backend │ │ Phone │
└────┬─────┘ └──────┬───────┘ └─────┬─────┘ └────┬─────┘
│ Calls user │ │ │
│────────────────>│ │ │
│ │ │ │
│ │ 1. Webhook: │ │
│ │ call.incoming │ │
│ │─────────────────>│ │
│ │ │ │
│ │ │ 2. Push │
│ │ │ notification │
│ │ │──────────────>│
│ │ │ │
│ │ │ 3. App wakes│
│ │ │ connects WS │
│ │ <───────────────────────────────│
│ │ │ │
│ │ 4. call.incoming│ │
│ │ (via WebSocket) │ │
│ │─────────────────────────────────>│
│ │ │ │
│ │ │ 5. User │
│ <─────────────────────────────────── answers │
│ Call connected │ │
```
1. DialStack sends a `call.incoming` webhook to your platform's webhook URL
2. Your backend sends a push notification (APNs or FCM) to the user's device
3. The app wakes and connects to the WebRTC signalling channel
4. DialStack delivers the `call.incoming` message over WebSocket
5. The user answers and the call connects
:::tip[Time budget]
You have approximately **30 seconds** from when the call arrives until it times out. Push notification delivery and app wake typically take 2–5 seconds, leaving plenty of time for the user to answer.
:::
### Webhook Payload
DialStack delivers `call.incoming` [webhook events](/guides/webhook-events) to your platform's webhook URL for every inbound call — no voice app required. The `user_id` field tells you which user the call is for, so you can look up their device tokens in your own database and send the push:
```json
{
"id": "evt_01jqr5k8m3n4p6q7r8s9t0u1v3",
"type": "call.incoming",
"created_at": "2026-04-10T14:30:00Z",
"account_id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
"data": {
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45",
"direction": "inbound",
"from_number": "+14155551234",
"from_name": "John Smith",
"to_number": "+14155559876",
"user_id": "user_01h2xcejqtf2nbrexx3vqjhp42",
"started_at": "2026-04-10T14:30:00Z"
}
}
```
Your backend maintains the mapping between DialStack `user_id` and your push notification device tokens. DialStack does not store device tokens — push delivery is entirely in your control.
### Sending Push Notifications
#### iOS (APNs)
Send a VoIP push notification using the PushKit framework. VoIP pushes wake the app immediately and have higher priority than standard notifications.
```javascript
import apn from 'apn';
const provider = new apn.Provider({
token: {
key: './AuthKey.p8',
keyId: 'YOUR_KEY_ID',
teamId: 'YOUR_TEAM_ID',
},
production: true,
});
async function sendCallPush(deviceToken, callData) {
const notification = new apn.Notification();
notification.topic = 'com.example.myapp.voip';
notification.pushType = 'voip';
notification.priority = 10;
notification.expiry = Math.floor(Date.now() / 1000) + 30; // 30 second TTL
notification.payload = {
call_id: callData.call_id,
from_number: callData.from_number,
from_name: callData.from_name,
to_number: callData.to_number,
};
await provider.send(notification, deviceToken);
}
```
#### Android (FCM)
Send a high-priority data message to bypass Doze mode:
```javascript
import admin from 'firebase-admin';
admin.initializeApp({
credential: admin.credential.applicationDefault(),
});
async function sendCallPush(deviceToken, callData) {
await admin.messaging().send({
token: deviceToken,
android: {
priority: 'high',
ttl: 30000, // 30 seconds
},
data: {
type: 'call.incoming',
call_id: callData.call_id,
from_number: callData.from_number,
from_name: callData.from_name || '',
to_number: callData.to_number,
},
});
}
```
:::danger[Do not use notification messages]
Use FCM **data messages** (not notification messages) for incoming calls. Data messages wake the app immediately and let you show a full-screen call UI. Notification messages display a banner that the user must tap.
:::
### Webhook Handler
Your platform's webhook handler receives `call.incoming` events for all accounts. Look up the user's devices and send notifications:
```javascript
import express from 'express';
import { DialStack } from '@dialstack/sdk/server';
const app = express();
const dialstack = new DialStack(process.env.DIALSTACK_API_KEY);
// This is your platform-level webhook URL (configured during onboarding)
app.post('/webhooks/dialstack', express.json(), async (req, res) => {
// Verify the webhook signature
const isValid = dialstack.webhooks.verifySignature(
req.body,
req.headers['x-dialstack-signature'],
process.env.DIALSTACK_WEBHOOK_SECRET
);
if (!isValid) {
return res.status(401).send('Invalid signature');
}
const { type, data } = req.body;
if (type === 'call.incoming' && data.user_id) {
// Look up the user's device tokens in YOUR database
const devices = await getDeviceTokensForUser(data.user_id);
// Send push to all registered devices in parallel
await Promise.all(
devices.map((device) => {
if (device.platform === 'apns') {
return sendApnsPush(device.token, data);
} else if (device.platform === 'fcm') {
return sendFcmPush(device.token, data);
}
})
);
}
res.status(200).send('OK');
});
```
### Mobile App Flow
#### iOS (Swift)
```swift
// 1. Register for VoIP push notifications
import PushKit
class AppDelegate: UIResponder, PKPushRegistryDelegate {
func registerForVoIPPush() {
let registry = PKPushRegistry(queue: .main)
registry.delegate = self
registry.desiredPushTypes = [.voIP]
}
func pushRegistry(_ registry: PKPushRegistry,
didUpdate pushCredentials: PKPushCredentials,
for type: PKPushType) {
let token = pushCredentials.token.map {
String(format: "%02x", $0)
}.joined()
// Store the device token in YOUR backend, mapped to the user's
// DialStack user_id. Your backend uses this to send pushes
// when it receives a call.incoming webhook.
YourAPI.shared.registerPushToken(token: token, platform: "apns")
}
// 2. Handle incoming VoIP push
func pushRegistry(_ registry: PKPushRegistry,
didReceiveIncomingPushWith payload: PKPushPayload,
for type: PKPushType) {
let callData = payload.dictionaryPayload
// 3. Report to CallKit (required on iOS)
let update = CXCallUpdate()
update.remoteHandle = CXHandle(
type: .phoneNumber,
value: callData["from_number"] as? String ?? ""
)
update.localizedCallerName = callData["from_name"] as? String
let callUUID = UUID()
CXProvider.shared.reportNewIncomingCall(
with: callUUID,
update: update
) { error in
if error == nil {
// 4. Connect to WebRTC in the background
DialStackPhone.shared.connect()
}
}
}
}
```
#### Android (Kotlin)
```kotlin
// 1. Handle FCM data message
class CallFirebaseService : FirebaseMessagingService() {
override fun onMessageReceived(message: RemoteMessage) {
val data = message.data
if (data["type"] == "call.incoming") {
// 2. Show full-screen call notification
val intent = Intent(this, IncomingCallActivity::class.java).apply {
putExtra("call_id", data["call_id"])
putExtra("from_number", data["from_number"])
putExtra("from_name", data["from_name"])
flags = Intent.FLAG_ACTIVITY_NEW_TASK
}
val pendingIntent = PendingIntent.getActivity(
this, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
// Use a full-screen intent for incoming call UI
val notification = NotificationCompat.Builder(this, "calls")
.setSmallIcon(R.drawable.ic_call)
.setContentTitle(data["from_name"] ?: data["from_number"])
.setContentText("Incoming call")
.setPriority(NotificationCompat.PRIORITY_MAX)
.setCategory(NotificationCompat.CATEGORY_CALL)
.setFullScreenIntent(pendingIntent, true)
.build()
val manager = getSystemService(NotificationManager::class.java)
manager.notify(CALL_NOTIFICATION_ID, notification)
}
}
}
```
## Emergency Calling (E911)
WebRTC softphone users are nomadic — they may call 911 from different locations. Federal regulations (RAY BAUM's Act, Kari's Law) require that every 911 call includes a dispatchable location (street address with floor/suite) so first responders can find the caller.
### How It Works
1. **Register an emergency address** for the user via `PUT /v1/me/emergency-address`
2. **Validate the address** — DialStack validates against the MSAG (Master Street Address Guide) and provisions it to the ALI database
3. **Prompt on network change** — when the client detects a network change (new IP, new Wi-Fi), prompt the user to confirm or update their location
4. **911 calls route with location** — when the user dials 911, DialStack includes the registered address so the PSAP can dispatch to the correct location
### Address Registration
```javascript
// Register or update the user's emergency address
await phone.setEmergencyAddress({
street: '123 Main St',
street2: 'Suite 400',
city: 'San Francisco',
state: 'CA',
zip: '94105',
country: 'US',
});
```
The address is validated synchronously. If it doesn't match a valid civic address, the call returns a validation error with suggestions.
### Requirements
- **Address required before calling**: Users must have a validated emergency address before placing calls. Attempting to dial without one returns an `emergency_address_required` error on the signalling channel.
- **Prompt on network change**: Detect network changes in your app and prompt the user to confirm their location. The SDK emits a `network.changed` event when the client's IP address changes.
- **Direct 911 dialing**: 911 and 933 (E911 test) are always routable without prefix, per Kari's Law.
:::danger[Regulatory requirement]
E911 compliance is not optional. If your users can place calls through the softphone, you must implement emergency address registration. Failure to provide accurate location with 911 calls carries regulatory and legal liability.
:::
## Background Audio
On mobile platforms, configure your app to continue audio playback in the background:
- **iOS**: Enable the `audio` background mode in your app's capabilities
- **Android**: Use a foreground service with the `mediaPlayback` type during active calls
## Battery Optimization
The WebSocket connection consumes battery when maintained in the background. For mobile apps:
- Maintain the WebSocket only while the app is in the foreground
- Rely on push notifications for incoming calls when backgrounded
## Best Practices
### DO
- Send push notifications with a short TTL (30 seconds) — stale call notifications confuse users
- Use VoIP pushes on iOS (PushKit) for immediate delivery and CallKit integration
- Use FCM data messages (not notification messages) on Android for full app control
- Include the `call_id` in the push payload so the app can match it to the WebSocket event
### DON'T
- Don't rely solely on the WebSocket for mobile incoming calls — the connection drops when backgrounded
- Don't keep the WebSocket alive in the background on mobile — it drains battery
---
## Network & Troubleshooting
Audio codecs, bandwidth requirements, firewall configuration, and common issues.
## Audio & Codec Details
### Supported Codecs
| Codec | Direction | Use case |
| --------------- | ------------------ | -------------------------------------------------------------------- |
| **Opus** | Client ↔ DialStack | WebRTC media path. Wideband (48 kHz), low latency, adaptive bitrate. |
| **G.711 μ-law** | DialStack ↔ PSTN | PSTN leg. DialStack transcodes between Opus and G.711 transparently. |
The SDP offer from DialStack includes Opus as the preferred codec. You do not need to configure codecs — the browser's WebRTC stack negotiates automatically.
### Bandwidth Requirements
| Scenario | Bandwidth (per direction) |
| ------------------- | ------------------------- |
| Opus voice call | 24–40 kbps |
| TURN relay overhead | +10–15 kbps |
| Typical total | ~50–60 kbps up + down |
These are conservative estimates for voice-only calls. Actual bandwidth depends on network conditions — Opus adapts its bitrate dynamically.
### Encryption
All WebRTC media is encrypted with DTLS-SRTP (mandatory per the WebRTC specification). The signalling WebSocket uses TLS (WSS). There is no unencrypted path.
## ICE/TURN Configuration
WebRTC requires STUN/TURN servers for NAT traversal. The SDK handles this automatically, but if you're building a custom client:
```javascript
// Fetch ICE server credentials
const response = await fetch('https://api.dialstack.ai/v1/webrtc/ice-servers', {
headers: { Authorization: `Bearer ${userToken}` },
});
const { ice_servers, expires_at } = await response.json();
// Pass to RTCPeerConnection
const pc = new RTCPeerConnection({ iceServers: ice_servers });
```
TURN credentials are time-limited. Fetch fresh credentials before the `expires_at` timestamp — typically before each new call.
## Network Requirements
### Required Connectivity
| Protocol | Destination | Port | Purpose |
| ---------- | ------------------- | ---- | ------------------------------- |
| WSS (TCP) | `api.dialstack.ai` | 443 | Signalling WebSocket |
| STUN (UDP) | `stun.dialstack.ai` | 3478 | NAT type discovery |
| TURN (UDP) | `turn.dialstack.ai` | 443 | Media relay (preferred) |
| TURN (TCP) | `turn.dialstack.ai` | 443 | Media relay (firewall fallback) |
The signalling WebSocket always uses TCP 443 (standard HTTPS port). Media uses UDP when possible but falls back to TURN over TCP 443 when UDP is blocked — this ensures calls work even behind restrictive corporate firewalls.
### How Media Connectivity Works
WebRTC uses ICE (Interactive Connectivity Establishment) to find the best path for audio:
1. **Direct (host candidate)** — local network, lowest latency
2. **STUN (server-reflexive)** — through NAT, still direct peer-to-peer
3. **TURN (relay)** — relayed through DialStack's TURN server, works behind any firewall
The SDK tries all paths simultaneously and uses the best one. If UDP is blocked entirely, TURN over TCP 443 is the last resort — it adds ~20ms latency but is indistinguishable from HTTPS traffic to firewalls.
### Enterprise Firewall Configuration
For IT administrators configuring firewalls for DialStack WebRTC:
```
# Minimum required (signalling + TURN fallback)
Allow TCP 443 outbound to api.dialstack.ai
Allow TCP 443 outbound to turn.dialstack.ai
# Recommended (better audio quality via UDP)
Allow UDP 443 outbound to turn.dialstack.ai
Allow UDP 3478 outbound to stun.dialstack.ai
```
TURN over TCP 443 is always available as a fallback. If only TCP 443 is permitted, calls will work but with slightly higher latency.
## Troubleshooting
### No audio after connecting
Most common cause: UDP is blocked by a firewall. The SDK will fall back to TURN/TCP, but this takes a few seconds. If TURN/TCP is also blocked, media cannot flow.
Verify connectivity: open `https://api.dialstack.ai/v1/webrtc/ice-servers` in a browser — if this loads, the signalling path is fine and the issue is media.
### One-way audio
Typically a symmetric NAT issue. TURN relay resolves this automatically. If one-way audio persists, check that the TURN credentials haven't expired (fetch fresh credentials before each call).
### Call drops after ~30 seconds
ICE connectivity check timeout. The media path couldn't be established. Check that at least one of UDP 443 or TCP 443 to `turn.dialstack.ai` is reachable.
### High latency or choppy audio
Check available bandwidth (50 kbps minimum per direction). Wi-Fi congestion and mobile network transitions are common causes.
Use `call.peerConnection.getStats()` to inspect WebRTC quality metrics (jitter, packet loss, round-trip time).
---
## Presence & BLF
Subscribe to real-time presence updates for other users in the account. This powers busy lamp field (BLF) indicators and contact status displays.
## Subscribing
```javascript
// Subscribe to all users in the account
phone.subscribePresence();
// Or subscribe to specific users
phone.subscribePresence(['user_01h2xcejqtf2nbrexx3vqjhp42', 'user_01h2xcejqtf2nbrexx3vqjhp43']);
// Get initial presence snapshot
phone.on('presenceList', (users) => {
// [{ userId, name, status, statusText, updatedAt }]
updateBuddyList(users);
});
// Listen for changes
phone.on('presenceUpdate', (update) => {
// { userId, status, statusText, updatedAt }
updateBuddyListEntry(update);
});
```
## Presence Statuses
| Status | Description |
| ----------- | --------------------------------------------- |
| `available` | User is online and can receive calls |
| `on_call` | User is on an active call (set automatically) |
| `dnd` | Do Not Disturb — calls go to voicemail |
| `away` | User is away (idle timeout or manual) |
| `offline` | No active WebRTC or SIP registration |
## Setting Your Status
```javascript
// Set yourself as Do Not Disturb
await phone.setPresence('dnd');
// Set yourself as available
await phone.setPresence('available');
// Set with custom status text
await phone.setPresence('away', 'In a meeting until 3pm');
```
The `on_call` and `offline` statuses are managed automatically — you cannot set them manually.
## REST API
You can also read and update your own presence via the REST API:
```bash
# Get current presence
curl https://api.dialstack.ai/v1/me/presence \
-H "Authorization: Bearer USER_TOKEN"
# Update presence
curl -X PUT https://api.dialstack.ai/v1/me/presence \
-H "Authorization: Bearer USER_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "status": "dnd", "status_text": "In a meeting" }'
```
---
## WebRTC Signalling Protocol
# DialStack WebRTC Signalling Protocol 1.0.0 documentation
- Support: [DialStack API Support](https://docs.dialstack.ai)
- Email support: [info@dialstack.ai](mailto:info@dialstack.ai)
Real-time signalling protocol for DialStack WebRTC softphones.
## Overview
The WebRTC signalling protocol enables softphone applications (web, mobile, desktop)
to make and receive phone calls through DialStack. It handles call setup, media
negotiation, call control, and presence — all over a single WebSocket connection.
## Connection Flow
1. Obtain a user token via `POST /v1/auth/token` (see [Authentication](/authentication#user-tokens))
2. Open a WebSocket connection to `wss://api.dialstack.ai/v1/webrtc`
3. Send an `authenticate` message with the user token
4. Receive an `authenticated` message confirming the session
5. The connection is now ready for calls and presence
## Authentication
The WebSocket connection itself does not use HTTP headers for authentication.
Instead, the first message sent after connecting must be an `authenticate` message
containing the user token. The server responds with `authenticated` on success
or `error` on failure, closing the connection.
## Keepalive
The client must send `ping` messages at least every 30 seconds. The server
responds with `pong`. If no ping is received within 60 seconds, the server
closes the connection.
## Reconnection
If the WebSocket connection drops:
1. Wait with exponential backoff (1s, 2s, 4s, 8s, max 30s)
2. Reconnect and re-authenticate
3. Active calls survive brief disconnections (up to 30 seconds). The server
holds call state and media continues flowing. On reconnection, the server
sends `call.restored` for each active call so the client can rebuild its UI.
## Message Format
All messages are JSON objects with a `type` field identifying the message kind.
Messages from the client include a `type` and message-specific fields.
Messages from the server include a `type` and message-specific fields.
## Call Lifecycle
### Outbound Call
```
Client Server
│ call.create ──────────────> │
│ <────────────── call.trying │
│ <─────────────── sdp.offer │
│ sdp.answer ──────────────> │
│ ice.candidate ←──────────→ │ (bidirectional, multiple)
│ ice.done ────────────────> │
│ <──────────────── ice.done │
│ <────────────── call.ringing │
│ <──────────── call.answered │
│ ... call in progress ...
│ call.hangup ─────────────> │
│ <────────────── call.ended │
```
### Inbound Call
```
Client Server
│ <──────────── call.incoming │
│ <─────────────── sdp.offer │
│ call.answer ─────────────> │
│ sdp.answer ──────────────> │
│ ice.candidate ←──────────→ │ (bidirectional, multiple)
│ <──────────── call.answered │
│ ... call in progress ...
│ <────────────── call.ended │
```
## Related Documentation
- [REST API Reference](/api) — User Authentication, ICE servers, User Profile endpoints
- [WebRTC Guide](/webrtc) — Integration guide with code examples
- [Mobile & Push Notifications](/webrtc/mobile) — Mobile incoming call notifications
- [Download AsyncAPI Spec](/api/asyncapi-webrtc.yaml) — Raw YAML specification
## Table of Contents
- [Servers](#servers)
- [dialstack](#dialstack-server)
- [Operations](#operations)
- [SEND Authenticate](#send-authenticate-operation)
- [RECEIVE Authenticated](#receive-authenticated-operation)
- [SEND Ping](#send-ping-operation)
- [RECEIVE Pong](#receive-pong-operation)
- [RECEIVE Error](#receive-error-operation)
- [SEND Call Create](#send-call-create-operation)
- [RECEIVE Call Trying](#receive-call-trying-operation)
- [RECEIVE Call Ringing](#receive-call-ringing-operation)
- [RECEIVE Call Incoming](#receive-call-incoming-operation)
- [SEND Call Answer](#send-call-answer-operation)
- [SEND Call Reject](#send-call-reject-operation)
- [RECEIVE Call Answered](#receive-call-answered-operation)
- [SEND Call Hangup](#send-call-hangup-operation)
- [RECEIVE Call Ended](#receive-call-ended-operation)
- [RECEIVE Call Restored](#receive-call-restored-operation)
- [SEND Sdp Offer](#send-sdp-offer-operation)
- [RECEIVE Sdp Offer](#receive-sdp-offer-operation)
- [SEND Sdp Answer](#send-sdp-answer-operation)
- [RECEIVE Sdp Answer](#receive-sdp-answer-operation)
- [SEND Ice Candidate](#send-ice-candidate-operation)
- [RECEIVE Ice Candidate](#receive-ice-candidate-operation)
- [SEND Ice Done](#send-ice-done-operation)
- [RECEIVE Ice Done](#receive-ice-done-operation)
- [SEND Call Hold](#send-call-hold-operation)
- [SEND Call Resume](#send-call-resume-operation)
- [RECEIVE Call Held](#receive-call-held-operation)
- [RECEIVE Call Resumed](#receive-call-resumed-operation)
- [SEND Call Mute](#send-call-mute-operation)
- [SEND Call Unmute](#send-call-unmute-operation)
- [SEND Call Dtmf](#send-call-dtmf-operation)
- [SEND Call Transfer](#send-call-transfer-operation)
- [SEND Call Transfer Attended](#send-call-transfer-attended-operation)
- [SEND Presence Subscribe](#send-presence-subscribe-operation)
- [RECEIVE Presence List](#receive-presence-list-operation)
- [RECEIVE Presence Update](#receive-presence-update-operation)
## Servers
### `dialstack` Server
- URL: `wss://api.dialstack.ai/v1/webrtc`
- Protocol: `wss`
DialStack WebRTC signalling endpoint. Connect with a standard WebSocket client:
```javascript
const ws = new WebSocket('wss://api.dialstack.ai/v1/webrtc');
```
## Operations
### SEND Authenticate Operation
*Authenticate connection*
- Operation ID: `sendAuthenticate`
Bidirectional signalling channel for WebRTC call setup, control, and presence.
A single WebSocket connection handles all calls for the authenticated user,
including multiple simultaneous calls.
Must be the first message sent after the WebSocket connection is established.
The server responds with `authenticated` on success or `error` on failure.
If authentication fails, the server closes the connection.
#### Message Authenticate `authenticate`
*First message after connection — authenticates the user*
- Message ID: `authenticate`
- Content type: [application/json](https://www.iana.org/assignments/media-types/application/json)
##### Payload
| Name | Type | Description | Value | Constraints | Notes |
|---|---|---|---|---|---|
| (root) | object | Authenticates the WebSocket connection with a user token. | - | - | **additional properties are allowed** |
| type | string | - | const (`"authenticate"`) | - | **required** |
| token | string | User token obtained from `POST /v1/auth/token` | examples (`"eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9..."`) | - | **required** |
> Examples of payload *(generated)*
```json
{
"type": "authenticate",
"token": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9..."
}
```
### RECEIVE Authenticated Operation
*Authentication confirmed*
- Operation ID: `receiveAuthenticated`
Bidirectional signalling channel for WebRTC call setup, control, and presence.
A single WebSocket connection handles all calls for the authenticated user,
including multiple simultaneous calls.
Confirms successful authentication. Contains session metadata and any
active calls that were preserved during a reconnection.
#### Message Authenticated `authenticated`
*Server confirms authentication and returns session info*
- Message ID: `authenticated`
- Content type: [application/json](https://www.iana.org/assignments/media-types/application/json)
##### Payload
| Name | Type | Description | Value | Constraints | Notes |
|---|---|---|---|---|---|
| (root) | object | Confirms successful authentication. Includes session and connection metadata. | - | - | **additional properties are allowed** |
| type | string | - | const (`"authenticated"`) | - | **required** |
| user\_id | string | Authenticated user identifier | examples (`"user_01h2xcejqtf2nbrexx3vqjhp42"`) | - | **required** |
| account\_id | string | Account identifier | examples (`"acct_01h2xcejqtf2nbrexx3vqjhp41"`) | - | **required** |
| reconnected | boolean | `true` if this is a reconnection with preserved call state. When `true`, `call.restored` messages follow for each active call. | - | - | - |
> Examples of payload *(generated)*
```json
{
"type": "authenticated",
"user_id": "user_01h2xcejqtf2nbrexx3vqjhp42",
"account_id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
"reconnected": false
}
```
### SEND Ping Operation
*Client keepalive*
- Operation ID: `sendPing`
Bidirectional signalling channel for WebRTC call setup, control, and presence.
A single WebSocket connection handles all calls for the authenticated user,
including multiple simultaneous calls.
Send at least every 30 seconds to keep the connection alive.
The server responds with `pong`. If no ping is received within
60 seconds, the server closes the connection.
#### Message Ping `ping`
*Client keepalive (send every 30 seconds)*
- Message ID: `ping`
- Content type: [application/json](https://www.iana.org/assignments/media-types/application/json)
##### Payload
| Name | Type | Description | Value | Constraints | Notes |
|---|---|---|---|---|---|
| (root) | object | Client keepalive. Send at least every 30 seconds. | - | - | **additional properties are allowed** |
| type | string | - | const (`"ping"`) | - | **required** |
> Examples of payload *(generated)*
```json
{
"type": "ping"
}
```
### RECEIVE Pong Operation
*Server keepalive response*
- Operation ID: `receivePong`
Bidirectional signalling channel for WebRTC call setup, control, and presence.
A single WebSocket connection handles all calls for the authenticated user,
including multiple simultaneous calls.
Sent in response to a `ping` message.
#### Message Pong `pong`
*Server keepalive response*
- Message ID: `pong`
- Content type: [application/json](https://www.iana.org/assignments/media-types/application/json)
##### Payload
| Name | Type | Description | Value | Constraints | Notes |
|---|---|---|---|---|---|
| (root) | object | Server keepalive response. | - | - | **additional properties are allowed** |
| type | string | - | const (`"pong"`) | - | **required** |
> Examples of payload *(generated)*
```json
{
"type": "pong"
}
```
### RECEIVE Error Operation
*Error notification*
- Operation ID: `receiveError`
Bidirectional signalling channel for WebRTC call setup, control, and presence.
A single WebSocket connection handles all calls for the authenticated user,
including multiple simultaneous calls.
Sent when an error occurs. The `code` field identifies the error type.
Some errors are fatal (the server closes the connection after sending);
others are informational (the connection remains open).
#### Message Error `error`
*Protocol or call error*
- Message ID: `error`
- Content type: [application/json](https://www.iana.org/assignments/media-types/application/json)
##### Payload
| Name | Type | Description | Value | Constraints | Notes |
|---|---|---|---|---|---|
| (root) | object | Error notification. Fatal errors close the connection after sending. | - | - | **additional properties are allowed** |
| type | string | - | const (`"error"`) | - | **required** |
| code | string | Machine-readable error code | allowed (`"auth_failed"`, `"auth_expired"`, `"invalid_message"`, `"call_failed"`, `"call_not_found"`, `"emergency_address_required"`, `"session_limit"`, `"rate_limited"`, `"internal_error"`) | - | **required** |
| message | string | Human-readable error description | examples (`"Invalid or expired user token"`) | - | **required** |
| call\_id | string \| null | Call identifier (when the error relates to a specific call) | - | - | - |
| fatal | boolean | If `true`, the server will close the connection after this message | - | - | - |
> Examples of payload *(generated)*
```json
{
"type": "error",
"code": "auth_failed",
"message": "Invalid or expired user token",
"call_id": "string",
"fatal": false
}
```
### SEND Call Create Operation
*Initiate outbound call*
- Operation ID: `sendCallCreate`
Bidirectional signalling channel for WebRTC call setup, control, and presence.
A single WebSocket connection handles all calls for the authenticated user,
including multiple simultaneous calls.
Dials the specified destination. The server responds with `call.trying`
followed by an `sdp.offer` for media negotiation. The client must respond
with `sdp.answer` and ICE candidates to establish the media path.
#### Message Create Call `call.create`
*Initiate an outbound call*
- Message ID: `callCreate`
- Content type: [application/json](https://www.iana.org/assignments/media-types/application/json)
##### Payload
| Name | Type | Description | Value | Constraints | Notes |
|---|---|---|---|---|---|
| (root) | object | Initiates an outbound call. The `destination` can be a phone number (E.164 format) or an extension dial code. | - | - | **additional properties are allowed** |
| type | string | - | const (`"call.create"`) | - | **required** |
| destination | string | Phone number in E.164 format (e.g., `+14155551234`) or an extension dial code (e.g., `105`). | examples (`"+14155551234"`, `"105"`) | - | **required** |
| caller\_id | string \| null | Caller ID number to display (E.164 format). Must be a phone number assigned to the account. If omitted, the account's default outbound caller ID is used. | examples (`"+14155559876"`) | - | - |
| client\_call\_id | string | Client-generated identifier for correlating the response. The server echoes this value in `call.trying`. | examples (`"c_a1b2c3d4"`) | - | - |
> Examples of payload *(generated)*
```json
{
"type": "call.create",
"destination": "+14155551234",
"caller_id": "+14155559876",
"client_call_id": "c_a1b2c3d4"
}
```
### RECEIVE Call Trying Operation
*Outbound call is being processed*
- Operation ID: `receiveCallTrying`
Bidirectional signalling channel for WebRTC call setup, control, and presence.
A single WebSocket connection handles all calls for the authenticated user,
including multiple simultaneous calls.
Confirms the server is processing the call request. The `call_id` in this
message should be used for all subsequent messages about this call.
#### Message Call Trying `call.trying`
*Server is processing the outbound call request*
- Message ID: `callTrying`
- Content type: [application/json](https://www.iana.org/assignments/media-types/application/json)
##### Payload
| Name | Type | Description | Value | Constraints | Notes |
|---|---|---|---|---|---|
| (root) | object | Server is processing the outbound call. Contains the server-assigned `call_id` to use for all subsequent messages about this call. | - | - | **additional properties are allowed** |
| type | string | - | const (`"call.trying"`) | - | **required** |
| call\_id | string | Server-assigned call identifier | examples (`"call_01h2xcejqtf2nbrexx3vqjhp45"`) | - | **required** |
| client\_call\_id | string \| null | Echoed from the `call.create` message for correlation | - | - | - |
> Examples of payload *(generated)*
```json
{
"type": "call.trying",
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45",
"client_call_id": "string"
}
```
### RECEIVE Call Ringing Operation
*Remote party is ringing*
- Operation ID: `receiveCallRinging`
Bidirectional signalling channel for WebRTC call setup, control, and presence.
A single WebSocket connection handles all calls for the authenticated user,
including multiple simultaneous calls.
The destination phone is ringing. Play a ringback tone to the user.
#### Message Call Ringing `call.ringing`
*Remote party's phone is ringing*
- Message ID: `callRinging`
- Content type: [application/json](https://www.iana.org/assignments/media-types/application/json)
##### Payload
| Name | Type | Description | Value | Constraints | Notes |
|---|---|---|---|---|---|
| (root) | object | The remote party's phone is ringing. | - | - | **additional properties are allowed** |
| type | string | - | const (`"call.ringing"`) | - | **required** |
| call\_id | string | Call identifier | examples (`"call_01h2xcejqtf2nbrexx3vqjhp45"`) | - | **required** |
> Examples of payload *(generated)*
```json
{
"type": "call.ringing",
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45"
}
```
### RECEIVE Call Incoming Operation
*Incoming call notification*
- Operation ID: `receiveCallIncoming`
Bidirectional signalling channel for WebRTC call setup, control, and presence.
A single WebSocket connection handles all calls for the authenticated user,
including multiple simultaneous calls.
An inbound call is arriving for this user. The message includes caller ID
information and an `sdp.offer` follows immediately. The client should alert
the user and, when they answer, respond with `call.answer` and `sdp.answer`.
If the user does not answer within 30 seconds, the server sends `call.ended`
with reason `no-answer`.
#### Message Incoming Call `call.incoming`
*An inbound call is arriving for this user*
- Message ID: `callIncoming`
- Content type: [application/json](https://www.iana.org/assignments/media-types/application/json)
##### Payload
| Name | Type | Description | Value | Constraints | Notes |
|---|---|---|---|---|---|
| (root) | object | An inbound call is arriving. An `sdp.offer` message follows immediately with the remote session description. | - | - | **additional properties are allowed** |
| type | string | - | const (`"call.incoming"`) | - | **required** |
| call\_id | string | Call identifier | examples (`"call_01h2xcejqtf2nbrexx3vqjhp45"`) | - | **required** |
| from | string | Caller's phone number (E.164 format) | examples (`"+14155551234"`) | - | **required** |
| from\_name | string \| null | Caller's display name (from caller ID, if available) | examples (`"John Smith"`) | - | - |
| to | string | Called number or extension | examples (`"+14155559876"`) | - | **required** |
> Examples of payload *(generated)*
```json
{
"type": "call.incoming",
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45",
"from": "+14155551234",
"from_name": "John Smith",
"to": "+14155559876"
}
```
### SEND Call Answer Operation
*Answer incoming call*
- Operation ID: `sendCallAnswer`
Bidirectional signalling channel for WebRTC call setup, control, and presence.
A single WebSocket connection handles all calls for the authenticated user,
including multiple simultaneous calls.
Accepts an incoming call. Must be followed by `sdp.answer` with the
local session description.
#### Message Answer Call `call.answer`
*Answer an incoming call*
- Message ID: `callAnswer`
- Content type: [application/json](https://www.iana.org/assignments/media-types/application/json)
##### Payload
| Name | Type | Description | Value | Constraints | Notes |
|---|---|---|---|---|---|
| (root) | object | Accepts an incoming call. | - | - | **additional properties are allowed** |
| type | string | - | const (`"call.answer"`) | - | **required** |
| call\_id | string | Call identifier from the `call.incoming` message | examples (`"call_01h2xcejqtf2nbrexx3vqjhp45"`) | - | **required** |
> Examples of payload *(generated)*
```json
{
"type": "call.answer",
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45"
}
```
### SEND Call Reject Operation
*Reject incoming call*
- Operation ID: `sendCallReject`
Bidirectional signalling channel for WebRTC call setup, control, and presence.
A single WebSocket connection handles all calls for the authenticated user,
including multiple simultaneous calls.
Rejects an incoming call on this device. The call may continue
ringing on the user's other devices.
#### Message Reject Call `call.reject`
*Reject an incoming call*
- Message ID: `callReject`
- Content type: [application/json](https://www.iana.org/assignments/media-types/application/json)
##### Payload
| Name | Type | Description | Value | Constraints | Notes |
|---|---|---|---|---|---|
| (root) | object | Rejects an incoming call on this device. The call may continue ringing on the user's other devices. | - | - | **additional properties are allowed** |
| type | string | - | const (`"call.reject"`) | - | **required** |
| call\_id | string | Call identifier from the `call.incoming` message | examples (`"call_01h2xcejqtf2nbrexx3vqjhp45"`) | - | **required** |
| reason | string | Rejection reason: - `busy` — signal busy to the caller - `decline` — silently decline (no busy signal) | default (`"decline"`), allowed (`"busy"`, `"decline"`) | - | - |
> Examples of payload *(generated)*
```json
{
"type": "call.reject",
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45",
"reason": "busy"
}
```
### RECEIVE Call Answered Operation
*Call connected*
- Operation ID: `receiveCallAnswered`
Bidirectional signalling channel for WebRTC call setup, control, and presence.
A single WebSocket connection handles all calls for the authenticated user,
including multiple simultaneous calls.
The call has been answered and media is flowing. For outbound calls, this
means the remote party picked up. For inbound calls, this confirms the
answer was processed.
#### Message Call Answered `call.answered`
*Call has been answered (media is flowing)*
- Message ID: `callAnswered`
- Content type: [application/json](https://www.iana.org/assignments/media-types/application/json)
##### Payload
| Name | Type | Description | Value | Constraints | Notes |
|---|---|---|---|---|---|
| (root) | object | The call has been answered and media is flowing. For outbound calls, this means the remote party picked up. For inbound calls, this confirms the client's `call.answer` was processed. | - | - | **additional properties are allowed** |
| type | string | - | const (`"call.answered"`) | - | **required** |
| call\_id | string | Call identifier | examples (`"call_01h2xcejqtf2nbrexx3vqjhp45"`) | - | **required** |
| answered\_at | string | When the call was answered (ISO 8601) | - | format (`date-time`) | - |
> Examples of payload *(generated)*
```json
{
"type": "call.answered",
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45",
"answered_at": "2019-08-24T14:15:22Z"
}
```
### SEND Call Hangup Operation
*End a call*
- Operation ID: `sendCallHangup`
Bidirectional signalling channel for WebRTC call setup, control, and presence.
A single WebSocket connection handles all calls for the authenticated user,
including multiple simultaneous calls.
Ends an active or ringing call. The server confirms with `call.ended`.
#### Message Hang Up `call.hangup`
*End an active or ringing call*
- Message ID: `callHangup`
- Content type: [application/json](https://www.iana.org/assignments/media-types/application/json)
##### Payload
| Name | Type | Description | Value | Constraints | Notes |
|---|---|---|---|---|---|
| (root) | object | Ends an active or ringing call. | - | - | **additional properties are allowed** |
| type | string | - | const (`"call.hangup"`) | - | **required** |
| call\_id | string | Call identifier | examples (`"call_01h2xcejqtf2nbrexx3vqjhp45"`) | - | **required** |
> Examples of payload *(generated)*
```json
{
"type": "call.hangup",
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45"
}
```
### RECEIVE Call Ended Operation
*Call ended*
- Operation ID: `receiveCallEnded`
Bidirectional signalling channel for WebRTC call setup, control, and presence.
A single WebSocket connection handles all calls for the authenticated user,
including multiple simultaneous calls.
The call has ended. The `reason` field indicates why (hangup, no-answer,
busy, failed, transferred). After receiving this message, clean up any
media resources for this call.
#### Message Call Ended `call.ended`
*Call has ended*
- Message ID: `callEnded`
- Content type: [application/json](https://www.iana.org/assignments/media-types/application/json)
##### Payload
| Name | Type | Description | Value | Constraints | Notes |
|---|---|---|---|---|---|
| (root) | object | The call has ended. Clean up media resources (close `RTCPeerConnection`). | - | - | **additional properties are allowed** |
| type | string | - | const (`"call.ended"`) | - | **required** |
| call\_id | string | Call identifier | examples (`"call_01h2xcejqtf2nbrexx3vqjhp45"`) | - | **required** |
| reason | string | Why the call ended: - `hangup` — either party hung up - `no-answer` — timed out without answer - `busy` — destination returned busy - `failed` — call setup failed (network error, invalid destination) - `transferred` — call was transferred to another destination - `rejected` — the remote party rejected the call | allowed (`"hangup"`, `"no-answer"`, `"busy"`, `"failed"`, `"transferred"`, `"rejected"`) | - | **required** |
| duration\_seconds | integer \| null | Call duration in seconds (null if never answered) | - | - | - |
> Examples of payload *(generated)*
```json
{
"type": "call.ended",
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45",
"reason": "hangup",
"duration_seconds": 0
}
```
### RECEIVE Call Restored Operation
*Active call restored after reconnection*
- Operation ID: `receiveCallRestored`
Bidirectional signalling channel for WebRTC call setup, control, and presence.
A single WebSocket connection handles all calls for the authenticated user,
including multiple simultaneous calls.
Sent after `authenticated` when reconnecting with active calls. The client
should rebuild its UI for each restored call. An `sdp.offer` follows for
re-establishing the media path.
#### Message Call Restored `call.restored`
*Active call restored after reconnection*
- Message ID: `callRestored`
- Content type: [application/json](https://www.iana.org/assignments/media-types/application/json)
##### Payload
| Name | Type | Description | Value | Constraints | Notes |
|---|---|---|---|---|---|
| (root) | object | Sent after `authenticated` when reconnecting with an active call that was preserved during the disconnection (up to 30 seconds). An `sdp.offer` follows for re-establishing the media path. The client should close any existing `RTCPeerConnection` for this call and create a new one. Then handle the `sdp.offer` normally (set remote description, create answer, exchange ICE candidates). | - | - | **additional properties are allowed** |
| type | string | - | const (`"call.restored"`) | - | **required** |
| call\_id | string | Call identifier | examples (`"call_01h2xcejqtf2nbrexx3vqjhp45"`) | - | **required** |
| state | string | Current state of the restored call | allowed (`"ringing"`, `"active"`, `"held"`) | - | **required** |
| from | string | Caller's phone number | - | - | **required** |
| from\_name | string \| null | Caller's display name | - | - | - |
| to | string | Called number or extension | - | - | **required** |
| direction | string | - | allowed (`"inbound"`, `"outbound"`) | - | - |
| answered\_at | string \| null | When the call was answered (null if still ringing) | - | format (`date-time`) | - |
> Examples of payload *(generated)*
```json
{
"type": "call.restored",
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45",
"state": "ringing",
"from": "string",
"from_name": "string",
"to": "string",
"direction": "inbound",
"answered_at": "2019-08-24T14:15:22Z"
}
```
### SEND Sdp Offer Operation
*Send SDP offer*
- Operation ID: `sendSdpOffer`
Bidirectional signalling channel for WebRTC call setup, control, and presence.
A single WebSocket connection handles all calls for the authenticated user,
including multiple simultaneous calls.
Send a local session description offer. Used during call setup and
mid-call renegotiation (e.g., codec change, hold with sendonly).
#### Message SDP Offer `sdp.offer`
*SDP offer for media negotiation*
- Message ID: `sdpOffer`
- Content type: [application/json](https://www.iana.org/assignments/media-types/application/json)
##### Payload
| Name | Type | Description | Value | Constraints | Notes |
|---|---|---|---|---|---|
| (root) | object | SDP offer for media negotiation. Sent by the server for inbound calls and outbound call setup. Sent by the client during renegotiation. | - | - | **additional properties are allowed** |
| type | string | - | const (`"sdp.offer"`) | - | **required** |
| call\_id | string | Call identifier | examples (`"call_01h2xcejqtf2nbrexx3vqjhp45"`) | - | **required** |
| sdp | string | SDP (Session Description Protocol) offer string. Pass this to `RTCPeerConnection.setRemoteDescription()` as an offer. | - | - | **required** |
> Examples of payload *(generated)*
```json
{
"type": "sdp.offer",
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45",
"sdp": "string"
}
```
### RECEIVE Sdp Offer Operation
*Receive SDP offer*
- Operation ID: `receiveSdpOffer`
Bidirectional signalling channel for WebRTC call setup, control, and presence.
A single WebSocket connection handles all calls for the authenticated user,
including multiple simultaneous calls.
Server sends an SDP offer for the client to answer. This happens during
call setup (both inbound and outbound) and mid-call renegotiation.
#### Message SDP Offer `sdp.offer`
*SDP offer for media negotiation*
- Message ID: `sdpOffer`
- Content type: [application/json](https://www.iana.org/assignments/media-types/application/json)
##### Payload
| Name | Type | Description | Value | Constraints | Notes |
|---|---|---|---|---|---|
| (root) | object | SDP offer for media negotiation. Sent by the server for inbound calls and outbound call setup. Sent by the client during renegotiation. | - | - | **additional properties are allowed** |
| type | string | - | const (`"sdp.offer"`) | - | **required** |
| call\_id | string | Call identifier | examples (`"call_01h2xcejqtf2nbrexx3vqjhp45"`) | - | **required** |
| sdp | string | SDP (Session Description Protocol) offer string. Pass this to `RTCPeerConnection.setRemoteDescription()` as an offer. | - | - | **required** |
> Examples of payload *(generated)*
```json
{
"type": "sdp.offer",
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45",
"sdp": "string"
}
```
### SEND Sdp Answer Operation
*Send SDP answer*
- Operation ID: `sendSdpAnswer`
Bidirectional signalling channel for WebRTC call setup, control, and presence.
A single WebSocket connection handles all calls for the authenticated user,
including multiple simultaneous calls.
Respond to an SDP offer with a local session description answer.
#### Message SDP Answer `sdp.answer`
*SDP answer for media negotiation*
- Message ID: `sdpAnswer`
- Content type: [application/json](https://www.iana.org/assignments/media-types/application/json)
##### Payload
| Name | Type | Description | Value | Constraints | Notes |
|---|---|---|---|---|---|
| (root) | object | SDP answer for media negotiation. Sent by the client in response to an `sdp.offer`. The SDP should be obtained from `RTCPeerConnection.createAnswer()`. | - | - | **additional properties are allowed** |
| type | string | - | const (`"sdp.answer"`) | - | **required** |
| call\_id | string | Call identifier | examples (`"call_01h2xcejqtf2nbrexx3vqjhp45"`) | - | **required** |
| sdp | string | SDP answer string from `RTCPeerConnection.createAnswer()`. Pass the received offer to `setRemoteDescription()` first, then create and send the answer. | - | - | **required** |
> Examples of payload *(generated)*
```json
{
"type": "sdp.answer",
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45",
"sdp": "string"
}
```
### RECEIVE Sdp Answer Operation
*Receive SDP answer*
- Operation ID: `receiveSdpAnswer`
Bidirectional signalling channel for WebRTC call setup, control, and presence.
A single WebSocket connection handles all calls for the authenticated user,
including multiple simultaneous calls.
Server responds to the client's SDP offer with an answer.
#### Message SDP Answer `sdp.answer`
*SDP answer for media negotiation*
- Message ID: `sdpAnswer`
- Content type: [application/json](https://www.iana.org/assignments/media-types/application/json)
##### Payload
| Name | Type | Description | Value | Constraints | Notes |
|---|---|---|---|---|---|
| (root) | object | SDP answer for media negotiation. Sent by the client in response to an `sdp.offer`. The SDP should be obtained from `RTCPeerConnection.createAnswer()`. | - | - | **additional properties are allowed** |
| type | string | - | const (`"sdp.answer"`) | - | **required** |
| call\_id | string | Call identifier | examples (`"call_01h2xcejqtf2nbrexx3vqjhp45"`) | - | **required** |
| sdp | string | SDP answer string from `RTCPeerConnection.createAnswer()`. Pass the received offer to `setRemoteDescription()` first, then create and send the answer. | - | - | **required** |
> Examples of payload *(generated)*
```json
{
"type": "sdp.answer",
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45",
"sdp": "string"
}
```
### SEND Ice Candidate Operation
*Send ICE candidate*
- Operation ID: `sendIceCandidate`
Bidirectional signalling channel for WebRTC call setup, control, and presence.
A single WebSocket connection handles all calls for the authenticated user,
including multiple simultaneous calls.
Send a locally gathered ICE candidate. Candidates are trickled as they
are discovered — send each one immediately for the fastest call setup.
#### Message ICE Candidate `ice.candidate`
*ICE candidate for connectivity checks*
- Message ID: `iceCandidate`
- Content type: [application/json](https://www.iana.org/assignments/media-types/application/json)
##### Payload
| Name | Type | Description | Value | Constraints | Notes |
|---|---|---|---|---|---|
| (root) | object | ICE candidate for connectivity checks. Trickled bidirectionally as candidates are gathered. Each candidate should be added to the peer connection immediately with `RTCPeerConnection.addIceCandidate()`. | - | - | **additional properties are allowed** |
| type | string | - | const (`"ice.candidate"`) | - | **required** |
| call\_id | string | Call identifier | examples (`"call_01h2xcejqtf2nbrexx3vqjhp45"`) | - | **required** |
| candidate | string | ICE candidate string from the `RTCIceCandidate.candidate` property. | examples (`"candidate:842163049 1 udp 1677729535 203.0.113.1 44323 typ srflx raddr 192.168.1.100 rport 44323"`) | - | **required** |
| sdp\_mid | string \| null | Media stream identification tag | examples (`"0"`) | - | - |
| sdp\_m\_line\_index | integer \| null | Index of the media description in the SDP | - | - | - |
> Examples of payload *(generated)*
```json
{
"type": "ice.candidate",
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45",
"candidate": "candidate:842163049 1 udp 1677729535 203.0.113.1 44323 typ srflx raddr 192.168.1.100 rport 44323",
"sdp_mid": "0",
"sdp_m_line_index": 0
}
```
### RECEIVE Ice Candidate Operation
*Receive ICE candidate*
- Operation ID: `receiveIceCandidate`
Bidirectional signalling channel for WebRTC call setup, control, and presence.
A single WebSocket connection handles all calls for the authenticated user,
including multiple simultaneous calls.
Server sends a remote ICE candidate. Add it to the peer connection
with `RTCPeerConnection.addIceCandidate()`.
#### Message ICE Candidate `ice.candidate`
*ICE candidate for connectivity checks*
- Message ID: `iceCandidate`
- Content type: [application/json](https://www.iana.org/assignments/media-types/application/json)
##### Payload
| Name | Type | Description | Value | Constraints | Notes |
|---|---|---|---|---|---|
| (root) | object | ICE candidate for connectivity checks. Trickled bidirectionally as candidates are gathered. Each candidate should be added to the peer connection immediately with `RTCPeerConnection.addIceCandidate()`. | - | - | **additional properties are allowed** |
| type | string | - | const (`"ice.candidate"`) | - | **required** |
| call\_id | string | Call identifier | examples (`"call_01h2xcejqtf2nbrexx3vqjhp45"`) | - | **required** |
| candidate | string | ICE candidate string from the `RTCIceCandidate.candidate` property. | examples (`"candidate:842163049 1 udp 1677729535 203.0.113.1 44323 typ srflx raddr 192.168.1.100 rport 44323"`) | - | **required** |
| sdp\_mid | string \| null | Media stream identification tag | examples (`"0"`) | - | - |
| sdp\_m\_line\_index | integer \| null | Index of the media description in the SDP | - | - | - |
> Examples of payload *(generated)*
```json
{
"type": "ice.candidate",
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45",
"candidate": "candidate:842163049 1 udp 1677729535 203.0.113.1 44323 typ srflx raddr 192.168.1.100 rport 44323",
"sdp_mid": "0",
"sdp_m_line_index": 0
}
```
### SEND Ice Done Operation
*ICE gathering complete*
- Operation ID: `sendIceDone`
Bidirectional signalling channel for WebRTC call setup, control, and presence.
A single WebSocket connection handles all calls for the authenticated user,
including multiple simultaneous calls.
All local ICE candidates have been gathered. This signals the end of
trickle ICE from the client side.
#### Message ICE Done `ice.done`
*All ICE candidates have been gathered*
- Message ID: `iceDone`
- Content type: [application/json](https://www.iana.org/assignments/media-types/application/json)
##### Payload
| Name | Type | Description | Value | Constraints | Notes |
|---|---|---|---|---|---|
| (root) | object | All ICE candidates have been gathered. No more `ice.candidate` messages will be sent for this call from this side. | - | - | **additional properties are allowed** |
| type | string | - | const (`"ice.done"`) | - | **required** |
| call\_id | string | Call identifier | examples (`"call_01h2xcejqtf2nbrexx3vqjhp45"`) | - | **required** |
> Examples of payload *(generated)*
```json
{
"type": "ice.done",
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45"
}
```
### RECEIVE Ice Done Operation
*Remote ICE gathering complete*
- Operation ID: `receiveIceDone`
Bidirectional signalling channel for WebRTC call setup, control, and presence.
A single WebSocket connection handles all calls for the authenticated user,
including multiple simultaneous calls.
All remote ICE candidates have been sent. No more candidates will arrive
for this call.
#### Message ICE Done `ice.done`
*All ICE candidates have been gathered*
- Message ID: `iceDone`
- Content type: [application/json](https://www.iana.org/assignments/media-types/application/json)
##### Payload
| Name | Type | Description | Value | Constraints | Notes |
|---|---|---|---|---|---|
| (root) | object | All ICE candidates have been gathered. No more `ice.candidate` messages will be sent for this call from this side. | - | - | **additional properties are allowed** |
| type | string | - | const (`"ice.done"`) | - | **required** |
| call\_id | string | Call identifier | examples (`"call_01h2xcejqtf2nbrexx3vqjhp45"`) | - | **required** |
> Examples of payload *(generated)*
```json
{
"type": "ice.done",
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45"
}
```
### SEND Call Hold Operation
*Hold call*
- Operation ID: `sendCallHold`
Bidirectional signalling channel for WebRTC call setup, control, and presence.
A single WebSocket connection handles all calls for the authenticated user,
including multiple simultaneous calls.
Places the call on hold. The server confirms with `call.held` and plays
hold music to the remote party.
#### Message Hold Call `call.hold`
*Place an active call on hold*
- Message ID: `callHold`
- Content type: [application/json](https://www.iana.org/assignments/media-types/application/json)
##### Payload
| Name | Type | Description | Value | Constraints | Notes |
|---|---|---|---|---|---|
| (root) | object | Places the specified call on hold. | - | - | **additional properties are allowed** |
| type | string | - | const (`"call.hold"`) | - | **required** |
| call\_id | string | Call identifier | examples (`"call_01h2xcejqtf2nbrexx3vqjhp45"`) | - | **required** |
> Examples of payload *(generated)*
```json
{
"type": "call.hold",
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45"
}
```
### SEND Call Resume Operation
*Resume call*
- Operation ID: `sendCallResume`
Bidirectional signalling channel for WebRTC call setup, control, and presence.
A single WebSocket connection handles all calls for the authenticated user,
including multiple simultaneous calls.
Resumes a held call. The server confirms with `call.resumed`.
#### Message Resume Call `call.resume`
*Resume a held call*
- Message ID: `callResume`
- Content type: [application/json](https://www.iana.org/assignments/media-types/application/json)
##### Payload
| Name | Type | Description | Value | Constraints | Notes |
|---|---|---|---|---|---|
| (root) | object | Resumes a held call. | - | - | **additional properties are allowed** |
| type | string | - | const (`"call.resume"`) | - | **required** |
| call\_id | string | Call identifier | examples (`"call_01h2xcejqtf2nbrexx3vqjhp45"`) | - | **required** |
> Examples of payload *(generated)*
```json
{
"type": "call.resume",
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45"
}
```
### RECEIVE Call Held Operation
*Call placed on hold*
- Operation ID: `receiveCallHeld`
Bidirectional signalling channel for WebRTC call setup, control, and presence.
A single WebSocket connection handles all calls for the authenticated user,
including multiple simultaneous calls.
Confirms the call was placed on hold. The `held_by` field indicates
whether the local user or the remote party initiated the hold.
#### Message Call Held `call.held`
*Call was placed on hold (by local or remote party)*
- Message ID: `callHeld`
- Content type: [application/json](https://www.iana.org/assignments/media-types/application/json)
##### Payload
| Name | Type | Description | Value | Constraints | Notes |
|---|---|---|---|---|---|
| (root) | object | Confirms the call was placed on hold. | - | - | **additional properties are allowed** |
| type | string | - | const (`"call.held"`) | - | **required** |
| call\_id | string | Call identifier | examples (`"call_01h2xcejqtf2nbrexx3vqjhp45"`) | - | **required** |
| held\_by | string | Who initiated the hold: - `local` — this user placed the call on hold - `remote` — the remote party placed the call on hold | allowed (`"local"`, `"remote"`) | - | **required** |
> Examples of payload *(generated)*
```json
{
"type": "call.held",
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45",
"held_by": "local"
}
```
### RECEIVE Call Resumed Operation
*Call resumed*
- Operation ID: `receiveCallResumed`
Bidirectional signalling channel for WebRTC call setup, control, and presence.
A single WebSocket connection handles all calls for the authenticated user,
including multiple simultaneous calls.
Confirms a held call was resumed. Media resumes flowing.
#### Message Call Resumed `call.resumed`
*Held call was resumed*
- Message ID: `callResumed`
- Content type: [application/json](https://www.iana.org/assignments/media-types/application/json)
##### Payload
| Name | Type | Description | Value | Constraints | Notes |
|---|---|---|---|---|---|
| (root) | object | Confirms a held call was resumed. | - | - | **additional properties are allowed** |
| type | string | - | const (`"call.resumed"`) | - | **required** |
| call\_id | string | Call identifier | examples (`"call_01h2xcejqtf2nbrexx3vqjhp45"`) | - | **required** |
> Examples of payload *(generated)*
```json
{
"type": "call.resumed",
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45"
}
```
### SEND Call Mute Operation
*Server-side mute*
- Operation ID: `sendCallMute`
Bidirectional signalling channel for WebRTC call setup, control, and presence.
A single WebSocket connection handles all calls for the authenticated user,
including multiple simultaneous calls.
Mutes the user's audio at the server. The remote party hears silence.
This is in addition to any client-side mute (disabling the microphone track).
Server-side mute is authoritative — even if the client sends audio, it
is not forwarded.
#### Message Mute `call.mute`
*Mute the microphone (server-side)*
- Message ID: `callMute`
- Content type: [application/json](https://www.iana.org/assignments/media-types/application/json)
##### Payload
| Name | Type | Description | Value | Constraints | Notes |
|---|---|---|---|---|---|
| (root) | object | Mutes the user's audio at the server. The remote party hears silence regardless of whether the client is sending audio. | - | - | **additional properties are allowed** |
| type | string | - | const (`"call.mute"`) | - | **required** |
| call\_id | string | Call identifier | examples (`"call_01h2xcejqtf2nbrexx3vqjhp45"`) | - | **required** |
> Examples of payload *(generated)*
```json
{
"type": "call.mute",
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45"
}
```
### SEND Call Unmute Operation
*Server-side unmute*
- Operation ID: `sendCallUnmute`
Bidirectional signalling channel for WebRTC call setup, control, and presence.
A single WebSocket connection handles all calls for the authenticated user,
including multiple simultaneous calls.
Unmutes the user's audio at the server.
#### Message Unmute `call.unmute`
*Unmute the microphone (server-side)*
- Message ID: `callUnmute`
- Content type: [application/json](https://www.iana.org/assignments/media-types/application/json)
##### Payload
| Name | Type | Description | Value | Constraints | Notes |
|---|---|---|---|---|---|
| (root) | object | Unmutes the user's audio at the server. | - | - | **additional properties are allowed** |
| type | string | - | const (`"call.unmute"`) | - | **required** |
| call\_id | string | Call identifier | examples (`"call_01h2xcejqtf2nbrexx3vqjhp45"`) | - | **required** |
> Examples of payload *(generated)*
```json
{
"type": "call.unmute",
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45"
}
```
### SEND Call Dtmf Operation
*Send DTMF tone*
- Operation ID: `sendCallDtmf`
Bidirectional signalling channel for WebRTC call setup, control, and presence.
A single WebSocket connection handles all calls for the authenticated user,
including multiple simultaneous calls.
Sends a DTMF digit to the remote party. Used for navigating IVR menus
or entering PIN codes during a call.
#### Message Send DTMF `call.dtmf`
*Send a DTMF tone*
- Message ID: `callDtmf`
- Content type: [application/json](https://www.iana.org/assignments/media-types/application/json)
##### Payload
| Name | Type | Description | Value | Constraints | Notes |
|---|---|---|---|---|---|
| (root) | object | Sends a DTMF tone to the remote party. | - | - | **additional properties are allowed** |
| type | string | - | const (`"call.dtmf"`) | - | **required** |
| call\_id | string | Call identifier | examples (`"call_01h2xcejqtf2nbrexx3vqjhp45"`) | - | **required** |
| digit | string | DTMF digit: 0-9, A-D, \*, or # | examples (`"5"`, `"#"`) | pattern (`^[0-9A-D*#]$`) | **required** |
> Examples of payload *(generated)*
```json
{
"type": "call.dtmf",
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45",
"digit": "5"
}
```
### SEND Call Transfer Operation
*Blind transfer*
- Operation ID: `sendCallTransfer`
Bidirectional signalling channel for WebRTC call setup, control, and presence.
A single WebSocket connection handles all calls for the authenticated user,
including multiple simultaneous calls.
Transfers the call to another destination without consulting the transfer
target first. The call is immediately redirected and this client's
participation ends. The server sends `call.ended` with reason `transferred`.
#### Message Blind Transfer `call.transfer`
*Transfer the call to another destination*
- Message ID: `callTransfer`
- Content type: [application/json](https://www.iana.org/assignments/media-types/application/json)
##### Payload
| Name | Type | Description | Value | Constraints | Notes |
|---|---|---|---|---|---|
| (root) | object | Blind transfer — immediately redirects the call to another destination. The current client's participation ends after the transfer. | - | - | **additional properties are allowed** |
| type | string | - | const (`"call.transfer"`) | - | **required** |
| call\_id | string | Call identifier | examples (`"call_01h2xcejqtf2nbrexx3vqjhp45"`) | - | **required** |
| destination | string | Transfer destination (E.164 number or extension) | examples (`"105"`, `"+14155551234"`) | - | **required** |
> Examples of payload *(generated)*
```json
{
"type": "call.transfer",
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45",
"destination": "105"
}
```
### SEND Call Transfer Attended Operation
*Attended transfer*
- Operation ID: `sendCallTransferAttended`
Bidirectional signalling channel for WebRTC call setup, control, and presence.
A single WebSocket connection handles all calls for the authenticated user,
including multiple simultaneous calls.
Performs an attended (consultative) transfer in two steps:
**Step 1 — Consult** (`step: "consult"`):
Send with a `destination`. The server:
1. Places the original call on hold (sends `call.held` with `held_by: "local"`)
2. Initiates a new call to the transfer target
3. Sends `call.trying` with a **new `call_id`** for the consultation call
4. Sends `sdp.offer` for the consultation call's media
5. Normal call setup follows (`call.ringing`, `call.answered`)
The client now has two calls: the original (held) and the consultation (active).
**Step 2 — Complete** (`step: "complete"`):
Send to bridge the original caller with the transfer target. The server:
1. Sends `call.ended` with reason `transferred` for the **original** call
2. Sends `call.ended` with reason `transferred` for the **consultation** call
3. The original caller and transfer target are connected directly
**Cancelling:**
Send `call.hangup` for the **consultation** call. The server ends the
consultation call and resumes the original call automatically.
**Failure:**
If the consultation call fails (busy, no-answer), the server ends the
consultation call and resumes the original call automatically.
#### Message Attended Transfer `call.transfer.attended`
*Start or complete an attended (consultative) transfer*
- Message ID: `callTransferAttended`
- Content type: [application/json](https://www.iana.org/assignments/media-types/application/json)
##### Payload
| Name | Type | Description | Value | Constraints | Notes |
|---|---|---|---|---|---|
| (root) | object | Attended (consultative) transfer. Send with step "consult" to dial the target, then "complete" to bridge the calls. | - | - | **additional properties are allowed** |
| type | string | - | const (`"call.transfer.attended"`) | - | **required** |
| call\_id | string | For `consult`: the call identifier of the original call to be transferred. For `complete`: the call identifier of the original call. | examples (`"call_01h2xcejqtf2nbrexx3vqjhp45"`) | - | **required** |
| step | string | Transfer step: - `consult` — hold the current call and dial the transfer target - `complete` — connect the original caller to the transfer target | allowed (`"consult"`, `"complete"`) | - | **required** |
| destination | string | Transfer destination (required for `consult` step, ignored for `complete`). E.164 number or extension. | examples (`"105"`) | - | - |
> Examples of payload *(generated)*
```json
{
"type": "call.transfer.attended",
"call_id": "call_01h2xcejqtf2nbrexx3vqjhp45",
"step": "consult",
"destination": "105"
}
```
### SEND Presence Subscribe Operation
*Subscribe to presence updates*
- Operation ID: `sendPresenceSubscribe`
Bidirectional signalling channel for WebRTC call setup, control, and presence.
A single WebSocket connection handles all calls for the authenticated user,
including multiple simultaneous calls.
Subscribes to real-time presence updates for users in the account.
The server responds with `presence.list` containing the current status
of all users, then sends `presence.update` messages as statuses change.
#### Message Subscribe to Presence `presence.subscribe`
*Subscribe to presence updates for users in the account*
- Message ID: `presenceSubscribe`
- Content type: [application/json](https://www.iana.org/assignments/media-types/application/json)
##### Payload
| Name | Type | Description | Value | Constraints | Notes |
|---|---|---|---|---|---|
| (root) | object | Subscribe to presence updates. The server responds with `presence.list` containing all users' current status, then sends `presence.update` messages as statuses change. | - | - | **additional properties are allowed** |
| type | string | - | const (`"presence.subscribe"`) | - | **required** |
| user\_ids | array\ | Specific user IDs to subscribe to. If omitted, subscribes to all users in the account. | - | - | - |
| user\_ids (single item) | string | - | - | - | - |
> Examples of payload *(generated)*
```json
{
"type": "presence.subscribe",
"user_ids": [
"string"
]
}
```
### RECEIVE Presence List Operation
*Presence snapshot*
- Operation ID: `receivePresenceList`
Bidirectional signalling channel for WebRTC call setup, control, and presence.
A single WebSocket connection handles all calls for the authenticated user,
including multiple simultaneous calls.
Sent in response to `presence.subscribe`. Contains the current presence
status of all users in the account. Use this to populate the initial
state of a buddy list or BLF panel.
#### Message Presence Snapshot `presence.list`
*Initial presence snapshot after subscribing*
- Message ID: `presenceList`
- Content type: [application/json](https://www.iana.org/assignments/media-types/application/json)
##### Payload
| Name | Type | Description | Value | Constraints | Notes |
|---|---|---|---|---|---|
| (root) | object | Presence snapshot of all subscribed users. Sent in response to `presence.subscribe`. | - | - | **additional properties are allowed** |
| type | string | - | const (`"presence.list"`) | - | **required** |
| users | array\