Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card
Premiers pas
D'une clé API à la lecture et écriture du dossier FHIR R4 d'un patient dans le sandbox : clés, premiers appels, écritures avec provenance, documents, contexte IA, IPS, consentement, webhooks et rapports de laboratoire.
La plateforme Anpheros est un backend de données de santé : un dossier FHIR R4 par patient, isolation des projets, provenance sur chaque écriture, et une API REST simple au-dessus des mêmes données. Ce guide vous emmène de zéro à la lecture et à l'écriture du dossier d'un patient dans le sandbox.
URL de base (le sandbox et la production la partagent ; la clé décide du plan de données) :
https://platform.anpheros.com
Référence interactive : /docs (OpenAPI) et /fhir/R4/metadata (CapabilityStatement).
1. Obtenir une clé (1 minute)
Le sandbox est en libre-service. Connectez-vous au tableau de bord (https://platform.anpheros.com/dashboard/)
avec Google et appuyez sur Obtenir une clé sandbox : vous obtenez une organisation, un projet sandbox avec ses propres
patients synthétiques, et une clé — affichée une seule fois. De même via l'API Admin, avec votre jeton utilisateur 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 étape par étape :
# 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"]}'
Vous obtenez sk_test_…. Les clés sandbox ne voient que des données sandbox. Les clés de production (sk_live_…) sont
délivrées aux organisations vérifiées avec un DPA signé — écrivez à [email protected]. Le sandbox est gratuit ;
la production commence à 99 € par mois et le premier mois est gratuit (voir Tarifs).
2. Premier appel (1 minute)
Votre projet sandbox possède déjà sa propre copie de 30 patients synthétiques, avec six mois d'historique
jusqu'au jour de création du projet : adultes, enfants et personnes âgées de toute l'UE, avec
des conditions (ICD-10), des médicaments (ATC), des allergies, des résultats de laboratoire et des signes vitaux (LOINC). La copie
appartient à votre projet : modifiez ou supprimez n'importe quoi — aucun autre projet ne le voit. Réinitialiser les patients de test dans le tableau de bord (ou POST /admin/projects/{id}/sandbox/reset) les ramène tels qu'ils étaient, avec de nouveaux identifiants ; les patients que vous avez créés vous-même ne sont pas affectés. Chaque patient synthétique conserve un identifiant stable à travers les réinitialisations : Patient?identifier=https://anpheros.com/fhir/sid/sandbox-persona|p02
est toujours 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}
Les limites du sandbox sont généreuses mais finies : 10 000 écritures de ressources par jour et par projet, 50 patients personnels en plus des patients synthétiques, 250 Mo de documents (voir limites).
3. Lire un enregistrement
# 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"
Les identifiants sont identiques dans /v1 et /fhir/R4 ; chaque objet v1 porte sa référence fhir.
_summary=count retourne uniquement le total ; _elements=code,effectiveDateTime retourne des ressources slim taguées SUBSETTED.
4. Écrire
Indiquez qui est l'auteur. author_type est patient, practitioner, device, import ou ai ;
si vous l'omettez, la plateforme enregistre import, jamais patient par défaut.
Les écritures avec author_type ai suivent la HL7 AI Transparency on FHIR :
la ressource porte le label de sécurité AIAST (Artificial Intelligence asserted) et sa Provenance a la raison
AIAST, le rôle de l'agent Artificial-Intelligence et le profil AI-Provenance. Pour nommer le modèle, enregistrez-le comme un
Device (type Artificial-Intelligence, nom, version, fabricant) et envoyez 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 réponse est l'observation stockée avec id, fhir et updated_at. Répéter la même requête exacte avec le même Idempotency-Key renvoie la même réponse et ne crée rien.
5. Documents
# 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'original n'est jamais modifié par la suite ; sha256 et size sont enregistrés, et toutes les valeurs que vous
extrairez plus tard renvoient au document via derived_from.
6. Provenance
curl "$BASE/v1/patients/$PID/provenance/Observation/$OBS" -H "Authorization: Bearer $KEY"
Une entrée par version : qui (type d'auteur et projet), quand, depuis quel système source.
Règles à connaître
- Isolation : un projet voit les patients qu'il a créés (plus les patients du bac à sable partagé). Les patients de quelqu'un d'autre n'existent pas pour vous :
404, jamais403. - IDs par paire : l'ID de patient que vous voyez est le vôtre. Un autre projet voit la même personne sous un ID différent. Stockez nos IDs librement ; n'essayez jamais de les corréler.
- Provenance : chaque écriture laisse une ressource Provenance. Rien n'est écrasé silencieusement ; l'historique est disponible à l'adresse
/fhir/R4/{Type}/{id}/_history. - Erreurs : les points de terminaison FHIR renvoient
OperationOutcome;/v1et/adminrenvoient{"error": {"type", "message", "field"}}. Chaque réponse contientAnpheros-Request-Id; citez-le lorsque vous nous contactez. - Limites : 600 requêtes/minute par clé par défaut, 200 éléments par page, 25 Mo par document.
7. Contexte pour un modèle d'IA
Au lieu d'extraire des enregistrements bruts et de décider ce qui correspond à une requête, demandez à la plateforme un contexte :
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"
}'
Vous obtenez des sections (carte récapitulative, conditions, médicaments, allergies, laboratoires, signes vitaux avec tendances hebdomadaires et marqueurs avant/après traitement, symptômes, chronologie, documents), chaque élément étant étiqueté avec author_type et source, une liste de ce qui a été omis pour respecter le budget, des avertissements, et un manifest_id qui relie l'appel au journal d'audit. Les valeurs produites par l'IA ne sont jamais mélangées avec des faits : elles apparaissent uniquement sous ai_notes. Les besoins explicites sont également acceptés :
"needs": ["labs:4548-4", "vitals:trend:85354-9", "timeline:180d"].
8. Normes
GET /fhir/R4/Patient/{id}/$summaryrenvoie un Bundle de document International Patient Summary.POST /fhir/R4/Observation/$validate?profile=eu-labrapporte comment un résultat de laboratoire se compare au profil de résultat HL7 Europe Laboratory Report 2.1.0 (erreurs, avertissements, informations) : catégorie, code (LOINC préféré), sujet, heure effective, un exécutant et une valeur, sauf si le résultat est uniquement enregistré ou annulé.GET /v1/terminology/loinc?q=hba1crecherche le sous-ensemble LOINC regroupé etGET /v1/search?q=metforminle catalogue des symptômes, conditions et médicaments ; les observations créées sans nom d'affichage obtiennent automatiquement le nom LOINC.
9. Consentement du patient (OAuth 2.1 + SMART on FHIR)
Les clés API voient les patients que votre projet a créés. Pour accéder à l'enregistrement existant d'une personne, demandez-lui :
- Enregistrez une application :
POST /admin/projects/{id}/applicationsavec votre URI de redirection (publicpour les applications mobiles/web avec PKCE,confidentialpour les serveurs ; le secret n'est affiché qu'une fois). - Envoyez la personne à la page de consentement :
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=roElle se connecte à Anpheros, voit ce que vous demandez en langage clair, choisit l'enregistrement (le sien, celui d'un dépendant, ou celui que votre application a créé pour elle) et la durée de l'accès. - Échangez le code :
POST /oauth/token(authorization_code+code_verifier). Vous recevez un jeton d'accès (30 min), un jeton de rafraîchissement (30 jours, pivoté à l'utilisation) et l'ID du patient. - Appelez l'API avec
Authorization: Bearer at_…. Vous ne voyez que ce patient, uniquement les types de ressources et les actions dans les scopes ; les lectures hors scope répondent403, les recherches sont filtrées.
La personne peut révoquer à tout moment depuis Anpheros ; le prochain appel répond 401. Chaque autorisation est
reflétée comme une ressource FHIR Consent, et chaque accès sous celle-ci est enregistré et visible par la
personne. Découverte : /.well-known/smart-configuration.
10. Webhooks
Laissez la plateforme vous appeler au lieu de sonder :
curl -X POST $BASE/v1/webhooks -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"url": "https://your.app/anpheros/hook", "events": ["*"]}'
Conservez le secret de la réponse et vérifiez Anpheros-Signature à chaque livraison
(verifyWebhookSignature dans les deux SDK). Les événements transportent des identifiants et des versions, pas des données cliniques.
Détails, nouvelles tentatives et exemples : webhooks.md.
11. Organisations et praticiens
Les cliniques, les laboratoires et les personnes qui y travaillent sont des ressources de première classe : Organization,
Practitioner, PractitionerRole. Ce sont des ressources de répertoire : aucun patient, lisible par
chaque projet dans le même environnement, modifiable uniquement par le projet qui les a créés.
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."]}]}'
Nommez le praticien derrière une écriture avec X-Anpheros-Author-Ref: Practitioner/<id> (ou un
PractitionerRole, Organization, Device) : la Provenance générée par le serveur porte alors
agent.who.reference, et GET /fhir/R4/Provenance?agent=Practitioner/<id> liste tout ce que cette personne a enregistré. Recherche : Organization?name=, ?identifier=, ?type=, Practitioner?name=,
?family=, ?given=, PractitionerRole?practitioner=, ?organization=, ?role=, ?specialty=, ?active=.
Qui travaille derrière votre application ? Envoyez X-Anpheros-Acting-As: PractitionerRole/<id> (ou
Practitioner/<id>) sur toute requête /v1 ou /fhir/R4 effectuée avec une clé de projet. La personne doit
exister dans le répertoire et être active. La référence est inscrite dans le journal d'accès, devient l'auteur
des écritures de cette requête (sauf si vous définissez X-Anpheros-Author-Ref) et est affichée au
patient par son nom dans ses connexions ("Dr. Ana Popescu · Clinica Dente a lu vos résultats de laboratoire").
12. Rapports de laboratoire en un seul appel
Envoyez un rapport de laboratoire complet (CSV, HL7 v2 ORU^R01 ou JSON) et obtenez des Observations de laboratoire avec LOINC et des plages de référence ; le renvoi est sûr. Détails : 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 conformité sur les écritures
Chaque POST/PUT d'une ressource clinique est vérifié par rapport au profil IPS de sa section et, pour
les observations de laboratoire, aux règles de rapport de laboratoire HL7 Europe. L'écriture n'est jamais rejetée pour
des raisons de profil (les erreurs structurelles FHIR le sont toujours) ; lorsqu'il manque quelque chose, la réponse contient
Anpheros-Conformance: warnings=2; IPS Condition: Condition without code | ...
Corrigez ce qu'elle nomme et la ressource sera incluse dans le $summary du patient. Types de ressources ajoutés
le 22 septembre 2026 : Immunization, MedicationAdministration (recherche statement=MedicationStatement/{id}),
RelatedPerson, QuestionnaireResponse, Basic. Les écritures effectuées par d'autres projets dans un dossier que vous pouvez
voir arrivent sous forme d'événements webhook avec data.external = true — voir docs/webhooks.md.
Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card