VOIPHORIZON LABS

Build on communications you own.

Recipes, sector builds and free tools from the team behind Bulwark Voice Suite. Every recipe here runs on Bulwark's REST API and live event stream today — secured with scoped, auto-rotating credentials, on your own servers.

bulwark · api your server
$ curl -u vhc_…:•••• -X POST /api/v1/oauth/token
{ "access_token": "vha_9fQ…", "token_type": "Bearer", "expires_in": 900 }
$ curl -H "Authorization: Bearer vha_9fQ…" /api/v1/reports/queues
[{ "answerRate": 0.94, "avgWaitS": 18, … }]
# token expires in 15 min — just ask for a new one
reports:readalerts:writeevents:readcalls:write

What Teams, Webex and Slack taught us

We studied how the big collaboration platforms open themselves to developers. The patterns are good. The catch is where they run.

Microsoft Teams

  • Tabs: web dashboards inside chats & channels
  • Bots / agents for notifications & workflows
  • Message extensions — e.g. create a ticket from a post
  • Meeting apps on the call surface
  • Graph presence change subscriptions
  • Compliance recording via certified partner bots

Cisco Webex

  • Messaging, meetings & calling REST APIs
  • Calling: dial, answer, transfer, record + call events
  • Call history feeding CRMs & dashboards
  • Device xAPI: room-in-use, bookings, fleet config
  • Instant Connect: one API call → guest visit links
  • Bots, webhooks, embedded apps

Slack

  • Block Kit messages with buttons & menus
  • Modals, App Home, slash commands, shortcuts
  • Incoming webhooks from CRMs & monitoring
  • Events API to react to activity
  • Workflow Builder custom steps from apps
  • Ecosystem: tickets, approvals, CRM record alerts

Bulwark — on your servers

  • REST API over every PBX resource
  • Live event stream: calls, presence, queues
  • Click-to-call, recording & PCI control
  • Alerts that ring phones and collect muster
  • Presence, location, geofence, threat feeds
  • OAuth client-credentials, scoped & auto-rotating
Why "where it runs" matters. Microsoft's own documentation describes Teams compliance recording as delivered by certified third-party recorder bots running on Azure VMs — and lists PSTN calls for users in India as not supported. Bulwark records on your own servers, PSTN included, with PCI pause/mask controlled from your apps.
Source: Microsoft Learn, “Microsoft Teams compliance recording (third-party)”.

API recipes you can build today

Each one uses endpoints and events that ship in Bulwark now. Scopes shown are the least privilege the recipe needs.

Your CRM · Accounts

Meridian Logistics Pvt Ltd

Owner
Arjun Mehta
Tier
Gold
Open tickets
2
Last call
Tue, 4 min
Incoming call · Sales queue
+91 98450 12345 · Priya Nair, Ops Head
Meridian Logistics · Gold · 2 open tickets
Open recordLog note
Build todayCalls in your apps

CRM screen-pop & automatic call logging

The moment a call rings, your CRM opens the caller's record. When it ends, the call is logged against the account — no agent typing.

CHANNEL_CREATE event → look up caller ID → pop record → on CHANNEL_HANGUP, write the CDR to the account
WS /api/v1/eventsGET /api/v1/cdrevents:readcdr:read
Pattern from: Webex Calling call events & call history feeding CRMs; CRM record actions in Slack and Teams.
Waiting
4
Answered
0
SLA
0%
Avg wait
0s
Sales
92%
Support
81%
Billing
96%
Ready 7On call 9Wrap-up 2Break 1
Build todaySee operations live

Live queue wallboard

A TV-sized board for the floor: who's waiting, answer rate against SLA, average wait and agent states — updating as calls move.

GET /reports/queues for answer rate & wait → callcenter::info events for live agent and queue state
GET /api/v1/reports/queuesWS /api/v1/eventsreports:readevents:read
Pattern from: dashboards embedded as Teams tabs; Webex call-history and room-analytics dashboards.
Helpdesk · Contacts
Rohit Sharma+91 80 4567 1122📞 Call
Leena Thomas+91 80 4567 8900 Ringing your desk 2041…
Vikram Rao+91 22 6123 4500📞 Call
POST /api/v1/calls/originate { "from": "2041", "to": "+918045678900" }
Build todayCalls in your apps

Click-to-call from any app

A call button in your CRM, ERP or intranet rings the user's own desk phone or softphone first, then dials out — no copying numbers.

User clicks → POST /calls/originate with their extension and the number → their phone rings, then the far end
POST /api/v1/calls/originatecalls:write
Pattern from: the Webex Calling dial API behind click-to-dial integrations.
Bulwark event
Abandoned
Support queue · waited 00:47
+91 99001 23456
→
#48213 · created automatically
Callback: missed support call
Caller: +91 99001 23456 (known: Suresh K.)
Priority: High · Group: Tier-1
Source: Bulwark · queue Support
# on callcenter::info "abandoned" or CHANNEL_HANGUP with no answer create_ticket("Callback", caller, queue, waited)
Build todayCalls in your apps

Missed or abandoned call → helpdesk ticket

No caller falls through the cracks. Every abandoned queue call opens a callback ticket in your helpdesk with the caller, queue and wait time.

callcenter::info / CHANNEL_HANGUP event → create ticket in Freshdesk, Zendesk or your own tool
WS /api/v1/eventsGET /api/v1/cdrevents:readcdr:read
Pattern from: "create a ticket from a message" in Slack and Teams helpdesk apps.
⚠️ NMS alarmChiller 2 high temp
Block A plant room
→
POST /alertsmuster: true
geofence: Block A
→
📞 64 phonesringing now
TTS + press 1 / 2
Safe (1)
0
Need help (2)
0
No answer
0
Build todayAlerts that ring phones

Monitoring, SCADA or SIEM → voice alert with muster

Your monitoring tool doesn't just post into a chat channel nobody's watching at 2 a.m. It rings every phone in the affected zone and gets a "safe / need help" answer back.

Alarm webhook → POST /alerts (target all, group, list or geofence) → poll GET /alerts/{id} for the live roll
POST /api/v1/alertsGET /api/v1/alerts/{id}alerts:writealerts:read
Pattern from: incoming webhooks posting monitoring alerts into Slack and Teams — taken a step further.
👤 HRMS · New joiner: Kavya Iyer · Support · starts Monday
✓ Create user POST /users
✓ Assign extension 2047 POST /extensions
✓ Voicemail box + email POST /voicemail-boxes
✓ Apply to the call engine POST /apply
✓ Ready before day one 0 tickets raised
Build todayAutomate & govern

Joiner / leaver provisioning from HR

A new hire in your HR system gets a user, extension and voicemail before they arrive. A leaver is removed the day they exit — no orphaned lines.

HR event → POST /users, /extensions, /voicemail-boxes → POST /apply; leavers use the matching DELETE
users:writeextensions:writevoicemail-boxes:writeapply:writeusers:deleteextensions:deletevoicemail-boxes:delete
Pattern from: Webex People and Calling provisioning APIs; app-provided steps in Slack Workflow Builder.
03:12:04 sip REGISTER 401 ×38 from 203.0.113.14
03:12:06 rule SIP-BRUTE-FORCE fired → block
03:12:06 POST /api/v1/ip-rules 201
Bulwark · IP Firewall
deny203.0.113.14/32autoSIEM: SIP brute force
deny198.51.100.0/24autoSIEM: toll-fraud probe
allow10.20.0.0/16manualHQ LAN
Build todayAutomate & govern

SIEM-driven perimeter defence

When your SIEM sees SIP brute-forcing or toll-fraud probing, it denies the source at the PBX edge in seconds — and can block fraud destinations too.

SIEM rule → POST /ip-rules (deny, CIDR, scope) and POST /block-rules for numbers → applied live, audited
POST /api/v1/ip-rulesPOST /api/v1/block-rulesip-rules:writeblock-rules:write
Pattern from: spam- and fraud-blocking call-control apps in the Webex App Hub.
Agent desktop · Take payment
Card number
•••• •••• •••• 4821
Expiry / CVV
••/•• · •••
POST /api/v1/calls/{uuid}/recording/pause # on open POST /api/v1/calls/{uuid}/recording/resume # on submit
Build todayAutomate & govern

PCI-safe recording from your payment screen

Opening the payment form pauses (or masks) the call recording; submitting resumes it. Card numbers never reach disk, and the agent can't forget.

Payment form opens → recording/pause or mask → form submits → recording/resume
POST /api/v1/calls/{uuid}/recording/{action}calls:write
Pattern from: policy-based compliance recording in Teams — here running on your own servers, PSTN included.

More recipes

On-call & presence board
Show who's available from GET /presence and PRESENCE_IN events; your roster tool sets DND with PUT /presence/{ext}.
Daily agent digest
Email supervisors a morning summary from GET /reports/agents and /reports/calls.
Your intel, geofenced
Push your own GeoJSON feed with POST /threat-feeds; people near a new event are alerted automatically.
Data-subject erasure
Wire DPDP/GDPR erasure requests to POST /compliance/erase and keep retention in step with /compliance/retention.

Sector builds

The use cases from our Solutions page, shown as what an integrator wires up on the API.

🛡️

Defence & Military — base-wide accountability

A drill or real alert goes to every unit. The duty room watches each unit's roll fill in, and a duress code at a gate pulls command into a secure bridge.

  • Launch by group per unit; muster "1 safe, 2 need help"
  • Live roll by unit, refreshed from the alert report
  • *911 duress opens an incident bridge automatically
POST /alertsGET /alerts/{id}alerts:writealerts:read
Duty room · Base muster · DRILL 07:42 live
HQ Company
48/48
Alpha Coy
112/115
Bravo Coy
97/104
Signals
36/36
MT Section
22/25
⚠ Duress *911 · Gate 3
Incident bridge open — Ops Room, QRF, Duty Officer joined
🏥

Hospitals — code blue that reaches the covering doctor

A code alert goes to the ward's on-call team. Anyone in theatre or off-shift is already on DND from the roster, so the call reaches whoever is covering.

  • Roster system sets DND with presence updates
  • Code alert to the ward geofence or an on-call list
  • Time-to-first-response from the alert report
PUT /presence/{ext}POST /alertspresence:writealerts:write
Nursing station · Alerts
CODE BLUE · Ward 4B, Bed 12
Paged: cardiac on-call team · 00:19 to first response
Dr. A. Rao · Cardiology✓ Responding
ICU charge nurse✓ Acknowledged
Anaesthetist on call (in theatre → covering: Dr. S. Menon)✓
Respiratory therapist Ringing
🏫

Schools & Colleges — lockdown roll-call by room

Lockdown is announced on every classroom phone in a block. Each room presses 1 when secure; the office sees which rooms still need someone.

  • Alert scoped to the block's geofence
  • Room-by-room muster on a single screen
  • "Need help" rooms surfaced first for responders
POST /alertsGET /alerts/{id}POST /geofencesalerts:write
Front office · LOCKDOWN · Block C live
10 / 12 rooms securestarted 10:31 · 01:12 elapsed
C101
C102
C103
C104
C105
C106
C107
HELP
C108
C109
C110
—
C111
C112
C107 pressed 2 — need helpCall room
🏦

BFSI — dealer-desk compliance and fraud at the edge

Every dealer-desk call is recorded on your own storage with the retention your regulator expects. Payment segments are masked, and the CDR feed goes to your surveillance tool.

  • Recording retention set by policy, not by agents
  • PCI mask/pause driven from the payment app
  • CDR feed to trade surveillance; fraud IPs auto-denied
GET /cdrPUT /compliance/retentionPOST /calls/{uuid}/recording/maskPOST /ip-rules
Compliance · Dealer desk · today
TimeDeskCounterpartyDur.Recording
09:14FX-2+91 22 6611 …04:12✓ kept 7y
09:31Bonds-1+44 20 7946 …11:48✓ kept 7y
09:52Retail+91 98201 …06:05PCI MASKED 01:10
10:07FX-1+65 6221 …02:39✓ kept 7y
● CDR synced to surveillance
● 3 fraud IPs auto-denied
🏢

Corporates — travelling-staff duty of care

Your travel or MDM app reports where people are and lets them check in. When a threat event lands near someone who hasn't checked in, HR calls them in one click.

  • Mobile app reports location + "safe / help" check-ins
  • Threat events correlated to travellers' locations
  • Click-to-call anyone not yet accounted for
POST /locationsGET /threat-eventsPOST /calls/originatelocations:write
HR · Travellers · 3 abroad
Rajesh K.
Mumbai → client site
09:10✓ Safe
Anita D.
Severe weather warning 12 km away
no check-in📞 Call now
Sameer P.
Singapore office
08:42✓ Safe
⚡

Critical infrastructure — SCADA alarm to crew call-out, offline

A breaker trip at a substation calls the crews nearest to it, gets acknowledgements back, and logs who took it — with no internet anywhere in the path.

  • Crew positions reported from rugged devices
  • Alert scoped to a geofence around the asset
  • Runs entirely inside the OT network
POST /locationsPOST /alertsGET /alerts/{id}alerts:write
Control room · Call-out● No internet required
ALARM · Substation 7 · 33 kV breaker trip
02:14 · crews within 15 km: 3
Line crew 3 · 6.2 km✓ Acknowledged 00:41
Line crew 5 · 9.8 km✓ Acknowledged 01:05
Line crew 1 · 14.1 kmNo answer · retry

Quickstart: three calls to your first alert

OAuth 2.0 client credentials. Secrets are hashed and rotatable with an overlap window; access tokens live 15 minutes by default.

1
Create an API client
A super admin opens Administration → API Clients, names the client and grants only the scopes it needs. The client id and secret are shown once.
name: noc-alerts scopes: alerts:write alerts:read
2
Get a short-lived token
Exchange the id and secret for a Bearer token. When it expires, ask again — rotation is automatic.
BULWARK=https://pbx.example.in curl -u "$CLIENT_ID:$CLIENT_SECRET" \ -X POST $BULWARK/api/v1/oauth/token
3
Call the API
Use the token on any endpoint your scopes allow.
curl -H "Authorization: Bearer $TOKEN" \ -X POST $BULWARK/api/v1/alerts -d '{ "name": "Chiller 2", "message": "Evacuate plant room", "muster": true, "targetType": "geofence", "targetValue": "<geofence-id>" }'
Scopes are resource:verb
Verb is read (GET), write (POST/PUT) or delete. Wildcards: resource:*, *:read, *. Scopes are checked live, so narrowing a client takes effect on its next request.
extensionsusersqueueshunt-groupsivr-menusvoicemail-boxestrunkscdrreportscallseventspresencealertsgeofenceslocationsthreat-feedsip-rulesblock-rulescomplianceapply
Live events & guard rails
Subscribe to GET /api/v1/events (WebSocket, scope events:read) for CHANNEL_CREATE, CHANNEL_ANSWER, CHANNEL_HANGUP, PRESENCE_IN, MESSAGE and queue callcenter::info.
Admins, groups, API clients, cluster and audit endpoints can never be reached with a client credential. Every grant, denial and write is in the tamper-evident audit log.

Free tools

Useful whether or not you run Bulwark. No account needed.

Available now
Bulwark Sizing Planner
Turn users, concurrent calls, video, recording and transcoding into CPU, RAM, storage and an active-active server layout.
Open the planner →
In development
SIP Exposure & Toll-Fraud Check
Check your own PBX's public SIP surface for the openings fraudsters scan for, and read the attack patterns in your logs. For systems you own.
Get notified →
In development
Voice Network Readiness Kit
Measure latency, jitter and packet loss, estimate call quality, and spot SIP ALG and NAT problems before you deploy VoIP.
Get notified →

Official connectors On the roadmap

Packaged integrations we're building on the same API. Until they ship, every one of these can be built today with the recipes above — tell us which you need first.

Microsoft Teams · IM & presence bridge Cisco Webex · IM & presence bridge Slack · IM & presence bridge SalesforceZoho CRMHubSpot FreshdeskZendesk Live wallboard appClick-to-call dialer

Chat bridges are for connected sites only. Voice, video, recordings and emergency alerts always stay on your own servers.

Have an integration in mind?

We'll help you scope it on the API, or build it with you during a one-day pilot.