# 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 (
Recent Calls
); } ``` ## 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
Recent Calls
Voicemails
); } ``` ## 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\ | Current presence status for each subscribed user | - | - | **required** | | users.user\_id | string | User identifier | examples (`"user_01h2xcejqtf2nbrexx3vqjhp42"`) | - | **required** | | users.name | string | User's display name | examples (`"Jane Doe"`) | - | **required** | | users.status | string | Current presence status | allowed (`"available"`, `"on_call"`, `"dnd"`, `"away"`, `"offline"`) | - | **required** | | users.status\_text | string \| null | Optional custom status message | - | - | - | | users.updated\_at | string | - | - | format (`date-time`) | - | > Examples of payload *(generated)* ```json { "type": "presence.list", "users": [ { "user_id": "user_01h2xcejqtf2nbrexx3vqjhp42", "name": "Jane Doe", "status": "available", "status_text": "string", "updated_at": "2019-08-24T14:15:22Z" } ] } ``` ### RECEIVE Presence Update Operation *Presence changed* - Operation ID: `receivePresenceUpdate` 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. A user's presence status has changed (e.g., went on a call, set DND, came online). Update the UI for the affected user. #### Message Presence Update `presence.update` *A user's presence status has changed* - Message ID: `presenceUpdate` - Content type: [application/json](https://www.iana.org/assignments/media-types/application/json) ##### Payload | Name | Type | Description | Value | Constraints | Notes | |---|---|---|---|---|---| | (root) | object | A user's presence status has changed. | - | - | **additional properties are allowed** | | type | string | - | const (`"presence.update"`) | - | **required** | | user\_id | string | User whose presence changed | examples (`"user_01h2xcejqtf2nbrexx3vqjhp42"`) | - | **required** | | status | string | New presence status | allowed (`"available"`, `"on_call"`, `"dnd"`, `"away"`, `"offline"`) | - | **required** | | status\_text | string \| null | Optional custom status message | - | - | - | | updated\_at | string | - | - | format (`date-time`) | - | > Examples of payload *(generated)* ```json { "type": "presence.update", "user_id": "user_01h2xcejqtf2nbrexx3vqjhp42", "status": "available", "status_text": "string", "updated_at": "2019-08-24T14:15:22Z" } ``` --- ## WebRTC Client SDK The WebRTC Client SDK provides a high-level interface for building softphone applications. It handles WebSocket signalling, WebRTC media, call management, and presence — so you can focus on your UI. ## Installation ```bash npm install @dialstack/sdk ``` The WebRTC client is available at `@dialstack/sdk/webrtc`. ## DialStackPhone The main entry point. Manages the WebSocket connection, calls, and presence for a single user. ### Constructor ```typescript import { DialStackPhone } from '@dialstack/sdk/webrtc'; const phone = new DialStackPhone(options: PhoneOptions); ``` #### PhoneOptions | Property | Type | Required | Description | | ----------------- | ----------------------- | -------- | ------------------------------------------------------------- | | `token` | string | Yes | User token from `POST /v1/auth/token` | | `onTokenExpiring` | () => Promise\ | No | Called ~5 minutes before token expiry. Return a fresh token. | | `autoReconnect` | boolean | No | Reconnect automatically on disconnect (default: `true`) | | `iceServers` | RTCIceServer[] | No | Override ICE server configuration (default: fetched from API) | ### Connection ```typescript // Connect to the signalling server await phone.connect(): Promise; // Disconnect (ends all active calls) phone.disconnect(): void; // Connection state phone.isConnected: boolean; ``` ### Making Calls ```typescript // Dial a phone number or extension const call = await phone.call( destination: string, options?: CallOptions ): Promise; ``` #### CallOptions | Property | Type | Description | | ---------- | ------ | ------------------------------------------------------------ | | `callerId` | string | Outbound caller ID (E.164). Must be assigned to the account. | ### Active Calls ```typescript // All active calls (ringing, active, held) phone.activeCalls: Call[]; // Find a call by ID phone.getCall(callId: string): Call | undefined; ``` ### Presence ```typescript // Subscribe to presence updates phone.subscribePresence(userIds?: string[]): void; // Set your own presence await phone.setPresence( status: 'available' | 'dnd' | 'away', statusText?: string ): Promise; ``` ### Emergency Address ```typescript // Set or update emergency address (E911) await phone.setEmergencyAddress(address: EmergencyAddressRequest): Promise; // Get current emergency address await phone.getEmergencyAddress(): Promise; ``` #### EmergencyAddressRequest | Property | Type | Required | Description | | --------- | -------------- | -------- | ------------------------------------ | | `street` | string | Yes | Street address | | `street2` | string \| null | No | Suite, floor, apartment, room number | | `city` | string | Yes | City | | `state` | string | Yes | Two-letter state/province code | | `zip` | string | Yes | ZIP/postal code | | `country` | string | Yes | Two-letter country code (ISO 3166-1) | ### Events | Event | Payload | Description | | ----------------- | ----------------- | ------------------------------------------- | | `connected` | — | WebSocket connected and authenticated | | `disconnected` | — | WebSocket disconnected | | `reconnected` | — | Reconnected after a drop | | `incoming` | `Call` | Incoming call | | `presenceList` | `PresenceEntry[]` | Initial presence snapshot | | `presenceUpdate` | `PresenceUpdate` | User presence changed | | `network.changed` | — | Client IP address changed (prompt for E911) | | `error` | `PhoneError` | Connection or protocol error | ```typescript phone.on(event: string, handler: Function): void; phone.off(event: string, handler?: Function): void; ``` ## Call Represents a single phone call. Obtained from `phone.call()` or the `incoming` event. ### Properties | Property | Type | Description | | ----------- | ---------------------------------------------------------------- | ----------------------------------------------- | | `id` | string | Call identifier | | `direction` | `'inbound'` \| `'outbound'` | Call direction | | `state` | `'trying'` \| `'ringing'` \| `'active'` \| `'held'` \| `'ended'` | Current call state | | `from` | string | Caller's number (E.164) | | `fromName` | string \| null | Caller's display name | | `to` | string | Called number or extension | | `isMuted` | boolean | Whether the microphone is muted | | `isHeld` | boolean | Whether the call is on hold | | `duration` | number | Call duration in seconds (updates in real-time) | ### Methods ```typescript // Answer an incoming call call.answer(): void; // Reject an incoming call call.reject(reason?: 'busy' | 'decline'): void; // Hang up call.hangup(): void; // Hold / resume call.hold(): void; call.resume(): void; // Mute / unmute call.mute(): void; call.unmute(): void; // Send DTMF call.sendDtmf(digit: string): void; // Blind transfer call.transfer(destination: string): void; // Attended transfer (returns the consultation call) call.attendedTransfer(destination: string): Promise; // Complete an attended transfer call.completeTransfer(): void; // Access the underlying RTCPeerConnection (for stats, custom media handling) call.peerConnection: RTCPeerConnection; ``` ### Events | Event | Payload | Description | | ---------- | ----------------------- | --------------------------------------------------------------------------------------- | | `trying` | — | Server is processing the call | | `ringing` | — | Remote party is ringing | | `answered` | — | Call connected | | `held` | `'local'` \| `'remote'` | Call placed on hold | | `resumed` | — | Call resumed from hold | | `ended` | `string` | Call ended (reason: `hangup`, `no-answer`, `busy`, `failed`, `transferred`, `rejected`) | ```typescript call.on(event: string, handler: Function): void; call.off(event: string, handler?: Function): void; ``` ## Types ### PresenceEntry ```typescript interface PresenceEntry { userId: string; name: string; status: 'available' | 'on_call' | 'dnd' | 'away' | 'offline'; statusText: string | null; updatedAt: string; } ``` ### PresenceUpdate ```typescript interface PresenceUpdate { userId: string; status: 'available' | 'on_call' | 'dnd' | 'away' | 'offline'; statusText: string | null; updatedAt: string; } ``` ### PhoneError ```typescript interface PhoneError { code: | 'auth_failed' | 'auth_expired' | 'invalid_message' | 'call_failed' | 'call_not_found' | 'emergency_address_required' | 'session_limit' | 'rate_limited' | 'internal_error'; message: string; callId?: string; fatal: boolean; } ``` ## Server SDK Additions The following resources are added to the server SDK for WebRTC-related backend operations: ### auth ```typescript // Create a user token const { token, expires_at, user } = await dialstack.auth.createToken({ grant_type: 'token_exchange', subject_token: platformJwt, subject_token_type: 'urn:ietf:params:oauth:token-type:jwt', account_id: 'acct_01h2xcejqtf2nbrexx3vqjhp41', }); // Refresh a token const { token, expires_at } = await dialstack.auth.refreshToken({ token: existingToken, }); // Revoke a token await dialstack.auth.revokeToken({ token: existingToken, }); ``` ### webrtc ```typescript // Get ICE server configuration const { ice_servers, expires_at } = await dialstack.webrtc.iceServers({ token: userToken, }); ``` ## Related Resources - [WebRTC Overview](/webrtc) — Integration guide with complete code examples - [Signalling Protocol](./protocol) — Low-level WebSocket message reference - [Server SDK](/sdks/server) — Server-side SDK for account and user management - [Authentication](/authentication#user-tokens) — Obtaining user tokens --- ## WebSocket API # DialStack Media WebSocket Protocol 2.0.0 documentation - Support: [DialStack API Support](https://docs.dialstack.ai) - Email support: [info@dialstack.ai](mailto:info@dialstack.ai) Real-time audio streaming protocol over WebSocket. ## Overview DialStack connects to a platform-provided WSS URL, sends a `begin` handshake, exchanges `audio` frames, and sends an `end` message before closing. The same wire protocol is used for every session; the enabled features depend on which REST API created it. ## Features ### Outbound audio Audio from DialStack to the platform is always present. Each `audio` message carries a timestamp (milliseconds from session start) and a base64-encoded μ-law payload. ### Inbound audio (optional) The platform may send `audio` messages back to DialStack to be played to the caller. When this is not enabled, DialStack does not read from the WebSocket. ### Channel tagging (optional) Outbound `audio` messages may carry a `channel` field (`caller` or `callee`) when both sides of the call are streamed on the same connection. When the field is absent, the stream is a single mixed channel. ### Session identity The `begin` message carries exactly one of `voice_app_id` or `listener_id`, identifying the resource that created the session. Consumers can branch on which field is present to select per-resource behavior. ### Graceful end Before closing the WebSocket, DialStack sends an `end` message with a `reason` (`call_ended`, `deleted`, `error`) so the consumer can distinguish normal termination from errors. ## Connection Flow 1. Platform provides a WSS URL when creating the session 2. DialStack connects and sends `begin` with session metadata and audio format 3. Audio flows via `audio` messages 4. DialStack sends `end` with a reason 5. DialStack closes the WebSocket ## Audio Format - Encoding: μ-law (G.711) - Sample rate: 8000 Hz - Channels: 1 (mono) - Chunk size: ~20ms (160 bytes before base64 encoding) - Bandwidth: ~8 KB/second per channel ## Connection Behavior - DialStack initiates the TLS WebSocket connection - Ping/pong keepalive every 30 seconds - If the connection drops during an active call, DialStack attempts reconnection (up to 3 times) - Closing the WebSocket stops the audio session; the effect on the underlying call depends on the session type ## Related Documentation - [REST API Reference](/api) — endpoints that create sessions - [Download AsyncAPI Spec](/api/asyncapi.yaml) — raw YAML specification ## Table of Contents - [Servers](#servers) - [platform](#platform-server) - [Operations](#operations) - [SEND Begin](#send-begin-operation) - [SEND Audio](#send-audio-operation) - [RECEIVE Audio](#receive-audio-operation) - [SEND End](#send-end-operation) ## Servers ### `platform` Server - URL: `wss://ai.platform.example.com/voice` - Protocol: `wss` Platform-provided WebSocket URL, supplied when the session is created via the REST API. DialStack connects to this URL and streams audio. ## Operations ### SEND Begin Operation *Session start notification* - Operation ID: `sendBegin` Media stream channel. DialStack connects to the platform's WebSocket URL and exchanges JSON messages for session control and audio data. Outbound audio is always streamed; inbound audio is accepted when the session was created with that feature enabled. Sent by DialStack immediately after the WebSocket connection is established. Contains session metadata (exactly one of `voice_app_id` or `listener_id`), optional pass-through `metadata`, and the audio format specification. #### Message Session Begin `begin` *First message after WebSocket connection, containing session metadata* - Message ID: `begin` - Content type: [application/json](https://www.iana.org/assignments/media-types/application/json) ##### Payload | Name | Type | Description | Value | Constraints | Notes | |---|---|---|---|---|---| | (root) | object | Session start message with call metadata and audio format. Exactly one of `voice_app_id` or `listener_id` is present. | - | - | **additional properties are allowed** | | event | string | Event type identifier | const (`"begin"`) | - | **required** | | call\_id | string | Unique identifier for this call | examples (`"call_01h2xcejqtf2nbrexx3vqjhp45"`) | - | **required** | | account\_id | string | Account identifier | examples (`"acct_01h2xcejqtf2nbrexx3vqjhp41"`) | - | **required** | | audio\_format | object | Audio encoding specification | - | - | **required**, **additional properties are allowed** | | audio\_format.encoding | string | Audio encoding (μ-law G.711) | const (`"audio/x-mulaw"`) | - | **required** | | audio\_format.sample\_rate | integer | Sample rate in Hz | const (`8000`) | - | **required** | | audio\_format.channels | integer | Number of audio channels (mono) | const (`1`) | - | **required** | | voice\_app\_id | string | Session identifier. Mutually exclusive with `listener_id` — exactly one of the two is present on every `begin`. | examples (`"voiceapp_01h2xcejqtf2nbrexx3vqjhp42"`) | - | - | | listener\_id | string | Session identifier. Mutually exclusive with `voice_app_id` — exactly one of the two is present on every `begin`. | examples (`"lstn_01h2xcejqtf2nbrexx3vqjhp50"`) | - | - | > Examples of payload *(generated)* ```json { "event": "begin", "call_id": "call_01h2xcejqtf2nbrexx3vqjhp45", "account_id": "acct_01h2xcejqtf2nbrexx3vqjhp41", "audio_format": { "encoding": "audio/x-mulaw", "sample_rate": 8000, "channels": 1 }, "voice_app_id": "voiceapp_01h2xcejqtf2nbrexx3vqjhp42", "listener_id": "lstn_01h2xcejqtf2nbrexx3vqjhp50" } ``` ### SEND Audio Operation *Audio to platform* - Operation ID: `sendAudio` Media stream channel. DialStack connects to the platform's WebSocket URL and exchanges JSON messages for session control and audio data. Outbound audio is always streamed; inbound audio is accepted when the session was created with that feature enabled. Audio sent by DialStack to the platform. Each message carries a timestamp (milliseconds from session start). When multi-leg audio is streamed on the same connection, messages also carry a `channel` tag (`caller` or `callee`); otherwise the tag is omitted. #### Message Audio from DialStack `audio` \*Audio sent from DialStack to the platform. May carry a per-chunk `channel` tag when multi-leg audio is streamed on the same connection. \* - Message ID: `audioFromDialStack` - Content type: [application/json](https://www.iana.org/assignments/media-types/application/json) ##### Payload | Name | Type | Description | Value | Constraints | Notes | |---|---|---|---|---|---| | (root) | object | Audio from DialStack to the platform. Carries an optional `channel` tag when multi-leg audio is streamed on the same connection. | - | - | **additional properties are allowed** | | event | string | Event type identifier | const (`"audio"`) | - | **required** | | timestamp | integer | Milliseconds from session start | examples (`0`, `20`, `40`) | - | **required** | | channel | string | Which party's audio this chunk contains. Present only when multi-leg audio is streamed on the same connection; otherwise omitted (the stream is a single mixed channel). | allowed (`"caller"`, `"callee"`) | - | - | | payload | string | Base64-encoded μ-law audio data (~160 bytes per 20ms chunk) | - | format (`byte`) | **required** | > Examples of payload *(generated)* ```json { "event": "audio", "timestamp": 0, "channel": "caller", "payload": "string" } ``` ### RECEIVE Audio Operation *Audio to caller* - Operation ID: `receiveAudio` Media stream channel. DialStack connects to the platform's WebSocket URL and exchanges JSON messages for session control and audio data. Outbound audio is always streamed; inbound audio is accepted when the session was created with that feature enabled. Audio to play to the caller, sent by the platform to DialStack. Accepted only when the session was created with inbound audio enabled; otherwise DialStack does not read from the WebSocket. #### Message Audio to DialStack `audio` \*Audio to play to the caller, sent from the platform to DialStack. Accepted only when the session was created with inbound audio enabled. \* - Message ID: `audioToDialStack` - Content type: [application/json](https://www.iana.org/assignments/media-types/application/json) ##### Payload | Name | Type | Description | Value | Constraints | Notes | |---|---|---|---|---|---| | (root) | object | Audio data to play to caller (Platform → DialStack). Accepted only when the session was created with inbound audio enabled. | - | - | **additional properties are allowed** | | event | string | Event type identifier | const (`"audio"`) | - | **required** | | payload | string | Base64-encoded μ-law audio data | - | format (`byte`) | **required** | > Examples of payload *(generated)* ```json { "event": "audio", "payload": "string" } ``` ### SEND End Operation *Session end* - Operation ID: `sendEnd` Media stream channel. DialStack connects to the platform's WebSocket URL and exchanges JSON messages for session control and audio data. Outbound audio is always streamed; inbound audio is accepted when the session was created with that feature enabled. Sent by DialStack before closing the WebSocket. The `reason` field distinguishes a normal hangup from an explicit deletion or an error. #### Message Session End `end` *Sent before DialStack closes the WebSocket, with a reason* - Message ID: `end` - Content type: [application/json](https://www.iana.org/assignments/media-types/application/json) ##### Payload | Name | Type | Description | Value | Constraints | Notes | |---|---|---|---|---|---| | (root) | object | Sent by DialStack before closing the WebSocket. | - | - | **additional properties are allowed** | | event | string | Event type identifier | const (`"end"`) | - | **required** | | reason | string | Why the session ended: - `call_ended`: the call was hung up - `deleted`: the session was closed via the API - `error`: an internal error occurred | allowed (`"call_ended"`, `"deleted"`, `"error"`) | - | **required** | > Examples of payload *(generated)* ```json { "event": "end", "reason": "call_ended" } ```