Numbers & call routing
Queues
A queue holds inbound calls and rings its agents — extensions, each with a priority and an order — by a ring strategy until one answers or the timeout action fires. This group lists the account's queues (GET /v2/queues, GET /v3/queues), adds and removes agents, and reports on dynamic agents and on today's outbound activity. Queues themselves are created, configured and deleted in the portal. Logging a dynamic agent in or out is POST /v2/extensions/set-dynamic-agent-queue-status in the Extensions group, and routing an IVR key to a queue is described in IVR.
Workflow (what the portal does)
- List:
GET /v3/queuesanswers a plain array of{"id", "name", "number", "description"}ordered by number — enough for pickers.GET /v2/queuesreturns the same queues in full:agents(the member count),agents_description(one entry per member:extension,name,priority,order,is_dynamic),queue_configandcan_delete. Withbasic=trueit answers onlyqueue_id,queue_number,queue_nameandqueue_desc. - Agents:
POST /v2/account-queue-headsetwithqueue_number,extension_numberand optionalpriority(0–59, default 0),order(0 or more, default 0) andis_dynamic(boolean, defaultfalse) adds the extension to the queue, or updates those three settings when it is already a member, and answers202with the membership row{"account_id", "queue_id", "extension_number", "priority", "order", "is_dynamic"}.DELETE /v2/account-queue-headset/{account_queue_headset}withqueue_numberandextension_numberin the query string removes it (204).GET /v2/account-queue-headsetlists the memberships of the caller's own extension, each with itsqueue(name,number,description); it answers400when the caller has no extension in the account. - Dynamic agents: a member with
is_dynamicis a dynamic agent — one who logs in to and out of the queue instead of being rung permanently.POST /v2/extensions/set-dynamic-agent-queue-statuswithqueue(queue number),extension(extension number) andaction(loginorlogoff) changes that state. It answers200with{"status": "success", "message": "Agent login"}, or200with{"error": true, "message": "Agent was not changed", "description": "…"}when the change could not be applied. - Dynamic-agent reports:
GET /v2/queue-dynamic-agentsis the login/logoff log, paginated.pageandperPage(15,25,50or100) are required;sorttakesid,ext,queue,action,user_name,platformordate, with a-prefix for descending (-dateby default); the filters arefilter[ext],filter[queue](queue number),filter[action](1login,0logoff),filter[user_name],filter[platform](1Wallboard,2Apps,3Shortcode) andfilter[date]as two Unix timestampsfrom-to. Each row isid,date,account,ext,queue,action,user_id,user_name,platformandplatform_name; next todata,linksandmetathe response addsagents(extension number → extension name) andqueues(the queue numbers that appear in the log).GET /v2/queue-dynamic-agents/statusis the current state: for every extension-and-queue pair whose latest event is a login, that event, newest first — who is logged in where right now.
- Related endpoints in other groups:
GET /v2/reports/queue-skipped-calls(Reports) lists the calls an agent did not pick up in aqueuebetweenfromandto, optionally for oneagentextension;GET /v2/call-log-queues(Call Logs) lists the queues the caller may filter call logs by, keyed by queue number.
Reading a queue
queue_config in GET /v2/queues is the queue's behaviour:
ring_strategy:ringall,leastrecent,fewestcalls,random,rrmemory,linearorwrandom;ring_agent_timeoutis the seconds each agent rings before the next one is tried,ring_in_usewhether an agent already on a call is rung,wrap_up_timethe seconds an agent is left alone after a call.timeout_inis the seconds a caller waits beforetimeout_actionfires:0ring an outside number,1continue,2backup call,3hang up,4option call,5option to voicemail,6dial an extension or shortcode,7voicemail,8another queue,9an IVR.timeout_action_valueis the target (a number, extension, mailbox, queue id or IVR id);backup_typeandbackup_valuedescribe the backup call.callee_announcement,periodic_announcement,announce_positionandannounce_position_frequencyare the caller-side announcements,moh_classthe music on hold,show_queue_namewhether the queue description is prepended to the caller ID the agent sees.can_deleteis{"allowed": true}when nothing points at the queue; otherwisemessagelists the numbers, IVRs, queues, callback widgets, webhooks and after-call-work rules that still use it. Deleting is portal-only.
Numbers and ids
Every queue has two identifiers: an id (id / queue_id), unique across NUACOM, and a number (number / queue_number), short and unique within the account. Every input in the API takes the number: queue_number in the agent endpoints, queue in the dynamic-agent status endpoint and the skipped-calls report, filter[queue] in the log, the queues filter of the call log, the queues grant in a user's permissions and the "join queue" actions of an IVR (see IVR). The id is only returned, never required.
A queue also has two labels, a short name (sales) and a description (Sales Queue), and the key that carries each differs by endpoint:
| Endpoint | id | number | short name | description |
|---|---|---|---|---|
GET /v3/queues |
id |
number |
name |
description |
GET /v2/queues |
id (string) |
number (string) |
— | name |
GET /v2/queues?basic=true |
queue_id |
queue_number |
queue_name |
queue_desc |
GET /v2/account-queue-headset, queue object |
– | number |
name |
description |
GET /v2/call-log-queues |
– | number |
id |
name |
Roles and access
- Listing queues and the three reports are open to any authenticated user. An account admin sees every queue; a regular user sees only the queues in the
queuesgrant of their permissions (set by an admin in the portal's Users screen, see Users), and with no grant both lists are empty —[], not403— even when the user has full call-log access. The reports are not filtered: they cover the whole account. - Adding and removing agents requires an account admin (
403otherwise). - Logging a dynamic agent in or out: an admin for any extension, a regular user for their own extension only (
403otherwise). - The ISO dates option does not change this group:
datein the dynamic-agent reports is alwaysM j Y H:i:s(Jun 15 2020 10:37:51) in the caller's profile timezone, andX-Timezoneis ignored there.
Pitfalls
nameis the description inGET /v2/queuesand the short name inGET /v3/queues(table above). Key your data onnumberorid, never on a label./v2/queuesreturnsid,number,agentsand everyqueue_configvalue as strings ("600");/v3/queuesreturns integers.is_dynamicis0/1inagents_descriptionandtrue/falsein the agent endpoints, andagents_description[].idjust repeatsextension.POST /v2/account-queue-headsetanswers202whether it created the membership or updated an existing one, and re-posting overwritespriority,orderandis_dynamic, which reset to0/falsewhen omitted.extension_numbermust be an extension linked to a user; an existing but unlinked extension is rejected with422.- The
{account_queue_headset}path segment of theDELETEis ignored — any value works — and the parameters go in the query string, not the body. perPage=-1("all") passes validation on the dynamic-agent log but the query then fails with500; page with100instead.filter[date]takes Unix timestamps (1735689600-1738368000) whiledatein the rows is formatted text; convert before comparing.actionislogin/logoffon input and1/0in the reports.- When a queue is in use,
can_deleteis{"success": false, " allowed": false, "message": [...]}— the key carries a leading space — so test forallowed === truerather than forallowed === false.