Products · /v1/messages
Two-way SMS your customers' customers actually reply to
Send and receive texts on real business numbers. Every message threads into a conversation per tenant, keywords are handled automatically, and opt-outs are enforced at send time — CTIA compliance you never have to think about.
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
Conversations built in
Inbound and outbound messages thread automatically per tenant and contact. Read one resource, render a inbox — no joins on your side.
STOP / HELP / START automation
Carrier-required keywords are detected, answered, and recorded as opt-outs or re-subscriptions before your webhook even fires.
Opt-outs enforced at send
A send to an opted-out contact fails fast with a typed error — not a carrier violation three weeks later.
Delivery receipts as events
message.delivered and message.failed webhooks carry carrier-level failure reasons you can surface in your product.
curl https://api.handset.dev/v1/messages \ -H "Authorization: Bearer sk_live_…" \ -H "Idempotency-Key: 3f1b2c…" \ -d tenant_id="tnt_01kzv90afex…" \ -d to="+14154136287" \ -d body="Your technician is 15 minutes out." { "id": "msg_01kzv9eb36…", "status": "queued", "conversation_id": "cnv_01kzv90a…" }
Endpoints
| POST | /v1/messages | Send a message from a tenant's number |
| GET | /v1/messages | List messages, filterable by tenant and conversation |
| GET | /v1/messages/{id} | Retrieve one message with delivery detail |
| GET | /v1/conversations | List threaded conversations per tenant |
| GET | /v1/conversations/{id} | Retrieve a conversation and its messages |
| GET | /v1/opt_outs | List a tenant's opted-out contacts |
Ship messaging this sprint.
We're onboarding a small group of vertical SaaS platforms. Tell us what your customers need to say, and to whom.