Archivos
Carga (JSON con contenido Base64) y eliminación de archivos adjuntos a una solicitud de certificado, y descarga mediante URL firmada (GET /certificate-request/{uuid}/files/{fileUuid}/download). Tipos admitidos: PDF, JPG, PNG, GIF y ZIP.
Subir archivos en Base64 a una solicitud
Adjunta uno o más archivos, enviados en Base64 dentro del JSON (no multipart), a una solicitud existente. **Tipos permitidos:** PDF, JPG, PNG, GIF y ZIP; el tipo se valida con el prefijo Data URI si viene, o se detecta por el contenido (el `mime_type` guardado y devuelto solo se toma del prefijo Data URI; sin prefijo queda en `null`). **Límites:** 2 MB por archivo (decodificado); la solicitud no puede superar 6 archivos en total contando los que ya tiene (incluido el Excel generado al crearla); 20 cargas por minuto por usuario. **Certificado en ZIP:** si el nombre del archivo termina en `.zip` (en minúsculas; un `.ZIP` se guarda sin procesar y no se registran los datos del certificado) y se envía `pin`, el servidor descomprime el ZIP con el NIT de la solicitud como contraseña (NIT + DV si es Persona Jurídica), busca el certificado solo en la raíz del ZIP (no en subcarpetas): usa el primer archivo `.p12`/`.pfx` (extensión en minúsculas) de la raíz; si no hay ninguno, intenta con el último archivo de la raíz en orden alfabético, por lo que un `.P12` en mayúsculas o sin extensión puede funcionar si es el único archivo, pero falla si hay otros archivos que se ordenan después (use siempre extensión `.p12` o `.pfx` en minúsculas); lo valida con el `pin` y guarda en la solicitud la fecha de vencimiento del certificado (`expiration_date`), el inicio y el fin de vigencia (`issued_at`, `cert_valid_to`) y el PIN. El `pin` se aplica a todos los `.zip` del envío. Tras cada archivo se disparan el webhook de archivo cargado y, para JPG/PNG/PDF, el análisis automático de documentos (si está habilitado en el servidor). **Todo o nada:** si falla cualquier archivo del envío, no se registra ninguno (tampoco se guardan los datos del certificado en la solicitud); corrija el error y reintente el lote completo. Nota: en ese caso puede llegar el webhook de archivo cargado de un archivo que finalmente no quedó registrado. **Orden de comprobación:** la validación del cuerpo (400) se evalúa antes que la existencia de la solicitud (404), así que un `id` inexistente o de otra empresa con un cuerpo inválido recibe 400.
Eliminar un archivo de una solicitud
Elimina definitivamente un archivo de una solicitud: lo borra del almacenamiento y de la base de datos. El archivo debe pertenecer a la solicitud indicada en `id`.
Obtener URL de descarga de un archivo de la solicitud
Devuelve una URL firmada (vigencia 24 h) para descargar un archivo registrado en la solicitud (adjuntos ATTACHED, soportes PAYMENT, certificado CERTIFICATE, etc.). Los tipos sensibles P7B_CERTIFICATE y PRIVATE_KEY no se pueden descargar (409), tampoco el administrador. El archivo de tipo CERTIFICATE (.zip con el .p12) sigue la misma regla de vigencia que GET /certificate-request/{uuid}/issuance/download: al cliente solo se le entrega si la solicitud está en PROCESSED (si no, 409 con el estado actual en `status`); el administrador (users.is_admin) puede descargarlo siempre. Los demás tipos se entregan en cualquier estado. El archivo debe pertenecer a la solicitud indicada.