FHIR Server Extractor
Pricing
from $0.35 / 1,000 resources
FHIR Server Extractor
Point at ANY HL7 FHIR R4 server (HAPI, SMART-on-FHIR, Azure/Google/AWS health APIs) and page any resource type (Patient, Observation, Condition, Encounter) into clean flat rows. Follows the Bundle next-link cursor, keeps the full resource in _raw. Discovery mode maps a server. Pay per record.
Pricing
from $0.35 / 1,000 resources
Rating
0.0
(0)
Developer
Datamule
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
4 days ago
Last modified
Categories
Share
FHIR Server Extractor reads authorized HL7 FHIR R4 JSON endpoints, follows
their Bundle next-link cursors, and emits one stable dataset row per matched
resource. Use search mode to export resources or capabilities mode to inspect
the resource types and search parameters a server advertises.
Try it now
This ready-to-run input requests up to 25 Patient resources from the public HAPI FHIR reference sandbox. HAPI is a shared test service, so its contents and availability can change. The records in this environment are synthetic test data, not production patient records.
{"sources": ["https://hapi.fhir.org/baseR4"],"mode": "search","resourceTypes": ["Patient"],"maxRecords": 25}
- Paste the JSON into the Actor's Input tab.
- Select Start.
- Open the default dataset to inspect or export the rows.
The same input can be sent through the Apify API, used in a scheduled task, or connected to an Apify integration. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.
Representative output
SYNTHETIC Patient sample
The row below is generated from the retained HAPI fixture used by this Actor's
local regression tests. It shows the exact stable row shape, including the
source resource preserved in _raw. This is not a real patient record.
{"_sourceServer": "https://hapi.fhir.org/baseR4","_resourceType": "Patient","_fhirVersion": "4.0.1","_serverSoftware": "HAPI FHIR","_mode": "search","_searchUrl": "https://hapi.fhir.org/baseR4/Patient?_count=25","resourceType": "Patient","id": "131896579","lastUpdated": "2026-04-10T15:55:37.648+00:00","meta_versionId": "1","meta_source": "#1SvhmbQgtkfxewf0","meta_profile": null,"status": null,"display": "Carlos Ramirez","supported_interactions": null,"supported_search_params": null,"software_name": null,"software_version": null,"_raw": {"resourceType": "Patient","id": "131896579","meta": {"versionId": "1","lastUpdated": "2026-04-10T15:55:37.648+00:00","source": "#1SvhmbQgtkfxewf0"},"identifier": [{"system": "urn:oid:1.2.36","value": "12345"}],"name": [{"use": "official","family": "Ramirez","given": ["Carlos"]}],"gender": "male","birthDate": "1975-03-02"}}
Fields that do not apply to the selected mode or resource are null; the Actor
does not invent replacements.
How much does FHIR extraction cost?
The pay-per-event event is resource: $0.0005 per emitted resource. The default
25-row ceiling is $0.0125. The rate is $0.50 per 1,000 emitted resources. A run
that emits fewer rows costs less; a valid zero-result run emits no billable
resource events.
Apify infrastructure/compute charges are separate and may apply.
| Emitted resources | Resource-event charge |
|---|---|
| 0 | $0.00 |
| 25 | $0.0125 |
| 1,000 | $0.50 |
Inputs, defaults, and limits
maxRecords defaults to 25. The minimum is 1, and an explicit larger integer
remains supported when a broader export is intentional. The cap applies across
all sources and resource types in the run, not separately to each combination.
| Field | Required | Default or prefill | Meaning and limits |
|---|---|---|---|
sources | Yes | HAPI URL prefilled | One or more FHIR R4 base URLs. Use the base/root, not /Patient or /metadata. |
mode | No | search | search emits matched resources. capabilities reads /metadata and emits advertised resource types. |
resourceTypes | No | ["Patient"] | UpperCamelCase FHIR resource types. Used only in search mode. |
searchParams | No | Empty | A JSON object applied to each requested resource type. _count is managed by the Actor. Parameter support is server- and resource-specific. |
maxRecords | No | 25 | Total emitted-row ceiling across the run. Minimum 1; set a larger value explicitly to override the trial cap. |
bearerToken | No | Empty | OAuth2 bearer token for an already-authorized server. The Actor does not perform an OAuth login or token exchange. |
extraHeaders | No | Empty | Additional request headers required by the server, such as a client identifier. |
The Actor requests pages of up to 50 resources, follows each absolute
link[relation=next] URL as returned, and stops at maxRecords. Source-side
page limits, timeouts, authorization rules, Apify run limits, and a hard
pagination safety guard still apply.
Output field dictionary
Both modes use the same stable set of columns. Search-only columns are null on
capability rows, and capability-only columns are null on search rows.
| Field | Meaning |
|---|---|
_sourceServer | FHIR base URL that produced the row. |
_resourceType | Requested or advertised resource type used for provenance. |
_fhirVersion | Version reported by the server's CapabilityStatement, when available. |
_serverSoftware | Best-effort software-family label, when detectable. |
_mode | search or capabilities. |
_searchUrl | Exact page URL that produced a search row; null in capabilities mode. |
resourceType | FHIR resource type represented by the row. |
id | FHIR logical ID; null for capability rows. |
lastUpdated | Resource meta.lastUpdated supplied by the server; may be null. |
meta_versionId | Resource meta.versionId, when supplied. |
meta_source | Resource meta.source, when supplied. |
meta_profile | Resource meta.profile canonical URLs, when supplied. |
status | Top-level resource status, when that resource type has one. |
display | Best-effort label from a name, title, or code display. |
supported_interactions | Capability row's advertised interaction codes. |
supported_search_params | Capability row's advertised search-parameter names. |
software_name | CapabilityStatement software name. |
software_version | CapabilityStatement software version. |
_raw | Original resource or capability-resource object, capped for row-size safety. |
Common use cases
- Export a bounded, authorized FHIR R4 resource set for analysis or QA.
- Inspect a server's advertised resource types and search surface before an integration is built.
- Schedule an incremental extract with a supported
_lastUpdatedfilter. - Compare normalized provenance fields across conformant R4 test or vendor
endpoints while retaining each original resource in
_raw.
Coverage, observation time, and freshness
The generic scope is FHIR R4 JSON: search responses shaped as FHIR Bundle
resources and capability discovery through /metadata. It does not claim FHIR
R5 support, Bulk Data $export, subscriptions, GraphQL, terminology expansion,
or create/update/delete operations. Vendor profiles, supported resource types,
search parameters, paging behavior, and authorization requirements vary even
when the transport is R4-conformant.
HAPI FHIR and SMART-on-FHIR / Logica are public sandboxes containing synthetic test data. They demonstrate the common R4 grammar; they do not prove that a private vendor endpoint will allow the same searches or be available at the time of your run.
Each run is a bounded observation of what the server returned at that time:
lastUpdatedis the server's resource-version timestamp, not the extraction time, and it may be absent.- The dataset deliberately has no invented observation timestamp. Use the Apify run start/finish metadata as the observation window.
- The Actor does not impose a sort order. With
maxRecords: 25, it keeps the first 25 matched rows in the server's response order, so the sample is not a completeness guarantee. - For incremental collection, schedule runs and pass a server-supported
_lastUpdatedsearch value. Deduplicate by source, resource type, logical ID, and version according to your own retention policy. - A capabilities row reflects the
/metadataresponse observed during that run; server capabilities can change later.
Privacy and authorization limits
Use this Actor only with endpoints and data you are authorized to read. FHIR
resources can contain protected health information. _raw retains the source
resource, so downstream datasets and exports require the same access controls as
the source data.
bearerToken is a secret input and is not intentionally logged. Treat
extraHeaders, task inputs, datasets, and exported files as sensitive whenever
they contain credentials or health data. Prefer private tasks and appropriate
Apify security controls for non-public systems. This extraction utility does not
grant permission, acquire consent, or by itself establish HIPAA or other
regulatory compliance.
Troubleshooting
Wrong base URL
Supply the FHIR base/root, such as https://hapi.fhir.org/baseR4. Do not append a
resource type or /metadata; the Actor adds those paths. A wrong base commonly
produces HTTP 404, a non-JSON page, or “expected Bundle/CapabilityStatement.”
Authentication
HTTP 401 or 403 means the server did not accept the request. Provide a current
bearerToken and any required extraHeaders, then confirm the token scopes
permit the requested resource type and search. The Actor accepts an existing
token but does not run a vendor OAuth flow.
OperationOutcome
FHIR can return an OperationOutcome even with HTTP 200. The Actor treats a
top-level outcome as an error rather than an empty result and reports the first
issue's severity, code, and diagnostics. Remove or correct unsupported
searchParams; if every source fails, the run exits non-zero instead of
presenting a false successful empty dataset.
Zero results
A valid search Bundle with no matching entries is a successful zero-result run.
Check the resource type's exact casing, remove filters, confirm the server
actually advertises the type with mode: "capabilities", and verify that your
authorization permits matches. Included companions and outcome entries are
filtered deliberately; only genuine matches are emitted.
For support, use the Actor's Issues tab with the base URL, mode, resource types, non-sensitive search parameters, and the relevant error text. Never post tokens, authorization headers, or patient data.


