Skip to main content

Receiving SMS

When a patient sends a message to a registered Twilio number, the integration creates a Communication resource automatically. No application code is required.

note

You must first register an inbound webhook for each Twilio number that should receive messages.

Inbound Communication Resource​

The created resource has:

  • status: completed
  • category: inbound direction coding (https://medplum.com/twilio-sms-direction | inbound)
  • medium: SMSWRIT
  • identifier: the Twilio MessageSid (used for deduplication on retried deliveries)
  • extension: twilio-from-number (patient's number) and twilio-to-number (your Twilio number)
  • payload: the SMS body text

No partOf, sender, or recipient is set on inbound messages — see Threading for how to organize messages into conversations.

{
"resourceType": "Communication",
"status": "completed",
"identifier": [{ "system": "https://www.twilio.com/", "value": "SMxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" }],
"category": [{
"coding": [{ "system": "https://medplum.com/twilio-sms-direction", "code": "inbound" }]
}],
"medium": [{
"coding": [{ "system": "https://terminology.hl7.org/CodeSystem/v3-ParticipationMode", "code": "SMSWRIT" }]
}],
"extension": [
{ "url": "https://medplum.com/twilio-from-number", "valueString": "+15005550001" },
{ "url": "https://medplum.com/twilio-to-number", "valueString": "+15005550006" }
],
"sent": "2025-01-15T09:15:00Z",
"payload": [{ "contentString": "Sounds good, see you then!" }]
}

Webhook Security​

The registered webhook URL embeds clientId:clientSecret credentials for Medplum authentication. The integration also independently validates Twilio's HMAC-SHA1 x-twilio-signature header. Both layers must pass for a request to be processed.