Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card
Iniziare
Da una chiave API alla lettura e scrittura del record FHIR R4 di un paziente nella sandbox: chiavi, prime chiamate, scritture con provenienza, documenti, contesto AI, IPS, consenso, webhook e referti di laboratorio.
Anpheros Platform è un backend di dati sanitari: un record FHIR R4 per paziente, isolamento dei progetti, provenienza su ogni scrittura e una semplice API REST sopra gli stessi dati. Questa guida ti porta da zero alla lettura e scrittura del record di un paziente nella sandbox.
URL di base (sandbox e produzione lo condividono; la chiave decide il data plane):
https://platform.anpheros.com
Riferimento interattivo: /docs (OpenAPI) e /fhir/R4/metadata (CapabilityStatement).
1. Ottieni una chiave (1 minuto)
Il sandbox è self-service. Accedi alla dashboard (https://platform.anpheros.com/dashboard/)
con Google e premi Ottieni una chiave sandbox: otterrai un'organizzazione, un progetto sandbox con i propri
pazienti sintetici e una chiave, mostrata una sola volta. Lo stesso tramite l'Admin API, con il tuo token utente 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": {…}}
Oppure passo dopo 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"]}'
Otterrai sk_test_…. Le chiavi sandbox vedono sempre e solo dati sandbox. Le chiavi di produzione (sk_live_…) vengono
rilasciate a organizzazioni verificate con un DPA firmato: scrivi a [email protected]. Il sandbox è gratuito;
la produzione inizia da €99 al mese e il primo mese è gratuito (vedi Prezzi).
2. Prima chiamata (1 minuto)
Il tuo progetto sandbox ha già una sua copia di 30 pazienti sintetici, con sei mesi di cronologia
fino al giorno in cui è stato creato il progetto: adulti, bambini e anziani da tutta l'UE, con
condizioni (ICD-10), farmaci (ATC), allergie, risultati di laboratorio e segni vitali (LOINC). La copia
appartiene al tuo progetto: cambia o elimina qualsiasi cosa — nessun altro progetto la vedrà. Ripristina i pazienti di test nella dashboard (o POST /admin/projects/{id}/sandbox/reset) li riporterà come erano, con nuovi ID; i pazienti che hai creato tu stesso non vengono toccati. Ogni paziente sintetico mantiene un identificatore stabile tra i reset: 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}
I limiti della sandbox sono generosi ma finiti: 10.000 scritture di risorse al giorno per progetto, 50 pazienti tuoi oltre a quelli sintetici, 250 MB di documenti (vedi limiti).
3. Leggere un record
# 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"
Gli ID sono identici in /v1 e /fhir/R4; ogni oggetto v1 porta il suo riferimento fhir.
_summary=count restituisce solo il totale; _elements=code,effectiveDateTime restituisce risorse slim contrassegnate SUBSETTED.
4. Scrivi
Indica chi è l'autore. author_type è patient, practitioner, device, import o ai;
se lo ometti, la piattaforma registra import, mai patient per impostazione predefinita.
Le scritture con author_type ai seguono HL7 AI Transparency on FHIR:
la risorsa porta l'etichetta di sicurezza AIAST (Artificial Intelligence asserted) e la sua Provenance ha il motivo
AIAST, il ruolo dell'agente Artificial-Intelligence e il profilo AI-Provenance. Per nominare il modello, registralo come
Device (tipo Artificial-Intelligence, nome, versione, produttore) e invia 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"
}'
La risposta è l'osservazione memorizzata con id, fhir e updated_at. Ripetere la stessa
esatta richiesta con lo stesso Idempotency-Key restituisce la stessa risposta e non crea nulla.
5. Documenti
# 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
L'originale non viene mai modificato successivamente; sha256 e size vengono registrati, e qualsiasi valore che
estrai successivamente punta al documento tramite derived_from.
6. Provenienza
curl "$BASE/v1/patients/$PID/provenance/Observation/$OBS" -H "Authorization: Bearer $KEY"
Una voce per versione: chi (tipo di autore e progetto), quando, da quale sistema sorgente.
Regole da conoscere
- Isolamento: un progetto vede i pazienti che ha creato (più i pazienti condivisi della sandbox). I pazienti di chiunque altro non esistono per te:
404, mai403. - ID pairwise: l'ID paziente che vedi è il tuo. Un altro progetto vede la stessa persona sotto un ID diverso. Memorizza liberamente i nostri ID; non tentare mai di correlarli.
- Provenienza: ogni scrittura lascia una risorsa Provenance. Nulla viene sovrascritto silenziosamente; la cronologia è disponibile all'indirizzo
/fhir/R4/{Type}/{id}/_history. - Errori: gli endpoint FHIR restituiscono
OperationOutcome;/v1e/adminrestituiscono{"error": {"type", "message", "field"}}. Ogni risposta contieneAnpheros-Request-Id; citarlo quando ci scrivi. - Limiti: 600 richieste/minuto per chiave per impostazione predefinita, 200 elementi per pagina, 25 MB per documento.
7. Contesto per un modello AI
Invece di estrarre record grezzi e decidere cosa si adatta a un prompt, chiedi alla piattaforma un contesto:
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"
}'
Ottieni sezioni (scheda riassuntiva, condizioni, farmaci, allergie, esami di laboratorio, parametri vitali con trend settimanali e marcatori pre/post trattamento, sintomi, timeline, documenti), ogni elemento etichettato con author_type e source, un elenco di ciò che è stato omesso per rientrare nel budget, avvisi e un manifest_id che collega la chiamata al log di audit. I valori prodotti dall'AI non vengono mai mescolati con i fatti: appaiono solo sotto ai_notes. Sono accettate anche esigenze esplicite:
"needs": ["labs:4548-4", "vitals:trend:85354-9", "timeline:180d"].
8. Standard
GET /fhir/R4/Patient/{id}/$summaryrestituisce un Bundle di documenti International Patient Summary.POST /fhir/R4/Observation/$validate?profile=eu-labriporta come un risultato di laboratorio si confronta con il profilo del risultato del Rapporto di Laboratorio 2.1.0 di HL7 Europe (errori, avvisi, informazioni): categoria, codice (LOINC preferito), soggetto, tempo effettivo, un esecutore e un valore, a meno che il risultato non sia solo registrato o annullato.GET /v1/terminology/loinc?q=hba1ccerca il sottoinsieme LOINC in bundle eGET /v1/search?q=metforminil catalogo di sintomi, condizioni e farmaci; le osservazioni create senza un nome visualizzato ottengono automaticamente il nome LOINC.
9. Consenso del paziente (OAuth 2.1 + SMART on FHIR)
Le chiavi API vedono i pazienti creati dal tuo progetto. Per raggiungere il record esistente di una persona, chiedi loro:
- Registra un'applicazione:
POST /admin/projects/{id}/applicationscon il tuo redirect URI (publicper app mobile/web con PKCE,confidentialper server; il segreto viene mostrato una sola volta). - Invia la persona alla pagina di consenso:
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=roSi autenticano su Anpheros, vedono ciò che richiedi in linguaggio chiaro, scelgono il record (il proprio, quello di un dipendente o quello che la tua app ha creato per loro) e per quanto tempo dura l'accesso. - Scambia il codice:
POST /oauth/token(authorization_code+code_verifier). Ricevi un access token (30 min), un refresh token (30 giorni, ruotato all'uso) e l'id del paziente. - Chiama l'API con
Authorization: Bearer at_…. Vedrai solo quel paziente, solo i tipi di risorsa e le azioni negli scope; le letture fuori scope rispondono403, le ricerche vengono filtrate.
La persona può revocare in qualsiasi momento da Anpheros; la chiamata successiva risponde 401. Ogni concessione è
riflessa come una risorsa FHIR Consent, e ogni accesso sottostante viene registrato e visibile alla
persona. Discovery: /.well-known/smart-configuration.
10. Webhook
Lascia che la piattaforma ti chiami invece di effettuare il polling:
curl -X POST $BASE/v1/webhooks -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"url": "https://your.app/anpheros/hook", "events": ["*"]}'
Mantieni il secret dalla risposta e verifica Anpheros-Signature ad ogni consegna
(verifyWebhookSignature in entrambi gli SDK). Gli eventi trasportano ID e versioni, non dati clinici.
Dettagli, tentativi ed esempi: webhooks.md.
11. Organizzazioni e professionisti
Cliniche, laboratori e le persone che vi lavorano sono risorse di prima classe: Organization,
Practitioner, PractitionerRole. Sono risorse di directory: nessuna paziente, leggibile da
ogni progetto nello stesso ambiente, modificabile solo dal progetto che le ha create.
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."]}]}'
Nomina il professionista dietro una scrittura con X-Anpheros-Author-Ref: Practitioner/<id> (o un
PractitionerRole, Organization, Device): il Provenance generato dal server conterrà quindi
agent.who.reference, e GET /fhir/R4/Provenance?agent=Practitioner/<id> elencherà tutto
ciò che quella persona ha registrato. Ricerca: Organization?name=, ?identifier=, ?type=, Practitioner?name=,
?family=, ?given=, PractitionerRole?practitioner=, ?organization=, ?role=, ?specialty=, ?active=.
Chi sta lavorando dietro la tua app? Invia X-Anpheros-Acting-As: PractitionerRole/<id> (o
Practitioner/<id>) su qualsiasi richiesta /v1 o /fhir/R4 effettuata con una chiave di progetto. La persona deve
esistere nella directory ed essere attiva. Il riferimento viene scritto nel log di accesso, diventa l'autore
delle scritture di quella richiesta (a meno che tu non imposti X-Anpheros-Author-Ref) e viene mostrato al
paziente per nome nelle sue connessioni ("Dr. Ana Popescu · Clinica Dente ha letto i tuoi risultati di laboratorio").
12. Report di laboratorio in una singola chiamata
Invia un intero report di laboratorio (CSV, HL7 v2 ORU^R01 o JSON) e ottieni Osservazioni di laboratorio con LOINC e intervalli di riferimento; il reinvio è sicuro. Dettagli: 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 di conformità sulle scritture
Ogni POST/PUT di una risorsa clinica viene verificato rispetto al profilo IPS della sua sezione e, per le osservazioni di laboratorio, alle regole del report di laboratorio HL7 Europe. La scrittura non viene mai rifiutata per motivi di profilo (gli errori strutturali FHIR lo sono ancora); quando qualcosa manca, la risposta riporta
Anpheros-Conformance: warnings=2; IPS Condition: Condition without code | ...
Correggere ciò che indica e la risorsa sarà inclusa nel $summary del paziente. Tipi di risorsa aggiunti il 22 settembre 2026: Immunization, MedicationAdministration (ricerca statement=MedicationStatement/{id}), RelatedPerson, QuestionnaireResponse, Basic. Le scritture effettuate da altri progetti in un record che è possibile visualizzare arrivano come eventi webhook con data.external = true — vedere docs/webhooks.md.
Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card