Empire Telecom · EmpireUC Teams Connect
EmpireUC runs on the NetSapiens platform and exposes its full REST API (NetSapiens API v2) for users, numbers, call routing, call history, recordings, call control, queues and real-time events.
EmpireUC is Empire Telecom's own cloud phone system (UCaaS). It is built on the NetSapiens platform, so everything you can do in EmpireUC can also be done in code through the NetSapiens API v2: a JSON REST API with bearer-token authentication that covers users, phones, phone numbers, call routing, schedules, auto attendants, call queues, voicemail, call history (CDRs), recordings, transcriptions, SMS, live call control and event subscriptions (webhooks). In short: it is a complete, mature API, and almost every screen in the phone system has an endpoint behind it.
Tip: You do not need code for day-to-day changes. Customers can manage EmpireUC without any programming in the Phones section of the Empire Telecom customer portal (users, numbers, ring groups, call history and more). Use the API when you want to connect EmpireUC to your own systems, such as an EHR, CRM, wallboard or reporting tool.
| Item | Detail |
|---|---|
| API type | REST over HTTPS, OpenAPI 3.1 specification |
| API version | NetSapiens API v2, platform release 44.x (about 239 paths and 111 schemas) |
| Base URL | https://<your-EmpireUC-API-server>/ns-api/v2 (Empire Telecom provides the server address) |
| Authentication | OAuth-style access and refresh tokens from POST /tokens (client ID + secret + user login); JWT tokens; API keys for server-to-server use. All sent as Authorization: Bearer <token> |
| Data format | JSON request and response bodies; field names are kebab-case (for example name-first-name) |
| Identifiers | Domains (your organisation) are numeric IDs; users are extension@domain; ~ means "my own" domain or user |
| Versioning | Platform release in the path family /ns-api/v2; GET /version returns the running API version |
| Sandbox | No public sandbox. Test against a non-production user or domain first; ask Empire Telecom to set one up |
| Rate limits | Not published. Keep polling modest, use event subscriptions instead of tight loops, and back off on errors |
| Webhooks / events | Event subscriptions (POST /subscriptions) push JSON to your HTTPS URL; delivery is near-real-time (checked about every 3 seconds) |
| SDKs | No official SDK. Any HTTP client works; the OpenAPI file can generate a client. NetSapiens also offers an MCP server for AI tools |
| Developer portal | docs.ns-api.com (choose version 44.4 to match EmpireUC) |
| Status page | No public status page. Contact Empire Telecom support for service status |
| How to get access | Ask Empire Telecom for API access; Empire requests a client ID and secret for your account and sets the user scope |
| 1 | Ask Empire Telecom for API access. Tell us what you want to build (for example "pull call history into our reporting tool" or "click-to-call from our CRM"). Empire Telecom requests an API client (a client ID and client secret) for your organisation. Credentials are delivered securely, usually through a one-time link. |
| 2 | Choose the user the integration will sign in as. We recommend a dedicated service user rather than a person's own extension, so the integration keeps working when staff change. |
| 3 | Agree the scope. NetSapiens permissions follow the user's scope. Customers are given Basic User (the user's own data: their calls, voicemail, contacts, answer rules) or Office Manager (everything in your organisation's domain: all users, numbers, queues, call history). The higher Reseller scope is kept by Empire Telecom. |
| 4 | Get the server address. Empire Telecom gives you the EmpireUC API server address. Your base URL is https://<your-EmpireUC-API-server>/ns-api/v2. |
| 5 | Request a token with POST /tokens (see Authentication) and make a first test call such as GET /domains/~ or GET /domains/~/users/~. |
| 6 | Optional: API key. For long-running server-to-server integrations you can use an API key. Creating a key through /apikeys itself needs a bearer token, so you must first sign in with the client ID and secret. Ask Empire Telecom if you would prefer that a restricted key be created for you (read-only, limited to certain IP addresses or limited to certain data models). |
| 7 | Test first. Run your integration against a test user or a quiet period before you point it at live call flows. Writes such as creating users or changing number routing take effect immediately and can be billable. |
Important: The client ID and the client secret are two separate values that go in two separate fields. Pasting both into the client ID field produces the error Invalid_client.
Request a token from POST /tokens. The body is JSON, not form-encoded. The /tokens call is the only one that does not need a bearer token.
| POST https://<your-EmpireUC-API-server>/ns-api/v2/tokens Content-Type: application/json { "grant_type": "password", "client_id": "<client_id>", "client_secret": "<client_secret>", "username": "1000@<domain>", "password": "<password>" } |
The response includes access_token, refresh_token, expires_in (seconds), token_type, scope, user, domain, uid, displayName, user_email, client_id and apiversion. Send the token on every other request:
| Authorization: Bearer <access_token> Accept: application/json |
When the access token expires, use the refresh token instead of sending the password again:
| POST /ns-api/v2/tokens { "grant_type": "refresh_token", "client_id": "<client_id>", "client_secret": "<client_secret>", "refresh_token": "<refresh_token>" } |
If the user has MFA turned on, the first request returns a token with the mfa_required scope. Repeat POST /tokens with "grant_type": "mfa", the same client and login values, the mfa_vendor and mfa_type from the first response, the 6-digit passcode from the authenticator app, and the access_token you received with the mfa_required scope.
NetSapiens also issues JSON Web Tokens, which suit end-user web applications:
| Method | Path | What it does |
|---|---|---|
| POST | /jwt | Create a JWT from username/password (same client ID and secret); returns token and refresh |
| POST | /jwt | Create a new JWT from a refresh JWT (body: refresh); the refresh JWT is revoked once used |
| GET | /jwt | Read the current JWT |
| DELETE | /jwt | Revoke the current JWT |
API keys are 60 characters long and are sent as a bearer token (Authorization: Bearer <key>). The first four characters show the scope: nsu_ Basic User, nsd_ Office Manager (domain), nsr_ Reseller, nss_ Super User. The first 12 characters are the Key ID, used to manage or revoke the key. A key is shown only once when it is created and cannot be retrieved later. Keys do not expire on their own, can be read-only, can be limited to IP addresses, limited to a domain, and limited to specific data models (allowed-models).
| Method | Path | What it does |
|---|---|---|
| GET | /apikeys | List API keys under your account |
| GET | /apikeys/~ | Read information about the key you are using |
| POST | /apikeys | Create an API key (requires a bearer token) |
| GET | /apikeys/{key_id} | Read one key by Key ID |
| PUT | /apikeys/{key_id} | Update a key |
| DELETE | /apikeys/{key_id} | Revoke a key |
All paths below are relative to https://<your-EmpireUC-API-server>/ns-api/v2. {domain} is your numeric domain ID (or ~ for the domain of the signed-in user). {user} is the extension (or ~ for yourself). Collection reads accept start and limit for paging.
| Method | Path | What it does |
|---|---|---|
| GET | /version | API version, host name and current server time |
| GET | /domains/~ | Your own domain (works even with a Basic User token) |
| GET | /domains/{domain} | Read a domain's settings |
| PUT | /domains/{domain} | Update domain settings |
| GET | /domains/{domain}/billing | Domain with billing summary |
| GET | /domains/{domain}/count | Check whether a domain exists |
| GET | /domains | List domains visible to your token (reseller scope) |
| Method | Path | What it does |
|---|---|---|
| GET | /domains/{domain}/users | List users in the domain (optionally filter by site) |
| GET | /domains/{domain}/users/list | Basic info for all users (choose fields) |
| GET | /domains/{domain}/users/count | Count users |
| POST | /domains/{domain}/users | Create a user |
| GET | /domains/{domain}/users/{user} | Read one user |
| PUT | /domains/{domain}/users/{user} | Update a user |
| DELETE | /domains/{domain}/users/{user} | Delete a user |
| GET | /domains/~/users/~ | Read your own user |
Common user fields: user, name-first-name, name-last-name, email-address, user-scope, account-status, user-presence-status, status-message, department, site, time-zone, caller-id-number, dial-policy. Example create body:
| { "user": "1050", "name-first-name": "Maria", "name-last-name": "Lopez", "email-address": "maria@example.org", "user-scope": "Basic User", "time-zone": "America/New_York" } |
Important: A new user is a new EmpireUC seat and is billable. Ask Empire Telecom before creating users in bulk.
There is no separate "department" object. department is a field on each user, and Sites group users by location.
| Method | Path | What it does |
|---|---|---|
| GET | /domains/{domain}/sites | Read sites |
| POST | /domains/{domain}/sites | Create a site |
| PUT | /domains/{domain}/sites/{site} | Update a site |
| GET | /domains/{domain}/sites/list | Basic list of sites |
| GET | /domains/{domain}/sites/count | Count sites |
Presence (available, on a call, do not disturb and so on) is returned on each user as user-presence-status, which the platform calculates from registration, answer rules and active calls.
| Method | Path | What it does |
|---|---|---|
| GET | /domains/{domain}/users/{user}/devices | Devices (SIP registrations/lines) for a user |
| POST | /domains/{domain}/users/{user}/devices | Create a device for a user |
| GET | /domains/{domain}/users/{user}/devices/{device} | Read one device |
| GET | /domains/{domain}/devices | All devices in the domain |
| GET | /domains/{domain}/phones | Desk phones (MAC addresses) in the domain |
| POST | /domains/{domain}/phones | Add a phone by MAC address |
| GET | /domains/{domain}/phones/{mac} | Read one phone |
| GET | /phones/models | Supported phone models |
There is no separate "registrations" collection; use the user's devices and presence instead.
| Method | Path | What it does |
|---|---|---|
| GET | /domains/{domain}/phonenumbers | List the domain's phone numbers |
| GET | /domains/{domain}/phonenumbers/count | Count numbers |
| GET | /domains/{domain}/phonenumbers/{phonenumber} | Read one number and its routing |
| POST | /domains/{domain}/phonenumbers | Add a number to the domain |
| PUT | /domains/{domain}/phonenumbers/{phonenumber} | Change where a number goes |
| DELETE | /domains/{domain}/phonenumbers/{phonenumber} | Remove a number from the domain |
Routing is set with dial-rule-application (for example to-user, to-callqueue, to-voicemail, to-connection, to-single-device, available-number, hangup) and dial-rule-translation-destination-user (the extension, queue or number it goes to). Example:
| PUT /domains/{domain}/phonenumbers/12015550100 { "dial-rule-application": "to-user", "dial-rule-translation-destination-user": "1000", "dial-rule-description": "Main line to reception" } |
Tip: Point main numbers at an auto attendant, ring group or queue rather than at one person, so calls are not lost when that person is away. New numbers and porting are ordered through Empire Telecom.
Each user has answer rules, one per timeframe (schedule). An answer rule decides what happens during that timeframe: simultaneous ring, forward always, forward on busy, forward when not answered, forward when unregistered, do not disturb, call screening, and lists of numbers to allow or reject.
| Method | Path | What it does |
|---|---|---|
| GET | /domains/{domain}/users/{user}/answerrules | Read a user's answer rules |
| POST | /domains/{domain}/users/{user}/answerrules | Add an answer rule (body includes time-frame, enabled) |
| PUT | /domains/{domain}/users/{user}/answerrules/{timeframe} | Update the rule for a timeframe |
| DELETE | /domains/{domain}/users/{user}/answerrules/{timeframe} | Delete the rule for a timeframe |
| PUT | /domains/{domain}/users/{user}/answerrules/reorder | Change rule priority (array of time-frame values) |
Timeframes come in five types: always, days-of-week, specific-dates, holiday and custom. Shared (domain) timeframes and per-user timeframes have matching endpoints:
| Method | Path | What it does |
|---|---|---|
| GET | /domains/{domain}/timeframes | Read shared timeframes |
| POST | /domains/{domain}/timeframes | Create a shared timeframe (set timeframe-type) |
| GET | /domains/{domain}/timeframes/{id} | Read one shared timeframe |
| PUT | /domains/{domain}/timeframes/{id} | Update or replace its entries |
| DELETE | /domains/{domain}/timeframes/{id} | Delete a shared timeframe |
| GET | /domains/{domain}/users/{user}/timeframes | Read a user's own timeframes |
| POST | /domains/{domain}/users/{user}/timeframes | Create a user timeframe |
| GET | /holidays/countries | Countries with holiday data |
| GET | /holidays/{country}/{year} | Holidays for a country and year (to build holiday timeframes) |
Ring groups are not a separate object. A ring group is built from a user (often a system extension) whose answer rules ring several destinations at once or in order, with timeframes for business hours and after hours. Use /answerrules/reorder to set which rule wins.
| Method | Path | What it does |
|---|---|---|
| GET | /domains/{domain}/autoattendants | List auto attendants |
| POST | /domains/{domain}/autoattendants | Create an auto attendant (requires attendant-name, user) |
| GET | /domains/{domain}/users/{user}/autoattendants/{prompt} | Read one menu |
| PUT | /domains/{domain}/users/{user}/autoattendants/{prompt} | Update a menu (keys, greeting, timeouts) |
On the EmpireUC release there is no DELETE for auto attendants through the API; ask Empire Telecom to remove one.
| Method | Path | What it does |
|---|---|---|
| GET | /domains/{domain}/callqueues | Read call queues (includes live counts such as calls waiting and agents available) |
| GET | /domains/{domain}/callqueues/list | Basic list of queues |
| POST | /domains/{domain}/callqueues | Create a queue |
| GET | /domains/{domain}/callqueues/{callqueue} | Read one queue |
| PUT | /domains/{domain}/callqueues/{callqueue} | Update a queue |
| DELETE | /domains/{domain}/callqueues/{callqueue} | Delete a queue |
| GET | /domains/{domain}/callqueues/{callqueue}/agents | Agents in a queue |
| POST | /domains/{domain}/callqueues/{callqueue}/agents | Add an agent (callqueue-agent-id, for example 1000@<domain>) |
| PUT | /domains/{domain}/callqueues/{callqueue}/agents/{callqueue-agent-id} | Update an agent |
| DELETE | /domains/{domain}/callqueues/{callqueue}/agents/{callqueue-agent-id} | Remove an agent |
| GET | /domains/{domain}/agents | All agents in the domain |
| PATCH | /domains/{domain}/callqueues/{callqueue}/agents/{callqueue-agent-id}/login | Log an agent in |
| PATCH | /domains/{domain}/callqueues/{callqueue}/agents/{callqueue-agent-id}/logout | Log an agent out |
| PATCH | /domains/{domain}/callqueues/{callqueue}/agents/{callqueue-agent-id}/onecall | Take a single call, then go offline |
| PATCH | /domains/{domain}/callqueues/all/agents/{callqueue-agent-id}/{status} | Set an agent's offline status across all queues |
| GET | /domains/{domain}/queuedcall/{queue} | Calls currently waiting in a queue |
Queue dispatch types include Round-robin, Tiered Round-robin, Ring All, Linear Cascade, Linear Hunt and Call Park.
| Method | Path | What it does |
|---|---|---|
| GET | /domains/{domain}/cdrs | Call records for the domain (datetime-start and datetime-end required) |
| GET | /domains/{domain}/users/{user}/cdrs | Call records for one user |
| GET | /domains/{domain}/cdrs/count | Count calls and total minutes |
Useful filters: datetime-start, datetime-end, type (Inbound, Outbound, On-net, Off-net, Missed, Received), dialled, caller, site, group (department), plus start and limit (default 100, maximum 1000). Key fields: id, call-direction, call-start-datetime, call-answer-datetime (present only when the call was answered), call-disconnect-datetime, call-orig-from-user, call-orig-caller-id, call-orig-from-name, call-orig-to-user, call-term-user, call-talking-duration-seconds, call-total-duration-seconds, call-disconnect-reason-text, call-orig-call-id and call-intelligence-job-id.
Recordings are looked up by call ID (from the CDR, call-orig-call-id), not listed as a collection.
| Method | Path | What it does |
|---|---|---|
| GET | /domains/{domain}/recordings/{callid} | Recording(s) for a call in the domain |
| GET | /domains/{domain}/users/{user}/recordings/{callid} | Recording for a call for one user |
| GET | /domains/{domain}/transcriptions | Transcription for a call (query: id, date as YYYYMM, callid) |
The recording response includes call-recording-status, file-duration-seconds, file-size-kilobytes and file-access-url, a link you use to download the audio. Call recording must be turned on for the user or number; ask Empire Telecom (recording is included free with EmpireUC).
| Method | Path | What it does |
|---|---|---|
| GET | /domains/{domain}/users/{user}/voicemails/{folder} | List voicemails in new, save or trash |
| GET | /domains/{domain}/users/{user}/voicemails/{folder}/{filename} | Read one voicemail (includes an audio link) |
| DELETE | /domains/{domain}/users/{user}/voicemails/{folder}/{filename} | Delete a voicemail |
| PATCH | /domains/{domain}/users/{user}/voicemails/{folder}/{filename}/save | Move to the saved folder |
| PATCH | /domains/{domain}/users/{user}/voicemails/{folder}/{filename}/forward | Forward to another user |
| GET | /domains/{domain}/users/{user}/greetings | List greetings |
| POST | /domains/{domain}/users/{user}/greetings | Create a greeting (text to speech or uploaded audio) |
| GET | /domains/{domain}/users/{user}/greetings/{index} | Read one greeting |
| GET | /domains/{domain}/users/{user}/vmailnag | Voicemail reminder settings |
| GET | /domains/{domain}/moh | Music on hold for the domain |
| GET | /domains/{domain}/users/{user}/moh | Music on hold for a user |
| Method | Path | What it does |
|---|---|---|
| GET | /domains/{domain}/smsnumbers | SMS-enabled numbers in the domain |
| POST | /domains/{domain}/smsnumbers | Enable a number for SMS (number, application, dest) |
| PUT | /domains/{domain}/smsnumbers/{smsnumber} | Update an SMS number |
| DELETE | /domains/{domain}/smsnumbers/{smsnumber} | Remove SMS from a number |
| GET | /domains/{domain}/users/{user}/smsnumbers | SMS numbers assigned to a user |
| GET | /domains/{domain}/users/{user}/messagesessions | A user's conversations |
| GET | /domains/{domain}/messagesessions | Conversations for the domain |
| POST | /domains/{domain}/users/{user}/messages | Start a new message session |
| GET | /domains/{domain}/users/{user}/messagesessions/{messagesession}/messages | Messages in a conversation |
| POST | /domains/{domain}/users/{user}/messagesessions/{messagesession}/messages | Send a message (type sms, mms, chat; message, destination, from-number) |
Important: Business texting in the US requires 10DLC registration of the sending numbers. Ask Empire Telecom to register and enable SMS before you send through the API.
| Method | Path | What it does |
|---|---|---|
| GET | /domains/{domain}/calls | Active calls in the domain |
| GET | /domains/{domain}/calls/count | Count active calls |
| GET | /domains/{domain}/users/{user}/calls | A user's active calls |
| GET | /domains/{domain}/users/{user}/calls/{callid} | Read one active call |
| POST | /domains/{domain}/users/{user}/calls | Place a call (click-to-call: rings the user's phone, then dials call-term-user) |
| DELETE | /domains/{domain}/users/{user}/calls/{call_id} | Hang up |
| PATCH | /domains/{domain}/users/{user}/calls/{call_id}/answer | Answer |
| PATCH | /domains/{domain}/users/{user}/calls/{call_id}/hold | Hold |
| PATCH | /domains/{domain}/users/{user}/calls/{call_id}/unhold | Take off hold |
| PATCH | /domains/{domain}/users/{user}/calls/{call_id}/transfer | Transfer |
| DELETE | /domains/{domain}/users/{user}/calls/{call_id}/reject | Reject a ringing call (the published reference lists DELETE; confirm against your release) |
These act on the user's desk phone or app. You do not need a browser softphone to control calls.
| Method | Path | What it does |
|---|---|---|
| GET | /domains/{domain}/users/{user}/contacts | A user's personal contacts |
| POST | /domains/{domain}/users/{user}/contacts | Create a personal contact |
| GET | /domains/{domain}/contacts | Shared (company) contacts |
| POST | /domains/{domain}/contacts | Create a shared contact |
| Method | Path | What it does |
|---|---|---|
| GET | /domains/{domain}/addresses | Emergency addresses in the domain |
| POST | /domains/{domain}/addresses | Create an address |
| POST | /domains/{domain}/addresses/validate | Validate an address before saving it |
| PUT | /domains/{domain}/addresses/{emergency-address-id} | Update an address |
| DELETE | /domains/{domain}/addresses/{emergency-address-id} | Delete an address |
| GET | /domains/{domain}/addresses/count | Count addresses |
| GET | /domains/{domain}/users/{user}/addresses | Addresses assigned to a user |
| POST | /domains/{domain}/users/{user}/addresses | Assign an address to a user |
| GET | /domains/{domain}/addresses/endpoints | Address endpoints for the domain |
Required fields for an address: address-name, caller-name, address-line-1, address-city, address-state-province-abbreviation, address-postal-code, address-country-abbreviation and address-location-description (for example "2nd floor nurses' station").
| Method | Path | What it does |
|---|---|---|
| GET | /domains/{domain}/dialplans/{dialplan}/dialrules | Read dial rules in a dial plan |
| POST | /domains/{domain}/dialplans/{dialplan}/dialrules | Add a dial rule |
| PUT | /domains/{domain}/dialplans/{dialplan}/dialrules/{dialrule} | Update a dial rule |
| DELETE | /domains/{domain}/dialplans/{dialplan}/dialrules/{dialrule} | Delete a dial rule |
| GET | /domains/{domain}/connections | SIP connections (trunks) for the domain |
| GET | /domains/{domain}/subscriptions | Event subscriptions for the domain |
The full reference also covers meetings and video, phone templates, images, configurations, backups and certificate management. Most of these are platform-administration features that Empire Telecom manages for you.
The NetSapiens reference for newer releases (45 and later) documents some endpoints that may not be on the EmpireUC release yet. Check with Empire Telecom before relying on them:
| Method | Path | What it does |
|---|---|---|
| GET | /domains/{domain}/statistics/callqueues/{callqueue} | Queue statistics (default fields VOL,CH,ATT,AC,AWT,SL) |
| GET | /domains/{domain}/statistics/callqueues/aggregate | Statistics for all queues combined |
| GET | /domains/{domain}/statistics/agent | Agent statistics |
| GET | /domains/{domain}/statistics/agentLog | Agent log |
| GET | /domains/{domain}/callqueuereport/abandoned | Abandoned calls |
| GET | /domains/{domain}/departments/list | List departments |
| GET | /domains/{domain}/presence/list | Presence for the whole domain in one call |
| PATCH | /domains/{domain}/users/{user}/calls/{call_id}/transferPeer | Transfer the other party of a call |
| Method | Path | What it does |
|---|---|---|
| GET | /domains/{domain}/number-filters | Numbers blocked for the whole domain |
| POST | /domains/{domain}/number-filters | Block numbers for the domain |
| DELETE | /domains/{domain}/number-filters | Unblock numbers for the domain |
| GET | /domains/{domain}/users/{user}/number-filters | Numbers blocked for one user |
| POST | /domains/{domain}/users/{user}/number-filters | Block numbers for one user |
| DELETE | /domains/{domain}/users/{user}/number-filters | Unblock numbers for one user |
Example body: {"phone-numbers-to-reject": {"parameters": ["2015550199"]}}. You can also block callers for a user with the phone-numbers-to-reject list on that user's answer rule.
EmpireUC pushes events to your system through event subscriptions. You register an HTTPS URL, and the platform POSTs JSON arrays of changed objects to it.
| Method | Path | What it does |
|---|---|---|
| GET | /subscriptions | List your subscriptions |
| POST | /subscriptions | Create a subscription |
| GET | /subscriptions/{id} | Read one subscription |
| PUT | /subscriptions/{id} | Update a subscription |
| DELETE | /subscriptions/{id} | Delete a subscription |
| GET | /domains/{domain}/subscriptions | Subscriptions for a domain |
| POST | /domains/{domain}/subscriptions | Create a subscription for a domain |
Example:
| POST /ns-api/v2/subscriptions { "model": "call", "post-url": "https://hooks.example.org/empireuc/calls", "domain": "<domain>", "user": "*" } |
Models you can subscribe to: call (every change to active calls: ringing, answered, ended), call_origid, cdr (one event when a call completes), agent (queue agent availability), presence, subscriber (user record changes), voicemail (a new voicemail; the transcription may arrive later), message and messagesession (SMS and chat), auditlog_lite (create and delete of key objects). Create one subscription per model.
Good to know:
X-Correlation-ID header holding the subscription ID; use it to check that the post is genuine and to route posts when several subscriptions share one URL.post-url should be HTTPS with a valid certificate. Custom ports are allowed.subscription-expires-datetime; one created with an API key lasts much longer. Re-create subscriptions when they expire.status (pending, active or error), posts-count and error-count, which help you troubleshoot.| Status | Meaning |
|---|---|
| 200 | Success, data returned |
| 202 | Accepted: the change was queued. Many write calls accept "synchronous": "yes" to wait and return 200 with the saved object |
| 400 | Bad request: a field is missing or invalid (body has code and message) |
| 401 | Not authenticated: token missing, expired or invalid. Refresh and retry once |
| 403 | Forbidden: your user scope does not allow this (for example a Basic User reading another user) |
| 404 | Record not found: check the domain ID, extension or call ID |
| 409 | Conflict: the object already exists (for example a duplicate phone number or subscription) |
start (offset, starting at 0) and limit. CDR reads return at most 1,000 records per page. Keep requesting until fewer than limit records come back. Count endpoints (/count) tell you the total first.YYYY-MM-DD HH:MM:SS or RFC 3339 with an offset. State the time zone explicitly.X-NetSapiens-Log: <your-tag> to a request when Empire Telecom support is helping you trace a problem; it lets the request be found in the platform logs.| 1 | Get a token with POST /tokens. |
| 2 | Call GET /domains/~/cdrs?datetime-start=2026-10-19 00:00:00&datetime-end=2026-10-19 23:59:59&limit=1000. |
| 3 | If 1,000 records come back, repeat with start=1000, start=2000 and so on. |
| 4 | Treat a call as answered when call-answer-datetime is present; use call-talking-duration-seconds for talk time. |
| 1 | Find the call in the CDRs and take its call-orig-call-id. |
| 2 | Call GET /domains/~/recordings/{callid}. |
| 3 | Download the audio from the returned file-access-url (send your bearer token if asked) and store it securely; recordings may contain patient or resident information. |
| 1 | Create a subscription: POST /subscriptions with "model": "cdr" and your HTTPS post-url. |
| 2 | Check X-Correlation-ID on each incoming POST matches your subscription ID. |
| 3 | Read the call details from the JSON array in the body and save them in your system. |
| 1 | Sign in as the agent (or use Office Manager scope for the domain). |
| 2 | Call POST /domains/~/users/1000/calls with "synchronous": "yes", a unique call-id and "call-term-user": "12015550123". |
| 3 | The agent's phone rings first; when they answer, the platform dials the customer. |
| 1 | Read the number: GET /domains/~/phonenumbers/{phonenumber}. |
| 2 | Update it: PUT /domains/~/phonenumbers/{phonenumber} with a new dial-rule-application (for example to-voicemail or to-callqueue) and dial-rule-translation-destination-user. |
| 3 | For time-based switching, use a timeframe and answer rules on the destination user instead of changing the number each evening. |
| 1 | Create the user: POST /domains/~/users with user, name-first-name, name-last-name, email-address, user-scope. |
| 2 | Assign a device or desk phone (POST /domains/~/users/{user}/devices or POST /domains/~/phones). |
| 3 | Add them to a queue if needed: POST /domains/~/callqueues/{callqueue}/agents. |
| 4 | Assign their 911 address: POST /domains/~/users/{user}/addresses. |
| 1 | Poll GET /domains/~/callqueues every 10 to 15 seconds for waiting calls and available agents, or subscribe to the agent and call models. |
| 2 | Show active calls from GET /domains/~/calls. |
| 3 | Show each person's status from user-presence-status on GET /domains/~/users. |
start and limit.Need a hand? Call Empire Telecom support at (732) 363-9898, email support@empiretelecomnj.com, or open a ticket in the customer portal.