Skip to content
DocsStart free

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.

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.
Caller → DID (number) → Call Flow
├─ timeCondition (business hours)
│ ├─ in_hours → enqueue (Support queue)
│ └─ out_of_hours → voicemail
└─ queue → available agent (bridged)
  1. Create a business-hours schedule.

    A time_schedule is 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.

  2. Create a queue and add an agent.

    A queue is the static config the ACD brain loads. An agent is a sip_user with is_agent = 1, linked to the queue via agent_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.

  3. Register a device for the agent.

    A sip_device holds the SIP digest credential (stored as ha1, 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 /auth endpoint, which validates the digest against ha1. See Authentication.

  4. 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_flow and publish it (is_published = 1). See Call Flows.

  5. 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.

  6. 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.

  7. 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 timeCondition routes straight to voicemail.
  1. the SIP signaling layer received the INVITE and asked the edge runtime /route what to do.
  2. /route matched the DID, ran admission control (CAC), and returned a flow directive.
  3. the media engine ran the flow via the /flow command loop, driven step-by-step by a per-call CallSessionDO.
  4. The timeCondition node resolved against your schedule, the enqueue node 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.