Early access · The business phone API
Phone infrastructure to grow your platform
Give your vertical SaaS compliant two‑way texting, inbound calling, voicemail, and real phone numbers — through one API, from your customers' first text to your millionth.
# Threading, opt-outs, and 10DLC handled. curl https://api.handset.dev/v1/messages \ -H "Authorization: Bearer sk_live_…" \ -d to="+14154136287" \ -d body="Your technician is 15 minutes out." { "id": "msg_01kzv9eb36…", "status": "queued", "mode": "live" }
- 10DLCregistered messaging
- E911address provisioning
- STOP/HELPCTIA keywords built in
- HMACsigned webhooks
- AES-256encrypted EINs at rest
A complete phone system for every business on your platform. Your customers already run their businesses inside your product — then step outside it to text and call their customers. Handset is the phone company behind your API: carrier contracts, 10DLC, CTIA keywords, E911, and multi‑tenant numbers, designed to work as one.
Messaging
/v1/messages
Two-way SMS that threads into conversations per tenant. STOP, HELP, and START handled automatically, opt-outs enforced at send time.
Bayview Dental+1 415 259 5084
Hi Maria — reminder: cleaning tomorrow at 9:30 AM. Reply C to confirm.
C — see you then!
conversation cnv_01kzv9… · delivered
Voice & voicemail
/v1/calls
Inbound calls routed by each tenant's business hours in their own timezone. Greetings, voicemail, recordings, transcripts.
Voicemailafter hours
+1 415 413 6287
“Hi, calling about a leaky faucet in the…”
Numbers
/v1/phone_numbers
Search, buy, and configure real numbers in one call — E911 included.
+1 415 555 0184Buy · $1/mo
+1 415 555 0271sms · voice
+1 415 555 0339sms · voice
Compliance
/v1/brands
10DLC brands and campaigns as API objects, not support tickets.
Brand · Ridge Plumbingvetted
Campaign · appointmentsapproved
EIN **-***6789 · encrypted
Webhooks
/v1/webhook_endpoints
Nine event types, HMAC-signed, retried until you acknowledge.
message.received200 OK
call.completed200 OK
voicemail.created200 OK
Embed a phone system in your platform. One account, many tenants — each of your customers gets their own numbers, conversations, opt‑out lists, and business hours, isolated by design and billed as one platform.
Start with tenantsyour platform acct_01kzv90a5md2wmj9d79spjqywk ├─ tenant tnt_01kzv90afex… “Bayview Dental” │ ├─ +1 415 259 5084 │ └─ hours: Mon–Fri 8–5 America/Los_Angeles └─ tenant tnt_01kzvb2m9qp… “Ridge Plumbing” ├─ +1 602 555 0144 └─ after‑hours → voicemail + transcript
Carrier infrastructure, without the carrier.
Ed25519‑verified carrier webhooks in, HMAC‑signed platform events out, a transactional queue in between. You never touch a SIP trunk — but the dial tone is real. Press it.
350 Hz + 440 Hz
The dial tone behind vertical SaaS
0
API
for messaging, voice, numbers, and compliance
0
event types
HMAC-signed webhooks, retried until acknowledged
0
endpoints
spec-first REST, typed SDKs on the way
0
modes
live and test on every account, from day one
Developer experience
Test mode is not an afterthought. Every account ships with parallel live and test keys. Test mode runs a simulated carrier: numbers are free, compliance approves instantly, and magic numbers let you rehearse failure before it happens in production.
# Magic number: simulate a failed delivery curl https://api.handset.dev/v1/messages \ -H "Authorization: Bearer sk_test_…" \ -d to="+15005550001" -d body="…" → webhook: message.failed "failure_reason": "carrier_rejected"
# Same code. Real number, real delivery. curl https://api.handset.dev/v1/messages \ -H "Authorization: Bearer sk_live_…" \ -d to="+14154136287" -d body="…" → webhook: message.delivered status: "delivered"
Put a handset in your product.
We're onboarding a small group of vertical SaaS platforms. Tell us what your customers need to say, and to whom.