Quickstart
This quickstart walks the full inbound path: a caller dials your number, the routing brain resolves it to a call flow, the flow checks business hours and offers the caller to a queue, and an available agent is bridged.
We’ll use the resource model (the objects in the data model) to describe each step. Where a public REST endpoint is on the roadmap, we show the resource you create; see the API Reference for the current surface.
Before you start
Section titled “Before you start”You’ll want:
- An account (your tenant). Multi-tenant and white-label accounts are described in Multi-Tenant & White-Label.
- A SIP domain for your account (the realm used for device authentication).
- At least one DID (inbound number) pointed at your account.
The path we’re building
Section titled “The path we’re building”Caller → DID (number) → Call Flow ├─ timeCondition (business hours) │ ├─ in_hours → enqueue (Support queue) │ └─ out_of_hours → voicemail └─ queue → available agent (bridged)-
Create a business-hours schedule.
A
time_scheduleis a reusable, timezone-aware object with rules. Here: open Mon–Fri 09:00–17:00, with a holiday.// time_schedule{ "id": "sch_01j0jvpe0wzc6g05bktfew0xyx", "account_id": "acc_01jf18ah3jeb5w6dfp27sgjsbt", "name": "Support hours", "timezone": "America/New_York" }// time_schedule_rule[] (dow: 0=Sun … 6=Sat)[{ "schedule_id": "sch_01j0jvpe0wzc6g05bktfew0xyx", "kind": "weekly", "dow": 1, "start_time": "09:00", "end_time": "17:00" },{ "schedule_id": "sch_01j0jvpe0wzc6g05bktfew0xyx", "kind": "weekly", "dow": 2, "start_time": "09:00", "end_time": "17:00" },{ "schedule_id": "sch_01j0jvpe0wzc6g05bktfew0xyx", "kind": "weekly", "dow": 3, "start_time": "09:00", "end_time": "17:00" },{ "schedule_id": "sch_01j0jvpe0wzc6g05bktfew0xyx", "kind": "weekly", "dow": 4, "start_time": "09:00", "end_time": "17:00" },{ "schedule_id": "sch_01j0jvpe0wzc6g05bktfew0xyx", "kind": "weekly", "dow": 5, "start_time": "09:00", "end_time": "17:00" },{ "schedule_id": "sch_01j0jvpe0wzc6g05bktfew0xyx", "kind": "date", "start_date": "2026-07-04", "is_closed": 1 }]See Business Hours for overnight intervals, date ranges, and holiday fallback.
-
Create a queue and add an agent.
A
queueis the static config the ACD brain loads. An agent is asip_userwithis_agent = 1, linked to the queue viaagent_queue_assignment.// queue{"id": "q_01j160r23gw5zkpfjme3fwzs5k", "account_id": "acc_01jf18ah3jeb5w6dfp27sgjsbt", "name": "Support","strategy": "longest_idle","agent_ring_timeout_sec": 20,"max_wait_sec": 600,"wrap_up_sec": 10,"announce_position": 1,"moh_mode": "stream","schedule_id": "sch_01j0jvpe0wzc6g05bktfew0xyx","timeout_dest_kind": "voicemail", "timeout_dest_id": "vm_01jg8asp59ps9rtt7azhrhvcre"}// sip_user (the agent){ "id": "us_01jatt0336xwzg2zbf3q9pyfm5", "account_id": "acc_01jf18ah3jeb5w6dfp27sgjsbt", "username": "1001", "display_name": "Dana", "is_agent": 1 }// agent_queue_assignment (membership + skill tier){ "queue_id": "q_01j160r23gw5zkpfjme3fwzs5k", "user_id": "us_01jatt0336xwzg2zbf3q9pyfm5", "tier_level": 1, "position": 0, "mode": "static" }See Queues & ACD for strategies, tiers, and the reserve/confirm fence.
-
Register a device for the agent.
A
sip_deviceholds the SIP digest credential (stored asha1, never plaintext). Point any softphone at your SIP domain.// sip_device{"id": "dev_01j12frzkfzcem64prjmgf6nnr", "account_id": "acc_01jf18ah3jeb5w6dfp27sgjsbt", "user_id": "us_01jatt0336xwzg2zbf3q9pyfm5","auth_username": "1001", "realm": "acme.sip.io","transport": "udp", "ha1": "<md5(username:realm:password)>"}When the phone registers, the SIP signaling layer calls the edge runtime
/authendpoint, which validates the digest againstha1. See Authentication. -
Build the call flow.
The flow is a JSON node-graph. This one checks hours, then offers an IVR that enqueues to Support, falling back to voicemail after hours.
{"id": "flow_01jzqwjn803wtnhc445bvjenzc", "name": "Support line", "version": 1, "start": "hours","nodes": [{ "id": "hours", "type": "timeCondition", "data": { "kind": "timeCondition", "scheduleId": "sch_01j0jvpe0wzc6g05bktfew0xyx" } },{ "id": "welcome", "type": "menu", "data": { "kind": "menu", "promptText": "Press 1 for support", "maxDigits": 1, "timeoutSec": 5 } },{ "id": "supQ", "type": "enqueue", "data": { "kind": "enqueue", "queueId": "q_01j160r23gw5zkpfjme3fwzs5k" } },{ "id": "vm", "type": "voicemail", "data": { "kind": "voicemail", "mailboxId": "vm_01jg8asp59ps9rtt7azhrhvcre" } }],"edges": [{ "id": "e1", "source": "hours", "target": "welcome", "sourceHandle": "in_hours" },{ "id": "e2", "source": "hours", "target": "vm", "sourceHandle": "out_of_hours" },{ "id": "e3", "source": "welcome", "target": "supQ", "sourceHandle": "digit:1" },{ "id": "e4", "source": "welcome", "target": "vm", "sourceHandle": "timeout" }]}Save it as a
call_flowand publish it (is_published = 1). See Call Flows. -
Point your number at the flow.
Set the DID’s route target to the published flow.
// did{ "id": "did_01j3sarpfcz8gdnnabykstr6fw", "account_id": "acc_01jf18ah3jeb5w6dfp27sgjsbt", "e164": "12025550123", "dest_kind": "flow", "dest_id": "flow_01jzqwjn803wtnhc445bvjenzc", "max_channels": 10 }dest_kind: "flow"tells the routing brain to run your call flow. See Numbers & Extensions. -
Bring the agent online.
An agent app calls the agent control endpoint to log in and become available:
Terminal window curl -X POST https://nodes.sip.io/agent \-H 'content-type: application/json' \-d '{ "accountId": "acc_01jf18ah3jeb5w6dfp27sgjsbt", "userId": 1001, "event": "available", "queues": [{ "queueId": "q_01j160r23gw5zkpfjme3fwzs5k", "level": 1 }] }'See Agents & Presence.
-
Call your number.
- In hours: the caller hears the menu, presses
1, joins the Support queue with hold music and position announcements, and is bridged to Dana when she’s free. - After hours / on a holiday: the
timeConditionroutes straight to voicemail.
- In hours: the caller hears the menu, presses
What just happened
Section titled “What just happened”- the SIP signaling layer received the INVITE and asked the edge runtime
/routewhat to do. /routematched the DID, ran admission control (CAC), and returned aflowdirective.- the media engine ran the flow via the
/flowcommand loop, driven step-by-step by a per-call CallSessionDO. - The
timeConditionnode resolved against your schedule, theenqueuenode handed the caller to the per-account PresenceDO (the ACD brain), and the reserve→confirm→release fence bridged the agent.
Next: read Core Concepts, or jump into the guides.