Skip to main content
The Messages API sends one text to a client on the practice’s behalf. On phones that support RCS, the client sees the practice’s name, logo and verified badge, plus rich content: cards with images and buttons, carousels, and reply chips. Every message also carries plain fallback_text, which Oliver sends as an SMS when RCS isn’t available. Messages appear in the practice’s Oliver inbox like any other text, so staff see what was sent and can pick up the client’s reply.

How it works

  1. Send: POST to /messages with a recipient, the fallback_text and the content.
  2. Delivery: with channel: "auto" (the default), Oliver sends RCS when the practice’s RCS sender is live and the client’s phone supports it, and fallback_text as an SMS otherwise. The client gets one or the other, never both.
  3. Status: follow the message through sent → delivered → read (RCS only) with GET /messages/{id}, or pass a callback_url to get a status webhook on each change.
An RCS message is either a text bubble or a card, never both. To open with a sentence like “Hi! Millie has preventive care coming due”, put it in the card’s description.

Content types

Sending with cURL

Buttons and suggestions

Calendar and share-location actions aren’t supported by our RCS provider; requests that use them return 400.

Limits

Invalid content returns 400 with every offending field:

Statuses

Statuses only move forward. A message that falls back from RCS to SMS can report a delivery error for the RCS attempt and still end delivered.

Sending hours

Messages are sent immediately; Oliver doesn’t queue them for later. Send during the practice’s sending hours, 8am to 9pm clinic time, the same window as the practice’s own reminders. Outside them the request returns 400 and nothing is sent:

Errors that mean nothing was sent

A 400 stores nothing, so you can fix the request and reuse its reference_id.

Opt-outs

Clients who replied STOP are never texted. The response is 200 with status: "suppressed" and no text is sent.

Idempotency

Set reference_id to a unique value per message. Re-sending the same reference_id returns the existing message instead of texting the client again, so retries are safe, including after a 502 or a timeout. reference_id is echoed in every response and webhook.

Rate limits

Each practice is limited to 120 messages per minute. Exceeding the limit returns 429 Too Many Requests.