TimberSwitch developer API

Programmatic access to numbers, calls, voicemails, SMS, contacts, and the full webhook event stream. Same auth surface your team already uses - just add an X-API-Key header.

Auth

Generate a key in Account → API keys with the scopes you need. Send it on every request as a header:

X-API-Key: ts_live_…

Or, equivalently, as a Bearer token:

Authorization: Bearer ts_live_…

Keys are scoped - you pick exactly which verbs each key can do at create time. Recommended starter scopes: read:telephony, write:telephony, telephony:dial.

Numbers, calls & voicemails

MethodPathWhat it does
GET/api/v1/orgs/{slug}/calls?limit=50Recent call history.
GET/api/v1/orgs/{slug}/voicemailsVoicemails for the org.
POST/api/v1/orgs/{slug}/voicemails/{id}/readMark a voicemail read.
POST/api/v1/orgs/{slug}/voicemails/{id}/archiveArchive a voicemail.
GET/api/v1/orgs/{slug}/voicemails/{id}/audio302 → 15-min presigned S3 audio URL.
GET/api/v1/orgs/{slug}/recordings/{id}/audio302 → 15-min presigned S3 recording URL.

SMS

MethodPathWhat it does
POST/api/sms/sendSend an outbound SMS. Body: { phoneNumberId, contactE164, body }.
GET/api/v1/orgs/{slug}/sms/threadsList conversation threads.
GET/api/v1/orgs/{slug}/sms/threads/{id}Get one thread (with contact + our-number metadata).
GET/api/v1/orgs/{slug}/sms/threads/{id}/messages?limit=100Paginated message history for a thread.

US outbound SMS requires A2P 10DLC brand + campaign registration - without it carriers throttle to ~1 msg/sec. Configure under /phone/messaging-registration.

Contacts (address book)

MethodPathWhat it does
GET/api/v1/orgs/{slug}/contacts?search=&limit=100List or search contacts.
GET/api/v1/orgs/{slug}/contacts/{id}Get one contact.
POST/api/v1/orgs/{slug}/contactsUpsert by E.164. Body: { e164, firstName, lastName, company, email, notes, tags }.
PATCH/api/v1/orgs/{slug}/contacts/{id}Partial update.
DELETE/api/v1/orgs/{slug}/contacts/{id}Remove.
GET/api/v1/orgs/{slug}/caller-context?e164=+1NNNAggregated view (contact + last calls + last VMs + last SMS).
curl -X POST https://www.timberswitch.com/api/v1/orgs/your-slug/contacts \
  -H "X-API-Key: ts_live_..." -H "Content-Type: application/json" \
  -d '{"e164":"+15551234567","firstName":"Sarah","company":"Acme"}'

Webhooks

We POST to your endpoint with an HMAC-signed JSON body. Configure endpoints under /phone/webhooks with an event filter glob (e.g. sms.*, call.completed, or *). Delivery retries with exponential backoff up to 8 attempts.

EventWhen it firesKey payload fields
voicemail.received Voicemail finalized + transcribed voicemail_id, from, duration_seconds, transcript, audio_endpoint
sms.received Inbound SMS persisted message_id, thread_id, from, to_phone_number_id, body, is_stop, is_help
call.completed Call leg ended call_id, direction, from, to, status, duration_seconds, hangup_cause

More events shipping with later versions - call.answered, call.recording.saved, contact.created, contact.updated.

Conventions

Need something not here?

Email [email protected] or hop into Switchboard in your workspace - it can answer questions about your own account state and the API.