TL;DR
EHR APIは、Epic、Cerner、Athenahealthのようなシステムに保存されている患者の健康記録にアクセスします。最新のほとんどのEHRは、医療データのための標準フォーマットであるFHIR(Fast Healthcare Interoperability Resources)をサポートしています。認証には、SMART on FHIR拡張機能を備えたOAuth 2.0が使用されます。テストには、Apidogを使用してFHIRリソースを検証し、サンドボックスでテストし、本番システムに接続する前に統合が患者データを正しく処理することを確認してください。
はじめに
電子カルテ(EHR)には、診断、投薬、検査結果、アレルギー、治療計画など、患者ケアに関するあらゆる情報が含まれています。病院、診療所、医療システムは、Epic、Cerner、AthenahealthなどのEHRプラットフォームにこのデータを保存しています。
医療アプリケーションを構築するということは、これらのシステムに接続することを意味します。病院にCSVファイルをエクスポートするよう依頼することはできません。APIが必要です。しかし、医療APIは一般的なWeb APIとは異なります。これらは保護された健康情報(PHI)を扱い、米国ではHIPAAのような規制を遵守する必要があります。
良いニュースは、ほとんどのEHRベンダーが現在、標準APIフォーマットであるFHIRをサポートしていることです。課題は、認証、認可、データマッピングが依然として複雑であることです。
医療統合を構築している場合、ApidogはFHIRリソースのテスト、データ構造の検証、アプリケーションが患者データを正しく処理することの確認に役立ちます。実際の病院システムで作業する前に、公開サンドボックスに対してテストできます。
ApidogでFHIR APIをテスト - 無料
このガイドを読み終えるまでに、あなたは以下のことができるようになります。
- FHIRリソースのタイプと構造を理解する
- SMART on FHIRで認証する
- 患者の人口統計データと臨床データを照会する
- 患者リソースを作成・更新する
- EHRサンドボックスでテストする
FHIRを理解する
FHIR(Fast Healthcare Interoperability Resources)は、医療APIの最新標準です。これは以下を定義します。
- リソース: 医療概念(Patient、Observation、Medicationなど)のデータ型
- REST API: リソースに対する標準的な操作
- フォーマット: JSONおよびXML表現
ベースURL構造
https://ehr.example.com/fhir/r4/{resource-type}/{id}
例:
GET https://ehr.example.com/fhir/r4/Patient/123
FHIRバージョン
ほとんどのEHRはFHIR R4(リリース4)を使用しています。一部の古いシステムではDSTU2を使用しています。このガイドではR4について説明します。
リソースタイプ
| リソース | 目的 |
|---|---|
| Patient | 人口統計データおよび管理データ |
| Practitioner | 医療提供者 |
| Organization | 病院、診療所 |
| Observation | 検査結果、バイタルサイン |
| MedicationRequest | 処方箋 |
| Condition | 診断、問題 |
| Encounter | 受診、入院 |
| DocumentReference | 臨床文書 |
| AllergyIntolerance | アレルギーおよび有害反応 |
FHIRリソースの構造
患者リソースの例
{
"resourceType": "Patient",
"id": "123",
"active": true,
"name": [
{
"use": "official",
"family": "Smith",
"given": ["John", "Michael"]
}
],
"gender": "male",
"birthDate": "1985-03-15",
"address": [
{
"use": "home",
"line": ["123 Main St"],
"city": "Boston",
"state": "MA",
"postalCode": "02101",
"country": "USA"
}
],
"telecom": [
{
"system": "phone",
"value": "555-123-4567",
"use": "home"
},
{
"system": "email",
"value": "john.smith@example.com"
}
],
"identifier": [
{
"system": "http://hospital.example.org/mrn",
"value": "MRN-123456"
}
]
}
観察リソースの例
{
"resourceType": "Observation",
"id": "obs-123",
"status": "final",
"category": [
{
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/observation-category",
"code": "vital-signs",
"display": "Vital Signs"
}
]
}
],
"code": {
"coding": [
{
"system": "http://loinc.org",
"code": "8480-6",
"display": "Systolic blood pressure"
}
]
},
"subject": {
"reference": "Patient/123"
},
"effectiveDateTime": "2026-03-24T09:30:00Z",
"valueQuantity": {
"value": 120,
"unit": "mmHg",
"system": "http://unitsofmeasure.org",
"code": "mm[Hg]"
}
}
SMART on FHIRによる認証
SMART on FHIRは、医療向けにOAuth 2.0を拡張したものです。これは患者コンテキストとEHR固有のスコープを処理します。
患者アクセス用のOAuthフロー
ステップ1: 認可URLを取得する
GET https://ehr.example.com/fhir/r4/.well-known/smart-configuration
レスポンスに含まれるもの:
{
"authorization_endpoint": "https://ehr.example.com/oauth2/authorize",
"token_endpoint": "https://ehr.example.com/oauth2/token",
"scopes_supported": [
"patient/*.read",
"patient/*.write",
"user/*.read",
"launch/patient"
]
}
ステップ2: ユーザーを認可にリダイレクトする
https://ehr.example.com/oauth2/authorize?
response_type=code&
client_id=YOUR_CLIENT_ID&
redirect_uri=https://yourapp.com/callback&
scope=patient/*.read&
state=random_state_value
ステップ3: コードをトークンと交換する
curl -X POST "https://ehr.example.com/oauth2/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=authorization_code" \
-d "code=AUTHORIZATION_CODE" \
-d "redirect_uri=https://yourapp.com/callback" \
-d "client_id=YOUR_CLIENT_ID" \
-d "client_secret=YOUR_CLIENT_SECRET"
レスポンス:
{
"access_token": "eyJhbGciOiJSUzI1NiIs...",
"token_type": "Bearer",
"expires_in": 3600,
"scope": "patient/*.read",
"patient": "123"
}
patientフィールドは、患者IDのコンテキストを提供します。
SMARTスコープ
| スコープ | アクセス |
|---|---|
patient/*.read |
全ての患者データを読み取る |
patient/Patient.read |
患者の人口統計データのみを読み取る |
patient/Observation.read |
観察データのみを読み取る |
user/*.read |
認証されたユーザーの全てのデータを読み取る |
launch/patient |
EHRが患者コンテキストであなたのアプリを起動する |
患者データの照会
患者の人口統計データを取得する
curl -X GET "https://ehr.example.com/fhir/r4/Patient/123" \
-H "Authorization: Bearer ACCESS_TOKEN"
観察データを検索する
curl -X GET "https://ehr.example.com/fhir/r4/Observation?patient=123&category=vital-signs" \
-H "Authorization: Bearer ACCESS_TOKEN"
レスポンスはBundleです:
{
"resourceType": "Bundle",
"type": "searchset",
"total": 5,
"entry": [
{
"resource": { ... Observation resource ... }
}
]
}
一般的な検索パラメータ
# 日付範囲による検査結果
GET /Observation?patient=123&category=laboratory&date=gt2026-01-01
# 特定のLOINCコード
GET /Observation?patient=123&code=http://loinc.org|8480-6
# 投薬
GET /MedicationRequest?patient=123&status=active
# 病状(診断)
GET /Condition?patient=123&clinical-status=active
# 受診記録
GET /Encounter?patient=123&type=AMB
ページネーション
大量の結果セットはページネーションされます:
GET /Observation?patient=123&_count=20
レスポンスにはリンクが含まれます:
{
"link": [
{
"relation": "next",
"url": "https://ehr.example.com/fhir/r4/Observation?patient=123&_count=20&page=2"
}
]
}
リソースの作成と更新
観察データを作成する
curl -X POST "https://ehr.example.com/fhir/r4/Observation" \
-H "Authorization: Bearer ACCESS_TOKEN" \
-H "Content-Type: application/fhir+json" \
-d '{
"resourceType": "Observation",
"status": "final",
"code": {
"coding": [{
"system": "http://loinc.org",
"code": "8480-6",
"display": "Systolic blood pressure"
}]
},
"subject": {
"reference": "Patient/123"
},
"effectiveDateTime": "2026-03-24T09:30:00Z",
"valueQuantity": {
"value": 118,
"unit": "mmHg",
"system": "http://unitsofmeasure.org",
"code": "mm[Hg]"
}
}'
患者を更新する
curl -X PUT "https://ehr.example.com/fhir/r4/Patient/123" \
-H "Authorization: Bearer ACCESS_TOKEN" \
-H "Content-Type: application/fhir+json" \
-d '{
"resourceType": "Patient",
"id": "123",
"name": [{
"family": "Smith",
"given": ["John", "Michael"]
}],
"telecom": [{
"system": "phone",
"value": "555-999-8888",
"use": "home"
}]
}'
EHRベンダー固有の詳細
Epic
EpicのFHIR APIは、ほとんどの大規模病院で利用可能です。
- ベースURL:
https://fhir.epic.com/interconnect-fhir-oauth/api/FHIR/R4/ - サンドボックス:
https://fhir.epic.com/test/api/FHIR/R4/ - ドキュメント: https://fhir.epic.com
Epicは、本番環境へのアクセスに、彼らのアプリマーケットプレイスでのアプリ登録を要求します。
Cerner
Cerner(Oracle Health)は、一部の拡張機能を備えた標準FHIRを使用しています。
- ベースURL:
https://fhir-myrecord.cerner.com/r4/{tenant-id} - サンドボックス:
https://fhir-deprecated.cerner.com/r4/ec2458f2-1e24-41c8-b71b-0e701af7583d - ドキュメント: https://docs.oracle.com/en/health/health-cerner/
Athenahealth
AthenahealthはFHIRとレガシーAPIを提供しています。
- ベースURL:
https://api.platform.athenahealth.com/fhir/r4/{practice-id} - サンドボックス: 開発者プログラムを通じて利用可能
- ドキュメント: https://docs.athenahealth.com
Apidogでのテスト
医療APIには慎重なテストが必要です。患者データは機密性が高いです。

1. 公開サンドボックスを使用する
公開FHIRサンドボックスに対してテストします:
# HAPI FHIR(オープンソース)
https://hapi.fhir.org/baseR4
# SMART Health ITサンドボックス
https://launch.smarthealthit.org
2. FHIRリソースを検証する
pm.test('Resource is valid Patient', () => {
const response = pm.response.json()
pm.expect(response.resourceType).to.eql('Patient')
pm.expect(response.id).to.exist
pm.expect(response.name).to.be.an('array')
})
pm.test('Observation has required fields', () => {
const resource = pm.response.json()
pm.expect(resource.status).to.exist
pm.expect(resource.code).to.exist
pm.expect(resource.subject).to.exist
})
3. 認証フローをテストする
SMART設定を環境として保存します:
AUTHORIZATION_ENDPOINT: https://ehr.example.com/oauth2/authorize
TOKEN_ENDPOINT: https://ehr.example.com/oauth2/token
CLIENT_ID: your_client_id
CLIENT_SECRET: your_client_secret
SCOPE: patient/*.read
ApidogでFHIR APIをテスト - 無料
コンプライアンスに関する考慮事項
HIPAA
米国では、医療アプリケーションはHIPAAを遵守する必要があります。これは以下に影響します。
- データ送信: TLS 1.2+を使用する
- データ保存: 保存時に暗号化する
- アクセス制御: 監査ログ、必要最小限のアクセス
- ビジネスアソシエイト契約: EHRベンダーとの間で必要
SMART on FHIRのセキュリティ
- トークンは期限切れになります(通常1時間)
- 拡張されたセッションのためにリフレッシュトークンが利用可能
- 患者コンテキストはトークンスコープに紐付けられる
- ログアウトにはトークンの失効が必要
データ最小化
必要なスコープのみを要求します:
- 良い例:
patient/Observation.read - 避けるべき例: 必要でない限り
patient/*.read
一般的なエラーと修正
401 認証されていない
原因: トークンが期限切れまたは無効です。
修正: 最初の認可からのリフレッシュトークンを使用してトークンを更新します。
403 禁止されている
原因: スコープに要求されたリソースが含まれていません。
修正: スコープを確認してください。さらにアクセスが必要な場合は、認可時に追加のスコープを要求します。
404 見つかりません
原因: 患者またはリソースが存在しません。
修正: リソースIDを確認してください。現在のトークンの患者コンテキストで患者にアクセスできることを確認します。
422 処理できないエンティティ
原因: FHIRリソースの検証に失敗しました。
修正: 必須フィールドと用語を確認してください:
{
"resourceType": "OperationOutcome",
"issue": [{
"severity": "error",
"code": "required",
"details": {
"text": "Observation.status is required"
}
}]
}
代替案と比較
| 機能 | Epic | Cerner | Athenahealth | OpenEMR |
|---|---|---|---|---|
| FHIR R4 | ✓ | ✓ | ✓ | 部分的 |
| SMART on FHIR | ✓ | ✓ | ✓ | いいえ |
| サンドボックスアクセス | ✓ | ✓ | 制限あり | 自己ホスト |
| APIドキュメント | 素晴らしい | 良い | 良い | 基本的 |
| 市場シェア | 大規模病院 | 医療システム | 小規模診療所 | オープンソース |
EpicとCernerは大規模な医療システムを支配しています。Athenahealthは小規模な診療所を対象としています。OpenEMRはオープンソースですが、APIサポートは限られています。
実世界のユースケース
患者ポータル。ある医療システムは、Epicからデータを取得する患者ポータルを構築します。患者は検査結果、投薬、今後の予約を閲覧できます。このポータルは、SMART on FHIR認証を備えたFHIR APIを使用しています。
臨床研究。製薬会社は、臨床試験の対象患者を特定する必要があります。彼らは複数の病院システムにわたるFHIR APIを照会し、適切な同意管理の下で基準に合致する患者を見つけます。
リモートモニタリング。ある遠隔医療会社は、患者が報告したバイタルサインをEHRシステムと統合します。観察データはFHIR APIを介して作成され、Epicの臨床医に即座に表示されます。
まとめ
これまでに学んだこと:
- FHIRは医療APIの標準である
- リソースは患者や観察などの医療概念を表す
- SMART on FHIRは患者コンテキストでOAuthを処理する
- 各EHRベンダーには特定の導入詳細がある
- 本番前にサンドボックスでテストする
次のステップ:
- HAPI FHIR公開サンドボックスを探索する
- あなたのユースケースに合ったFHIRリソースタイプを理解する
- EHR開発者プログラムに登録する
- モック患者データを使用してApidogでテストする
- HIPAA準拠のデータ処理を実装する
ApidogでFHIR APIをテスト - 無料
FAQ
FHIRとHL7 v2の違いは何ですか?HL7 v2は、病院のインターフェースで使用される古いメッセージング標準です。FHIRは、最新のREST API標準です。ほとんどの新しい統合はFHIRを使用しますが、HL7 v2はレガシーシステムで依然として一般的です。
EHR APIを使用するためにBAAは必要ですか?はい、PHIを扱っている場合は必要です。ビジネスアソシエイト契約は、対象事業体とビジネスアソシエイトの間で必要とされます。EHRベンダーのコンプライアンスチームに確認してください。
EpicのFHIR APIにアクセスするにはどうすればよいですか?EpicのApp Orchardマーケットプレイスに登録してください。サンドボックスでのテストには、彼らの公開サンドボックスを使用してください。本番環境へのアクセスには、病院の承認が必要です。
患者コンテキストとは何ですか?SMART on FHIRトークンには患者IDが含まれています。API呼び出しは、その患者のデータに限定されます。これにより、アプリは患者が認可したデータのみにアクセスできるようになります。
EHRにデータを書き込むことはできますか?はい、しかし制限があります。ほとんどのEHRは観察データの作成や患者の人口統計データの更新を許可しています。診断や投薬の書き込みには、通常、臨床意思決定支援の承認が必要です。
用語コードはどのように処理しますか?FHIRは標準的な用語を使用します:
- 検査結果と観察データのためのLOINC
- 臨床概念のためのSNOMED CT
- 診断のためのICD-10
- 投薬のためのRxNorm
リソースを作成する際には、これらのシステムを使用してください。
国際的な医療はどうですか?FHIRはグローバルです。各国には実装ガイドがある場合があります。米国はUS Coreプロファイルを使用しています。お住まいの地域の仕様を確認してください。
