AnpherosAnpheros PlatformDevelopers

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

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

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 :

  1. Enregistrez une application : POST /admin/projects/{id}/applications avec votre URI de redirection (public pour les applications mobiles/web avec PKCE, confidential pour les serveurs ; le secret n'est affiché qu'une fois).
  2. 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=ro Elle 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.
  3. É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.
  4. 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épondent 403, 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

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