Appearance
For AI Agents
Use this page when the consumer is an AI coding assistant or another automated tool that needs operational guidance instead of conceptual package docs.
Pick one release first
Choose the FHIR release before choosing schemas or model types. Keep the same release in the type import, schema import, and surrounding workflow.
Use fhir-zod/<release>/<Resource> for concrete resources; use fhir-zod/<release> for shared datatypes and release-level exports.
ts
import { PatientSchema, type Patient } from "fhir-zod/r4/Patient";Do not mix releases unless the code is explicitly translating between them.
Validate unknown JSON
Use safeParse when input is untrusted and validation failure should stay in normal control flow.
ts
import { PatientSchema } from "fhir-zod/r4/Patient";
const payload: unknown = await fetch("/api/patient/example").then((response) =>
response.json(),
);
const result = PatientSchema.safeParse(payload);
if (!result.success) {
console.error(result.error.issues);
} else {
console.log(result.data.resourceType);
}Validate Bundle resources
BundleSchema validates the Bundle envelope and recursively validates known entry resources through the release-specific resourceType dispatcher.
ts
import { BundleSchema, type Bundle } from "fhir-zod/r4/Bundle";
const bundle: Bundle = {
resourceType: "Bundle",
type: "collection",
entry: [
{
resource: {
resourceType: "Patient",
id: "example",
},
},
],
};
BundleSchema.parse(bundle);Do not assume
- Structural validation is not full FHIR semantics, terminology validation, or profile validation.
Reference.referencedoes not prove the referenced resource exists.- R5, R4B, R4, and STU3 should not be mixed unless the code is translating deliberately.
*SchemaInternalsymbols are generated implementation details, not public API.
When validation fails
Prefer safeParse for repair and retry loops. Inspect result.error.issues, keep the issue paths, and preserve those paths in logs or follow-up prompts so fixes can be targeted to the failing fields.
ts
import { ObservationSchema } from "fhir-zod/r4/Observation";
const payload: unknown = await fetch("/api/observation/example").then(
(response) => response.json(),
);
const result = ObservationSchema.safeParse(payload);
if (!result.success) {
const issues = result.error.issues.map((issue) => ({
code: issue.code,
message: issue.message,
path: issue.path,
}));
console.error(issues);
}Use parse only when invalid input should throw immediately and the caller does not need to recover in normal control flow.