EHR API の使い方

Ashley Innocent

Ashley Innocent

24 3月 2026

EHR API の使い方

Apidog エンタープライズ

オンプレミスデプロイ

SSO & RBAC

SOC 2 準拠

Apidog Enterpriseを見る

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を理解する

FHIR(Fast Healthcare Interoperability Resources)は、医療APIの最新標準です。これは以下を定義します。

ベース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は、ほとんどの大規模病院で利用可能です。

Epicは、本番環境へのアクセスに、彼らのアプリマーケットプレイスでのアプリ登録を要求します。

Cerner

Cerner(Oracle Health)は、一部の拡張機能を備えた標準FHIRを使用しています。

Athenahealth

AthenahealthはFHIRとレガシーAPIを提供しています。

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を遵守する必要があります。これは以下に影響します。

SMART on FHIRのセキュリティ

データ最小化

必要なスコープのみを要求します:

一般的なエラーと修正

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の臨床医に即座に表示されます。

まとめ

これまでに学んだこと:

次のステップ:

  1. HAPI FHIR公開サンドボックスを探索する
  2. あなたのユースケースに合ったFHIRリソースタイプを理解する
  3. EHR開発者プログラムに登録する
  4. モック患者データを使用してApidogでテストする
  5. 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は標準的な用語を使用します:

リソースを作成する際には、これらのシステムを使用してください。

国際的な医療はどうですか?FHIRはグローバルです。各国には実装ガイドがある場合があります。米国はUS Coreプロファイルを使用しています。お住まいの地域の仕様を確認してください。

ApidogでAPIデザイン中心のアプローチを取る

APIの開発と利用をよりシンプルなことにする方法を発見できる