# SDKs

> Los clientes Dart / Flutter (anpheros_sdk) y TypeScript (@anpheros/sdk): misma estructura, creaciones idempotentes, reintentos, actualización de tokens y flujo de consentimiento.

Source: https://developers.anpheros.com/es/guides/sdks

> Librerías cliente oficiales para una API de salud FHIR R4 con un sandbox FHIR gratuito: pacientes, observaciones, resultados de laboratorio, condiciones, medicamentos, Resumen Internacional del Paciente, consentimiento del paciente y contexto de IA, en TypeScript y Dart / Flutter.

**Anpheros es una infraestructura de datos médicos interoperable para construir aplicaciones de salud, software médico y servicios de IA.** Cada paciente tiene un registro HL7 FHIR R4 que controla; las aplicaciones, clínicas, laboratorios y agentes de IA lo leen y escriben a través de la API de la Plataforma Anpheros — con el consentimiento del paciente (OAuth 2.1 / SMART on FHIR), procedencia en cada escritura y un registro de acceso que el paciente puede ver. Este repositorio contiene las librerías cliente oficiales y ejemplos ejecutables.

| Lenguaje | Paquete | Instalación | Fuente |
|---|---|---|---|
| Dart / Flutter | [`anpheros_sdk`](https://pub.dev/packages/anpheros_sdk) | `dart pub add anpheros_sdk` | [`dart/anpheros_sdk`](https://github.com/anpheros/anpheros-sdk/tree/main/dart/anpheros_sdk) |
| TypeScript (Node 18+, navegadores, Deno, Bun) | [`@anpheros/sdk`](https://www.npmjs.com/package/@anpheros/sdk) | `npm install @anpheros/sdk` | [`ts`](https://github.com/anpheros/anpheros-sdk/tree/main/ts) |

## Inicio rápido en 2 minutos

1. **Obtenga una clave de sandbox gratuita:** inicie sesión en el [panel](https://platform.anpheros.com/dashboard/) y presione **Obtener una clave de sandbox** (`sk_test_…`). Su sandbox tiene 30 pacientes sintéticos.
2. **Verifique que funciona:**

   ```bash
   curl -H "Authorization: Bearer $ANPHEROS_KEY" "https://platform.anpheros.com/fhir/R4/Patient?_count=3"
   ```

3. **Instale un SDK y lea un registro:** `npm install @anpheros/sdk` o `dart pub add anpheros_sdk`, luego ejecute el código en [Conectar](#connect), o clone [quickstart-ts](https://github.com/anpheros/anpheros-sdk/tree/main/examples/quickstart-ts).

## A quién va dirigido

Desarrolladores que crean aplicaciones de salud para pacientes y familiares, backends de aplicaciones médicas, integraciones de clínicas y laboratorios, y asistentes o agentes de IA que necesitan el contexto médico estructurado de un paciente, sin tener que diseñar desde cero una base de datos médica, un sistema de consentimiento y un registro de auditoría.

## Obtener una clave de sandbox

El sandbox es gratuito y de autoservicio. Inicia sesión con Google en el [dashboard](https://platform.anpheros.com/dashboard/) y presiona **Obtener una clave de sandbox**: obtendrás un proyecto de sandbox y una clave al instante. Cada proyecto de sandbox viene con sus propios 30 pacientes sintéticos —seis meses de condiciones, medicamentos, alergias, resultados de laboratorio y signos vitales— que puedes modificar libremente y restablecer en cualquier momento. Las claves de sandbox (`sk_test_…`) nunca acceden a datos de pacientes reales.

Cuando pases a producción, la producción es para organizaciones verificadas con un acuerdo de procesamiento de datos, y la producción comienza a partir de 99 € al mes con el primer mes gratuito ([precios](https://developers.anpheros.com/es/guides/pricing)).

## Conectar

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

const anpheros = new Anpheros({ auth: apiKey(process.env.ANPHEROS_KEY!) });   // sk_test_… in the sandbox
const { data: patients } = await anpheros.patients.list();
const labs = await anpheros.observations.list(patients[0].id, { category: 'laboratory', limit: 10 });
const ctx = await anpheros.context.build({ patient: patients[0].id, task: 'weekly check-in', budget_tokens: 1500, format: 'text' });
```

```dart
import 'package:anpheros_sdk/anpheros_sdk.dart';

final anpheros = Anpheros(auth: AnpherosAuth.apiKey('sk_test_…'));
final patients = await anpheros.patients.list();
final labs = await anpheros.observations.list(patients.data.first.id, category: 'laboratory', limit: 10);
```

Las claves de API pertenecen a los servidores. Una aplicación que actúa en nombre de una persona utiliza OAuth en su lugar: ambos SDK implementan el flujo de consentimiento (código de autorización + PKCE) y actualizan los tokens automáticamente.

## Lo que cubren los SDK

Ambos cubren toda la superficie pública (`/v1`, `/fhir/R4`, `/oauth/token`, `/oauth/revoke`) con la
misma estructura: `patients`, `observations`, `conditions`, `medications`, `documents`, `timeline`,
`provenance`, `context`, `grants`, `terminology` y `fhir` en bruto. Una prueba falla la
compilación cuando falta una ruta pública en cualquiera de los SDK o cuando un SDK llama a una ruta que el servidor
no tiene.

Ambos SDK: `Idempotency-Key` automático en las creaciones, reintentos con retroceso en 429/5xx, una actualización de token
en 401, errores tipados con el ID de solicitud, asistentes PKCE y el flujo de consentimiento.

## Datos médicos y FHIR

El registro está compuesto por recursos FHIR R4 estándar — 26 tipos, incluyendo `Observation`, `Condition`, `MedicationStatement`, `DocumentReference`, `Immunization` y `AllergyIntolerance` — codificados con LOINC, ICD-10, ATC y UCUM. La API REST (`/v1`) y la API FHIR (`/fhir/R4`) leen y escriben los mismos recursos con los mismos ids; `fhir` en ambos SDKs proporciona acceso FHIR sin procesar (búsqueda, transacciones, `$everything`, `$summary`, `$validate`).

## Ejemplos

| Ejemplo | Muestra |
|---|---|
| [quickstart-ts](https://github.com/anpheros/anpheros-sdk/tree/main/examples/quickstart-ts) | escribir y leer un registro: mediciones, resultado de laboratorio, diagnóstico, medicación, línea de tiempo, búsqueda FHIR, IPS, contexto de IA |
| [quickstart-dart](https://github.com/anpheros/anpheros-sdk/tree/main/examples/quickstart-dart) | lo mismo desde Dart / Flutter |
| [consent-app-ts](https://github.com/anpheros/anpheros-sdk/tree/main/examples/consent-app-ts) | una aplicación web que solicita consentimiento (OAuth 2.1 + PKCE) y lee el registro de la persona |
| [ai-context-llm](https://github.com/anpheros/anpheros-sdk/tree/main/examples/ai-context-llm) | una pregunta sobre un registro respondida por un modelo de su elección (local o alojado) |
| [fhir-transaction](https://github.com/anpheros/anpheros-sdk/tree/main/examples/fhir-transaction) | un paquete de transacción FHIR R4 y el International Patient Summary resultante |

Los ejemplos se ejecutan contra el sandbox gratuito, donde cada proyecto de sandbox tiene sus propios 30 pacientes sintéticos; consulte [Obtener una clave de sandbox](#get-a-sandbox-key).

## Repositorios relacionados

| Repositorio | Qué es |
|---|---|
| [fhir-api-openapi](https://github.com/anpheros/fhir-api-openapi) | Especificación OpenAPI 3.1 y colección Postman de la API |
| [mcp-server](https://github.com/anpheros/mcp-server) | el servidor FHIR MCP alojado para agentes de IA: configuraciones para Claude, Cursor, VS Code |
| [agent-skills](https://github.com/anpheros/agent-skills) | Agent Skill, Claude Code plugin, reglas de Cursor y AGENTS.md |
| [fhir-synthetic-patients](https://github.com/anpheros/fhir-synthetic-patients) | los 30 pacientes sintéticos como FHIR R4 Bundles y NDJSON |
| [ips-examples](https://github.com/anpheros/ips-examples) | Documentos International Patient Summary en FHIR R4 |
| [fhir-validate-action](https://github.com/anpheros/fhir-validate-action) | GitHub Action que valida FHIR R4 JSON en CI |
| [lab-results-to-fhir](https://github.com/anpheros/lab-results-to-fhir) | CLI: informes de laboratorio CSV / HL7 v2 → FHIR Observations |
| [healthcare-app-starters](https://github.com/anpheros/healthcare-app-starters) | Plantillas de aplicaciones de salud Next.js y Flutter |

## Conformidad

Resultados de pruebas sin procesar, publicados para que puedan ser verificados (resultados de pruebas, no certificaciones): [conformance/](https://github.com/anpheros/anpheros-sdk/tree/main/conformance). El 28 de septiembre de 2026, el grupo Standalone Launch del kit de pruebas Inferno SMART App Launch STU2 (v1.0.3) superó 22 de 22 pruebas contra la plataforma. El lanzamiento de EHR no es compatible.

## Documentación

- [Guías para desarrolladores](https://developers.anpheros.com/guides/)
- [Primeros pasos](https://developers.anpheros.com/es/guides/getting-started)
- [Sandbox de FHIR](https://developers.anpheros.com/es/guides/fhir-sandbox)
- [API de Salud](https://developers.anpheros.com/es/guides/healthcare-api)
- [Plataforma de API de Salud](https://developers.anpheros.com/es/guides/healthcare-api-platform)
- [Plataforma FHIR](https://developers.anpheros.com/es/guides/fhir)
- [Guía del SDK](https://developers.anpheros.com/es/guides/sdks)
- [Referencia de la API (OpenAPI)](https://developers.anpheros.com/docs)
- [Para asistentes de IA](https://developers.anpheros.com/llms.txt)
- [Anpheros](https://anpheros.com/)

## Problemas y seguridad

Reporte errores en los issues de este repositorio. Nunca incluya claves de API, tokens o datos de pacientes en un issue. Reportes de seguridad: contact@anpheros.com.

## Licencia

Licencia Apache 2.0 — consulte el archivo `LICENSE` de cada paquete. Copyright 2026 Anpheros.

## @anpheros/sdk

Cliente TypeScript para **Anpheros Platform**: un registro de salud FHIR R4 por paciente, aislamiento de proyectos, consentimiento del paciente (OAuth 2.1 / SMART on FHIR), procedencia en cada escritura y una API de contexto de IA. Se ejecuta en cualquier lugar donde exista `fetch` (Node 18+, navegadores, Deno, Bun).

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

const anpheros = new Anpheros({ auth: apiKey(process.env.ANPHEROS_KEY!) });
const { data: patients } = await anpheros.patients.list();
const labs = await anpheros.observations.list(patients[0].id, { category: 'laboratory', limit: 10 });
const ctx = await anpheros.context.build({ patient: patients[0].id, task: 'weekly check-in', budget_tokens: 1500, format: 'text' });
```

Actuando en nombre de una persona:

```ts
import { OAuthFlow, OAuthAuth, generatePkce } from '@anpheros/sdk';

const flow = new OAuthFlow({ baseUrl: BASE, clientId: 'client_…', redirectUri: 'https://myapp.example/callback' });
const pkce = await generatePkce();
location.href = flow.authorizeUrl({ scopes: ['patient/Observation.rs?category=laboratory', 'offline_access'], state, pkce, lang: 'ro' });
// on the callback:
const tokens = await flow.exchange(code, pkce);
const anpheros = new Anpheros({ auth: new OAuthAuth({ tokens, onRefresh: flow.refresh, onTokens: persist }) });
```

Los errores son `AnpherosError` (`status`, `type`, `message`, `field`, `requestId`). Las creaciones envían un `Idempotency-Key`; los errores 429/5xx se reintentan; los tokens expirados se actualizan una vez y se reintenta la llamada.

## anpheros_sdk

Cliente Dart / Flutter para **Anpheros Platform**: un backend de datos de salud con un registro FHIR R4
por paciente, aislamiento de proyectos, consentimiento del paciente (OAuth 2.1 / SMART on FHIR), procedencia en cada
escritura y una API de contexto de IA.

```dart
import 'package:anpheros_sdk/anpheros_sdk.dart';

final anpheros = Anpheros(auth: AnpherosAuth.apiKey('sk_test_…'));      // server / sandbox

final patients = await anpheros.patients.list();
final elena = patients.data.first;
final labs = await anpheros.observations.list(elena.id, category: 'laboratory', limit: 10);
final ctx = await anpheros.context.build(ContextRequest(patient: elena.id, task: 'weekly check-in', budgetTokens: 1500));
```

## Actuando en nombre de una persona (aplicaciones)

```dart
final flow = OAuthFlow(baseUrl: 'https://…', clientId: 'client_…', redirectUri: 'myapp://callback');
final pkce = Pkce.generate();
final url = flow.authorizeUrl(scopes: ['patient/Observation.rs?category=laboratory', 'patient/MedicationStatement.r', 'offline_access'],
                              state: 'abc', pkce: pkce, lang: 'ro');
// open `url`; on return with ?code=…:
final tokens = await flow.exchange(code: code, pkce: pkce);
final anpheros = Anpheros(auth: AnpherosAuth.oauth(
  accessToken: tokens.accessToken, refreshToken: tokens.refreshToken, expiresAt: tokens.expiresAt,
  onRefresh: flow.refresh, onTokens: persist));
final meds = await anpheros.medications.listMedications(tokens.patient!);
```

Cada objeto lleva `fhir` (su referencia `/fhir/R4`); `anpheros.fhir` proporciona acceso FHIR sin procesar
(read, search, create, transaction, `$everything`, `$summary`, `$validate`).

Los errores se `AnpherosException` con `status`, `type`, `message`, `field` y `requestId`.
Las creaciones envían un `Idempotency-Key` automáticamente; los errores 429/5xx se reintentan con backoff; los tokens OAuth expirados
se actualizan una vez y la llamada se reintenta.
