Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card
Começar
De uma chave de API à leitura e escrita do registo FHIR R4 de um paciente na sandbox: chaves, primeiras chamadas, escritas com proveniência, documentos, contexto de IA, IPS, consentimento, webhooks e relatórios de laboratório.
A Plataforma Anpheros é um backend de dados de saúde: um registo FHIR R4 por paciente, isolamento de projetos, proveniência em cada escrita e uma API REST simples sobre os mesmos dados. Este guia leva-o do zero à leitura e escrita do registo de um paciente na sandbox.
URL base (sandbox e produção partilham-no; a chave decide o plano de dados):
https://platform.anpheros.com
Referência interativa: /docs (OpenAPI) e /fhir/R4/metadata (CapabilityStatement).
1. Obter uma chave (1 minuto)
O sandbox é self-service. Inicie sessão no dashboard (https://platform.anpheros.com/dashboard/)
com o Google e prima Obter uma chave de sandbox: obtém uma organização, um projeto de sandbox com os seus próprios
pacientes sintéticos e uma chave — mostrada uma vez. O mesmo através da Admin API, com o seu token de utilizador Firebase:
curl -X POST $BASE/admin/sandbox/quickstart -H "Authorization: Bearer $FIREBASE_ID_TOKEN"
# {"organization": {…}, "project": {"id": "proj_…", "environment": "sandbox", …}, "key": {"key": "sk_test_…", …}, "sandbox": {…}}
Ou passo a passo:
# 1. an organization (you become its owner)
curl -X POST $BASE/admin/organizations -H "Authorization: Bearer $FIREBASE_ID_TOKEN" \
-H 'content-type: application/json' -d '{"name":"CardioAI SRL","kind":"developer","country":"RO"}'
# 2. a sandbox project (it comes with its own synthetic patients)
curl -X POST $BASE/admin/organizations/org_…/projects -H "Authorization: Bearer $FIREBASE_ID_TOKEN" \
-H 'content-type: application/json' -d '{"name":"CardioAI dev","environment":"sandbox"}'
# 3. a key — the plain key is returned exactly once
curl -X POST $BASE/admin/projects/proj_…/keys -H "Authorization: Bearer $FIREBASE_ID_TOKEN" \
-H 'content-type: application/json' -d '{"name":"local dev","scopes":["read","write"]}'
Obtém sk_test_…. As chaves de sandbox apenas veem dados de sandbox. As chaves de produção (sk_live_…) são
emitidas a organizações verificadas com um DPA assinado — escreva para [email protected]. O sandbox é gratuito;
a produção começa em 99 € por mês e o primeiro mês é gratuito (ver Preços).
2. Primeira chamada (1 minuto)
O seu projeto sandbox já tem a sua própria cópia de 30 pacientes sintéticos, com seis meses de histórico
até ao dia em que o projeto foi criado: adultos, crianças e idosos de toda a UE, com
condições (ICD-10), medicamentos (ATC), alergias, resultados de laboratório e sinais vitais (LOINC). A cópia
pertence ao seu projeto: altere ou elimine qualquer coisa — nenhum outro projeto a vê. Repor pacientes de teste
no dashboard (ou POST /admin/projects/{id}/sandbox/reset) devolve-os ao estado original,
com novos IDs; os pacientes que criou pessoalmente não são afetados. Cada paciente sintético mantém um
identificador estável entre reposições: Patient?identifier=https://anpheros.com/fhir/sid/sandbox-persona|p02
é sempre Elena Ionescu.
export KEY=sk_test_…
curl $BASE/v1/patients -H "Authorization: Bearer $KEY"
{"data":[{"id":"…","given":"Elena","family":"Ionescu","birth_date":"1985-09-03","gender":"female",…,"fhir":"Patient/…"}, …],"total":30,"next_cursor":null}
Os limites do sandbox são generosos mas finitos: 10 000 escritas de recursos por dia por projeto, 50 pacientes seus além dos sintéticos, 250 MB de documentos (ver limites).
3. Ler um registo
# lab results, newest first
curl "$BASE/v1/patients/$PID/observations?category=laboratory&limit=10" -H "Authorization: Bearer $KEY"
# active medications
curl "$BASE/v1/patients/$PID/medications?status=active" -H "Authorization: Bearer $KEY"
# everything on one timeline
curl "$BASE/v1/patients/$PID/timeline?from=2026-06-01" -H "Authorization: Bearer $KEY"
# the same data, strict FHIR
curl "$BASE/fhir/R4/Observation?patient=$PID&code=http://loinc.org|4548-4&_sort=-date" -H "Authorization: Bearer $KEY"
Os IDs são idênticos em /v1 e /fhir/R4; cada objeto v1 carrega a sua referência fhir.
_summary=count retorna apenas o total; _elements=code,effectiveDateTime retorna recursos slim marcados com SUBSETTED.
4. Escrever
Indique quem é o autor. author_type é patient, practitioner, device, import ou ai;
se omitir, a plataforma regista import, nunca patient por defeito.
Escrever com author_type ai segue a HL7 AI Transparency on FHIR:
o recurso transporta o rótulo de segurança AIAST (Artificial Intelligence asserted) e a sua Provenance tem a razão
AIAST, o papel do agente Artificial-Intelligence e o perfil AI-Provenance. Para nomear o modelo, registe-o como um
Device (tipo Artificial-Intelligence, nome, versão, fabricante) e envie X-Anpheros-Author-Ref: Device/<id>.
curl -X POST "$BASE/v1/patients/$PID/observations" -H "Authorization: Bearer $KEY" \
-H 'content-type: application/json' -H "Idempotency-Key: $(uuidgen)" -d '{
"code": "2339-0", "display": "Glucose", "category": "laboratory",
"value": 112, "unit": "mg/dL", "effective_at": "2026-09-19T08:10:00Z",
"author_type": "device"
}'
A resposta é a observação armazenada com id, fhir e updated_at. Repetir o exato
mesmo pedido com o mesmo Idempotency-Key retorna a mesma resposta e não cria nada.
5. Documentos
# 1. create the document → upload target
curl -X POST "$BASE/v1/patients/$PID/documents" -H "Authorization: Bearer $KEY" -H 'content-type: application/json' \
-d '{"title":"Analize 2026-09-14","kind":"lab_report","content_type":"application/pdf","date":"2026-09-14"}'
# 2. upload the bytes to the returned url (direct to storage, or through the platform)
curl -X PUT "$BASE/v1/documents/$DOC/content" -H "Authorization: Bearer $KEY" -H 'content-type: application/pdf' --data-binary @analize.pdf
O original nunca é modificado após isso; sha256 e size são registados, e quaisquer valores que
posteriormente extraia apontam de volta para o documento através de derived_from.
6. Proveniência
curl "$BASE/v1/patients/$PID/provenance/Observation/$OBS" -H "Authorization: Bearer $KEY"
Uma entrada por versão: quem (tipo de autor e projeto), quando, de que sistema de origem.
Regras a saber
- Isolamento: um projeto vê os pacientes que criou (mais os pacientes da sandbox partilhada). Pacientes de outra pessoa não existem para si:
404, nunca403. - IDs par a par: o ID do paciente que vê é o seu. Outro projeto vê a mesma pessoa sob um ID diferente. Armazene os nossos IDs livremente; nunca tente correlacioná-los.
- Proveniência: cada escrita deixa um recurso Provenance. Nada é substituído silenciosamente; o histórico está disponível em
/fhir/R4/{Type}/{id}/_history. - Erros: os endpoints FHIR retornam
OperationOutcome;/v1e/adminretornam{"error": {"type", "message", "field"}}. Cada resposta carregaAnpheros-Request-Id; cite-o quando nos escrever. - Limites: 600 pedidos/minuto por chave por defeito, 200 itens por página, 25 MB por documento.
7. Contexto para um modelo de IA
Em vez de extrair registos brutos e decidir o que se adequa a um prompt, peça à plataforma um contexto:
curl -X POST "$BASE/v1/context" -H "Authorization: Bearer $KEY" -H 'content-type: application/json' -d '{
"patient": "'$PID'",
"task": "medication review before a cardiology visit",
"question": "How did blood pressure evolve over the last 3 months?",
"budget_tokens": 1500,
"format": "text"
}'
Obtém secções (cartão de resumo, condições, medicamentos, alergias, exames laboratoriais, sinais vitais com tendências semanais e marcadores antes/depois do tratamento, sintomas, linha cronológica, documentos), cada item rotulado com author_type e source, uma lista do que foi omitido para caber no orçamento, avisos e um manifest_id que liga a chamada ao registo de auditoria. Os valores produzidos pela IA nunca são misturados com factos: aparecem apenas em ai_notes. Necessidades explícitas também são aceites: "needs": ["labs:4548-4", "vitals:trend:85354-9", "timeline:180d"].
8. Normas
GET /fhir/R4/Patient/{id}/$summarydevolve um Bundle de documento International Patient Summary.POST /fhir/R4/Observation/$validate?profile=eu-labreporta como um resultado de laboratório se compara ao perfil de resultado do HL7 Europe Laboratory Report 2.1.0 (erros, avisos, informações): categoria, código (LOINC preferido), sujeito, tempo efetivo, um executante e um valor, a menos que o resultado seja apenas registado ou cancelado.GET /v1/terminology/loinc?q=hba1cpesquisa o subconjunto LOINC agrupado eGET /v1/search?q=metformino catálogo de sintomas, condições e medicamentos; observações criadas sem um nome de exibição recebem automaticamente o nome LOINC.
9. Consentimento do Paciente (OAuth 2.1 + SMART on FHIR)
As chaves de API veem os pacientes que o seu projeto criou. Para aceder ao registo existente de uma pessoa, peça-lhe:
- Registe uma aplicação:
POST /admin/projects/{id}/applicationscom o seu URI de redirecionamento (publicpara aplicações móveis/web com PKCE,confidentialpara servidores; o segredo é mostrado uma vez). - Envie a pessoa para a página de consentimento:
GET /oauth/authorize?response_type=code&client_id=…&redirect_uri=…&state=…&code_challenge=…&code_challenge_method=S256&scope=patient/Observation.rs?category=laboratory patient/MedicationStatement.r offline_access&purpose=treatment&lang=roEla inicia sessão no Anpheros, vê o que pede em linguagem clara, escolhe o registo (o seu próprio, o de um dependente ou o que a sua aplicação criou para ela) e por quanto tempo o acesso dura. - Troque o código:
POST /oauth/token(authorization_code+code_verifier). Recebe um token de acesso (30 min), um token de atualização (30 dias, rotacionado a cada utilização) e o ID do paciente. - Chame a API com
Authorization: Bearer at_…. Vê apenas esse paciente, apenas os tipos de recursos e ações nos escopos; leituras fora do escopo respondem com403, as pesquisas são filtradas.
A pessoa pode revogar a qualquer momento a partir do Anpheros; a próxima chamada responderá com 401. Cada concessão é
refletida como um recurso FHIR Consent, e cada acesso sob ela é registado e visível para a
pessoa. Descoberta: /.well-known/smart-configuration.
10. Webhooks
Deixe a plataforma chamá-lo em vez de fazer polling:
curl -X POST $BASE/v1/webhooks -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"url": "https://your.app/anpheros/hook", "events": ["*"]}'
Mantenha o secret da resposta e verifique Anpheros-Signature em cada entrega
(verifyWebhookSignature em ambos os SDKs). Os eventos transportam IDs e versões, não dados clínicos.
Detalhes, retentativas e exemplos: webhooks.md.
11. Organizações e Praticantes
Clínicas, laboratórios e as pessoas que trabalham neles são recursos de primeira classe: Organization,
Practitioner, PractitionerRole. São recursos de diretório: nenhum paciente, legível por
cada projeto no mesmo ambiente, alterável apenas pelo projeto que os criou.
curl -X POST $BASE/fhir/R4/Practitioner -H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json" \
-d '{"resourceType":"Practitioner","active":true,"name":[{"family":"Popescu","given":["Ana"],"prefix":["Dr."]}]}'
Nomeie o praticante por trás de uma escrita com X-Anpheros-Author-Ref: Practitioner/<id> (ou um
PractitionerRole, Organization, Device): a Provenance gerada pelo servidor então carrega
agent.who.reference, e GET /fhir/R4/Provenance?agent=Practitioner/<id> lista tudo
que essa pessoa registou. Pesquisa: Organization?name=, ?identifier=, ?type=, Practitioner?name=,
?family=, ?given=, PractitionerRole?practitioner=, ?organization=, ?role=, ?specialty=, ?active=.
Quem está a trabalhar por trás da sua aplicação? Envie X-Anpheros-Acting-As: PractitionerRole/<id> (ou
Practitioner/<id>) em qualquer pedido /v1 ou /fhir/R4 feito com uma chave de projeto. A pessoa deve
existir no diretório e estar ativa. A referência é escrita no log de acesso, torna-se o
autor das escritas desse pedido (a menos que defina X-Anpheros-Author-Ref) e é mostrada ao
paciente pelo nome nas suas conexões ("Dr. Ana Popescu · Clínica Dente leu os seus resultados de laboratório").
12. Relatórios de laboratório numa única chamada
Envie um relatório de laboratório completo (CSV, HL7 v2 ORU^R01 ou JSON) e obtenha Observações laboratoriais com LOINC e intervalos de referência; reenviar é seguro. Detalhes: lab-connector.md.
curl -X POST "$BASE/v1/patients/$PATIENT/labs/import" -H "Authorization: Bearer $KEY" -H "Content-Type: text/csv" --data-binary @report.csv
Feedback de Conformidade em Escritas
Cada POST/PUT de um recurso clínico é verificado em relação ao perfil IPS da sua secção e, para
observações de laboratório, às regras de relatório de laboratório da HL7 Europe. A escrita nunca é rejeitada por
motivos de perfil (erros estruturais FHIR ainda o são); quando algo está em falta, a resposta transporta
Anpheros-Conformance: warnings=2; IPS Condition: Condition without code | ...
Corrija o que é nomeado e o recurso será incluído no $summary do paciente. Tipos de recursos adicionados
em 22 de setembro de 2026: Immunization, MedicationAdministration (pesquisa statement=MedicationStatement/{id}),
RelatedPerson, QuestionnaireResponse, Basic. Escritas feitas por outros projetos num registo que pode
ver chegam como eventos webhook com data.external = true — consulte docs/webhooks.md.
Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card