Healthcare ,

Architecture Guide Designing Healthcare API Gateways for Interoperability

FHIR-aware routing, multi-protocol translation, SMART on FHIR enforcement, mTLS, per-tenant rate limiting, audit logging, and production observability — the complete engineering blueprint for healthcare API gateways that power real interoperability at scale.

Architecture Guide Designing Healthcare API Gateways for Interoperability

  • Last Updated on May 21, 2026
  • 25 min read

A healthcare API gateway is not a reverse proxy with CORS headers. It is the regulatory enforcement boundary, protocol translation engine, and security perimeter for every clinical data exchange your platform facilitates. The design decisions made at the gateway layer determine whether your platform achieves real interoperability or merely connects systems while accumulating compliance debt.

73%

of EHR integration failures involve missing or misconfigured API gateway security controls

4.2×

more API incident types in healthcare vs other industries due to PHI sensitivity and multi-protocol complexity

$1.9M

maximum annual HIPAA penalty per violation category — most stem from gateway-layer gaps

8+

distinct protocols a production healthcare API gateway must handle: REST, SOAP, HL7 v2, FHIR, X12, DICOM, gRPC, GraphQL

1. Why Healthcare API Gateways Fail Standard Enterprise Patterns

Enterprise API gateways — Kong, Apigee, AWS API Gateway, Azure API Management — are designed for general-purpose workloads. They excel at JWT validation, rate limiting, and request routing. But healthcare API gateways must do things these platforms were never designed for: FHIR resource-type-aware routing, HL7 v2 message parsing, per-patient data access enforcement (not just per-user), PHI-safe audit logging, and SMART on FHIR scope verification at the gateway layer rather than in each downstream service.

Teams that bolt a standard enterprise gateway onto a healthcare integration stack and configure it as they would a fintech API consistently hit the same failure modes:

  • JWT validation without SMART scope enforcement. The gateway verifies the token is valid but does not verify that the token's granted scopes include the specific FHIR resource type and interaction being requested. A valid SMART token with patient/Patient.read should not authorize a GET /Observation request — but a misconfigured gateway passes it through anyway.

  • Rate limiting by IP or user, not by tenant and interaction type. A FHIR Bulk export ($export) operation is orders of magnitude heavier than a FHIR patient read. Treating them identically in rate limiting allows a bulk export to exhaust server resources while individual clinical reads are blocked. Healthcare rate limiting must be interaction-type-aware.

  • Request body logging that captures PHI. Standard API gateway access logs include request and response bodies for debugging. In a healthcare context, this means PHI lands in your observability platform — creating a HIPAA breach in your monitoring infrastructure. Most SIEM and APM tools do not have BAAs for PHI storage.

  • No HL7 v2 to FHIR translation capability. Healthcare ecosystems run on HL7 v2 for ADT feeds, lab results, and pharmacy data. An API gateway that only speaks REST leaves these sources entirely outside the interoperability perimeter, forcing source-system-specific integrations that bypass the gateway entirely.

⚠️ Architecture principle

Healthcare API gateways must be designed around clinical data context (patient, encounter, practitioner, resource type, interaction type) — not just technical context (user identity, endpoint URL, HTTP method). A gateway that cannot reason about FHIR resource semantics cannot enforce HIPAA Minimum Necessary controls at the API layer.

2. Gateway Architecture Patterns for Healthcare Interoperability

Four gateway architecture patterns cover the landscape of healthcare interoperability use cases. Most production healthcare platforms need a combination of two or three. The pattern selection is driven by the protocol mix of your upstream sources and the access model of your downstream consumers.

🔀

FHIR Proxy Gateway

REST · FHIR R4

Passes FHIR REST requests through to EHR FHIR endpoints with added auth enforcement, audit logging, and response filtering. Minimal transformation — maximum transparency. Best for apps that need direct EHR FHIR API access with centralized policy enforcement. Not for: bulk data extraction or event-driven notifications.

🔄

Protocol Translation Gateway ($export)

HL7 v2 · SOAP · REST · FHIR

Translates between protocol formats at the gateway boundary. HL7 v2 ADT → FHIR Encounter, SOAP ClinicalDocument → FHIR Bundle, X12 834 → FHIR Coverage. Exposes a unified FHIR R4 API to consumers regardless of source protocol. Most operationally complex but highest interoperability value.

🏗

Aggregation Gateway

Multi-source · Fan-out

Fans out a single consumer request to multiple upstream FHIR endpoints (Epic + Cerner + athenahealth), merges and de-duplicates the response, resolves cross-system patient identity via MPI, and returns a unified Bundle. Best for care coordination platforms and HIEs serving multi-EHR environments.

📡

Event-Streaming Gateway

Async · Kafka · Webhooks

Converts EHR FHIR Subscriptions and HL7 v2 ADT feeds into event streams on Kafka, AWS EventBridge, or Azure Event Hub. Downstream consumers subscribe to patient-level or population-level event topics. Best for care management platforms, real-time alerting, and analytics pipelines.

Peerbits Service - EHR Integration Services

3. FHIR-Aware Routing: Beyond URL Pattern Matching

Standard API gateway routing matches on URL path patterns — /fhir/r4/Patient routes to the FHIR Patient service. Healthcare API gateways need to route on FHIR resource semantics: the same URL path requires different routing decisions based on the FHIR interaction type, the resource type, the operation code, and the SMART token's granted scopes.

FHIR Interaction-Type Routing Matrix

FHIR InteractionHTTP MethodRoute TargetAuth RequirementRate Limit Class
readGET /Resource/{id}FHIR Server — direct

patient/Resource.read scope

Standard
searchGET /Resource?params

FHIR Server — cached layer

patient/Resource.read scope

Standard (count-limited)

createPOST /Resource

FHIR Server — validated path

patient/Resource.write scope

Write class (stricter)

$export (Bulk)

POST /Group/{id}/$export

Bulk export service (async)

system/Resource.read + BAA verified

Bulk class (isolated workers)

$validate

POST /Resource/$validate

Validation microservice

Basic auth sufficient

Validation class
metadataGET /metadata

CapabilityStatement service

No auth required (public)

Unrestricted (cached)

CDS Hook callback

POST /cds-services/{id}

CDS Hook handler

EHR JWT (different issuer)

Hook class (5s timeout enforced)

Read more: FHIR Integration Architecture Guide

KONG — FHIR-AWARE CUSTOM ROUTING PLUGIN (LUA)GATEWAY PLUGIN
-- Kong custom plugin: FHIR-aware router
-- Routes FHIR requests based on resource type + interaction type + token scopes

local FHIRRouter = {}

function FHIRRouter:access(conf)
  local path = kong.request.get_path()
  local method = kong.request.get_method()
  local scopes = get_smart_scopes()                      // ← parse from verified JWT

  -- Extract FHIR resource type from URL path segment
  -- Route to isolated async service
  
  if path:match("%$export") then
    assert_scope(scopes, "system/%w+.read")             // ← system scope required
    assert_baa_active()                                  // ← BAA must be in force
    route_to(conf.bulk_export_upstream)                 // ← dedicated isolated workers
    apply_rate_limit("bulk", 2, "per_hour")
    
    return
  end

  -- Extract FHIR resource type from URL path segment
  local resource_type = path:match("/fhir/r4d/(%w+)")

  -- Enforce Minimum Necessary: verify scope covers this resource type
  if method == "GET" then
    assert_scope(scopes, "patient/"..resource_type..".read"
      or "user/"..resource_type..".read"
      or "system/"..resource_type..".read")
    
    apply_rate_limit("standard", 600, "per_minute")
    
  elseif method == "POST" or method == "PUT" then
    assert_scope(scopes, "patient/"..resource_type..".write")
    apply_rate_limit("write", 60, "per_minute")           // ← stricter write limits
  end

  -- Add tenant context header for downstream FHIR server
  kong.service.request.set_header("X-Tenant-ID", get_tenant_from_jwt())
  kong.service.request.set_header("X-FHIR-Resource-Type", resource_type)

  return FHIRRouter
end

4. Multi-Protocol Translation: HL7 v2, SOAP, X12 → FHIR

Production healthcare environments speak multiple protocols simultaneously. Your API gateway must present a unified interface to consumers while absorbing the protocol complexity of upstream source systems. The translation layer architecture determines how maintainable and extensible this mapping is over time.

HL7 v2 ADT A01 (Inbound)

MSH|^~\&|EHR|HOSP|... PID|1||MRN123^^... PV1|1||3N^301^A^HOSP...

Translation Engine

Segment parser → FHIR mapper → Terminology resolver → Profile validator → Enrichment

FHIR R4 Encounter (Output)

{ "resourceType": "Encounter", "status": "in-progress", "subject": { "reference": "Patient/pid-MRN123" } }
↓ same gateway, different source protocol ↓

SOAP ClinicalDocument (C-CDA)

<ClinicalDocument xmlns="urn:hl7-org:v3"> <RecordTarget>... </RecordTarget> </ClinicalDocument>

CCDA→FHIR Transform

Microsoft FHIR Converter / custom XSLT → FHIR Bundle sections (Conditions, Medications, Allergies, Results)

FHIR R4 Bundle (Output)

{ "resourceType": "Bundle", "type": "document", "entry": [ ...Condition, MedicationStatement, AllergyIntolerance... ] }

Translation Pipeline Components

ComponentFunctionRecommended ToolingDeployment
HL7 v2 Parser

Parse v2 message segments, handle Z-segments, per-site variations

HAPI HL7v2, LinuxForHealth HL7v2-FHIR Converter, Mirth Connect

Sidecar container per source system

C-CDA / CCDA Transformer

Convert CCD/CDA documents to FHIR Bundle sections

Microsoft FHIR Converter (Liquid templates), HL7 C-CDA-on-FHIR IG

Shared translation microservice

Terminology Resolver

Translate local/v2 codes to FHIR-required code systems (LOINC, SNOMED, RxNorm)

HAPI FHIR Terminology Server, Ontoserver, TerminologyServer.net

Shared infrastructure service

Profile Validator

Validate translated FHIR resources against US Core / IG profiles before routing to consumers

HAPI FHIR Validator, HL7 FHIR Validator CLI

Async validation (sync adds 200–800ms)

Patient Identity Resolver

Map source system patient IDs to FHIR Patient resource IDs via MPI

Custom MPI service, OpenEMPI, HealthShare Patient Index

Cached MPI lookup service

5. Security Architecture: mTLS, OAuth 2.0 & SMART Enforcement

The healthcare API gateway is the single enforcement point for your security policy. Security controls scattered across individual downstream microservices are inconsistently applied, difficult to audit, and impossible to update uniformly when regulations change. Centralizing authentication, authorization, and transport security at the gateway is the only architecture that produces consistent, auditable enforcement.

mTLS for Internal Service Communication Every connection between your API gateway and downstream healthcare microservices must use mutual TLS (mTLS) — both sides present certificates, both sides verify. This prevents a compromised internal service from impersonating the gateway to extract PHI from other services, and prevents unauthorized internal services from calling PHI-bearing services directly without going through the gateway's policy enforcement.

NGINX — MTLS CONFIGURATION FOR HEALTHCARE INTERNAL SERVICESTRANSPORT SECURITY
# Gateway upstream: enforce mTLS to all FHIR backend services
# Both gateway and service present client certificates — mutual verification

upstream fhir_backend {
  server fhir-service:8443;
  keepalive 32;
}

server {
  listen 443 ssl;
  ssl_certificate       /certs/gateway.crt;
  ssl_certificate_key   /certs/gateway.key;
  ssl_client_certificate /certs/ca-bundle.crt;
  ssl_verify_client     on;                            // ← Require client cert (mTLS)
  
  ssl_protocols         TLSv1.2 TLSv1.3;               // ← No TLS 1.0/1.1 — HIPAA requirement
  
  ssl_ciphers           ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305;
  ssl_prefer_server_ciphers on;

  location /fhir/ {
    # Proxy to FHIR backend with gateway client cert (mTLS outbound)
    proxy_ssl_certificate      /certs/gateway-client.crt;
    proxy_ssl_certificate_key  /certs/gateway-client.key;
    proxy_verify               on;
    proxy_ssl_trusted_certificate /certs/ca-bundle.crt;
    proxy_ssl_protocols        TLSv1.3;                // ← Prefer TLS 1.3 internal

    # Strip Authorization header before logging — never log bearer tokens
    proxy_set_header Authorization "";
    proxy_pass https://fhir_backend;
  }
}

SMART on FHIR Scope Enforcement at Gateway Layer

Token validation at the gateway (signature verification, expiry check) is necessary but not sufficient. The gateway must also enforce that the token's granted scopes cover the specific resource type and interaction being requested. This cannot be left to individual downstream services — they have no visibility into the full scope context and cannot consistently apply Minimum Necessary enforcement.

Token Validated — Scope Not Checked

Gateway verifies JWT signature and expiry. Forwards request with X-Authenticated: true header. Downstream FHIR service trusts the header and serves the response. A token with patient/Patient.read can access GET /MedicationRequest, GET /Observation, and GET /Condition without explicit scope grants for those resource types.

Scope Enforced at Gateway

Gateway verifies JWT signature, expiry, and extracts granted scopes array. For each incoming request, verifies that scopes.includes(patient/${resourceType}.read). Returns HTTP 403 with a FHIR OperationOutcome if scope is absent. Downstream services receive pre-authorized requests only — no scope logic needed per service.

Read more: How to Build SMART on FHIR Applications

6. HIPAA-Compliant Audit Logging Without PHI Exposure

HIPAA requires comprehensive audit logging of all PHI access (45 CFR §164.312(b)). Your API gateway is perfectly positioned to generate this log — it sees every request. The challenge is generating logs that are complete enough to satisfy a HIPAA audit and PHI-free enough to ship to your observability platform without creating a BAA obligation for every logging vendor.

STRUCTURED LOG SCHEMA — HIPAA-COMPLIANT, PHI-FREE GATEWAY AUDIT EVENT45 CFR §164.312(B)
// Every PHI-touching request generates this structured audit event
// PHI-FREE: never includes resource content, patient names, or clinical values

{
  "event_type": "fhir.api.access",
  "timestamp_utc": "2025-05-16T14:32:01.847Z",        // ← Millisecond precision

  // WHO accessed
  "principal_id": "usr-7f3a9b2c",                     // ← UUID — not username
  "principal_role": "physician",                       // ← Role, not personal identity
  "tenant_id": "acme-health-system",
  "app_client_id": "smart-app-care-gap-checker",

  // WHAT was accessed
  "fhir_resource_type": "Patient",                    // ← Type — not content
  "fhir_resource_id": "pat-8a7c2d1e",                 // ← ID — not name/DOB/MRN
  "fhir_interaction": "read",
  "smart_scopes_used": ["patient/Patient.read"],

  // HOW it was accessed
  "http_method": "GET",
  "gateway_route": "/fhir/r4/Patient/{id}",
  "source_ip": "10.0.4.22",
  "user_agent_hash": "sha256:4f8a...",                // ← Hashed — not raw UA string

  // OUTCOME
  "http_status": 200,
  "fhir_outcome": "success",                          // ← Check OperationOutcome too
  "response_ms": 142,

  // NEVER include: response body, request body, patient.name, patient.birthDate, MRN, SSN
}

Route audit logs to a write-once, append-only sink (AWS CloudTrail Lake, Azure Monitor with immutability policy, WORM S3 bucket with object lock) before the gateway returns the response — not asynchronously. For PHI access events, the audit log must be durable before the request completes. Async fire-and-forget logging creates a gap where a failed log delivery means an unaudited access event.

🚨 Critical: Request body logging

Never configure your API gateway to log request or response bodies for FHIR endpoints. A POST /Patient create request body contains a complete FHIR Patient resource — full name, DOB, address, medical record number, insurance identifiers. Logging this to Datadog, Splunk, or any observability tool that lacks a HIPAA BAA creates an immediate reportable breach. Set access_log_body: false for all /fhir/* routes.

7. Rate Limiting Strategy for Clinical Workloads

Healthcare API rate limiting cannot use the same flat "X requests per minute per user" model that works for fintech or e-commerce APIs. Clinical workloads have extreme variance: a physician opening a chart may trigger 8–12 FHIR reads in under a second; a bulk export operation may run for 40 minutes generating thousands of NDJSON records; a CDS Hook must respond within 5 seconds or the EHR discards it. A single rate limit tier that works for any of these use cases breaks the others.

Multi-Tier Rate Limiting Architecture

600/min

Standard Read Limit

Per authenticated user. Point-of-care queries: Patient read, Observation search, Condition list. Resets per 60-second window.

60/min

Write Operation Limit

Per authenticated user. Create, update, delete interactions. Stricter to prevent accidental bulk writes from errant scripts.

2/hour

Bulk Export Limit

Per tenant. $export operations isolated to dedicated workers. Prevents bulk jobs starving point-of-care queries. Queued with fair scheduling.

  • Rate limits are per-tenant-plus-user, not per-IP. Healthcare API clients include EHR systems, backend services, and patient apps — all potentially behind shared IPs or NAT. Per-IP rate limiting breaks these patterns. Rate limit by (tenant_id, user_id) for user-context tokens and by (tenant_id, client_id) for Backend Services tokens.

  • CDS Hook endpoints have enforced 5-second timeout budgets. The CDS Hooks specification allows EHRs to discard responses that arrive after their timeout. Your gateway must enforce a 5-second upstream timeout on CDS Hook routes and return an empty cards response (cards) rather than a 504 error when the timeout fires — so clinicians are not blocked by a slow CDS service.

  • Rate limit headers are required in 429 responses. Include Retry-After, X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset in all 429 responses. SMART on FHIR apps and backend services need these to implement proper backoff — without them, they retry immediately, making the rate limit situation worse.

  • Emergency mode bypass for clinical systems. Configure a rate limit bypass header (verified by HMAC, not just present) for clinical emergency scenarios where a care coordination system must exceed normal rate limits. This must generate an elevated audit log entry and alert — it is a break-glass mechanism, not a configuration option for regular use.

8. API Gateway Selection: Kong, Apigee, AWS & Azure Compared

No commercial API gateway ships with healthcare-specific plugins pre-installed. Every gateway on this list requires custom development to reach the FHIR-aware routing, SMART scope enforcement, and PHI-safe audit logging capabilities described above. The selection decision is driven by your cloud platform, operational preferences, and how much custom plugin development you can sustain.

GatewayTypeFHIR Plugin EcosystemSMART on FHIRHIPAA BAABest Fit
Kong Gateway

Open source + Enterprise

Custom Lua/Go plugins required

Custom plugin (JWKS + scope logic)

Yes (Enterprise)

Full-control, on-prem/hybrid, high customization

Apigee (Google)Managed SaaS

JavaScript policy plugins

Custom JWT + scope policy

Yes (GCP BAA)

GCP-native, strong analytics, large org

AWS API GatewayManaged (AWS)

Lambda authorizers only — no native FHIR

Cognito + Lambda custom authorizer

Yes (AWS BAA)

AWS-native, serverless FHIR apps, simple routing

Azure API ManagementManaged (Azure)

FHIR-specific policies available (Azure HDS integration)

Built-in OAuth 2.0 + custom scope validation

Yes (Azure BAA)

Azure-native, best FHIR integration of managed gateways

NGINX + OpenResty

Open source self-managed

Full Lua customization — build everything

Custom Lua JWKS + scope enforcement

Depends on hosting (not NGINX itself)

Maximum performance, full control, significant ops burden

Mulesoft AnypointCommercial iPaaS

HL7/FHIR connectors available

SMART on FHIR policies

Yes

Enterprise with existing Mulesoft investment, HL7 v2 priority

💡 Peerbits recommendation

For healthcare platforms with mixed AWS/Azure infrastructure: Azure API Management for the FHIR-facing API gateway (best native FHIR integration, Azure Health Data Services compatibility) and AWS API Gateway + Lambda authorizers for patient-facing standalone apps (Cognito + PKCE flow, simpler scope model). For on-prem or hybrid deployments with complex HL7 v2 translation requirements: Kong Enterprise + Mirth Connect for the protocol translation sidecar.

9. Gateway Observability: FHIR-Specific Metrics & Alerting

Standard API gateway observability — request rate, latency percentiles, error rate, upstream health — is necessary but insufficient for healthcare. Your gateway observability stack must instrument FHIR-semantic signals that standard HTTP metrics cannot capture.

Critical FHIR Gateway Metrics

  • SMART scope denial rate by resource type. Track the percentage of requests that fail gateway scope enforcement, broken down by FHIR resource type and the scope that was missing. A rising scope denial rate for a specific resource type indicates either a SMART app bug (not requesting the right scopes) or a misconfigured gateway scope enforcement rule — both require immediate investigation.

  • Protocol translation error rate by source system. For each upstream HL7 v2 source, track the percentage of messages that fail parsing or FHIR mapping. A spike in translation errors from a specific lab system indicates a LIMS version change that altered their v2 message format — a maintenance event that must be caught before it silently drops lab results from the clinical record.

  • CDS Hook P99 response time by hook and service. Track P99 response time per CDS Hook service. A P99 above 4 seconds (approaching the 5-second EHR timeout) is a production alert — not a warning. At 5 seconds, the EHR discards the response and the clinical alert is lost. This metric must page on-call, not just trigger a dashboard annotation.

  • FHIR OperationOutcome rate in 2xx responses. Count responses where HTTP status is 200 but response body contains a FHIR OperationOutcome resource with severity "error" or "fatal." These are FHIR-level errors that standard HTTP monitoring misses entirely. Divide by resource type to identify which FHIR interactions are silently failing.

  • Bulk export job completion rate and NDJSON integrity. Track the ratio of $export jobs that complete successfully vs. fail or expire. For completed jobs, validate NDJSON line counts against the expected patient count. A bulk export that reports success but delivers 30% fewer records than expected is a data loss event — not a partial success.

  • Tenant rate limit breach frequency. Track which tenants hit rate limits and for which interaction classes (read, write, bulk). Frequent rate limit hits from a specific tenant indicate either a poorly implemented SMART app in their environment (retry without backoff) or a legitimate capacity planning signal that their tier's limits need adjustment.

Design Your Gateway for Clinical Reality

A healthcare API gateway that handles FHIR-aware routing, multi-protocol translation, SMART scope enforcement, PHI-safe audit logging, and clinical-workload-aware rate limiting is not a commodity infrastructure component — it is a core product competency that determines the security, compliance, and interoperability ceiling of your entire healthcare platform.

Peerbits has designed and operated healthcare API gateways for EHR vendors, digital health platforms, HIEs, and large payer organizations — handling millions of FHIR transactions daily across Epic, Cerner, Oracle Health, Athenahealth, and proprietary HL7 v2 source systems. Our Healthcare API Gateway Architecture Review is a 5-day engagement delivering a current-state assessment, a target architecture design, technology selection recommendation, and a phased implementation roadmap.

Book Free Gateway Review
author-profile

Ubaid Pisuwala

Ubaid Pisuwala is a highly regarded healthtech expert and Co-founder of Peerbits. He possesses extensive experience in entrepreneurship, business strategy formulation, and team management. With a proven track record of establishing strong corporate relationships, Ubaid is a dynamic leader and innovator in the healthtech industry.

Related Post

Award Partner Certification Logo
Award Partner Certification Logo
Award Partner Certification Logo
Award Partner Certification Logo
Award Partner Certification Logo