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:
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.
| Field | Description |
|---|---|
name | Friendly label for internal use, e.g. "Car Rental Price List" |
reason | The trigger, e.g. "When the caller asks for available cars and wants to see pricing." |
message | What the assistant says before sending, e.g. "Sure, I'll send you a price list via SMS right now." |
content | The actual SMS body sent to the caller, e.g. "Here's the price list: https://example.com/prices" |
assistantId | The 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.