Developers · Standards-based API
Bulk Data export
Export a practice's whole patient population as FHIR NDJSON files, asynchronously, with a SMART Backend Services token. Ask only for what changed since your last run with _since.
At a glance
| Status | Live in production. |
| Level | Group-level only: GET /Group/{id}/$export. Each practice has one dynamic Group containing every patient not deleted at processing time. System-level /$export and patient-level /Patient/$export are not available. |
| Standard | FHIR Bulk Data Access 2.0. |
| Authentication | A SMART Backend Services token with a system read scope, plus system/Group.rs to discover the Group. |
| Output | application/fhir+ndjson, one resource per line, one file set per resource type. |
| Files | Signed links that expire after 24 hours and still require a current token from the same client and practice. |
| Cost | No fee and no revenue share. |
Live, with certification in progress
The FHIR and authorization hosts are live in production. ONC certification is in progress and ChartVoyant is not yet CHPL-listed. An internal security assessment has been completed with follow-up remediation ongoing; an independent external security review has not been completed. Access requires an enabled practice, a registered app and the right patient or practice authorization.
The flow
Relative to the practice's FHIR base. Synthetic placeholders throughout.
1. Find the Group
GET /r4/your-practice/Group Authorization: Bearer BACKEND_ACCESS_TOKEN
2. Kick off
GET /r4/your-practice/Group/GROUP_ID/$export?_type=Patient,Observation&_since=2026-01-01T00%3A00%3A00Z Authorization: Bearer BACKEND_ACCESS_TOKEN Accept: application/fhir+json Prefer: respond-async HTTP/1.1 202 Accepted Content-Location: STATUS_URL
3. Poll, then download
GET STATUS_URL # 202 with X-Progress and Retry-After while running
HTTP/1.1 200 OK
{"transactionTime":"2026-09-13T12:00:00Z","request":"ORIGINAL_REQUEST_URL",
"requiresAccessToken":true,
"output":[{"type":"Patient","url":"SIGNED_FILE_URL","count":3}],"error":[]}
GET SIGNED_FILE_URL # same token; one FHIR resource per line
DELETE STATUS_URL # cancel, and invalidate the files
Honor Retry-After between polls. Check the error array, and do not treat partial output as a complete export. If an export is already running for the practice, kickoff returns 429 with Retry-After.
Parameters
| Parameter | Support |
|---|---|
| _type | Comma-separated resource types. Request only types your scopes allow; system/*.rs may request every supported class. |
| _since | A FHIR instant, for example 2026-01-01T00:00:00Z. Returns resources changed strictly after it. A future instant is rejected. |
| _outputFormat | NDJSON only: application/fhir+ndjson (the default), application/ndjson or ndjson. |
| Anything else | Rejected with 400, including _typeFilter and _elements. |
| Headers | Accept: application/fhir+json and Prefer: respond-async are required. |
How to get access
- Read the guide
The full SMART on FHIR-4 developer guide and the public practice directory need no account, payment or agreement.
- Request registration
Email info@chartvoyant.com or use the support form with the details your system needs. Send no patient records, private keys or client secrets.
- We register and enable it
We apply the same identity and configuration checks to every developer, and register and enable a complete eligible request within five business days. If something is missing, we tell you what.
- Authorize and connect
The practice authorizes your system for its data. Then request a token with a signed assertion and call its FHIR base.
No fee
There is no fee to patients, practices or app developers for the standardized FHIR API, registration, testing, production access, calls or Bulk Data, and no revenue share. The API Use Agreement and profit share for the separate ChartVoyant API do not apply here.