# Backend y base de datos de aplicaciones médicas

> Qué debe manejar un backend de aplicación médica y su base de datos, qué partes proporciona Anpheros como base de datos sanitaria gestionada, qué queda en su backend, tres formas de conectarse y cómo mantenerse sincronizado con webhooks.

Source: https://developers.anpheros.com/es/guides/medical-app-backend

**Un backend de aplicación médica es el lado del servidor de una aplicación sanitaria: almacena datos del paciente, aplica quién puede verlos, mantiene un historial de cambios y se comunica con laboratorios, clínicas y otros servicios.** Con Anpheros, la parte médica de ese backend —la base de datos sanitaria que contiene el registro de cada paciente, con su historial, consentimiento, procedencia, auditoría, importación de laboratorio y eventos— es proporcionada por la plataforma a través de una API, y su propio backend solo conserva lo que es específico de su producto.

## Qué debe manejar un backend médico

| Responsabilidad | Por qué es difícil en la atención médica | Con Anpheros |
|---|---|---|
| Un modelo de datos médicos | docenas de tipos de datos, cada uno con códigos estándar | HL7 FHIR R4, 26 tipos de recursos, LOINC / ICD-10 / ATC / UCUM |
| Versionado | los datos médicos se corrigen, nunca se sobrescriben silenciosamente | cada actualización es una nueva versión; `If-Match` para actualizaciones condicionales |
| Documentos | los originales deben permanecer sin cambios y ser rastreables | originales inmutables con SHA-256, almacenamiento en la UE cifrado con una clave administrada por el cliente |
| Control de acceso | por paciente, por aplicación, por tipo de dato | aislamiento de proyectos, IDs de pares, ámbitos de OAuth con filtros de categoría |
| Consentimiento | el paciente decide y puede cambiar de opinión | concesiones por 30–365 días, revocables, reflejadas como FHIR `Consent` |
| Auditoría | pacientes y reguladores preguntan quién vio qué | cada lectura y escritura registrada y visible para el paciente |
| Procedencia | un valor de un laboratorio no es un valor introducido por un paciente | tipo de autor, organización, profesional y sistema de origen en cada escritura |
| Integraciones | los laboratorios envían CSV, HL7 v2, JSON; las aplicaciones necesitan eventos | importación de laboratorio, transacciones FHIR, webhooks firmados |
| Reintentos seguros | una medicación o resultado duplicado es un error clínico | `Idempotency-Key` en cada creación |
| Datos de prueba | los pacientes reales nunca deben estar en desarrollo | una base de datos sandbox con pacientes sintéticos |

## Lo que permanece en tu backend

- tus **usuarios y cuentas**, y el mapeo de cada usuario a su ID de paciente de Anpheros (el ID de emparejamiento que ve tu proyecto);
- **datos del producto** que no son médicos: configuraciones, suscripciones, contenido, horarios de recordatorios;
- **reglas de negocio**: qué miembros de tu personal pueden ver qué paciente en tu producto;
- la **clave API**, que nunca debe incluirse dentro de una aplicación móvil o web.

## Tres formas de conectar

**1. Su backend almacena la clave API (más común).** Su aplicación llama a su backend; su backend llama a Anpheros con una clave `sk_live_` y ve los pacientes que creó su proyecto.

```ts
import { Anpheros, apiKey } from '@anpheros/sdk';
const anpheros = new Anpheros({ auth: apiKey(process.env.ANPHEROS_KEY!) });

// GET /api/me/vitals in your backend, after your own authentication
export async function myVitals(user: { anpherosPatientId: string }) {
  const page = await anpheros.observations.list(user.anpherosPatientId, { category: 'vital-signs', limit: 50 });
  return page.data;
}
```

**2. La aplicación actúa en nombre del paciente con OAuth.** Para personas que ya tienen un registro en Anpheros, una aplicación móvil o web es un cliente OAuth *público* con PKCE: la persona consiente en la página alojada y la aplicación recibe un token de acceso de 30 minutos y un token de actualización rotatorio para ese único registro. Los SDK implementan el flujo (`OAuthFlow`).

**3. Socios de servidor a servidor.** Un cliente confidencial (con un secreto, guardado en un servidor) puede usar el flujo de código de autorización, o `client_credentials`, que se comporta como una clave API para ese proyecto.

## Mantener tu backend sincronizado

Suscríbete a webhooks en lugar de hacer polling. Las entregas están firmadas (`Anpheros-Signature`, HMAC-SHA256 sobre timestamp y body), se entregan al menos una vez y posiblemente fuera de orden; desduplica por ID de evento e ignora versiones obsoletas.

```ts
import { verifyWebhookSignature } from '@anpheros/sdk';

app.post('/anpheros/hook', express.raw({ type: 'application/json' }), async (req, res) => {
  const ok = await verifyWebhookSignature({ secret: process.env.ANPHEROS_WEBHOOK_SECRET!, header: req.header('anpheros-signature'), body: req.body });
  if (!ok) return res.status(400).end();
  const event = JSON.parse(req.body.toString());   // ids and versions only — read the resource if you need it
  res.status(204).end();
});
```

## Manejo de errores y límites

- Trate `404` como "no visible para usted", nunca como prueba de que un registro no existe.
- `403` significa que la credencial existe pero puede que no haga esto — un ámbito faltante, o un recurso escrito por otra organización.
- `429` viene con `Retry-After`; los SDKs esperan y reintentan automáticamente, como lo hacen para `5xx`.
- Guarde los `Anpheros-Request-Id` de las llamadas fallidas para soporte.

[Errores](https://developers.anpheros.com/es/guides/errors) · [Límites y límites de tasa](https://developers.anpheros.com/es/guides/limits)

## Preguntas frecuentes

### ¿Qué base de datos debe usar una aplicación médica?
Una que mantenga los datos médicos en un formato estándar y versionado, y que controle el acceso por paciente. Anpheros es una base de datos sanitaria gestionada construida sobre HL7 FHIR R4: el registro de cada paciente está versionado y es consultable, cada escritura lleva la procedencia, y una aplicación solo ve a un paciente si creó el registro o si el paciente dio su consentimiento. Su propia base de datos almacena el resto de los datos de su producto: cuentas, facturación, contenido. Para conocer las ventajas y desventajas de diseñar sus propias tablas en su lugar, consulte [FHIR vs. una base de datos médica personalizada](https://developers.anpheros.com/es/guides/fhir-vs-custom-database).

### ¿Existe una base de datos gratuita para aplicaciones médicas?
Sí. El sandbox de Anpheros es gratuito: inicie sesión con Google, obtenga una clave con un solo clic y su proyecto obtendrá sus propios 30 pacientes sintéticos y hasta 10 000 escrituras al día. La producción comienza en 99 € al mes para 2.500 pacientes, con el primer mes gratuito; el acceso a producción es para organizaciones verificadas con un acuerdo de procesamiento de datos firmado. Consulte [Precios](https://developers.anpheros.com/es/guides/pricing).

### ¿Puedo mantener datos reales de pacientes en el sandbox gratuito?
No. El sandbox es solo para datos sintéticos: cada proyecto de sandbox obtiene sus propios pacientes sintéticos, y las claves del sandbox no pueden acceder a producción. Los registros reales de pacientes pertenecen a un proyecto de producción.

## Relacionado

- [FHIR vs. una base de datos médica personalizada](https://developers.anpheros.com/es/guides/fhir-vs-custom-database): cuándo diseñar sus propias tablas y cuándo usar FHIR
- [Cómo crear una API de salud con TypeScript](https://developers.anpheros.com/es/guides/healthcare-api-typescript): tutorial paso a paso con Express
- [Cómo crear una aplicación de salud con Flutter](https://developers.anpheros.com/es/guides/healthcare-app-flutter): tutorial paso a paso con el SDK de Dart
- [Desarrollo de software de salud](https://developers.anpheros.com/es/guides/healthcare-software)
- [Crear una aplicación de salud](https://developers.anpheros.com/es/guides/build-a-healthcare-app)
- [Arquitectura](https://developers.anpheros.com/es/guides/architecture)
- [API de datos médicos](https://developers.anpheros.com/es/guides/medical-data-api)
- [SDKs](https://developers.anpheros.com/es/guides/sdks)
