# FHIR を使用した個人健康記録 (PHR) アプリ

> チュートリアル: FHIR R4 上の接続型 PHR のバックエンド — 個人、検査、文書、デバイスからのデータ、タイムライン、共有用の IPS、同意。テスト済みのコード。

Source: https://developers.anpheros.com/ja/guides/personal-health-record-app

**個人健康記録 (PHR) アプリは、個人の健康情報 — 結果、測定値、診断、投薬、文書 — を、1つの病院からではなく、本人が管理する記録に保持します。** 難しいのは画面ではなく、検査機関、クリニック、デバイスからデータを使いやすい形式で取り込み、各項目の出所を追跡し、本人が管理を失うことなく記録を共有できるようにすることです。このチュートリアルでは、Anpheros TypeScript SDK を使用して HL7 FHIR R4 上の PHR のバックエンドを構築します。以下のコードは、サンドボックスキーを使用してローカルのプラットフォームインスタンスに対して実行されました。

## 接続型、非接続型、および連携型 PHR

| 種類 | データ保存場所 | 制限事項 |
|---|---|---|
| 接続型 (病院の患者ポータル) | プロバイダーの EHR | そのプロバイダーのデータのみを表示。担当医が変わると変更される |
| 非接続型 (スタンドアロンアプリまたはノートブック) | アプリ独自のデータベース | すべて手入力。データはアプリからほとんど出ない |
| 連携型 | 患者の同意を得て、アプリ、ラボ、クリニックが読み書きする標準化された記録 | 標準、同意、およびプロベナンスが必要 |

連携型 PHR は、今日構築する価値のあるものです。また、ポリシーもそちらに向かっています。米国では、認定 EHR は患者にデータへの FHIR ベースの API アクセス (US Core) を提供しなければなりません。欧州連合では、European Health Data Space は、人々が自身の電子健康データにアクセスし、選択したプロバイダーと共有する権利を与えています (2029 年から段階的に導入)。

## PHRデータの出所

1.  **本人:** 自宅での測定値、症状、服用中の薬、自身が認識している病状。これらは患者報告としてマークします。
2.  **検査レポート:** ほとんどの人はPDFで受け取りますが、一部の検査機関はHL7 v2またはCSVで送信できます。各結果はコード化されたObservation ([Lab results API](https://developers.anpheros.com/ja/guides/lab-results-api)) になります。
3.  **文書:** 退院サマリー、画像診断レポート、処方箋。構造化データと並べて、元のファイルを変更せずに保持します。
4.  **デバイスおよびウェアラブル:** Apple HealthまたはHealth Connectからの毎日の歩数、心拍数、睡眠、血圧 ([wearable data in FHIR](https://developers.anpheros.com/ja/guides/wearable-data-fhir))。
5.  **医療提供者:** 米国では、病院や保険会社の患者アクセスFHIR API（SMART on FHIRでアクセス）、それ以外の地域では、主に文書やInternational Patient Summaryのようなサマリー。

各ソースは同じレコードに書き込みます。信頼性を保つのは、各項目が誰がそれを書き込んだか、そしてどのシステムから来たかを記録していることです ([medical data provenance](https://developers.anpheros.com/guides/medical-data-provenance))。

## アーキテクチャ

```
 person ──► your PHR app (mobile / web) ──► your backend ──► Anpheros: one FHIR R4 record per person
                                               │                 ├─ Observations, Conditions, Medications, Documents…
   lab report, PDF, device data ───────────────┘                 ├─ Provenance on every write
                                                                 ├─ access log the person can see
   other apps, doctors, AI assistants ◄── consent (OAuth) ───────┴─ $summary (IPS) to share
```

バックエンドはプロジェクトキーを保持します（サンドボックスでは`sk_test_…`、アプリ内では決して保持しません）。アプリは独自の認証でユーザーをサインインさせ、バックエンドと通信します。バックエンドは各ユーザーを1つの患者レコードにマッピングします。

## ステップバイステップ

SDK (`npm install @anpheros/sdk`) をインストールし、[ダッシュボード](https://platform.anpheros.com/dashboard/) から無料のサンドボックスキーを取得してください。このサンプルでは、2つの結果を持つ HL7 v2 リピッドパネル (`lipid-panel.hl7`) と任意の PDF (`report.pdf`) を使用します。

```ts
import { readFile } from 'node:fs/promises';
import { Anpheros, apiKey } from '@anpheros/sdk';

const anpheros = new Anpheros({ auth: apiKey(process.env.ANPHEROS_KEY!) });

// 1. One record per person who signs up in your PHR app
const jane = await anpheros.patients.create({ given: 'Jane', family: 'Doe', birth_date: '1984-07-19', gender: 'female' });

// 2. Something the person measured at home
await anpheros.observations.create(jane.id, {
  code: '85354-9', category: 'vital-signs', effective_at: '2026-10-01T08:30:00-05:00', author_type: 'patient',
  components: [{ code: '8480-6', value: 128, unit: 'mm[Hg]' }, { code: '8462-4', value: 82, unit: 'mm[Hg]' }],
});

// 3. A diagnosis and a medication the person reports
await anpheros.conditions.create(jane.id, { code: 'E11.9', system: 'http://hl7.org/fhir/sid/icd-10',
  display: 'Type 2 diabetes mellitus without complications', clinical_status: 'active', onset: '2021-03-15', author_type: 'patient' });
await anpheros.medications.create(jane.id, { code: 'A10BA02', display: 'Metformin 500 mg', status: 'active',
  dosage: '500 mg twice a day', start: '2021-03-20', author_type: 'patient' });

// 4. A lab report the person received, as the lab sent it (HL7 v2)
const lab = await anpheros.labs.importHl7(jane.id, await readFile('lipid-panel.hl7', 'utf8'), { sourceSystem: 'springfield-lis' });

// 5. A PDF they want to keep with the record
const doc = await anpheros.documents.upload(jane.id,
  { title: 'Chest X-ray report', kind: 'imaging_report', content_type: 'application/pdf', date: '2026-10-03' },
  await readFile('report.pdf'));

// 6. One timeline for the home screen
const timeline = await anpheros.timeline.list(jane.id, { limit: 10 });

// 7. A summary to share with a new doctor: the International Patient Summary
const ips = await anpheros.fhir.summary(jane.id);

// 8. Who else can read this record (empty until the person consents to another app)
const grants = await anpheros.grants.of(jane.id);
```

その実行から印刷されたもの:

```
lab:       created 2, unmapped []
document:  final
timeline:  2026-10-03  document    Chest X-ray report
           2026-10-02  observation Cholesterol in HDL [Mass/volume] in Serum or Plasma
           2026-10-02  observation Cholesterol [Mass/volume] in Serum or Plasma
           2026-10-01  observation Blood pressure panel
           2021-03-20  medication  Metformin 500 mg
           2021-03-15  condition   Type 2 diabetes mellitus without complications
IPS:       Allergies, Medications, Problems, Results, Vital signs
grants:    0
```

上記すべては FHIR R4 — Patient, Observation, Condition, MedicationStatement, DocumentReference — として保存されるため、同じレコードは任意の FHIR クライアント (`GET /fhir/R4/Patient/{id}/$everything`) で読み取ることができ、そのまま別の場所に移動できます。SDK 内の `/v1` 呼び出しは、同じリソースのよりシンプルなビューです。[Medical data API](https://developers.anpheros.com/ja/guides/medical-data-api) にそれらがリストされています。

## 管理を失わずに共有する

PHRは、本人の意思に基づいて共有されるものです。

- **医師との共有:** 国際患者サマリー（`$summary`）は、臨床医向けに作成されたFHIRドキュメントです。問題、薬剤、アレルギー、検査結果などが含まれており、アプリで表示、印刷、送信できます。[FHIRプラットフォーム](https://developers.anpheros.com/ja/guides/fhir)では、`$summary`と`$everything`について説明しています。
- **他のアプリとの共有:** 他のアプリは、OAuth 2.1およびSMART on FHIRを通じて同意を求めます。本人は、どのデータ（例: 検査結果のみ）を、どのくらいの期間共有するかを選択でき、いつでも取り消すことができます。[SMART on FHIRで患者同意を実装する方法](https://developers.anpheros.com/ja/guides/smart-on-fhir-backend)で手順を説明しています。
- **AIアシスタントとの共有:** `POST /v1/context`は、モデルのために予算化され、ソースラベルが付与されたレコードのサマリーを構築します。読み取りはアクセスログに表示されます（[AIヘルスケアアプリの構築方法](https://developers.anpheros.com/ja/guides/build-ai-healthcare-app)）。
- **透明性:** どのアプリケーションによる読み取りおよび書き込みも、アプリケーションごとにログに記録され、本人はログとアクティブな付与を確認できます。

## ファミリー

多くのPHRは、子供、配偶者、高齢の親など、複数の家族のために一人の人物によって管理されています。全員のデータを一つに混ぜるのではなく、各個人に独自のレコードを作成し、保護者とリンクさせてください。同意はレコードごとに与えられます。[患者の医療記録](https://developers.anpheros.com/ja/guides/patient-medical-record)でモデルについて説明しています。

## 自分で構築するもの、構築しないもの

ユーザー体験（オンボーディング、結果の説明方法、リマインダー、チャート、ユーザーが読む言語など）は、お客様が構築します。Anpheros は、レコード、標準フォーマット、同意、来歴、アクセスログ、およびラボ、ドキュメント、サマリーの操作を提供します。

現在、PHR において Anpheros が行わないこと：Anpheros は、ユーザーの代わりに病院の患者ポータルや米国の患者アクセス API にログインしません（お客様のアプリは、SMART on FHIR クライアントを使用してこれを行い、受信したものを書き込むことができます）。API を介して PDF レポートを読み取ることも、医療アドバイスを提供することもありません。Anpheros 自身の PHR アプリである **Anpheros Daily** は、この同じ API 上に構築されています。

## よくある質問

### 個人健康記録（PHR）とは何ですか？
個人の健康情報のうち、本人が管理・保持する記録のことです。単一の医療機関が保持するのではなく、本人による入力、検査機関、クリニック、デバイスなど、複数のソースから収集されます。

### PHRとEHRの違いは何ですか？
EHRは医療機関が保持し、その医療機関の提供者が記録した内容を網羅します。PHRは本人が保持し、すべての医療機関やデバイスからのデータを統合できます。テザードPHRは単一の医療機関のEHRへの窓口であり、コネクテッドPHRは標準規格を使用して複数のソースを統合します。

### PHRはFHIRを使用すべきですか？
データが医師、他のアプリ、またはAIアシスタントと共有される可能性がある場合は、はい、FHIR R4は、他のシステムが既に理解しているコード化されバージョン管理されたリソースを提供します。これは、米国の患者アクセスAPIおよび欧州の患者サマリーの形式です。

### PHRアプリはどのようにして病院からデータを取得しますか？
米国では、認定されたEHRや多くの保険会社が公開しているFHIR患者アクセスAPIを通じて、SMART on FHIRを使用して、本人がアプリを承認できるようにします。それ以外の地域では、ほとんどの場合、ドキュメントやサマリーが構造化データと並べてインポート・保存されます。

### PHRアプリはAPIキーをどこに保管すべきですか？
ご自身のサーバーに保管してください。プロジェクトキーは、プロジェクトが作成したすべてのレコードを読み取ることができるため、モバイルアプリやWebアプリ内に含めることは絶対にできません。アプリはバックエンドと通信し、他の人のアプリは本人の同意を得てOAuthを使用します。

## 関連情報

- [医療アプリの構築](https://developers.anpheros.com/ja/guides/build-a-healthcare-app): 一般的なウォークスルー
- [患者の診療記録](https://developers.anpheros.com/ja/guides/patient-medical-record): 記録の内容とアクセス権限
- [デジタル診療記録インフラストラクチャ](https://developers.anpheros.com/ja/guides/digital-medical-record)
- [FHIRにおけるウェアラブルデータ](https://developers.anpheros.com/ja/guides/wearable-data-fhir): Apple Health, Health Connect, Samsung Health
- [検査結果API](https://developers.anpheros.com/ja/guides/lab-results-api)
- [SDK](https://developers.anpheros.com/ja/guides/sdks)
