SQL on FHIR
2.1.0-pre - release
SQL on FHIR, published by SQL on FHIR Working Group. This guide is not an authorized publication; it is the continuous build for version 2.1.0-pre built by the FHIR (HL7® FHIR® Standard) CI Build. This version is based on the current content of https://github.com/FHIR/sql-on-fhir-v2/ and changes regularly. See the Directory of published versions
| Official URL: http://sql-on-fhir.org/OperationDefinition/$viewdefinition-export | Version: 2.1.0-pre | |||
| Active as of 2026-01-22 | Computable Name: ViewDefinitionExport | |||
Export a view definition. User can provide view definition references and/or resources as part of the input parameters.
Overview:
The $viewdefinition-export operation is an asynchronous operation that enables the bulk export of FHIR data that has been transformed using ViewDefinitions. Multiple ViewDefinitions can be exported in a single operation, allowing efficient batch processing of related views. Exported data can be written in various formats (CSV, NDJSON, Parquet) and delivered to file storage systems such as Amazon S3, Azure Blob Storage, or a local file system.
Use Cases:
Endpoints:
{BaseUrl}/$viewdefinition-export (system level){BaseUrl}/ViewDefinition/$viewdefinition-export (type level){BaseUrl}/ViewDefinition/{id}/$viewdefinition-export (instance level)URL: [base]/$viewdefinition-export
URL: [base]/CanonicalResource/$viewdefinition-export
URL: [base]/CanonicalResource/[id]/$viewdefinition-export
| Use | Name | Scope | Cardinality | Type | Binding | Documentation |
| IN | view | system, type | 1..* | One or more ViewDefinitions to export. Each repetition identifies a single view. | ||
| IN | view.name | 0..1 | string | Optional friendly name for the exported view output. | ||
| IN | view.viewReference | 0..1 | Reference | Reference to a ViewDefinition stored on the server. | ||
| IN | view.viewResource | 0..1 | https://sql-on-fhir.org/ig/StructureDefinition/ViewDefinition | Inline ViewDefinition resource to export. | ||
| IN | clientTrackingId | system, type | 0..1 | string | Client-provided tracking identifier for the export operation. | |
| IN | _format | system, type | 0..1 | code | Output Format Codes (Extensible) | Bulk export output format (for example csv, ndjson, parquet, json). |
| IN | header | system, type | 0..1 | boolean | Include CSV headers (default true). Applies only when csv output is requested. | |
| IN | patient | system, type | 0..* | Reference | Filter exported data to the supplied patient(s). | |
| IN | group | system, type | 0..* | Reference | Filter exported data to members of the supplied group(s). | |
| IN | _since | system, type | 0..1 | instant | Export only resources updated since this instant. | |
| IN | source | system, type | 0..1 | string | External data source to use for the export (for example a URI or bucket name). | |
| OUT | exportId | 1..1 | string | Server-generated identifier assigned to the export request. | ||
| OUT | clientTrackingId | 0..1 | string | Echoed client tracking identifier when provided. | ||
| OUT | status | 1..1 | code | Export Status Codes (Required) | Status of the export (accepted, in-progress, completed, cancelled, failed). | |
| OUT | location | 1..1 | uri | URL to poll for export status updates. | ||
| OUT | cancelUrl | 0..1 | uri | Optional URL for cancelling the export. | ||
| OUT | _format | 0..1 | code | Output Format Codes (Extensible) | Format of the exported files (echoed from input if supplied). | |
| OUT | exportStartTime | 0..1 | instant | Timestamp when the export operation began. | ||
| OUT | exportEndTime | 0..1 | instant | Timestamp when the export operation completed. | ||
| OUT | exportDuration | 0..1 | integer | Duration of the export in seconds. | ||
| OUT | estimatedTimeRemaining | 0..1 | integer | Estimated seconds remaining until completion. | ||
| OUT | output | 0..* | Output information for each exported view. | |||
| OUT | output.name | 1..1 | string | Name assigned to the exported view output. | ||
| OUT | output.location | 1..* | uri | Download URL(s) for the exported file(s). |
This operation follows the FHIR Asynchronous Interaction Request Pattern:
Prefer: respond-async header and one or more view parameters202 Accepted with Content-Location header pointing to status URL202 Accepted while export is in progress (MAY include interim results)303 See Other with Location header pointing to result URLNote: This operation uses Parameters resource format instead of Bundle format to:
Note: The 303 See Other redirect pattern cleanly separates status polling from result retrieval, eliminating ambiguity around error handling and request header scope.
Client Server
│ │
│ ┌─────────────────────────────────────────┐ │
│ │ POST /ViewDefinition/$viewdefinition-export│
│ │ Content-Type: application/fhir+json │ │
│ │ Prefer: respond-async │ │
│ │ Accept: application/fhir+json │ │
│ │ │ │
│ │ { "resourceType": "Parameters", │ │
│ │ "parameter": [ │ │
│ │ {"name": "view", "part": [...]} │ │
│ │ ]} │ │
│ └─────────────────────────────────────────┘ │
│ ─────────────────────────────────────────────>│
│ │ Step 1: Kick-off
│ ┌─────────────────────────────────────────┐ │
│ │ 202 Accepted │ │
│ │ Content-Location: /status/abc123 │ │
│ │ │ │
│ │ { "resourceType": "Parameters", │ │
│ │ "parameter": [ │ │
│ │ {"name": "exportId", │ │
│ │ "valueString": "abc123"}, │ │
│ │ {"name": "status", │ │
│ │ "valueCode": "accepted"} │ │
│ │ ]} │ │
│ └─────────────────────────────────────────┘ │
│ <─────────────────────────────────────────────│
│ │
├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─┤
│ │
│ ┌─────────────────────────────────────────┐ │
│ │ GET /status/abc123 │ │
│ │ Accept: application/fhir+json │ │
│ └─────────────────────────────────────────┘ │
│ ─────────────────────────────────────────────>│
│ │ Step 2: Polling
│ ┌─────────────────────────────────────────┐ │ (repeat while
│ │ 202 Accepted │ │ in progress)
│ │ Retry-After: 10 │ │
│ │ X-Progress: 45% │ │
│ │ │ │
│ │ { "resourceType": "Parameters", │ │
│ │ "parameter": [ │ │
│ │ {"name": "status", │ │
│ │ "valueCode": "in-progress"} │ │
│ │ ]} │ │
│ └─────────────────────────────────────────┘ │
│ <─────────────────────────────────────────────│
│ ... (repeat) ... │
│ │
├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─┤
│ │
│ ┌─────────────────────────────────────────┐ │
│ │ GET /status/abc123 │ │
│ └─────────────────────────────────────────┘ │
│ ─────────────────────────────────────────────>│
│ │ Step 3: Completion
│ ┌─────────────────────────────────────────┐ │ (redirect to result)
│ │ 303 See Other │ │
│ │ Location: /result/abc123 │ │
│ └─────────────────────────────────────────┘ │
│ <─────────────────────────────────────────────│
│ │
├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─┤
│ │
│ ┌─────────────────────────────────────────┐ │
│ │ GET /result/abc123 │ │
│ │ Accept: application/fhir+json │ │
│ └─────────────────────────────────────────┘ │
│ ─────────────────────────────────────────────>│
│ │ Step 4: Result
│ ┌─────────────────────────────────────────┐ │
│ │ 200 OK │ │
│ │ Content-Type: application/fhir+json │ │
│ │ Expires: Mon, 21 Jan 2026 16:00:00 GMT │ │
│ │ │ │
│ │ { "resourceType": "Parameters", │ │
│ │ "parameter": [ │ │
│ │ {"name": "output", "part": [ │ │
│ │ {"name": "name", │ │
│ │ "valueString": "patients"}, │ │
│ │ {"name": "location", │ │
│ │ "valueUrl": "/export/.../..."} │ │
│ │ ]} │ │
│ │ ]} │ │
│ └─────────────────────────────────────────┘ │
│ <─────────────────────────────────────────────│
│ │
├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─┤
│ │
│ ┌─────────────────────────────────────────┐ │
│ │ GET /export/abc123/patients.ndjson │ │
│ └─────────────────────────────────────────┘ │
│ ─────────────────────────────────────────────>│
│ │ Step 5: Download
│ ┌─────────────────────────────────────────┐ │
│ │ 200 OK │ │
│ │ Content-Type: application/fhir+ndjson │ │
│ │ │ │
│ │ {"id":"pt1","name":[{"given":["John"]}]}│ │
│ │ {"id":"pt2","name":[{"given":["Jane"]}]}│ │
│ └─────────────────────────────────────────┘ │
│ <─────────────────────────────────────────────│
│ │
Alternative Flows:
┌─────────────────────────────────────────────────────────────────┐
│ CANCELLATION (Recommended) │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Client Server │
│ │ │ │
│ │ DELETE /status/abc123 │ │
│ │ ─────────────────────────────────────────────>│ │
│ │ │ │
│ │ 202 Accepted │ │
│ │ <─────────────────────────────────────────────│ │
│ │ │ │
│ │ GET /status/abc123 (subsequent poll) │ │
│ │ ─────────────────────────────────────────────>│ │
│ │ │ │
│ │ 404 Not Found │ │
│ │ <─────────────────────────────────────────────│ │
│ │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ ERROR HANDLING (Operation Failure) │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Client Server │
│ │ │ │
│ │ GET /status/abc123 │ │
│ │ ─────────────────────────────────────────────>│ │
│ │ │ │
│ │ 303 See Other │ │
│ │ Location: /result/abc123 │ │
│ │ <─────────────────────────────────────────────│ │
│ │ │ │
│ │ GET /result/abc123 │ │
│ │ ─────────────────────────────────────────────>│ │
│ │ │ │
│ │ 500 Internal Server Error │ │
│ │ { "resourceType": "OperationOutcome", │ │
│ │ "issue": [{ │ │
│ │ "severity": "error", │ │
│ │ "code": "exception", │ │
│ │ "diagnostics": "Export failed: ..." │ │
│ │ }]} │ │
│ │ <─────────────────────────────────────────────│ │
│ │
└─────────────────────────────────────────────────────────────────┘
The operation can export data from:
source parameterOptional filtering parameters:
patient - Export only resources for this patientgroup - Export only resources for this group_since - Export only resources updated since this timePrefer: respond-async (required) - Specifies that the response should be asynchronousAccept (recommended) - Specifies the format of the kick-off responseAccept (recommended) - Specifies the format of the status responseAccept (recommended) - Specifies the format of the final result responseRequest headers sent during status polling apply only to the status response, not to the final operation result. This separation:
| Name | Type | Min | Max | Description |
|---|---|---|---|---|
| view | complex | 1 | * | ViewDefinition(s) to export. Can be repeated to export multiple views in a single operation. See ViewDefinition Parameter |
The view parameter is a complex type that can be repeated multiple times to export several ViewDefinitions in a single operation. Each view parameter has the following parts:
| Name | Type | Min | Max | Description |
|---|---|---|---|---|
| view | complex | 1 | * | A ViewDefinition to export |
| view.name | string | 0 | 1 | Name for the export output. If not provided, ViewDefinition name will be used |
| view.viewReference | Reference | 0¹ | 1 | Reference to ViewDefinition on the server. Details |
| view.viewResource | ViewDefinition | 0¹ | 1 | Inline ViewDefinition resource |
¹ Either view.viewReference or view.viewResource is required
| Name | Type | Min | Max | Description |
|---|---|---|---|---|
| clientTrackingId | string | 0 | 1 | Client-provided tracking ID for the export operation |
| _format | code | 0 | 1 | Output format: csv, ndjson, parquet, json. Details |
| Name | Type | Min | Max | Description |
|---|---|---|---|---|
| patient | Reference | 0 | * | Filter by patient reference. Details |
| group | Reference | 0 | * | Filter by group membership. Details |
| _since | instant | 0 | 1 | Export only resources updated since this time. Details |
| Name | Type | Min | Max | Description |
|---|---|---|---|---|
| source | string | 0 | 1 | External data source (e.g., URI, bucket name). If absent, uses server data |
If server does not support a parameter, request should be rejected with 400 Bad Request
and OperationOutcome resource in the body with clarification that the parameter is not supported.
Server should document which parameters it supports in its CapabilityStatement.
The view.viewReference parameter MAY be specified using any of the following formats:
| A canonical URL (e.g. “http://specification.org/fhir/ViewDefinition/123 | 1.0.0”) |
Servers MAY choose which reference formats they support. Servers SHALL document which reference formats they support in their CapabilityStatement.
For servers that want to support all types of references, it is recommended to follow the following algorithm:
It is RECOMMENDED to support ‘json’, ‘ndjson’ and ‘csv’ formats by default. Servers may support other formats, but they should be explicitly documented in the CapabilityStatement.
When provided, the server SHALL NOT return resources in the patient compartments belonging to patients outside of this list.
If a client requests patients who are not present on the server,
the server SHOULD return details via a FHIR OperationOutcome resource in an error response to the request.
When provided, the server SHALL NOT return resources that are not a member of the supplied Group.
If a client requests groups that are not present on the server,
the server SHOULD return details via a FHIR OperationOutcome resource in an error response to the request.
Resources will be included in the response if their state has changed after the supplied time
(e.g., if Resource.meta.lastUpdated is later than the supplied _since time).
In the case of a Group level export, the server MAY return additional resources modified prior to the supplied time
if the resources belong to the patient compartment of a patient added to the Group after the supplied time (this behavior SHOULD be clearly documented by the server).
For Patient- and Group-level requests, the server MAY return resources that are referenced by the resources being returned
regardless of when the referenced resources were last updated.
For resources where the server does not maintain a last updated time,
the server MAY include these resources in a response irrespective of the _since value supplied by a client.
Output parameters appear in the result response (after following the 303 See Other redirect), not in status polling responses.
| Name | Type | Min | Max | Description |
|---|---|---|---|---|
| exportId | string | 1 | 1 | Server-generated export ID |
| clientTrackingId | string | 0 | 1 | Client-provided tracking ID (echoed from input if provided) |
| Name | Type | Min | Max | Description |
|---|---|---|---|---|
| _format | code | 0 | 1 | The format of the exported files (echoed from input if provided) |
| exportStartTime | instant | 0 | 1 | When the export operation began |
| exportEndTime | instant | 0 | 1 | When the export operation completed |
| exportDuration | integer | 0 | 1 | The actual duration of the export in seconds |
| Name | Type | Min | Max | Description |
|---|---|---|---|---|
| output | complex | 0 | * | Output information for each exported view |
| output.name | string | 1 | 1 | The name of the exported view. Details |
| output.location | uri | 1 | * | URL(s) to download the exported file(s). Details |
During status polling (202 Accepted responses), servers MAY include the following in the response body:
| Name | Type | Min | Max | Description |
|---|---|---|---|---|
| exportId | string | 0 | 1 | Server-generated export ID |
| estimatedTimeRemaining | integer | 0 | 1 | Estimated seconds until completion |
Servers MAY also include partial/interim results during polling. The format of interim responses is implementation-defined.
The output.name parameter identifies each exported view in the results. The value is determined as follows:
view.name was provided in the input parameters, that value is usedview.name was not provided, the name is taken from the ViewDefinition resource’s name elementThis allows clients to correlate output files with their requested views and provides meaningful filenames for the exported data.
For large exports, servers MAY partition the output into multiple files. When partitioning occurs:
output.location parameter can repeat within a single output entryfilename.part1.parquet, filename.part2.parquet)Example of partitioned output:
{
"name": "output",
"part": [
{
"name": "name",
"valueString": "patient_demographics"
},
{
"name": "location",
"valueUri": "https://example.com/export/123/patient_demographics.part1.parquet"
},
{
"name": "location",
"valueUri": "https://example.com/export/123/patient_demographics.part2.parquet"
},
{
"name": "location",
"valueUri": "https://example.com/export/123/patient_demographics.part3.parquet"
}
]
}
Clients MUST download all parts to obtain the complete dataset for a view.
The $viewdefinition-export operation uses standard HTTP status codes to indicate the outcome:
| Status Code | Description | When to Use |
|---|---|---|
| 202 Accepted | In Progress | Export request accepted or still in progress during polling |
| 303 See Other | Complete | Export complete, follow Location header to retrieve results |
| 400 Bad Request | Client Error | Invalid parameters, unsupported parameters, missing required headers |
| 404 Not Found | Not Found | ViewDefinition not found, or cancelled export status URL |
| 422 Unprocessable Entity | Business Logic Error | Valid request but ViewDefinition is invalid or cannot be processed |
| 500 Internal Server Error | Server Error | Unexpected server error (at result URL indicates operation failure) |
All error responses (4xx and 5xx) SHOULD include an OperationOutcome resource providing details about the error.
When the server does not support certain parameters, it returns 400 Bad Request:
HTTP/1.1 400 Bad Request
Content-Type: application/fhir+json
{
"resourceType": "OperationOutcome",
"issue": [
{
"severity": "error",
"code": "not-supported",
"diagnostics": "The server does not support the 'source' parameter"
}
]
}
When a provided ViewDefinition is invalid:
HTTP/1.1 422 Unprocessable Entity
Content-Type: application/fhir+json
{
"resourceType": "OperationOutcome",
"issue": [
{
"severity": "error",
"code": "invalid",
"diagnostics": "The ViewDefinition 'patient_summary' is invalid: column 'age' contains invalid FHIRPath expression",
"expression": ["parameter[0].part[1].resource.select[0].column[1].path"]
}
]
}
When a referenced ViewDefinition does not exist:
HTTP/1.1 404 Not Found
Content-Type: application/fhir+json
{
"resourceType": "OperationOutcome",
"issue": [
{
"severity": "error",
"code": "not-found",
"diagnostics": "ViewDefinition with reference 'ViewDefinition/non-existent' not found"
}
]
}
When filtering by patient or group that doesn’t exist:
HTTP/1.1 404 Not Found
Content-Type: application/fhir+json
{
"resourceType": "OperationOutcome",
"issue": [
{
"severity": "error",
"code": "not-found",
"diagnostics": "Patient with reference 'Patient/12345' not found"
}
]
}
For group references:
HTTP/1.1 404 Not Found
Content-Type: application/fhir+json
{
"resourceType": "OperationOutcome",
"issue": [
{
"severity": "error",
"code": "not-found",
"diagnostics": "Group with reference 'Group/diabetes-cohort' not found"
}
]
}
When processing multiple ViewDefinitions, servers SHOULD validate all of them before starting the export:
HTTP/1.1 400 Bad Request
Content-Type: application/fhir+json
{
"resourceType": "OperationOutcome",
"issue": [
{
"severity": "error",
"code": "not-found",
"diagnostics": "ViewDefinition 'patient-vitals' not found",
"expression": ["parameter[1]"]
},
{
"severity": "error",
"code": "invalid",
"diagnostics": "ViewDefinition 'lab-results' contains invalid resource type",
"expression": ["parameter[2]"]
}
]
}
POST ViewDefinition/$viewdefinition-export with Prefer: respond-async header.202 Accepted status codeContent-Location header with the absolute URL for subsequent status requests (polling location)status parameter set to accepted and location parameter400 Bad Request and OperationOutcome resource in the body.202 Accepted with optional Parameters resource for interim statusX-Progress header to indicate completion percentageRetry-After header to indicate when to retry303 See Other status codeLocation header pointing to the result URLLocation header:
200 OK status code with Parameters resource containing output locations303 See Other with Location header500 Internal Server Error)OperationOutcome with error detailsDELETE request to the status polling URL202 Accepted404 Not FoundExpires header to indicate result URL expiration401 Unauthorized or 403 Forbiddenoutput.location parameters.This example demonstrates the full lifecycle of an export operation from initiation through completion.
Step 1: Kick-off Request
Client initiates export of two ViewDefinitions with patient filtering:
POST /ViewDefinition/$viewdefinition-export HTTP/1.1
Host: example.com
Content-Type: application/fhir+json
Prefer: respond-async
Accept: application/fhir+json
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGc...
{
"resourceType": "Parameters",
"parameter": [
{
"name": "clientTrackingId",
"valueString": "monthly-report-2026-01"
},
{
"name": "view",
"part": [
{
"name": "name",
"valueString": "demographics_summary"
},
{
"name": "viewReference",
"valueReference": {
"reference": "ViewDefinition/patient-demographics-v2"
}
}
]
},
{
"name": "view",
"part": [
{
"name": "viewResource",
"resource": {
"resourceType": "ViewDefinition",
"name": "active_medications",
"resource": "MedicationRequest",
"select": [
{
"column": [
{
"path": "id",
"name": "medication_id"
},
{
"path": "medication.concept.coding[0].display",
"name": "medication_name"
},
{
"path": "authoredOn",
"name": "prescribed_date"
},
{
"path": "subject.reference",
"name": "patient_ref"
}
]
}
],
"where": [
{
"path": "status",
"op": "=",
"value": "active"
}
]
}
}
]
},
{
"name": "patient",
"valueReference": {
"reference": "Patient/cohort-123"
}
},
{
"name": "_since",
"valueInstant": "2026-01-01T00:00:00Z"
},
{
"name": "_format",
"valueCode": "parquet"
}
]
}
Step 2: Kick-off Response
Server accepts the request and provides polling location:
HTTP/1.1 202 Accepted
Content-Location: https://example.com/fhir/export/550e8400-e29b-41d4-a716-446655440000/status
Content-Type: application/fhir+json
{
"resourceType": "Parameters",
"parameter": [
{
"name": "exportId",
"valueString": "550e8400-e29b-41d4-a716-446655440000"
},
{
"name": "clientTrackingId",
"valueString": "monthly-report-2026-01"
},
{
"name": "status",
"valueCode": "accepted"
},
{
"name": "location",
"valueUri": "https://example.com/fhir/export/550e8400-e29b-41d4-a716-446655440000/status"
}
]
}
Step 3: First Status Poll (Starting)
Client polls immediately:
GET /fhir/export/550e8400-e29b-41d4-a716-446655440000/status HTTP/1.1
Host: example.com
Accept: application/fhir+json
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGc...
Response shows export is starting:
HTTP/1.1 202 Accepted
Content-Type: application/fhir+json
Retry-After: 5
X-Progress: 0%
{
"resourceType": "Parameters",
"parameter": [
{
"name": "exportId",
"valueString": "550e8400-e29b-41d4-a716-446655440000"
},
{
"name": "clientTrackingId",
"valueString": "monthly-report-2026-01"
},
{
"name": "status",
"valueCode": "in-progress"
},
{
"name": "location",
"valueUri": "https://example.com/fhir/export/550e8400-e29b-41d4-a716-446655440000/status"
},
{
"name": "exportStartTime",
"valueInstant": "2026-01-15T14:30:00Z"
}
]
}
Step 4: Second Status Poll (In Progress)
After 5 seconds, client polls again:
GET /fhir/export/550e8400-e29b-41d4-a716-446655440000/status HTTP/1.1
Host: example.com
Accept: application/fhir+json
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGc...
Response shows progress:
HTTP/1.1 202 Accepted
Content-Type: application/fhir+json
Retry-After: 10
X-Progress: 65%
{
"resourceType": "Parameters",
"parameter": [
{
"name": "exportId",
"valueString": "550e8400-e29b-41d4-a716-446655440000"
},
{
"name": "clientTrackingId",
"valueString": "monthly-report-2026-01"
},
{
"name": "status",
"valueCode": "in-progress"
},
{
"name": "location",
"valueUri": "https://example.com/fhir/export/550e8400-e29b-41d4-a716-446655440000/status"
},
{
"name": "exportStartTime",
"valueInstant": "2026-01-15T14:30:00Z"
},
{
"name": "estimatedTimeRemaining",
"valueInteger": 25
}
]
}
Step 5: Final Status Poll (Completed)
After another 10 seconds:
GET /fhir/export/550e8400-e29b-41d4-a716-446655440000/status HTTP/1.1
Host: example.com
Accept: application/fhir+json
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGc...
Response indicates completion with redirect to result URL:
HTTP/1.1 303 See Other
Location: https://example.com/fhir/export/550e8400-e29b-41d4-a716-446655440000/result
Step 6: Result Retrieval
Client follows the Location header to retrieve the final results:
GET /fhir/export/550e8400-e29b-41d4-a716-446655440000/result HTTP/1.1
Host: example.com
Accept: application/fhir+json
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGc...
Response contains the export results (identical to what a synchronous call would return):
HTTP/1.1 200 OK
Content-Type: application/fhir+json
Expires: Fri, 16 Jan 2026 14:30:42 GMT
{
"resourceType": "Parameters",
"parameter": [
{
"name": "exportId",
"valueString": "550e8400-e29b-41d4-a716-446655440000"
},
{
"name": "clientTrackingId",
"valueString": "monthly-report-2026-01"
},
{
"name": "status",
"valueCode": "completed"
},
{
"name": "_format",
"valueCode": "parquet"
},
{
"name": "exportStartTime",
"valueInstant": "2026-01-15T14:30:00Z"
},
{
"name": "exportEndTime",
"valueInstant": "2026-01-15T14:30:42Z"
},
{
"name": "exportDuration",
"valueInteger": 42
},
{
"name": "output",
"part": [
{
"name": "name",
"valueString": "demographics_summary"
},
{
"name": "location",
"valueUri": "https://example.com/fhir/export/550e8400-e29b-41d4-a716-446655440000/demographics_summary.parquet"
}
]
},
{
"name": "output",
"part": [
{
"name": "name",
"valueString": "active_medications"
},
{
"name": "location",
"valueUri": "https://example.com/fhir/export/550e8400-e29b-41d4-a716-446655440000/active_medications.part1.parquet"
},
{
"name": "location",
"valueUri": "https://example.com/fhir/export/550e8400-e29b-41d4-a716-446655440000/active_medications.part2.parquet"
}
]
}
]
}
Step 7: Download Files
Client downloads each file:
GET /fhir/export/550e8400-e29b-41d4-a716-446655440000/demographics_summary.parquet HTTP/1.1
Host: example.com
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGc...
HTTP/1.1 200 OK
Content-Type: application/octet-stream
Content-Disposition: attachment; filename="demographics_summary.parquet"
Content-Length: 1048576
[Binary parquet file content]