Flujo de subida
Subir un examen en 3 pasos
La subida de un examen es un flujo de 3 pasos. Los archivos van directo a Cloudflare R2 con URLs presignadas (no pasan por nuestros servidores), así que es rápido incluso con tomografías de 500 MB+.
Paso 1 — Crear el examen
Envía metadata del paciente y la lista de archivos (nombre + tamaño en bytes). Recibís un exam_id y URLs presignadas (válidas por 15 minutos).
POST /api/v1/exams
{
"name": "CBCT mandíbula",
"patient_name": "Juan Pérez",
"files": [
{ "name": "ct_001.dcm", "size": 524288 }
]
}Paso 2 — Subir los archivos a R2
Por cada URL presignada, hacés un PUT con el contenido binario del archivo. R2 responde 200 OK si la subida fue exitosa. No necesitás autenticación adicional: la URL ya está firmada.
PUT https://r2.cloudflarestorage.com/.../ct_001.dcm
Content-Type: application/dicom
<bytes>Paso 3 — Confirmar
Una vez subidos todos los archivos, llamá a /confirm para marcar el examen como ready. Recibís share_url (link branded) y viewer_url (visor 3D directo).
POST /api/v1/exams/{exam_id}/confirm
→ {
"ok": true,
"exam_id": "...",
"status": "ready",
"share_url": "https://cbcthub.com/share/...",
"viewer_url": "https://cbcthub.com/viewer/..."
}Diagrama del flujo
TU SISTEMA CBCTHub API Cloudflare R2
│ │ │
├──POST /v1/exams────────►│ │
│ │ │
│◄────exam_id, upload_urls┤ │
│ │
├──PUT ct_001.dcm ────────────────────────────────►│
├──PUT ct_002.dcm ────────────────────────────────►│
│◄───── 200 OK ───────────────────────────────────┤
│ │
├──POST /v1/exams/{id}/confirm ►│ │
│◄────share_url, viewer_url─────┤ │ℹ Idempotencia
¿Qué pasa si tardo más de 15 minutos en subir?
Las URLs presignadas expiran a los 15 minutos. Si tu cliente no terminó la subida en ese tiempo, volvé a llamar POST /api/v1/exams para regenerar las URLs. El exam_id viejo queda en status uploading hasta que lo elimines.