POST/v1/uploads/{upload_id}/complete
Completar una subida
complete_upload
Cuando se han recibido todas las partes, Sursa ensambla el archivo, compara el SHA-256 del archivo completo con sha256 del cuerpo y ejecuta las mismas comprobaciones que para una subida en una sola solicitud: el formato por la firma del contenido y el análisis antivirus. El resultado es ready, o rejected con reject_reason (checksum_mismatch, type_mismatch, unsupported_format, infected, scan_unavailable, unsafe_content). Cada rechazo de la comprobación de formato o del antivirus se anota en el registro de auditoría como file.rejected.
Una respuesta 200 significa que el resultado está listo; 202, que el archivo aún se está comprobando (processing), y el resultado se obtiene con GET /v1/uploads/{upload_id}. Si el estado vuelve a pending (un reinicio de una instancia de la API interrumpió la comprobación), envíe complete de nuevo. Repetir complete después del resultado devuelve el mismo resultado. Las partes que faltan devuelven 409 uploads.incomplete (details.missing). Un sha256 distinto del declarado al crear la subida, o un parts[].etag distinto del de una parte recibida, devuelve 422 uploads.checksum_mismatch. Una subida lista que no se usa se conserva durante 24 horas. Se añadió en 1.62.0.
Autenticación
Envíe una clave de API en el encabezado Authorization: Authorization: Bearer <clave>.
Parámetros de ruta
upload_idstringobligatorioID de la subida (
upl_seguido de 32 caracteres hexadecimales).length ≤ 64
Parámetros de encabezado
Idempotency-KeystringClave para reintentar de forma segura una escritura: de 1 a 255 caracteres ASCII imprimibles; se recomienda un UUID v4 por operación lógica. Un reintento con la misma clave en un plazo de 24 horas no vuelve a ejecutar la operación: devuelve la respuesta guardada (estado, encabezados y cuerpo) con el encabezado
Idempotency-Replayed: true. La misma clave con otro método, otra ruta, otroContent-Typeu otro cuerpo devuelve409 api.idempotency_mismatch; mientras la primera solicitud sigue en curso,409 api.idempotency_in_progressconRetry-After: 1. Tras una respuesta 5xx o 429, la clave se libera y un reintento vuelve a ejecutar la operación. La clave se aplica a la organización y a quien llama a la API (clave de API, usuario o clave de fuente personalizada).length ≥ 1, length ≤ 255
Cuerpo de la solicitud
application/json
sha256stringobligatorioEl SHA-256 del archivo completo.
partsarray of UploadPartRefComprobación opcional de las partes: el ETag de cada parte tal como lo devuelve
PUT …/parts/{n}.items ≤ 1000
Respuestas
200El resultado está listo: `ready` o `rejected`.
Encabezados de la respuesta
RateLimit-PolicyLímites vigentes, en el formato del borrador del IETF
draft-ietf-httpapi-ratelimit-headers: elementos separados por comas"<name>";q=<quota>;w=<window in seconds>.keyes la frecuencia de solicitudes de la clave de API (la cuota es la ráfaga y la ventana es el tiempo que tarda en recargarse por completo; para una sesión esusery sin credenciales,ip);minute,dayymonthson las cuotas de la organización para el minuto, el día y el mes naturales en UTC.RateLimitLo que queda de cada límite de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLímite de la entrada más estricta de
RateLimit-Policy(la que tiene menos solicitudes restantes).X-RateLimit-RemainingSolicitudes restantes del límite más estricto.
X-RateLimit-ResetSegundos hasta que se restablece el límite más estricto.
Idempotency-Replayedtruesignifica que la respuesta se reprodujo a partir de la guardada para estaIdempotency-Key: la operación no se volvió a ejecutar.
application/json
idstringobligatorioEl ID de la subida (
upl_seguido de 32 caracteres hexadecimales).filenamestringobligatorioEl nombre del archivo (sin carpetas).
content_typestringobligatorioEl tipo de contenido declarado; vacío si no se declaró.
sizeinteger (int64)obligatorioEl tamaño del archivo en bytes.
sha256string | nullobligatorioEl SHA-256 del archivo, declarado al crear la subida o en
complete;nullsi todavía no se conoce.part_sizeinteger (int64)obligatorioEl tamaño de cada parte excepto la última (de 5 a 100 MiB).
part_countintegerobligatorioEl número de partes.
≥ 1, ≤ 1000
parts_receivedintegerobligatorioEl número de partes recibidas.
≥ 0
Las partes recibidas por número (vacío en la respuesta de
POST /v1/uploads).reject_reasonstring | nullobligatorioEl motivo del rechazo (
rejected):checksum_mismatch,type_mismatch,unsupported_format,infected,scan_unavailable,unsafe_content. La enumeración puede ampliarse;nullsi no se rechazó.reject_detailsobject | nullobligatorioDetalles del rechazo (la extensión, el formato declarado y el detectado, las sumas de comprobación);
nullsi no se rechazó.created_atstring (date-time)obligatorioCuándo se creó la subida.
expires_atstring (date-time)obligatorioEl plazo para completar la subida y, una vez lista, para usarla.
completed_atstring (date-time) | nullobligatorioCuándo terminó la comprobación (
readyorejected).consumed_atstring (date-time) | nullobligatorioCuándo se usó la subida (en una tarjeta, un archivo comprimido o una importación).
202El archivo aún se está comprobando (`processing`).
Encabezados de la respuesta
RateLimit-PolicyLímites vigentes, en el formato del borrador del IETF
draft-ietf-httpapi-ratelimit-headers: elementos separados por comas"<name>";q=<quota>;w=<window in seconds>.keyes la frecuencia de solicitudes de la clave de API (la cuota es la ráfaga y la ventana es el tiempo que tarda en recargarse por completo; para una sesión esusery sin credenciales,ip);minute,dayymonthson las cuotas de la organización para el minuto, el día y el mes naturales en UTC.RateLimitLo que queda de cada límite de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLímite de la entrada más estricta de
RateLimit-Policy(la que tiene menos solicitudes restantes).X-RateLimit-RemainingSolicitudes restantes del límite más estricto.
X-RateLimit-ResetSegundos hasta que se restablece el límite más estricto.
Idempotency-Replayedtruesignifica que la respuesta se reprodujo a partir de la guardada para estaIdempotency-Key: la operación no se volvió a ejecutar.
application/json
idstringobligatorioEl ID de la subida (
upl_seguido de 32 caracteres hexadecimales).filenamestringobligatorioEl nombre del archivo (sin carpetas).
content_typestringobligatorioEl tipo de contenido declarado; vacío si no se declaró.
sizeinteger (int64)obligatorioEl tamaño del archivo en bytes.
sha256string | nullobligatorioEl SHA-256 del archivo, declarado al crear la subida o en
complete;nullsi todavía no se conoce.part_sizeinteger (int64)obligatorioEl tamaño de cada parte excepto la última (de 5 a 100 MiB).
part_countintegerobligatorioEl número de partes.
≥ 1, ≤ 1000
parts_receivedintegerobligatorioEl número de partes recibidas.
≥ 0
Las partes recibidas por número (vacío en la respuesta de
POST /v1/uploads).reject_reasonstring | nullobligatorioEl motivo del rechazo (
rejected):checksum_mismatch,type_mismatch,unsupported_format,infected,scan_unavailable,unsafe_content. La enumeración puede ampliarse;nullsi no se rechazó.reject_detailsobject | nullobligatorioDetalles del rechazo (la extensión, el formato declarado y el detectado, las sumas de comprobación);
nullsi no se rechazó.created_atstring (date-time)obligatorioCuándo se creó la subida.
expires_atstring (date-time)obligatorioEl plazo para completar la subida y, una vez lista, para usarla.
completed_atstring (date-time) | nullobligatorioCuándo terminó la comprobación (
readyorejected).consumed_atstring (date-time) | nullobligatorioCuándo se usó la subida (en una tarjeta, un archivo comprimido o una importación).
401No se enviaron credenciales (ni una cookie de sesión ni una clave de API) o no se encontró la clave.
Encabezados de la respuesta
RateLimit-PolicyLímites vigentes, en el formato del borrador del IETF
draft-ietf-httpapi-ratelimit-headers: elementos separados por comas"<name>";q=<quota>;w=<window in seconds>.keyes la frecuencia de solicitudes de la clave de API (la cuota es la ráfaga y la ventana es el tiempo que tarda en recargarse por completo; para una sesión esusery sin credenciales,ip);minute,dayymonthson las cuotas de la organización para el minuto, el día y el mes naturales en UTC.RateLimitLo que queda de cada límite de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLímite de la entrada más estricta de
RateLimit-Policy(la que tiene menos solicitudes restantes).X-RateLimit-RemainingSolicitudes restantes del límite más estricto.
X-RateLimit-ResetSegundos hasta que se restablece el límite más estricto.
application/json
403La acción no está permitida: el rol no es suficiente, no hay acceso a la colección o a la tarjeta, la solicitud se ejecuta en modo «View as», o la organización está suspendida o eliminada (`detail` es un objeto con `code: org_suspended | org_deleted`).
Encabezados de la respuesta
RateLimit-PolicyLímites vigentes, en el formato del borrador del IETF
draft-ietf-httpapi-ratelimit-headers: elementos separados por comas"<name>";q=<quota>;w=<window in seconds>.keyes la frecuencia de solicitudes de la clave de API (la cuota es la ráfaga y la ventana es el tiempo que tarda en recargarse por completo; para una sesión esusery sin credenciales,ip);minute,dayymonthson las cuotas de la organización para el minuto, el día y el mes naturales en UTC.RateLimitLo que queda de cada límite de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLímite de la entrada más estricta de
RateLimit-Policy(la que tiene menos solicitudes restantes).X-RateLimit-RemainingSolicitudes restantes del límite más estricto.
X-RateLimit-ResetSegundos hasta que se restablece el límite más estricto.
application/json
404El objeto no existe o no está disponible para usted. La API no confirma la existencia de un objeto restringido.
Encabezados de la respuesta
RateLimit-PolicyLímites vigentes, en el formato del borrador del IETF
draft-ietf-httpapi-ratelimit-headers: elementos separados por comas"<name>";q=<quota>;w=<window in seconds>.keyes la frecuencia de solicitudes de la clave de API (la cuota es la ráfaga y la ventana es el tiempo que tarda en recargarse por completo; para una sesión esusery sin credenciales,ip);minute,dayymonthson las cuotas de la organización para el minuto, el día y el mes naturales en UTC.RateLimitLo que queda de cada límite de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLímite de la entrada más estricta de
RateLimit-Policy(la que tiene menos solicitudes restantes).X-RateLimit-RemainingSolicitudes restantes del límite más estricto.
X-RateLimit-ResetSegundos hasta que se restablece el límite más estricto.
application/json
409El estado del objeto no permite la acción, por ejemplo, un duplicado, una indexación en curso o un trabajo ya procesado.
Encabezados de la respuesta
RateLimit-PolicyLímites vigentes, en el formato del borrador del IETF
draft-ietf-httpapi-ratelimit-headers: elementos separados por comas"<name>";q=<quota>;w=<window in seconds>.keyes la frecuencia de solicitudes de la clave de API (la cuota es la ráfaga y la ventana es el tiempo que tarda en recargarse por completo; para una sesión esusery sin credenciales,ip);minute,dayymonthson las cuotas de la organización para el minuto, el día y el mes naturales en UTC.RateLimitLo que queda de cada límite de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLímite de la entrada más estricta de
RateLimit-Policy(la que tiene menos solicitudes restantes).X-RateLimit-RemainingSolicitudes restantes del límite más estricto.
X-RateLimit-ResetSegundos hasta que se restablece el límite más estricto.
application/json
410El objeto existió, pero ya no está disponible: el enlace ya se usó o caducó, o el archivo se eliminó al final de su período de conservación.
Encabezados de la respuesta
RateLimit-PolicyLímites vigentes, en el formato del borrador del IETF
draft-ietf-httpapi-ratelimit-headers: elementos separados por comas"<name>";q=<quota>;w=<window in seconds>.keyes la frecuencia de solicitudes de la clave de API (la cuota es la ráfaga y la ventana es el tiempo que tarda en recargarse por completo; para una sesión esusery sin credenciales,ip);minute,dayymonthson las cuotas de la organización para el minuto, el día y el mes naturales en UTC.RateLimitLo que queda de cada límite de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLímite de la entrada más estricta de
RateLimit-Policy(la que tiene menos solicitudes restantes).X-RateLimit-RemainingSolicitudes restantes del límite más estricto.
X-RateLimit-ResetSegundos hasta que se restablece el límite más estricto.
application/json
422Error de validación: el cuerpo o los parámetros no coinciden con el esquema (`detail` es una lista de errores de validación), o el valor de un parámetro está fuera del rango permitido (`detail` es un mensaje).
Encabezados de la respuesta
RateLimit-PolicyLímites vigentes, en el formato del borrador del IETF
draft-ietf-httpapi-ratelimit-headers: elementos separados por comas"<name>";q=<quota>;w=<window in seconds>.keyes la frecuencia de solicitudes de la clave de API (la cuota es la ráfaga y la ventana es el tiempo que tarda en recargarse por completo; para una sesión esusery sin credenciales,ip);minute,dayymonthson las cuotas de la organización para el minuto, el día y el mes naturales en UTC.RateLimitLo que queda de cada límite de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLímite de la entrada más estricta de
RateLimit-Policy(la que tiene menos solicitudes restantes).X-RateLimit-RemainingSolicitudes restantes del límite más estricto.
X-RateLimit-ResetSegundos hasta que se restablece el límite más estricto.
application/json
429Demasiadas solicitudes (`api.rate_limited`), se agotó la cuota de la organización para el minuto, el día o el mes (`api.quota_exceeded`; `error.details` contiene `quota`, `limit` y `reset_at`), se alcanzó el límite de la organización o el servicio de respuestas está ocupado (`answers.engine_busy`). Espere el tiempo indicado en el encabezado `Retry-After`.
Encabezados de la respuesta
Retry-AfterNúmero de segundos que hay que esperar antes de reintentar la solicitud.
RateLimit-PolicyLímites vigentes, en el formato del borrador del IETF
draft-ietf-httpapi-ratelimit-headers: elementos separados por comas"<name>";q=<quota>;w=<window in seconds>.keyes la frecuencia de solicitudes de la clave de API (la cuota es la ráfaga y la ventana es el tiempo que tarda en recargarse por completo; para una sesión esusery sin credenciales,ip);minute,dayymonthson las cuotas de la organización para el minuto, el día y el mes naturales en UTC.RateLimitLo que queda de cada límite de
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitLímite de la entrada más estricta de
RateLimit-Policy(la que tiene menos solicitudes restantes).X-RateLimit-RemainingSolicitudes restantes del límite más estricto.
X-RateLimit-ResetSegundos hasta que se restablece el límite más estricto.
application/json
Códigos de error
Códigos que este endpoint puede devolver en error.code, además de los códigos generales de cualquier solicitud.
Reintentos seguros
Envíe un encabezado Idempotency-Key (por ejemplo, un UUID) con cada POST y PATCH. Un reintento con la misma clave en un plazo de 24 horas devuelve la respuesta guardada en lugar de volver a ejecutar la solicitud.
Límites de frecuencia
Las respuestas incluyen los encabezados RateLimit y RateLimit-Policy y los anteriores X-RateLimit-Limit, X-RateLimit-Remaining y X-RateLimit-Reset. Una respuesta 429 lleva Retry-After en segundos: espere y vuelva a intentarlo.