HTTPS REST API — Submit HL7 Messages via HTTP
Synura accepts HL7 v2 messages over HTTPS via a single REST endpoint. No socket programming, no MLLP framing — just an HTTP POST with the raw message in the body.
This page covers sending messages to Synura. To receive messages from Synura, see Receiving messages over HTTPS.
Endpoint
Section titled “Endpoint”POST https://{subdomain}.synura.io/hl7Replace {subdomain} with the value assigned to your organisation (e.g. acmelab).
Headers
Section titled “Headers”| Header | Required | Value |
|---|---|---|
X-Synura-Api-Key | Yes | Your API key from the Synura dashboard |
Content-Type | Yes | application/hl7-v2 or text/plain |
X-Synura-Tenant | No | Your subdomain — only needed if you are not using subdomain routing (e.g. posting to a shared gateway) |
Request body
Section titled “Request body”The body is a raw HL7 v2 message. No JSON wrapping, no Base64 encoding — just the pipe-delimited HL7 text.
MSH|^~\&|SENDER|FACILITY|SYNURA|RECV|20260416120000||ADT^A01|MSG001|P|2.5EVN|A01|20260416120000PID|1||PAT001^^^HOSP||DOE^JANE||19850115|FPV1|1|I|WARD1^ROOM1^BED1Response
Section titled “Response”Success (200): The response body contains an HL7 ACK message.
MSH|^~\&|SYNURA|RECV|SENDER|FACILITY|20260416120001||ACK^A01|ACK001|P|2.5MSA|AA|MSG001Errors:
All non-2xx responses (except 502) return a JSON body with a single error field:
{ "error": "descriptive error message"}| Status | Meaning | Example error value |
|---|---|---|
400 | Missing tenant — neither subdomain routing nor X-Synura-Tenant header identified a tenant | tenant not identified — use tenant subdomain or X-Synura-Tenant header |
400 | Empty body — no HL7 message was provided in the request body | request body is empty — expected an HL7 v2 message |
400 | Malformed MSH — the HL7 message could not be parsed (invalid or missing MSH segment) | malformed HL7 message: {detail} |
400 | Routing failure — the receiving facility in MSH-6 does not match any configured org link for this tenant | routing failed: {detail} |
401 | Missing API key — X-Synura-Api-Key header not provided | missing API key — set X-Synura-Api-Key header |
403 | Invalid API key — the key does not match any active key for this tenant | invalid API key |
404 | Unknown tenant — the subdomain does not match any configured endpoint | unknown tenant: {subdomain} |
415 | Wrong content type — use application/hl7-v2 or text/plain | Content-Type must be application/hl7-v2 or text/plain |
502 | Delivery failed — the message was accepted but could not be delivered downstream. Note: the 502 response returns an HL7 NACK (not JSON). | (HL7 ACK with AE or AR status) |
curl example
Section titled “curl example”curl -X POST https://acmelab.synura.io/hl7 \ -H "X-Synura-Api-Key: your-api-key-here" \ -H "Content-Type: application/hl7-v2" \ -d 'MSH|^~\&|SENDER|FACILITY|SYNURA|RECV|20260416120000||ADT^A01|MSG001|P|2.5EVN|A01|20260416120000PID|1||PAT001^^^HOSP||DOE^JANE||19850115|FPV1|1|I|WARD1^ROOM1^BED1'Rate limits
Section titled “Rate limits”There are no per-request rate limits. If you are planning to send high volumes (more than 1,000 messages per minute), contact support@synura.io so we can ensure your endpoint is provisioned appropriately.
When to use HTTPS vs Synura Connect
Section titled “When to use HTTPS vs Synura Connect”| Use HTTPS when… | Use Synura Connect when… |
|---|---|
| You don’t have an integration engine | You already run Mirth, Rhapsody, Iguana, etc. |
| You’re building a custom application | You need persistent connections for high throughput |
| You want the simplest possible integration | Your engine natively supports MLLP over TLS |
| You’re prototyping or testing | You’re in production with an established HL7 pipeline |
Both methods deliver messages to the same downstream destination. Choose whichever fits your stack.
Support
Section titled “Support”Contact support@synura.io with your subdomain and any error responses you’re receiving.