|FHIR R4 · HL7 v2.5.1 · 100% synthetic

Describe the patient.
Get the feed.

Generate production-realistic HL7v2 sequences and FHIR R4 bundles from a clinical scenario. Deterministic, believably messy, and never real PHI.

curl -X POST 'https://gzp3bhmytd.us-east-1.awsapprunner.com/v1/hl7v2/generate?preset=chf-ckd-admit&seed=42&format=raw'
synthhl7-api · us-east-1 hl7v2 · raw
seed 42 · byte-identical on every run verbatim API output

|The problem

Your interface will meet real data. Your test suite won't.

Epic's sandbox ships about 18 pristine test patients. Cerner's has around 30. Public HAPI servers are a junk drawer with no auth. And Synthea will hand you a random small town when what you actually need is one 62-year-old with heart failure and stage-3 CKD who came in through the ED on a Tuesday night.

So integration teams do what they've always done: burn a third of their engineering time on test-data workarounds, and meet the real bugs at go-live. That's the part we're deleting.

|How it works

Plain English in. Production mess out.

Say what you need

A sentence, not a config file. Age, conditions, route of admission, labs, length of stay — whatever the test case calls for.

"62-year-old female with CHF and stage-3 CKD, admitted via the ED, 4 lab panels, discharged after 5 days"

Scribe writes the spec — and only the spec

Scribe, our clinical-language engine, turns the sentence into a structured spec. It never writes a segment or a resource itself, so there are no hallucinated codes in your test data.

{ "age": 62, "sex": "female", "conditions": [ {"icd10Code": "I50.9"}, {"icd10Code": "N18.3"} ], "encounter": { "class": "inpatient", "admitViaEd": true, "lengthOfStayDays": 5 } }

Deterministic generators emit both formats

Template-driven builders turn the spec into coherent v2 sequences and FHIR bundles — golden-file tested, validated against base R4, round-tripped through NHapi.

?seed=42 → byte-identical output ADT^A04 → A01 → 4×ORU^R01 → A03 + one FHIR transaction Bundle, same patient, same values

|Why it feels real

Fifteen years of integration scar tissue, encoded.

?profile=epic-like

Vendor-shaped mess

Four noise profiles inject the quirks you'll meet in production: duplicate MRNs, local codes beside standard ones, dropped fields, timezone-less timestamps, names in the wrong case.

2160-0 → 1.99 H

Labs that match the story

A CKD patient's creatinine comes back high and flagged — not random-normal. Conditions skew exactly the values your interface logic branches on.

ADT ⇄ Bundle

One patient, both standards

The same clinical story renders as an HL7v2 feed and a FHIR R4 transaction bundle. Same name, same MRN, same lab values — test the mapping, not two strangers.

?seed=42

Reproducible on purpose

Every generator is deterministic. Pin a seed in CI and diff byte-identical output forever. Test data that changes under you isn't test data.

POST /v1/sandbox/seed · coming soon

A FHIR server to test against

Seed generated bundles into a hosted HAPI FHIR sandbox and query them straight back over plain REST. Sandbox sign-in ships with early access — waitlist members get it first.

npx synthhl7

Open-source CLI

MIT-licensed. Pipe presets, spec files, or plain-English scenarios into your interface engine from a one-line command.

|Compliance

No PHI. By design, not by paperwork.

SynthHL7 never ingests, stores, or processes real patient data — there is no upload path for it to exist. Every name comes from a fixed synthetic corpus; every MRN, address, and lab value from a seeded generator. Nothing to de-identify, no BAA to sign, nothing to breach. And none of it is for clinical use.

|Early access

Get a free-tier key the day sign-ups open.

We're onboarding design partners now. Leave an email and you'll get a free-tier API key — 100 generations a month — at launch, plus a say in which scenario presets we build first.

No spam — launch note and design-partner invites only.