PracticeHI FHIR API

Standards-based patient and practice data access for applications, patients and health information networks. FHIR R4 · US Core 7.0.0 (USCDI v4) · SMART App Launch 2.2 · Bulk Data Access 2.0. This page is public and needs no account.

Service base URL

One base URL serves every practice on PracticeHI; the practice a request reaches is the one the access token was issued for.

https://practicehi.com/fhir/r4
Capability statementhttps://practicehi.com/fhir/r4/metadata
SMART configurationhttps://practicehi.com/fhir/r4/.well-known/smart-configuration
OpenID configurationhttps://practicehi.com/.well-known/openid-configuration
Authorization server keyshttps://practicehi.com/.well-known/jwks
Authorize · token · introspect · revokehttps://practicehi.com/connect/authorize · https://practicehi.com/connect/token · https://practicehi.com/connect/introspect · https://practicehi.com/connect/revoke
Service base URL list (machine-readable)https://practicehi.com/developers/fhir/endpoints — a FHIR Bundle of the Endpoint and one Organization per practice, published under 45 CFR 170.404(b)(2).

Standards and versions

FHIRR4 (4.0.1), JSON. Read and search only; no writes through this API.
ProfilesUS Core 7.0.0 (USCDI v4). Every served type lists its profiles in the capability statement's supportedProfile.
AuthorizationSMART App Launch 2.2: standalone launch (patient and clinician), EHR launch, PKCE (S256) required, SMART v2 scopes (patient/Observation.rs) and SMART v1 scopes (patient/Observation.read), sub-resource (granular) scopes such as patient/Condition.rs?category=http://hl7.org/fhir/us/core/CodeSystem/condition-category|problem-list-item, openid fhirUser, launch, launch/patient, offline_access. Backend services (system-level) with private_key_jwt.
Bulk dataBulk Data Access 2.0 (STU2), group export: GET Group/practice-{practiceId}/$export, NDJSON output, _type, _since, _outputFormat, status polling and cancel.
TransportHTTPS only, TLS 1.2 or later.

Registering an application

Applications are registered by PracticeHI for the practice(s) that will authorize them; there is no self-service registration form. Registration is open to any developer. Send the request through PracticeHI Support (the Support conversation inside the application, available to any practice user) or to the contact published at practicehi.com, with:

You receive a client id (and a secret when symmetric). A single registration serves single-patient (SMART) and multi-patient (bulk) access as requested; the same process registers a client for one practice or many.

Scopes

Every resource type below may be named with patient/ (the authorizing patient's record) or user/ (what the signed-in user may see) and the permissions .r, .s, .rs (or v1 .read); patient/*.rs and user/*.rs name them all. Backend-services clients receive system/*.read.

AllergyIntolerance CarePlan CareTeam Condition Coverage Device DiagnosticReport DocumentReference Encounter Endpoint EpisodeOfCare Goal Immunization Location MedicationDispense MedicationRequest MedicationStatement Observation Organization Patient Practitioner PractitionerRole Procedure Provenance QuestionnaireResponse RelatedPerson ServiceRequest Specimen

Named but served without data (the practice records none; a search answers an empty set): Medication.

The person authorizing chooses which parts of the record an app may see (all, none, or by type and category); the app is granted what was allowed and the token response's scope says what that was.

Tokens and sessions

Access token15 minutes. A JWT (RFC 9068) for the resource server; the SMART launch context (patient, encounter, fhirUser, need_patient_banner, smart_style_url) rides the token response.
Refresh tokenIssued when offline_access is granted, to confidential and public (native) clients alike; valid for 90 days. Each refresh returns a new refresh token valid for a new 90 days; the presented token remains valid until its own expiry (no rotation), so an app that persists a token is never locked out by a concurrent refresh.
RevocationBy the app at /connect/revoke, or by the person under My Profile › Connected apps, which ends every token of that authorization.
Introspection/connect/introspect (RFC 7662) with the client's own credential, for tokens it holds.
Backend servicesclient_credentials with a private_key_jwt assertion (RS384 / ES384); 5-minute access tokens; the client's JWK Set is fetched from its JWKS URL and re-fetched when the response's Cache-Control max-age elapses.

Reading data

Bulk data (multi-patient)

GET https://practicehi.com/fhir/r4/Group/practice-{practiceId}/$export
Accept: application/fhir+json
Prefer: respond-async
Authorization: Bearer {system token}

Answers 202 Accepted with Content-Location = the status URL; poll it (202 while running, 200 with the manifest when complete); fetch each file with the same token; DELETE the status URL to cancel. _type narrows the types, _since keeps resources whose meta.lastUpdated (or principal date) is not before the instant; resources referenced by the exported ones (practitioners, organizations, locations) are included regardless of their date. Files stay until the export is cancelled or superseded; fetch them promptly.

Terms of use