Send a message to a patient
/patient-messagesSends a message to a patient by patient_id or phone number, from one of the organization’s numbers: from, else the key’s default number, else the organization’s only number. An organization with several numbers and no default answers 422 from_required. The message goes in that number’s team’s conversation with the patient, and comes from the API identity the key belongs to (an automated sender on the account, never a staff member); until identities are on for the account, it shows the key’s name with an API marker. BloomText finds the patient (or creates one for a new phone number), finds or starts the conversation, and sends. Messages go by secure link unless channel is sms.
Run in Postman: import the collection, set api_key, and find this request in its folder.
Query parameters
org_idUUIDThe organization the call acts on, from List organizations. Required when an account API key reaches more than one organization; an organization key or a key limited to one organization can leave it out.
Headers
Idempotency-KeyUUIDRequiredA UUID you generate for each write. Retrying with the same key returns the original result for 24 hours. Reusing a key with a different method, path, or body returns 409.
Body parameters
A message to a patient.
toRecipientRequiredWho to message. Provide exactly one of patient_id or phone.
Show child attributes
patient_idUUIDThe patient to message.
phonestringA mobile number. BloomText finds the patient with this number, or creates one.
patientPatientDetailsDetails for a patient BloomText creates while sending. Ignored when the phone number matches an existing patient.
Show child attributes
first_namestringFirst name.
last_namestringLast name.
date_of_birthdateDate of birth.
emailstringEmail address.
mrnstringThe patient’s ID in your system.
bodystringRequiredMessage text: up to 1,600 characters for sms, or 40,000 for secure. A longer one returns 422 too_long.
channelsecure, smsRequiredRequired; there’s no default. sms sends the text itself as a regular SMS from the clinic’s number. secure sends a text or email with a secure link, and the message stays in BloomText.
fromstringThe clinic phone number to send from, in E.164 format, like +15125550100. Defaults to the API key’s default number, else the organization’s only number; an organization with several numbers and no default answers 422 from_required. See List phone numbers.
Any other field returns 422 unknown_field. See Unknown fields are rejected.
Returns
Returns 201 Created with the sent Message object in message, plus patient_created and conversation_created to say whether BloomText created either one. Returns 202 Accepted with the same body when the message waits for the patient’s consent to texting, with delivery.status consent_requested.
Errors
Failed requests return application/problem+json problem details. The errors specific to this endpoint:
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request is malformed, such as invalid JSON. |
| 400 | org_id_required | The key reaches more than one organization: pass org_id. |
| 401 | invalid_token | The API key is missing or malformed, or isn’t a BloomText key. |
| 401 | key_revoked | The API key was revoked. |
| 401 | key_expired | The API key’s expiry has passed. |
| 403 | insufficient_scope | The key doesn’t have the scope this endpoint needs. |
| 403 | org_not_reachable | The key can’t reach the organization in org_id. |
| 403 | plan_required | The organization’s plan doesn’t include patient messaging. |
| 404 | not_found | The patient_id doesn’t exist in the organization, or from isn’t one of its phone numbers. |
| 409 | idempotency_key_reused | The Idempotency-Key was already used with a different request. |
| 409 | idempotency_request_in_progress | A request with this Idempotency-Key is still running. Retry shortly. |
| 409 | ambiguous_recipient | The phone number belongs to more than one patient. candidates lists them; send again with a patient_id, or add patient.mrn. |
| 409 | recipient_mismatch | patient.mrn belongs to a patient with a different phone number, or the number’s only patient has a different MRN. Nothing is sent. candidates lists that patient; update their phone, or send with their patient_id. |
| 422 | validation_failed | A field failed validation. See field_errors. |
| 422 | from_required | The organization has several phone numbers and no default. detail and numbers list them; set from to one. |
| 422 | channel_required | channel is missing. Set it to sms or secure; there’s no default. |
| 422 | too_long | The body is over max characters (1,600 for sms, 40,000 for secure). length and max say by how much. |
| 422 | patient_has_no_phone | An sms send to a patient with no phone number. |
| 422 | no_contact_method | A secure send to a patient with neither phone nor email. |
| 422 | patient_opted_out | The patient opted out: they replied STOP to one of the organization’s numbers, or staff recorded their opt-out. No number can text them until they reply START. number and since say which number the text would have come from and since when. |
| 422 | carrier_blocked | The carrier refused an earlier text to the patient because they replied STOP to that number, so the organization’s numbers don’t text them until they text START to one of them. number and since as above. |
| 422 | number_blocked | An admin in your organization blocked the patient’s number. Only an admin can unblock it, in the app. number and since as above. |
| 422 | number_unreachable | An earlier text failed because the patient’s number can’t receive texts: it’s a landline, or its carrier couldn’t be reached. It clears when the patient texts one of the organization’s numbers, when their phone number is changed, or when an admin clears it in the app. number and since as above. |
| 429 | rate_limited | Too many requests. Retry after Retry-After seconds. |