Skip to content

Channels & Embeds

SMS & texting

Enable two-way SMS for an assistant and configure SMS follow-ups on voice calls.

OnCore supports SMS in two ways: as a texting channel (the assistant answers inbound SMS on its number) and as SMS follow-ups during voice calls (the assistant texts the caller a link, price list, etc. when a configured trigger fires).

Enable or disable the SMS channel#

Toggle two-way SMS per assistant:

Terminal
curl -X PATCH https://core-api.heysadie.ai/assistants/ASSISTANT_ID/sms-enabled \
  -H "Authorization: ApiKey YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "smsEnabled": true }'

The response returns the assistant id and its updated featureFlags. When SMS is disabled, OnCore does not respond to inbound SMS for the assistant's number(s).

Enabling requires a linked Twilio number

Enabling requires the assistant to have a linked Twilio phone number. If it doesn't, the request fails with 400 (NO_PHONE_NUMBER_LINKED or NON_TWILIO_PROVIDER) and the flag is left unchanged. Disabling only clears the flag — the number's messaging registration is intentionally kept so re-enabling doesn't require A2P campaign re-registration.

SMS reasons#

SMS reasons define when the assistant should send an SMS to a caller during a voice call and what it should say — e.g. a caller asks for a price list, a link, or directions.

FieldDescription
nameFriendly label for internal use, e.g. "Car Rental Price List"
reasonThe trigger, e.g. "When the caller asks for available cars and wants to see pricing."
messageWhat the assistant says before sending, e.g. "Sure, I'll send you a price list via SMS right now."
contentThe actual SMS body sent to the caller, e.g. "Here's the price list: https://example.com/prices"
assistantIdThe assistant this SMS reason is attached to

Manage them as a standard resource: GET /sms-reasons (filterable by assistantId, paginated with limit/offset), GET /sms-reasons/{id}, POST /sms-reasons, PUT /sms-reasons/{id}, and DELETE /sms-reasons/{id}.

When a call triggers an SMS reason, the call's end-of-call report carries the reason id in extra.smsReasonId and the call category is set to SMS_SENT.

Transfer reasons#

The companion resource for handing a call to a human: transfer reasons define when the assistant should transfer the call and to which number (phoneNumber, optional extension, plus the same name/reason/message fields). Manage them at /transfer-reasons with the same CRUD verbs (plus PATCH /transfer-reasons/{id} for partial updates). When a call is transferred, the end-of-call report includes the matching transfer_reason_id.

Where texting shows up#

Text exchanges are conversations, not calls. Read them via GET /conversations, which is filterable by channel (as well as assistantId, status, date range, and free-text search) and paginated. GET /conversations/{id} returns a single conversation with its messages, and GET /conversations/export exports up to 10,000 conversations as JSON.

When a messaging conversation starts and ends, OnCore fires the messaging webhooks — see End-of-conversation report.