Los equipos de siniestros y las plataformas de telemedicina pierden semanas con PDF de laboratorio, recetas escaneadas y resúmenes clínicos enviados por fax. Zuree los lee y devuelve hechos normalizados y codificados en LOINC — cada uno con un índice de confianza y procedencia hasta el documento de origen exacto.
Una sola API REST. Cargas idempotentes, webhooks firmados, un SDK de TypeScript tipado y una representación FHIR R4 de todo lo que extrae.
{ "jobId": "job_8Kd2", "status": "QUEUED" } {
"type": "document.processing_completed",
"data": {
"documentId": "doc_3Fq9",
"documentType": "LAB_REPORT",
"processingStatus": "PROCESSED"
}
} {
"display": "Hemoglobin",
"coding": { "system": "LOINC", "code": "718-7" },
"valueNumeric": 13.5, "unit": "g/dL",
"interpretation": "LOW",
"confidence": 0.93,
"provenance": { "documentId": "doc_3Fq9",
"method": "AI_TEXT" }
} Un solo siniestro o alta puede implicar una docena de archivos de una docena de laboratorios, cada uno con su formato, sus unidades y sus abreviaturas. Alguien tiene que leerlos.
Enfermeras revisoras y peritos reescriben valores en formularios. El rendimiento queda limitado por la plantilla, y el coste por archivo no baja nunca.
Un volcado de texto todavía hay que clasificarlo, codificarlo y normalizarle las unidades antes de que un motor de reglas o un modelo pueda usarlo.
Si un revisor no puede rastrear un valor hasta la página de la que salió, no sostiene una decisión que haya que defender.
OCR, detección de plantillas, versionado de prompts, validación de esquema, reintentos idempotentes, trazas de auditoría. Meses de trabajo que no son tu producto.
Cada etapa es idempotente y guarda punto de control por documento. Un reintento retoma donde se detuvo — nunca duplica trabajo ni vuelve a facturar una llamada de IA de una etapa ya completada.
El archivo aterriza en almacenamiento de objetos privado, indexado por tenant más un SHA-256 de sus bytes. Ese hash es la identidad del documento, así que una recarga idéntica resuelve al documento existente en vez de crear un segundo.
stage: INGESTION status: ok · 42ms sha256: 9f2c…a71b dedupe: miss
Cada ejecución es auditable: un ledger de etapas con tiempos, tokens, coste y decisiones de escalado. La salida de la IA se trata como entrada no confiable — pasa validación de esquema antes de que nada aguas abajo la lea, y el JSON reparado se marca como reparado, nunca se devuelve como limpio.
La procedencia no es una nota al pie — es un campo. Cada hecho extraído apunta de vuelta al documento, al registro de extracción y al método que lo produjo.
{
"display": "Hemoglobin",
"coding": {
"system": "LOINC",
"code": "718-7",
"display": "Hemoglobin"
},
"valueNumeric": 13.5,
"unit": "g/dL",
"referenceRange": {
"low": 12, "high": 16, "unit": "g/dL",
"text": "12.0 - 16.0"
},
"interpretation": "LOW",
"observedAt": "2026-07-01",
"confidence": 0.93,
"provenance": {
"documentId": "doc_3Fq9",
"extractionId": "ext_7Bm2",
"method": "AI_TEXT",
"confidence": 0.93
}
} curl -sX POST "$ZUREE_BASE_URL/v1/patients" \
-H "Authorization: Bearer $ZUREE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"pseudonym":"ext-user-42"}'
# → {"id":"<patientId>",
# "pseudonym":"ext-user-42",
# "createdAt":"2026-07-01T09:12:04.000Z"} import { ZureeClient } from '@zuree/sdk';
const zuree = new ZureeClient({
apiKey: process.env.ZUREE_API_KEY!,
baseUrl: process.env.ZUREE_BASE_URL!,
});
const patient = await zuree.patients.create({
pseudonym: 'ext-user-42',
}); CONTENT=$(base64 -i lab-report.pdf)
curl -sX POST "$ZUREE_BASE_URL/v1/documents" \
-H "Authorization: Bearer $ZUREE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d "{\"patientId\":\"$PATIENT_ID\",
\"filename\":\"lab-report.pdf\",
\"mimeType\":\"application/pdf\",
\"content\":\"$CONTENT\"}"
# → {"document":{"id":"<documentId>",
# "status":"SECURITY_CHECKED"},
# "duplicate":false} import { readFile } from 'node:fs/promises';
import { randomUUID } from 'node:crypto';
const bytes = await readFile('lab-report.pdf');
const { document } = await zuree.documents.create(
{
patientId: patient.id,
filename: 'lab-report.pdf',
mimeType: 'application/pdf',
content: bytes.toString('base64'),
},
{ idempotencyKey: randomUUID() },
); curl -sX POST \
"$ZUREE_BASE_URL/v1/documents/$DOCUMENT_ID/process" \
-H "Authorization: Bearer $ZUREE_API_KEY"
# → 202 {"jobId":"<jobId>",
# "status":"QUEUED",
# "attempts":0} await zuree.documents.process(document.id);
let s = await zuree.documents.status(document.id);
while (s.status === 'PROCESSING') {
await new Promise((r) => setTimeout(r, 2000));
s = await zuree.documents.status(document.id);
} curl -sX POST "$ZUREE_BASE_URL/v1/webhooks" \
-H "Authorization: Bearer $ZUREE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://your-app.example/hooks/zuree",
"events":["document.processing_completed",
"document.processing_failed"]}'
# → {"id":"whe_…","secret":"whsec_…"} import { verifyWebhookSignature } from '@zuree/sdk';
app.post('/hooks/zuree', async (req, res) => {
const raw = await readRawBody(req);
const check = verifyWebhookSignature({
payload: raw,
signatureHeader: req.headers['zuree-webhook-signature'],
secret: process.env.ZUREE_WEBHOOK_SECRET!,
});
if (!check.ok) return res.status(401).end();
const event = JSON.parse(raw);
res.status(200).end();
}); curl -s \
"$ZUREE_BASE_URL/v1/patients/$PID/observations?limit=50" \
-H "Authorization: Bearer $ZUREE_API_KEY"
# → { "items": [ { "display": "Hemoglobin",
# "coding": {"system":"LOINC","code":"718-7"},
# "valueNumeric": 13.5, "unit": "g/dL",
# "interpretation": "LOW", "confidence": 0.93,
# "provenance": {…} } ],
# "nextCursor": "b2Zmc2V0OjUw" } for await (const obs of zuree.clinical.observationsAll(patient.id)) {
console.log(
obs.display,
obs.valueNumeric ?? obs.valueText,
obs.unit ?? '',
`(${obs.confidence})`,
);
}
for await (const e of zuree.clinical.timelineAll(patient.id)) {
console.log(e.date ?? '(undated)', e.kind);
} Envía un Idempotency-Key y ningún reintento duplica. Los bytes idénticos se deduplican solos.
Firma HMAC, entrega al menos una vez con backoff exponencial y un log de entregas por endpoint.
429 con Retry-After. El SDK reintenta automáticamente y lo respeta.
Spec en vivo en /v1/openapi.json. Los datos clínicos también salen como FHIR R4.
Manda los adjuntos del siniestro directo a tu motor de reglas. Observaciones, medicaciones y procedimientos codificados llegan con índices de confianza, para aprobar automáticamente los casos limpios y derivar a una persona solo los archivos ambiguos.
Deja que el paciente suba lo que tenga durante el alta. Zuree devuelve una línea de tiempo cronológica unificada — análisis, medicaciones, condiciones, procedimientos, encuentros — para que la consulta empiece con contexto y no con un visor de archivos.
La evidencia médica de cien laboratorios distintos normaliza al mismo modelo codificado, así que la evaluación de riesgo compara igual con igual. LOINC donde existe código, un código LOCAL explícito de Zuree donde no — nunca una suposición silenciosa.
Podrías construir OCR, detección de plantillas, versionado de prompts, validación de esquema y una traza de auditoría. O podrías instalar el SDK esta tarde y gastar el trimestre en el producto que tus usuarios sí pidieron.
Zuree Mobile es un producto de consumo en producción que corre íntegramente sobre los endpoints documentados en esta página — el mismo modelo de paciente pseudonímico, el mismo pipeline de diez etapas, la misma salida codificada. Sin endpoints privados, sin vía privilegiada.
Eso lo convierte en nuestra implementación de referencia y en nuestro banco de pruebas permanente de precisión: formatos de laboratorio desconocidos le llegan todos los días, y una regresión aparece en registros reales antes de poder alcanzar el tenant de un cliente.
zuree.app (iOS / Android)
│
└─ POST /v1/documents
POST /v1/documents/:id/process
GET /v1/patients/:id/timeline
│
└─ la misma API V1 de esta página Tú identificas a los pacientes con una referencia opaca que controlas. Zuree nunca necesita un identificador del mundo real para procesar un documento.
Zuree no hace ninguna afirmación de cumplimiento normativo — ni RGPD, ni HIPAA, ni ningún otro marco. Los controles de al lado son los mecanismos técnicos que implementamos y que explicaremos a tu equipo de seguridad. Determinar bases legales, plazos de retención y obligaciones de supresión en tu jurisdicción sigue siendo tuyo. Preferimos decirlo de entrada y no en la due diligence.
Logs, métricas, analytics, rastreadores de errores, payloads de webhook y registros de auditoría llevan IDs opacos, códigos y recuentos — nunca contenido de documento.
La identidad del tenant se resuelve en el servidor a partir de tu clave de API. Un tenant_id nunca se acepta en el cuerpo de una petición.
Los buckets son privados; las URLs firmadas caducan en minutos. Las cargas pasan análisis de malware y el tipo de contenido se verifica desde los bytes.
Cada extracción registra qué proveedor, qué modelo exacto, qué versión de prompt y qué versión de pipeline la produjo — legible por la API.
Borrar un documento lo elimina de la base de datos, del almacenamiento de objetos, de la cola de procesamiento y de los archivos temporales — dejando un registro de auditoría de IDs y recuentos, no de contenido.
Indefinida por defecto — Zuree nunca borra lo que no pediste. Activa una ventana de antigüedad de documento por tenant y los archivos vencidos se purgan por la misma vía.
La disciplina de alcance es parte de la postura de seguridad: Zuree transcribe documentos a datos estructurados. No diagnostica, no interpreta hallazgos, no lee imágenes, no recomienda tratamiento ni actúa como apoyo a la decisión clínica — y rechazamos peticiones de función que cruzan esa línea.
Un documento es un archivo que envías a /process. Las recargas deduplicadas y los reintentos retomados nunca se cobran dos veces. El exceso se mide por documento, así que un pico cuesta dinero — no una conversación de upgrade.
Pon un flujo en producción sin pasar por un ciclo de compras.
Para equipos que procesan siniestros o altas de pacientes cada día.
Para aseguradoras y plataformas donde el volumen de documentos es el negocio.
Los tres tipos de documento de V1, codificación LOINC, procedencia, confianza, webhooks, la spec OpenAPI, el SDK de TypeScript, exportación FHIR R4 y borrado auditado. Ninguna función queda tras un muro de pago — solo cambian volumen y soporte.
Cargas duplicadas (bytes idénticos), reintentos retomados de una etapa con punto de control, documentos devueltos como UNSUPPORTED y toda lectura de datos que ya tienes.
Un tenant de sandbox gratuito con 100 documentos acompaña toda evaluación técnica, para que midas la precisión sobre tu propio corpus antes de firmar nada.
Arrastra hasta el volumen mensual de documentos que esperas. Elegimos el plan más barato para ese volumen, exceso incluido.
Solo estimaciones, sin impuestos. La facturación anual aplica un 15% de descuento sobre la tarifa de plataforma; el exceso se mantiene en la tarifa del plan. Los volúmenes comprometidos por encima de 120.000 documentos al mes se cotizan individualmente.
Informes de laboratorio, recetas e informes médicos / resúmenes clínicos. Un documento que Zuree reconoce pero que queda fuera de ese alcance devuelve estado UNSUPPORTED en vez de una extracción adivinada — y no se factura. Los tipos adicionales son una conversación de roadmap, no una ampliación silenciosa.
No. Zuree transcribe y normaliza lo que dice el documento. No es un sistema de diagnóstico, de consejo médico, de interpretación radiológica, de recomendación de tratamiento ni de apoyo a la decisión clínica. El campo interpretation de una observación refleja la marca impresa en el informe de origen contra su propio rango de referencia — es transcripción, no juicio.
La salida de la IA se trata como entrada no confiable. Toda respuesta se valida contra esquema antes de que nada aguas abajo la lea. Las respuestas en bruto se guardan de forma inmutable, separadas de los hechos normalizados, para que una extracción siempre pueda rederivarse y auditarse. El JSON que hubo que reparar se marca como tal — nunca se devuelve como limpio. Y ningún campo toma valor por defecto en silencio: una confianza ausente sigue ausente en vez de convertirse en un número plausible.
Sí — la extracción lo exige. Qué proveedor y qué modelo exacto trató un documento dado queda registrado en el registro de extracción y es legible vía GET /v1/documents/{id}/extraction, junto con las versiones de prompt y de pipeline. Los proveedores viven detrás de una interfaz interna, así que la mezcla puede cambiar; la atribución de cada registro dice exactamente qué procesó qué. El tratamiento por parte del proveedor se rige por su contrato, que compartimos en la due diligence.
Los límites numéricos se fijan por despliegue y plan, no en el contrato de la API — los de tu tenant constan en tu cuenta. El mecanismo es estable en cualquier caso: un 429 con Retry-After, que el SDK respeta automáticamente con backoff y jitter. El procesamiento por lotes se encola contra un presupuesto de concurrencia en vez de rechazarse, así que enviar mil documentos de una vez está bien.
Ambas cosas. Una exportación JSON portable completa por paciente incluye la contabilidad de proveedor por documento, y los datos clínicos también están disponibles como FHIR R4. El borrado es explícito e iniciado por el tenant — DELETE /v1/documents/{id} elimina un documento y sus datos derivados en la base de datos, el almacenamiento de objetos, la cola y los archivos temporales, dejando un registro de auditoría de quién y cuándo, nunca de qué.
Un archivo que completa una ejecución de procesamiento. Volver a subir bytes idénticos devuelve el documento existente con "duplicate": true y no se cobra otra vez. Un reintento que retoma una etapa con punto de control no vuelve a facturar la llamada de IA de una etapa ya terminada. Las lecturas de datos que ya tienes no se miden.
Todos los endpoints y campos, con ejemplos en curl y SDK uno al lado del otro.
Leer la documentación →Cliente TypeScript tipado con paginación automática, reintento y verificación de webhook.
Genera un cliente en tu lenguaje desde la spec del propio despliegue en marcha.
El mismo modelo clínico, renderizado como recursos FHIR para tu stack actual.
Ver el mapeo →Cuarenta y cinco minutos con un ingeniero, no un pitch. Pasamos tus archivos reales por el pipeline, te mostramos los registros de extracción y la procedencia, y te decimos con claridad dónde falla.
Tenant de sandbox con 100 documentos gratis. Sin tarjeta, sin compras.