Changelog
What’s new in SIP.IO, newest first. Each entry links to the relevant docs.
2026-07-02: The flow interpreter grows up
Section titled “2026-07-02: The flow interpreter grows up”- Nested flows: a flow node can splice another published flow’s nodes in at load time, so a shared block (a business-hours check, a “collect a callback number” step) is written once and reused everywhere.
cond_routenow has a full expression evaluator: comparison and string operators, boolean algebra with parentheses,{var}interpolation, and aswitchOnform matched by outgoing edge.callbackandlastCalledUserare fully implemented (previously documented as stubs that fell through to the default outcome).
2026-06-30: Real outbound trust: STIR/SHAKEN identity & wholesale balance
Section titled “2026-06-30: Real outbound trust: STIR/SHAKEN identity & wholesale balance”Closes out the last of the trust/fraud stubs on the wholesale carrier path.
- The outbound STIR/SHAKEN identity token is now read from a real, admin-managed account-to-subaccount mapping, not a placeholder; an unmapped account correctly omits the identity header rather than originating unattributed.
- A cached wholesale-balance pre-check blocks outbound (
402) only on a known, depleted balance; an unknown or stale balance fails open rather than causing an outage. - A signed webhook keeps the balance and mapping status current without polling.
Changed
Section titled “Changed”- What is STIR/SHAKEN? reflects the now-real attestation wiring behind the A/B policy it already documented.
2026-06-27: Call recording
Section titled “2026-06-27: Call recording”- Call recording: policy-driven recording (account, user, queue, or DID scope), retention (account default or override), stereo output, and mid-call pause/resume/stop/start for PCI-sensitive segments (e.g. a caller reading a card number).
/v1/recordings: list, get metadata, play, download, and delete, all writing to an access log for audit.- Recordings correlate to a CDR row by
call_id.
2026-06-25: Messaging matures: channels, inbound forwarding & the agent inbox
Section titled “2026-06-25: Messaging matures: channels, inbound forwarding & the agent inbox”/v1/channels: full CRUD for channel management (provider, address, default queue, secret rotation).- Inbound webhook signature verification, fail-closed once configured, with per-provider schemes.
- SMS-to-email and SMS-to-webhook: per-channel inbound forwarding, independent of the omnichannel routing.
- Omnichannel Inbox & ACD: the agent-inbox read API (
/v1/conversations), and the routing loop is fully closed: an agent coming online now drains any waiting conversation backlog, not just new ones. message.receivedandmessage.statuswebhooks, on the same delivery mechanism as call webhooks.
2026-06-22: Account self-service & per-country ringback
Section titled “2026-06-22: Account self-service & per-country ringback”PATCH /v1/account: self-service updates to name, timezone, language, voice gender, ringback country, default recording retention, and free-caller-ID policy.- Per-country call-progress ringback: the tone a caller hears while ringing now follows the account’s configured country (defaults to US), covering a dozen major regions plus an ETSI fallback.
- Click-to-call now reaches PSTN destinations, not just internal users, gated by the same DNC and caller-ID checks as any other outbound call.
- Both
console.sip.ioandapi.sip.ioare now CORS-enabled for direct browser SPA use.
2026-06-18: Embedded softphone: the WebRTC token foundation
Section titled “2026-06-18: Embedded softphone: the WebRTC token foundation”The authentication foundation for browser-based calling: no password ever touches the browser.
POST /v1/softphone/token: mints a short-lived, ephemeral SIP credential for a given user, Twilio-Access-Token style.- TURN/the TURN relay credentials minted alongside the token, for reliable connectivity on UDP-blocked networks.
- WSS on port 443 via a shared regional host, for firewall traversal without a per-customer certificate.
- (2026-07-02) Token expiry is now actually enforced, not just advisory, cleaned up by a lazy reap plus a global cron sweep.
The client SDK, an embeddable widget, and CRM connectors are on the roadmap; this is the server-side foundation they’ll build on.
2026-06-15: Per-account SIP realms
Section titled “2026-06-15: Per-account SIP realms”- Vanity SIP realms (
<label>.cust.sip.io), the Twilio SIP-Domain equivalent, for white-label and reseller accounts.
2026-06-10: Omnichannel messaging
Section titled “2026-06-10: Omnichannel messaging”A new product line: SMS, MMS, WhatsApp & RCS.
- Messaging: a
messaging.sip.ioservice with a unified conversation model (channels, conversations, messages, templates, opt-outs). - Carrier-neutral adapters: bring your own SMS carrier via a config-driven HTTP adapter (no code), plus the WhatsApp Cloud API.
- WhatsApp 24-hour session window + templates, and STOP/opt-out compliance built in.
SMS (carrier-neutral) and WhatsApp are live; RCS, the omnichannel inbox/ACD routing, and a
/v1/messagesAPI are on the roadmap.
2026-06-05: API pagination & rate limits
Section titled “2026-06-05: API pagination & rate limits”- Keyset cursor pagination on
GET /v1/calls: stable, offset-free paging vianext_cursor. - Rate limiting on the
/v1API: 100 requests / 60s per key, returning429withRetry-After.
2026-06-02: Public API, auth & webhooks
Section titled “2026-06-02: Public API, auth & webhooks”A real REST API, per-account auth, and signed event webhooks.
- Public
/v1REST API atapi.sip.io/v1: account, calls/CDR, agents, queues, numbers, DNC, and campaigns, with a published OpenAPI spec. - Authentication: per-account API keys (
x-api-key: sk_…) and console-login session tokens (BearerJWT), authorized by per-resource scopes. - Webhooks: subscribe to
call.started/call.ended; delivered as HMAC-SHA256-signed POSTs. - Service split: the platform is now an API, realtime, console, and edge-control-plane set of services.
- DNC integration wired into the dialer, a call-rating engine (
cost_micros), and region-aware agent dispatch.
Changed
Section titled “Changed”- Agent/queue KPIs and CDR export now read from the
/v1API (/v1/agents,/v1/queues,/v1/calls) instead of the internal monitor endpoint.
2026-05-27: Transfers, callback, sticky routing & call CDR
Section titled “2026-05-27: Transfers, callback, sticky routing & call CDR”Call control, smarter routing, and full call records.
- Call transfer: agent-initiated blind and attended (consultative) transfers, with anti-fraud gates on PSTN transfers.
- Virtual queue (callback): an in-queue option to hang up, keep your place, and get called back when an agent frees.
- Sticky / last-agent routing: a per-queue option to prefer the agent a repeat caller spoke to last (
preferredorstrict). - Users & Devices brings a user call-handling layer: multi-device ring (simultaneous/sequential + ring order), do-not-disturb, and per-user call-forward (always / busy / no-answer).
- Per-user caller-ID: a validated, selectable caller-ID allowlist per user (anti-spoofing).
- Full call CDR + export: a queryable 30-day CDR window plus an unbounded archive, with a JSON/CSV export endpoint.
Changed
Section titled “Changed”- Toll-fraud gate: outbound PSTN now requires an active, account-owned device (defense-in-depth).
2026-05-19: Outbound dialer & campaigns
Section titled “2026-05-19: Outbound dialer & campaigns”Power and predictive dialing with a built-in abandon-rate governor.
- Outbound dialer. Run calling campaigns with preview, progressive, power, and predictive pacing against your agents’ live availability.
- Abandon-rate governor. Power/predictive pacing self-tunes (AIMD) to hold abandons under a configurable cap (
abandon_cap_pct, default 3%), backing off to progressive-safe when needed. - Dispositions → retries. A per-account disposition catalog drives the contact lifecycle (retry/callback/closed/DNC) with attempt caps and retry delays.
- Answering-machine detection (AMD) and local-presence caller-ID (pick a caller-ID matching the called number’s area).
- Campaign KPIs: live status/disposition breakdown, completion and DNC rates, and the live pacing governor state.
2026-05-12: Overflow deflection, live wallboard & in-queue options
Section titled “2026-05-12: Overflow deflection, live wallboard & in-queue options”Smarter queue overflow, a real-time supervisor view, and a DTMF menu on hold.
- Deflect-at-enqueue exits. Two new queue exits decide before a caller waits:
queue_full(atmax_queuedcapacity) andewt(estimated wait overewt_threshold_sec), overflowing before anyone has to hold. - Live supervisor wallboard. A real-time big-screen view with KPI gauges, per-queue tiles, and a live agent grid, pushed over WebSocket on every state change.
- In-queue options (Tier 1). Callers on hold can press a key for DTMF options:
routeout, fire awebhook,deflect(webhook + keep holding), orhangup, with an optional bearer-authed webhook payload.
Changed
Section titled “Changed”- The enqueue node gains
queue_fullandewtoutcomes alongsidetimeout/abandon/no_agents.
2026-05-04: First-class SIP trunks & call forwarding
Section titled “2026-05-04: First-class SIP trunks & call forwarding”Bring your own carrier or PBX, in both directions, and reliable find-me/follow-me.
- First-class SIP trunks. A single
sip_trunkmodel spans carrier, BYOC, and customer PBX peers, withrole,direction, outbound registration, and inbound auth (ip/register/digest). - Inbound identification by source IP. Unauthenticated INVITEs are mapped to an account by matching the source IP against a trunk’s
sip_trunk_acl; no match is rejected403. - Receive-on-PBX. A DID can ring a customer PBX via
dest_kind: "trunk", preserving the called number as the request-URI. - Registration failover. For registering trunks, an active-registrar election keeps exactly one node holding the upstream AOR, with deterministic failover on node-down.
- Call forwarding to PSTN. Forwards with
always/busy/no_answer/unreachabletriggers, press-1 confirm screening (so a mobile’s voicemail can’t swallow the call), and an overflow fallback.
Changed
Section titled “Changed”customer_trunkis generalized tosip_trunk(bidirectional, role-aware);outbound_route.trunk_idnow references it.- Resource IDs are now prefixed, time-ordered opaque strings (
us_,tr_,q_,did_,fwd_, …); see Data Model.
2026-04-20: Agent states, reporting & workforce management
Section titled “2026-04-20: Agent states, reporting & workforce management”An explicit-Ready agent model, a durable state log, and the contact-center KPIs built on it.
- Explicit-Ready agent state model. Agents now land not-ready on login and choose when to go available, with opt-in
auto_ready_on_login/auto_queue_loginflags. Nine canonical live buckets unify the wallboard and the reports. - Durable agent-state event log. Every transition is appended to a deduped, append-only
agent_eventlog in the PresenceEngine, the foundation for all agent reporting. - Agent KPIs: state-time, occupancy, and utilization, computed directly from the event log with documented formulas.
- Queue CDR & KPIs: a per-call
queue_cdrtiming layer yielding ASA, service level, abandon rate, and AHT. - Work schedules & adherence. Assign a time-schedule shift to an agent and measure adherence: actual on-the-phones state sampled against the scheduled shift, reusing the business-hours engine.
Changed
Section titled “Changed”- Connect-aligned membership modes. Queue membership splits priority (
tier_level,position,delay_sec) from who activates the agent:static·dynamic·mandatory·supervisor_managed. - Clearer table names.
queue_agent→agent_queue_assignment; runtimeagent_queue→agent_queue_live;queue_member→queued_call.
2026-04-07: Time-based routing & overflow exits
Section titled “2026-04-07: Time-based routing & overflow exits”Business hours, everywhere, and smarter queue overflow.
- Business hours / time-based routing. A reusable, timezone-aware
time_schedulewith weekly rules, specific dates, date ranges, and holiday overrides. Evaluate it in a flow with thetimeConditionnode, or attach it directly to a DID, extension, queue, or ring group so that being closed/holiday overrides the route target. Overnight intervals and DST are handled; evaluation fails open. - Queue overflow exit destinations. Three distinct exits per queue:
timeout(waited too long),abandon(caller hung up), andno_agents(no viable agent at all). Theno_agentsexit overflows immediately when nobody’s logged in, instead of making callers wait out the full max-wait.
Changed
Section titled “Changed”- Flow synthesis now chains a destination’s configured exits, so a number pointed straight at a queue inherits its overflow routing with no flow to build.
2026-03-23: Queue position announcements
Section titled “2026-03-23: Queue position announcements”Tell callers their place in line: multilingual, gender-correct, and gapless.
- Position announcements on queues (docs). Push-based and change-aware: the brain announces a caller’s position only when it actually changes, so hold music isn’t interrupted by a number that hasn’t moved. Configurable first delay and repeat interval, with a per-queue language override.
- Multilingual, gender-correct TTS for announcements across 16 languages, with per-language gender-correct number agreement (Hebrew, Arabic, Spanish, French, Russian, …), e.g. in Hebrew the position number agrees masculine with “number” while wait-time minutes agree feminine with “minutes.” Each unique spoken line is synthesized once and cached, content-addressed.
Changed
Section titled “Changed”- Announcements integrate with both MOH modes:
streamresumes near-gaplessly;filerestarts after the announcement.
2026-03-09: Music on hold modes & call log
Section titled “2026-03-09: Music on hold modes & call log”Hold audio that scales, and a CDR view.
- Music / message on hold modes (docs) via
queue.moh_mode:stream(a shared, always-decoding source: fixed cost, gapless; ideal for shared platform music) andfile(per-caller playback from object storage, cost proportional to active holds; ideal for custom uploads and message-on-hold). - Call log / CDR view. Per-call detail and the full execution trace via
GET /calls/{callId}/trace, backed by the Apache Iceberg data lake pipeline.
- The split exists so per-tenant custom MOH doesn’t pin an always-on decoder per tenant;
filemode means zero calls cost zero.