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.

send-a-text.sh
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/messagesSend a message from a tenant's number
GET/v1/messagesList messages, filterable by tenant and conversation
GET/v1/messages/{id}Retrieve one message with delivery detail
GET/v1/conversationsList threaded conversations per tenant
GET/v1/conversations/{id}Retrieve a conversation and its messages
GET/v1/opt_outsList 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.