FHIR API Request Guide
API Fundamentals
Service Endpoints
Development: https://localhost:8000/graphql
Production: https://<your-domain>/graphql
Authentication Requirements:
Authorization: Bearer <JWT_TOKEN>
Environment Setup
# Verify connectivity
curl -H "Authorization: Bearer $TOKEN" $ENDPOINT \
-d '{"query":"{ Me { reference } }"}'
Core Request Patterns
Identity Verification
query IdentityCheck {
Me {
reference # Returns "ClientRole/ClientID"
resourceType
}
}
Usage Scenario: Validate authentication context before sensitive operations
Resource Operations
Create Resources
mutation CreatePatient($input: PatientCreateInput!) {
CreatePatient(resource: $input) {
id
meta { versionId lastUpdated }
}
}
Input Validation:
- Requires minimum demographic fields
- Rejects duplicate identifiers
- Auto-generates missing required fields
Read Operations
Single Resource Retrieval
query FetchPatient($id: ID!) {
Patient(id: "c6a5ef32-72b7-45e1-8faa-9e89807b5192") {
name { given family }
address { line city }
}
}
Search Methods
# Basic search (PatientList)
query {
PatientList(name: "Smith", birthdate: "ge2000-01-01") {
id
name { given family }
}
}
# Paginated search (PatientConnection)
query {
PatientConnection(name: "John", _count: 25) {
pageInfo { totalCount nextCursor }
edges {
node {
id
name { given family }
}
}
}
}
Update Operations
mutation UpdateContact($id: ID!, $input: PatientUpdateInput!) {
UpdatePatient(id: $id, resource: $input) {
meta { lastUpdated }
telecom { system value }
}
}
Concurrency Control:
- Uses
meta.versionIdfor optimistic locking - Returns 412 Precondition Failed on version mismatch
Delete Operations
mutation RemovePatient($id: ID!) {
DeletePatient(id: "12345") {
issue {
severity
code
details { text }
}
}
}
Permanent Deletion:
- Requires
forceDeleteparameter for hard deletes - Default behavior: Soft delete with tombstone record
Search Implementation
Complex Queries
query AdvancedSearch {
PatientConnection(
name: "smith",
_tag: "research-study-45",
_lastUpdated: "ge2023-01-01"
) {
edges {
node {
id
name { family given }
extension(url: "http://hl7.org/fhir/StructureDefinition/patient-congregation") {
valueString
}
}
}
}
}
Search Modifiers:
:exactfor precise matching:missingfor null value checks:containsfor partial text matches
Development Tools
Interactive Playground
Access URL: https://localhost:8000/playground
Header Configuration:
{
"Authorization": "Bearer eyJhbGciOiJIUz...",
"X-Request-ID": "custom-correlation-id"
}
Playground Features:
- Schema documentation sidebar
- Query variable injection
- Response formatting presets
- Request history persistence
API Client Configuration
Postman Setup Template
Collection Variables:
{
"base_url": "{{environment}}/graphql",
"token": "{{jwt_secret}}"
}
Sample Request:
query GetRecentPatients {
PatientConnection(_sort: "-_lastUpdated", _count: 5) {
edges {
node {
id
name { given family }
}
}
}
}
Security Operations
Production Hardening
# settings.py
GRAPHQL_PLAYGROUND = False # Disable in production
INTROSPECTION_ENABLED = False # Disable schema introspection
RATE_LIMIT = "1000/hour" # Global rate limiting
Secret Rotation Schedule:
- JWT Signing Key: 90 days
- Database Encryption Keys: 365 days
- API Tokens: 30 days
Operational FAQ
Data Handling
Q: How are extensions managed?
A: Extensions persist in dedicated fields without altering core resource structure
Q: File upload limitations?
A: 256MB maximum with automatic virus scanning
Compliance
Q: Audit log retention?
A: 7-year retention with WORM storage
Interface Support
Q: REST API availability?
A: Full REST endpoint parity at /api/fhir/r4/