Enviar gasto
POST /api/spot/gastos con uno o más archivos de boleta.
POST /api/spot/gastos?public_key={tu_public_key}&rut={rut_paciente}
Content-Type: multipart/form-dataEnvía a Skip el gasto de un paciente — la boleta más su metadata — para que Skip lo rinda ante su ISAPRE/seguro. Puedes mandar 1–5 boletas en una sola request.
Campos del formulario
El único campo requerido de facto es uploaded_files (sin archivos → 400). Los demás son opcionales, pero mientras más completos, mejor el matcheo y la rendición.
| Campo | Tipo | Obligatorio | Notas |
|---|---|---|---|
uploaded_files | file × 1–5 | sí | PDF o imagen (PDF, JPEG, PNG, WebP, HEIC/HEIF). XML no soportado. Máx 2 MB por archivo. |
name | string | no | Nombre del paciente. |
date | dd/mm/yyyy | no | Fecha de atención de la boleta. |
receipt_id | string | no | Tu ID interno de la boleta (se guarda como referencia). |
receipt_rut | string | no | RUT de la entidad emisora (la clínica). |
doctor_rut | string | no | RUT del médico tratante. |
total | integer | no | Monto en CLP, sin decimales. |
Respuesta
{
"status": "ok",
"processed_files": ["boleta_a.pdf", "boleta_b.jpg"],
"submission_status": "...",
"pending_document_ids": [],
"missing_document_types": []
}processed_files es la lista de archivos que Skip aceptó. Los archivos que fallan validación se descartan en silencio — chequea esta lista contra lo que enviaste. La respuesta incluye campos adicionales de estado de rendición; trátala como no exhaustiva.
Un 200 significa recibido y encolado, no validado ni extraído: la extracción con IA y la presentación a la ISAPRE ocurren de forma asíncrona y pueden fallar después sin reflejarse en esta respuesta (hoy no hay webhook público de status). Detalle en Boletas → processed_files.
Idempotencia
Skip deduplica por el contenido del archivo (hash SHA256, dentro del mismo paciente), no por receipt_id — este último se guarda solo como referencia tuya. Para reintentar tras un fallo de red sin crear un gasto duplicado (ni un segundo WhatsApp al paciente), reenvía el mismo archivo byte a byte. Si regeneras el PDF, el hash cambia y Skip lo tratará como una boleta nueva.
Errores
| Status | code | Causa |
|---|---|---|
| 401 | invalid_provider | public_key inválida. |
| 400 | no_files / too_many_files / file_too_large | Sin archivos, más de 5 archivos, o archivo > 2 MB. |
| 404 | beneficiary_not_found | No hay beneficiario para rut (el paciente no es usuario Skip con ISAPRE asociada). Guarda la boleta y reintenta cuando el paciente complete su onboarding — ver Boletas → paciente aún no registrado. |
Ejemplo
curl -X POST "https://backend.getskip.ai/api/spot/gastos?public_key=pk_live_xxx&rut=12345678-9" \
-F "name=María González" \
-F "date=15/04/2026" \
-F "receipt_id=DTE-2026-001" \
-F "receipt_rut=99999999-9" \
-F "doctor_rut=11111111-1" \
-F "total=50000" \
-F "uploaded_files=@boleta.pdf"¿El gasto corresponde a una orden AAPD? Usa AAPD → Enviar gasto, que liga la boleta a su orden para destrabar la rendición.