AnpherosAnpheros PlatformDevelopers

Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card

Dados de wearables em FHIR (Apple Health, Health Connect)

Obtenha dados de smartwatches, anéis e balanças para um registo FHIR: quais dispositivos chegam a qual health store, uma tabela de mapeamento LOINC, resumos diários e um upsert testado.

Para obter dados de um smartwatch, anel ou balança inteligente num registo médico, leia-os no telemóvel a partir da loja de saúde do sistema operativo — Apple Health no iOS, Health Connect no Android — resuma-os por dia, mapeie cada métrica para um código LOINC e uma unidade UCUM, e escreva-os como Observações FHIR R4 marcadas como dados de dispositivo. Ler a partir da loja de saúde do telemóvel em vez da nuvem de cada fornecedor permite que uma única integração cubra Apple Watch, Galaxy Watch, Pixel Watch, Garmin, Fitbit, Oura e Withings, desde que a pessoa tenha permitido a partilha pela aplicação do seu fornecedor. Esta página fornece o caminho dos dados, uma tabela de mapeamento que pode reutilizar, um exemplo FHIR validado e código que foi executado na plataforma.

O caminho dos dados

 watch, ring, scale ──► vendor app (Garmin Connect, Fitbit, Oura, Withings, Samsung Health…)
                              │  shares, with the person's permission
                              ▼
                 Apple Health (iOS)  /  Health Connect (Android)
                              │  your app reads, with the person's permission, on the phone
                              ▼
                 your app ──► your backend ──► FHIR R4 Observations in the person's record

Nem o Apple Health nem o Health Connect possuem uma API de servidor: os dados só podem ser lidos por uma aplicação no telemóvel da pessoa. A sua aplicação lê-os, envia valores diários compactos para o seu backend, e o backend escreve-os no registo.

Que dispositivos chegam a que repositório de saúde

O que cada fornecedor partilha muda com as versões das aplicações; a documentação do próprio fornecedor é a referência.

Dispositivo ou aplicação Apple Health (iOS) Health Connect (Android) Notas
Apple Watch Sim, nativamente — Tudo o que o relógio mede é enviado para o Apple Health
Samsung Galaxy Watch, Samsung Health — Parcialmente O Samsung Health decide que tipos exporta e com que frequência; consulte Samsung Health
Pixel Watch, Fitbit Sem sincronização oficial Sim, através da aplicação Fitbit (Ajuda do Google)
Garmin Sim, a partir do Garmin Connect após cada sincronização do dispositivo Sim, o Garmin Connect suporta o Health Connect no Android 14 e posterior (Android Developers, agosto de 2025) Pontuações específicas da Garmin, como Body Battery, não são partilhadas
Oura Sim Sim (Oura) Readiness e outras pontuações Oura permanecem na aplicação Oura
Withings Sim, através do Health Mate Sim (blog Android Developers) Balanças, monitores de pressão arterial, relógios

Duas consequências práticas. Primeiro, a sua aplicação depende de a pessoa ter ativado a partilha na sua aplicação de fornecedor; o onboarding deve indicar isso. Segundo, o repositório de saúde pode conter os mesmos passos de duas fontes (um telemóvel e um relógio); leia os totais diários do próprio repositório em vez de somar amostras, porque o Apple Health e o Health Connect já eliminam duplicados de fontes sobrepostas.

Tabela de mapeamento: tipo de store de saúde → Observação FHIR

Os códigos que o Anpheros Daily utiliza ao escrever dados de wearables num registo FHIR:

Métrica Apple HealthKit Health Connect LOINC Unidade UCUM Categoria
Frequência cardíaca heartRate HeartRateRecord 8867-4 /min vital-signs
Frequência cardíaca em repouso restingHeartRate RestingHeartRateRecord 40443-4 /min vital-signs
Variabilidade da frequência cardíaca heartRateVariabilitySDNN HeartRateVariabilityRmssdRecord 80404-7 (apenas SDNN) ms vital-signs
Oxigénio no sangue (SpO₂) oxygenSaturation OxygenSaturationRecord 59408-5 % vital-signs
Frequência respiratória respiratoryRate RespiratoryRateRecord 9279-1 /min vital-signs
Passos por dia stepCount StepsRecord 41950-7 {steps} activity
Energia ativa activeEnergyBurned ActiveCaloriesBurnedRecord 41981-2 kcal activity
Duração do sono sleepAnalysis (categoria) SleepSessionRecord 93832-4; fases 93831-6 profundo, 93830-8 leve, 93829-0 REM min activity
Peso corporal bodyMass WeightRecord 29463-7 kg vital-signs
Pressão arterial bloodPressure (correlação) BloodPressureRecord 85354-9 com 8480-6 e 8462-4 mm[Hg] vital-signs
Glicose no sangue (medidor) bloodGlucose BloodGlucoseRecord 2339-0 mg/dL vital-signs
Temperatura corporal bodyTemperature BodyTemperatureRecord 8310-5 Cel vital-signs

Observe a linha de variabilidade da frequência cardíaca: o Apple Health armazena SDNN, o Health Connect armazena RMSSD. São estatísticas diferentes e não devem ser escritas sob o mesmo código. O LOINC 80404-7 é SDNN; para RMSSD, o Anpheros Daily utiliza o seu próprio sistema de códigos em vez de fingir que os dois são iguais.

Resumos, não todas as amostras

Um relógio produz milhares de amostras de frequência cardíaca por dia. Um registo médico precisa de algo que uma pessoa ou um médico possa ler:

Um resumo diário da frequência cardíaca como FHIR R4 (passa pelo validador FHIR R4):

{
  "resourceType": "Observation",
  "status": "final",
  "identifier": [{"system": "https://your-app.test/fhir/sid/daily-wearable", "value": "p-123:2026-10-01:heart_rate"}],
  "category": [{"coding": [{"system": "http://terminology.hl7.org/CodeSystem/observation-category", "code": "vital-signs"}]}],
  "code": {"coding": [{"system": "http://loinc.org", "code": "8867-4", "display": "Heart rate"}]},
  "subject": {"reference": "Patient/p-123"},
  "effectivePeriod": {"start": "2026-10-01T00:00:00-04:00", "end": "2026-10-02T00:00:00-04:00"},
  "valueQuantity": {"value": 71.4, "unit": "/min", "system": "http://unitsofmeasure.org", "code": "/min"},
  "component": [
    {"code": {"text": "minimum"}, "valueQuantity": {"value": 52, "unit": "/min", "system": "http://unitsofmeasure.org", "code": "/min"}},
    {"code": {"text": "maximum"}, "valueQuantity": {"value": 138, "unit": "/min", "system": "http://unitsofmeasure.org", "code": "/min"}}
  ],
  "device": {"display": "Apple Watch (via Apple Health)"}
}

Escrever valores diários sem duplicados

Os telemóveis sincronizam várias vezes por dia, e o último valor de um dia continua a mudar até à meia-noite. Atribua a cada Observation um identificador estável — pessoa, dia, métrica — e atualize-o em vez de criar um novo. Com o Anpheros TypeScript SDK, no seu backend:

import { Anpheros, apiKey } from '@anpheros/sdk';

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

// What the phone sends: one value per metric per local day
type DailyValue = { metric: 'heart_rate' | 'steps'; day: string; value: number; min?: number; max?: number };

const CODES = {
  heart_rate: { code: '8867-4', display: 'Heart rate', unit: '/min', category: 'vital-signs' },
  steps: { code: '41950-7', display: 'Number of steps in 24 hour Measured', unit: '{steps}', category: 'activity' },
} as const;

// One Observation per person, metric and day: re-sending a day updates it instead of adding a copy.
async function upsertDaily(patientId: string, v: DailyValue, source: string) {
  const c = CODES[v.metric];
  const identifier = { system: 'https://your-app.test/fhir/sid/daily-wearable', value: `${patientId}:${v.day}:${v.metric}` };
  const resource: any = {
    resourceType: 'Observation', status: 'final',
    identifier: [identifier],
    category: [{ coding: [{ system: 'http://terminology.hl7.org/CodeSystem/observation-category', code: c.category }] }],
    code: { coding: [{ system: 'http://loinc.org', code: c.code, display: c.display }] },
    subject: { reference: `Patient/${patientId}` },
    effectivePeriod: { start: `${v.day}T00:00:00Z`, end: `${v.day}T23:59:59Z` },
    valueQuantity: { value: v.value, unit: c.unit, system: 'http://unitsofmeasure.org', code: c.unit },
  };
  if (v.min !== undefined && v.max !== undefined) {
    resource.component = [
      { code: { text: 'minimum' }, valueQuantity: { value: v.min, unit: c.unit, system: 'http://unitsofmeasure.org', code: c.unit } },
      { code: { text: 'maximum' }, valueQuantity: { value: v.max, unit: c.unit, system: 'http://unitsofmeasure.org', code: c.unit } },
    ];
  }
  const found = await anpheros.fhir.search('Observation', { identifier: `${identifier.system}|${identifier.value}` });
  const existing = found.entry?.[0]?.resource;
  return existing
    ? anpheros.fhir.update({ ...resource, id: existing.id }, { author_type: 'device' })
    : anpheros.fhir.create(resource, { author_type: 'device', source_system: source });
}

Executar contra uma instância local da plataforma com uma chave de sandbox, dois valores diários seguidos de uma sincronização posterior dos passos do mesmo dia resultou em duas Observations, a dos passos com a versão 2 com o novo valor, e a proveniência v1 device apple-health · v2 device. O histórico mantém o valor anterior, e qualquer leitor pode ver que os dados vieram de um dispositivo, não de um clínico.

Em produção, utilize os limites reais do dia no fuso horário da pessoa (o exemplo acima utiliza UTC por brevidade), tal como o código HealthKit e Health Connect nas páginas da plataforma.

Leitura no telemóvel

Regras a seguir

O que a Anpheros faz e não faz

A Plataforma Anpheros não se conecta à Apple Health, Health Connect ou a qualquer nuvem de fornecedor por si só: a sua aplicação lê os dados no telemóvel e escreve-os através da API. A própria aplicação da Anpheros, Anpheros Daily, faz exatamente isso: lê a Apple Health no iPhone e o Health Connect no Android, mantém resumos diários e escreve-os no registo FHIR da pessoa com os códigos acima. A conexão de dispositivos faz parte dos seus planos Plus e Max.

Perguntas frequentes

Como obtenho dados do Apple Watch num servidor FHIR?

Leia-os no iPhone a partir do Apple Health com HealthKit (não existe uma API de servidor), resuma-os por dia e faça com que o seu backend escreva cada métrica como uma Observation com um código LOINC e unidade UCUM, marcada como dados do dispositivo.

Existe uma API na nuvem para Health Connect ou Apple Health?

Não. Ambos mantêm os dados no telemóvel; uma aplicação instalada no telemóvel lê-os com a permissão da pessoa. As nuvens de fornecedores como Garmin, Fitbit ou Oura têm as suas próprias APIs, mas a leitura da loja de saúde do telemóvel cobre a maioria delas com uma única integração.

Qual código LOINC devo usar para passos?

41950-7, "Number of steps in 24 hour Measured", com um resumo diário effectivePeriod. Para a frequência cardíaca use 8867-4, para SpO₂ 59408-5, para a duração do sono 93832-4.

Devo armazenar cada amostra de frequência cardíaca em FHIR?

Normalmente não. Um resumo diário com média, mínimo e máximo é o que uma pessoa ou clínico lê; leituras individuais pertencem ao registo apenas quando são importantes por si só, como um evento de ritmo irregular.

Posso usar um código para HRV do Apple Health e Health Connect?

Não. O Apple Health reporta SDNN e o Health Connect reporta RMSSD; medem coisas diferentes e necessitam de códigos diferentes.

Relacionado

Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card

Product updates by email

New features, guides and the end of the beta. One email a month at most.

Send me occasional Anpheros Platform updates by email (new features, API changes, guides). I'll confirm by email and can unsubscribe in one click from any email. Privacy