FHIR / Healthcare
Validate, query, convert, and render FHIR R4 resources
6 endpoints in this category. All require X-API-Key header.
Validate FHIR Resource
/api/ValidateFhirResource
1 token
Validate a FHIR R4 resource against the specification. Returns validation errors, warnings, and info messages.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
resource |
object | required | FHIR resource as JSON object |
options |
object | optional | Validation options: {errorOnUnexpected} |
Request Example
{"resource": {"resourceType": "Patient", "id": "example", "name": [{"use": "official", "given": ["John"], "family": "Doe"}], "gender": "male", "birthDate": "1990-01-15"}}
Code Examples
curl -X POST "https://docbutterfly.com/api/ValidateFhirResource" \
-H "X-API-Key: df_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{"resource": {"resourceType": "Patient", "id": "example", "name": [{"use": "official", "given": ["John"], "family": "Doe"}], "gender": "male", "birthDate": "1990-01-15"}}'using var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-Key", "df_your_api_key_here");
var json = @"{""resource"": {""resourceType"": ""Patient"", ""id"": ""example"", ""name"": [{""use"": ""official"", ""given"": [""John""], ""family"": ""Doe""}], ""gender"": ""male"", ""birthDate"": ""1990-01-15""}}";
var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");
var response = await client.PostAsync("https://docbutterfly.com/api/ValidateFhirResource", content);
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);import requests
import json
url = "https://docbutterfly.com/api/ValidateFhirResource"
headers = {
"X-API-Key": "df_your_api_key_here",
"Content-Type": "application/json"
}
payload = json.loads('{"resource": {"resourceType": "Patient", "id": "example", "name": [{"use": "official", "given": ["John"], "family": "Doe"}], "gender": "male", "birthDate": "1990-01-15"}}')
response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
data = response.json()
print(json.dumps(data, indent=2))┌─────────────────────────────────────────────┐
│ Power Automate - HTTP Action │
├─────────────────────────────────────────────┤
│ │
│ Method: POST │
│ URI: https://docbutterfly.com/api/ValidateFhirResource
│ │
│ Headers: │
│ X-API-Key: df_your_api_key_here │
│ Content-Type: application/json │
│ │
│ Body: │
│ {
│ "resource": {
│ "resourceType": "Patient",
│ "id": "example",
│ "name": [
│ {
│ "use": "official",
│ "given": [
│ "John"
│ ],
│ "family": "Doe"
│ }
│ ],
│ "gender": "male",
│ "birthDate": "1990-01-15"
│ }
│ }
│ │
└─────────────────────────────────────────────┘
Steps:
1. Add an HTTP action to your flow
2. Set Method to "POST"
3. Set URI to "https://docbutterfly.com/api/ValidateFhirResource"
4. Add the headers shown above
5. Paste the Body JSON into the Body field
6. Replace placeholder values with dynamic content as neededFHIRPath Query
/api/FhirPathQuery
1 token
Execute a FHIRPath expression against a FHIR resource or bundle. Supports filtering, functions, and type-aware navigation.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
resource |
object | required | FHIR resource as JSON object |
expression |
string | required | FHIRPath expression |
variables |
object | optional | Environment variables for the expression |
Request Example
{"resource": {"resourceType": "Patient", "id": "example", "name": [{"use": "official", "given": ["John", "Michael"], "family": "Doe"}], "birthDate": "1990-01-15", "telecom": [{"system": "email", "value": "john@example.com"}, {"system": "phone", "value": "555-1234"}]}, "expression": "Patient.name.given"}
Code Examples
curl -X POST "https://docbutterfly.com/api/FhirPathQuery" \
-H "X-API-Key: df_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{"resource": {"resourceType": "Patient", "id": "example", "name": [{"use": "official", "given": ["John", "Michael"], "family": "Doe"}], "birthDate": "1990-01-15", "telecom": [{"system": "email", "value": "john@example.com"}, {"system": "phone", "value": "555-1234"}]}, "expression": "Patient.name.given"}'using var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-Key", "df_your_api_key_here");
var json = @"{""resource"": {""resourceType"": ""Patient"", ""id"": ""example"", ""name"": [{""use"": ""official"", ""given"": [""John"", ""Michael""], ""family"": ""Doe""}], ""birthDate"": ""1990-01-15"", ""telecom"": [{""system"": ""email"", ""value"": ""john@example.com""}, {""system"": ""phone"", ""value"": ""555-1234""}]}, ""expression"": ""Patient.name.given""}";
var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");
var response = await client.PostAsync("https://docbutterfly.com/api/FhirPathQuery", content);
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);import requests
import json
url = "https://docbutterfly.com/api/FhirPathQuery"
headers = {
"X-API-Key": "df_your_api_key_here",
"Content-Type": "application/json"
}
payload = json.loads('{"resource": {"resourceType": "Patient", "id": "example", "name": [{"use": "official", "given": ["John", "Michael"], "family": "Doe"}], "birthDate": "1990-01-15", "telecom": [{"system": "email", "value": "john@example.com"}, {"system": "phone", "value": "555-1234"}]}, "expression": "Patient.name.given"}')
response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
data = response.json()
print(json.dumps(data, indent=2))┌─────────────────────────────────────────────┐
│ Power Automate - HTTP Action │
├─────────────────────────────────────────────┤
│ │
│ Method: POST │
│ URI: https://docbutterfly.com/api/FhirPathQuery
│ │
│ Headers: │
│ X-API-Key: df_your_api_key_here │
│ Content-Type: application/json │
│ │
│ Body: │
│ {
│ "resource": {
│ "resourceType": "Patient",
│ "id": "example",
│ "name": [
│ {
│ "use": "official",
│ "given": [
│ "John",
│ "Michael"
│ ],
│ "family": "Doe"
│ }
│ ],
│ "birthDate": "1990-01-15",
│ "telecom": [
│ {
│ "system": "email",
│ "value": "john@example.com"
│ },
│ {
│ "system": "phone",
│ "value": "555-1234"
│ }
│ ]
│ },
│ "expression": "Patient.name.given"
│ }
│ │
└─────────────────────────────────────────────┘
Steps:
1. Add an HTTP action to your flow
2. Set Method to "POST"
3. Set URI to "https://docbutterfly.com/api/FhirPathQuery"
4. Add the headers shown above
5. Paste the Body JSON into the Body field
6. Replace placeholder values with dynamic content as neededFHIR JSON to XML
/api/FhirJsonToXml
1 token
Convert a FHIR resource from JSON format to FHIR-compliant XML.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
resource |
object | required | FHIR resource as JSON object |
Request Example
{"resource": {"resourceType": "Patient", "id": "example", "name": [{"use": "official", "given": ["John"], "family": "Doe"}], "gender": "male", "birthDate": "1990-01-15"}}
Code Examples
curl -X POST "https://docbutterfly.com/api/FhirJsonToXml" \
-H "X-API-Key: df_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{"resource": {"resourceType": "Patient", "id": "example", "name": [{"use": "official", "given": ["John"], "family": "Doe"}], "gender": "male", "birthDate": "1990-01-15"}}'using var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-Key", "df_your_api_key_here");
var json = @"{""resource"": {""resourceType"": ""Patient"", ""id"": ""example"", ""name"": [{""use"": ""official"", ""given"": [""John""], ""family"": ""Doe""}], ""gender"": ""male"", ""birthDate"": ""1990-01-15""}}";
var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");
var response = await client.PostAsync("https://docbutterfly.com/api/FhirJsonToXml", content);
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);import requests
import json
url = "https://docbutterfly.com/api/FhirJsonToXml"
headers = {
"X-API-Key": "df_your_api_key_here",
"Content-Type": "application/json"
}
payload = json.loads('{"resource": {"resourceType": "Patient", "id": "example", "name": [{"use": "official", "given": ["John"], "family": "Doe"}], "gender": "male", "birthDate": "1990-01-15"}}')
response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
data = response.json()
print(json.dumps(data, indent=2))┌─────────────────────────────────────────────┐
│ Power Automate - HTTP Action │
├─────────────────────────────────────────────┤
│ │
│ Method: POST │
│ URI: https://docbutterfly.com/api/FhirJsonToXml
│ │
│ Headers: │
│ X-API-Key: df_your_api_key_here │
│ Content-Type: application/json │
│ │
│ Body: │
│ {
│ "resource": {
│ "resourceType": "Patient",
│ "id": "example",
│ "name": [
│ {
│ "use": "official",
│ "given": [
│ "John"
│ ],
│ "family": "Doe"
│ }
│ ],
│ "gender": "male",
│ "birthDate": "1990-01-15"
│ }
│ }
│ │
└─────────────────────────────────────────────┘
Steps:
1. Add an HTTP action to your flow
2. Set Method to "POST"
3. Set URI to "https://docbutterfly.com/api/FhirJsonToXml"
4. Add the headers shown above
5. Paste the Body JSON into the Body field
6. Replace placeholder values with dynamic content as neededFHIR XML to JSON
/api/FhirXmlToJson
1 token
Convert a FHIR resource from XML format to JSON.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
xml |
string | required | FHIR resource as XML string |
Request Example
{"xml": "<Patient xmlns=\"http://hl7.org/fhir\"><id value=\"example\"/><name><use value=\"official\"/><given value=\"John\"/><family value=\"Doe\"/></name><gender value=\"male\"/><birthDate value=\"1990-01-15\"/></Patient>"}
Code Examples
curl -X POST "https://docbutterfly.com/api/FhirXmlToJson" \
-H "X-API-Key: df_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{"xml": "<Patient xmlns=\"http://hl7.org/fhir\"><id value=\"example\"/><name><use value=\"official\"/><given value=\"John\"/><family value=\"Doe\"/></name><gender value=\"male\"/><birthDate value=\"1990-01-15\"/></Patient>"}'using var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-Key", "df_your_api_key_here");
var json = @"{""xml"": ""<Patient xmlns=\""http://hl7.org/fhir\""><id value=\""example\""/><name><use value=\""official\""/><given value=\""John\""/><family value=\""Doe\""/></name><gender value=\""male\""/><birthDate value=\""1990-01-15\""/></Patient>""}";
var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");
var response = await client.PostAsync("https://docbutterfly.com/api/FhirXmlToJson", content);
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);import requests
import json
url = "https://docbutterfly.com/api/FhirXmlToJson"
headers = {
"X-API-Key": "df_your_api_key_here",
"Content-Type": "application/json"
}
payload = json.loads('{"xml": "<Patient xmlns=\"http://hl7.org/fhir\"><id value=\"example\"/><name><use value=\"official\"/><given value=\"John\"/><family value=\"Doe\"/></name><gender value=\"male\"/><birthDate value=\"1990-01-15\"/></Patient>"}')
response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
data = response.json()
print(json.dumps(data, indent=2))┌─────────────────────────────────────────────┐
│ Power Automate - HTTP Action │
├─────────────────────────────────────────────┤
│ │
│ Method: POST │
│ URI: https://docbutterfly.com/api/FhirXmlToJson
│ │
│ Headers: │
│ X-API-Key: df_your_api_key_here │
│ Content-Type: application/json │
│ │
│ Body: │
│ {
│ "xml": "\u003CPatient xmlns=\u0022http://hl7.org/fhir\u0022\u003E\u003Cid value=\u0022example\u0022/\u003E\u003Cname\u003E\u003Cuse value=\u0022official\u0022/\u003E\u003Cgiven value=\u0022John\u0022/\u003E\u003Cfamily value=\u0022Doe\u0022/\u003E\u003C/name\u003E\u003Cgender value=\u0022male\u0022/\u003E\u003CbirthDate value=\u00221990-01-15\u0022/\u003E\u003C/Patient\u003E"
│ }
│ │
└─────────────────────────────────────────────┘
Steps:
1. Add an HTTP action to your flow
2. Set Method to "POST"
3. Set URI to "https://docbutterfly.com/api/FhirXmlToJson"
4. Add the headers shown above
5. Paste the Body JSON into the Body field
6. Replace placeholder values with dynamic content as neededFHIR Bundle to HTML
/api/FhirBundleToHtml
2 tokens
Render a FHIR Bundle (or single resource) as a styled, human-readable HTML report. Supports Patient, Observation, Condition, Medication, Allergy, Encounter, Procedure, and more.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
resource |
object | required | FHIR Bundle or resource as JSON |
title |
string | optional | Report title |
Request Example
{"resource": {"resourceType": "Bundle", "type": "collection", "entry": [{"resource": {"resourceType": "Patient", "id": "pat1", "name": [{"given": ["Jane"], "family": "Smith"}], "gender": "female", "birthDate": "1985-03-22"}}, {"resource": {"resourceType": "Observation", "id": "obs1", "status": "final", "code": {"coding": [{"system": "http://loinc.org", "code": "8867-4", "display": "Heart rate"}]}, "valueQuantity": {"value": 72, "unit": "beats/min"}, "effectiveDateTime": "2024-01-15"}}]}, "title": "Patient Summary"}
Code Examples
curl -X POST "https://docbutterfly.com/api/FhirBundleToHtml" \
-H "X-API-Key: df_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{"resource": {"resourceType": "Bundle", "type": "collection", "entry": [{"resource": {"resourceType": "Patient", "id": "pat1", "name": [{"given": ["Jane"], "family": "Smith"}], "gender": "female", "birthDate": "1985-03-22"}}, {"resource": {"resourceType": "Observation", "id": "obs1", "status": "final", "code": {"coding": [{"system": "http://loinc.org", "code": "8867-4", "display": "Heart rate"}]}, "valueQuantity": {"value": 72, "unit": "beats/min"}, "effectiveDateTime": "2024-01-15"}}]}, "title": "Patient Summary"}'using var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-Key", "df_your_api_key_here");
var json = @"{""resource"": {""resourceType"": ""Bundle"", ""type"": ""collection"", ""entry"": [{""resource"": {""resourceType"": ""Patient"", ""id"": ""pat1"", ""name"": [{""given"": [""Jane""], ""family"": ""Smith""}], ""gender"": ""female"", ""birthDate"": ""1985-03-22""}}, {""resource"": {""resourceType"": ""Observation"", ""id"": ""obs1"", ""status"": ""final"", ""code"": {""coding"": [{""system"": ""http://loinc.org"", ""code"": ""8867-4"", ""display"": ""Heart rate""}]}, ""valueQuantity"": {""value"": 72, ""unit"": ""beats/min""}, ""effectiveDateTime"": ""2024-01-15""}}]}, ""title"": ""Patient Summary""}";
var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");
var response = await client.PostAsync("https://docbutterfly.com/api/FhirBundleToHtml", content);
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);import requests
import json
url = "https://docbutterfly.com/api/FhirBundleToHtml"
headers = {
"X-API-Key": "df_your_api_key_here",
"Content-Type": "application/json"
}
payload = json.loads('{"resource": {"resourceType": "Bundle", "type": "collection", "entry": [{"resource": {"resourceType": "Patient", "id": "pat1", "name": [{"given": ["Jane"], "family": "Smith"}], "gender": "female", "birthDate": "1985-03-22"}}, {"resource": {"resourceType": "Observation", "id": "obs1", "status": "final", "code": {"coding": [{"system": "http://loinc.org", "code": "8867-4", "display": "Heart rate"}]}, "valueQuantity": {"value": 72, "unit": "beats/min"}, "effectiveDateTime": "2024-01-15"}}]}, "title": "Patient Summary"}')
response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
data = response.json()
print(json.dumps(data, indent=2))┌─────────────────────────────────────────────┐
│ Power Automate - HTTP Action │
├─────────────────────────────────────────────┤
│ │
│ Method: POST │
│ URI: https://docbutterfly.com/api/FhirBundleToHtml
│ │
│ Headers: │
│ X-API-Key: df_your_api_key_here │
│ Content-Type: application/json │
│ │
│ Body: │
│ {
│ "resource": {
│ "resourceType": "Bundle",
│ "type": "collection",
│ "entry": [
│ {
│ "resource": {
│ "resourceType": "Patient",
│ "id": "pat1",
│ "name": [
│ {
│ "given": [
│ "Jane"
│ ],
│ "family": "Smith"
│ }
│ ],
│ "gender": "female",
│ "birthDate": "1985-03-22"
│ }
│ },
│ {
│ "resource": {
│ "resourceType": "Observation",
│ "id": "obs1",
│ "status": "final",
│ "code": {
│ "coding": [
│ {
│ "system": "http://loinc.org",
│ "code": "8867-4",
│ "display": "Heart rate"
│ }
│ ]
│ },
│ "valueQuantity": {
│ "value": 72,
│ "unit": "beats/min"
│ },
│ "effectiveDateTime": "2024-01-15"
│ }
│ }
│ ]
│ },
│ "title": "Patient Summary"
│ }
│ │
└─────────────────────────────────────────────┘
Steps:
1. Add an HTTP action to your flow
2. Set Method to "POST"
3. Set URI to "https://docbutterfly.com/api/FhirBundleToHtml"
4. Add the headers shown above
5. Paste the Body JSON into the Body field
6. Replace placeholder values with dynamic content as neededFHIR Bundle to CSV
/api/FhirBundleToCsv
2 tokens
Extract key fields from FHIR Bundle entries into CSV format. Type-aware extraction for Patient, Observation, Condition, Medication, and more.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
resource |
object | required | FHIR Bundle or resource as JSON |
resourceTypeFilter |
string | optional | Filter to specific resource type |
Request Example
{"resource": {"resourceType": "Bundle", "type": "collection", "entry": [{"resource": {"resourceType": "Observation", "id": "obs1", "status": "final", "code": {"coding": [{"system": "http://loinc.org", "code": "8867-4", "display": "Heart rate"}]}, "valueQuantity": {"value": 72, "unit": "beats/min"}, "effectiveDateTime": "2024-01-15"}}, {"resource": {"resourceType": "Observation", "id": "obs2", "status": "final", "code": {"coding": [{"display": "Blood pressure"}]}, "valueString": "120/80 mmHg", "effectiveDateTime": "2024-01-15"}}]}, "resourceTypeFilter": "Observation"}
Code Examples
curl -X POST "https://docbutterfly.com/api/FhirBundleToCsv" \
-H "X-API-Key: df_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{"resource": {"resourceType": "Bundle", "type": "collection", "entry": [{"resource": {"resourceType": "Observation", "id": "obs1", "status": "final", "code": {"coding": [{"system": "http://loinc.org", "code": "8867-4", "display": "Heart rate"}]}, "valueQuantity": {"value": 72, "unit": "beats/min"}, "effectiveDateTime": "2024-01-15"}}, {"resource": {"resourceType": "Observation", "id": "obs2", "status": "final", "code": {"coding": [{"display": "Blood pressure"}]}, "valueString": "120/80 mmHg", "effectiveDateTime": "2024-01-15"}}]}, "resourceTypeFilter": "Observation"}'using var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-Key", "df_your_api_key_here");
var json = @"{""resource"": {""resourceType"": ""Bundle"", ""type"": ""collection"", ""entry"": [{""resource"": {""resourceType"": ""Observation"", ""id"": ""obs1"", ""status"": ""final"", ""code"": {""coding"": [{""system"": ""http://loinc.org"", ""code"": ""8867-4"", ""display"": ""Heart rate""}]}, ""valueQuantity"": {""value"": 72, ""unit"": ""beats/min""}, ""effectiveDateTime"": ""2024-01-15""}}, {""resource"": {""resourceType"": ""Observation"", ""id"": ""obs2"", ""status"": ""final"", ""code"": {""coding"": [{""display"": ""Blood pressure""}]}, ""valueString"": ""120/80 mmHg"", ""effectiveDateTime"": ""2024-01-15""}}]}, ""resourceTypeFilter"": ""Observation""}";
var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");
var response = await client.PostAsync("https://docbutterfly.com/api/FhirBundleToCsv", content);
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);import requests
import json
url = "https://docbutterfly.com/api/FhirBundleToCsv"
headers = {
"X-API-Key": "df_your_api_key_here",
"Content-Type": "application/json"
}
payload = json.loads('{"resource": {"resourceType": "Bundle", "type": "collection", "entry": [{"resource": {"resourceType": "Observation", "id": "obs1", "status": "final", "code": {"coding": [{"system": "http://loinc.org", "code": "8867-4", "display": "Heart rate"}]}, "valueQuantity": {"value": 72, "unit": "beats/min"}, "effectiveDateTime": "2024-01-15"}}, {"resource": {"resourceType": "Observation", "id": "obs2", "status": "final", "code": {"coding": [{"display": "Blood pressure"}]}, "valueString": "120/80 mmHg", "effectiveDateTime": "2024-01-15"}}]}, "resourceTypeFilter": "Observation"}')
response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
data = response.json()
print(json.dumps(data, indent=2))┌─────────────────────────────────────────────┐
│ Power Automate - HTTP Action │
├─────────────────────────────────────────────┤
│ │
│ Method: POST │
│ URI: https://docbutterfly.com/api/FhirBundleToCsv
│ │
│ Headers: │
│ X-API-Key: df_your_api_key_here │
│ Content-Type: application/json │
│ │
│ Body: │
│ {
│ "resource": {
│ "resourceType": "Bundle",
│ "type": "collection",
│ "entry": [
│ {
│ "resource": {
│ "resourceType": "Observation",
│ "id": "obs1",
│ "status": "final",
│ "code": {
│ "coding": [
│ {
│ "system": "http://loinc.org",
│ "code": "8867-4",
│ "display": "Heart rate"
│ }
│ ]
│ },
│ "valueQuantity": {
│ "value": 72,
│ "unit": "beats/min"
│ },
│ "effectiveDateTime": "2024-01-15"
│ }
│ },
│ {
│ "resource": {
│ "resourceType": "Observation",
│ "id": "obs2",
│ "status": "final",
│ "code": {
│ "coding": [
│ {
│ "display": "Blood pressure"
│ }
│ ]
│ },
│ "valueString": "120/80 mmHg",
│ "effectiveDateTime": "2024-01-15"
│ }
│ }
│ ]
│ },
│ "resourceTypeFilter": "Observation"
│ }
│ │
└─────────────────────────────────────────────┘
Steps:
1. Add an HTTP action to your flow
2. Set Method to "POST"
3. Set URI to "https://docbutterfly.com/api/FhirBundleToCsv"
4. Add the headers shown above
5. Paste the Body JSON into the Body field
6. Replace placeholder values with dynamic content as needed