Saltar al contenido principal

Multimedia y PDFs de la tarea

Obtené las evidencias adjuntas a una tarea — fotos, firmas, croquis, audios y el PDF de un formulario completado en campo. Tres operaciones, todas de solo lectura:

  1. Listar los metadatos de los adjuntos de una tarea (nombre, tipo, tamaño, fecha, notas, proveedor de almacenamiento) — sin contenido pesado.
  2. Descargar un archivo puntual por media_id, como enlace firmado (link, por defecto) o como base64 (on-demand).
  3. Generar el PDF de un formulario como base64, on-demand.
Requisitos previos

Todos los endpoints requieren un token JWT válido, una clave de API y el encabezado tenant. Consultá Autenticación.

Alcance de la tarea

Una credencial solo alcanza las tareas que vería su usuario técnico en el panel web. Aquí aplican las mismas reglas de visibilidad por tarea (móvil/vehículo, aislamiento de procedencia y visibilidad por grupo). Si una tarea existe pero está fuera de ese alcance, recibís 403 FORBIDDEN — no un 404.


Listar adjuntos

Obtiene los metadatos de los adjuntos directos de una tarea. El contenido nunca se incluye — usá el endpoint de descarga para traer un archivo.

GET/apidev/v1/tasks/{id}/attachments
PermisoAPICLI_TASKS_READ
Límite de solicitudes30 solicitudes/min (ventana deslizante)
CachéNinguna

Parámetros de ruta

ParámetroTipoRequeridoDescripción
idstringIdentificador de la tarea. Acepta el ID interno de la tarea, el número de servicio o el ID externo (ver Resolución multi-identificador).

Parámetros de consulta

ParámetroTipoRequeridoDescripción
typestringNoFiltra por la clase del adjunto: signature, image, sketch, audio, qr, barcode u other. Omitir para no filtrar.
form_idstringNoIdentificador del formulario (BigInt opaco). Reservado para adjuntos de formulario. Longitud máxima 40. Ver la nota de abajo.
Adjuntos de formulario

El listado por defecto devuelve solo los adjuntos directos de la tarea, por lo que form_id y form_name salen siempre null aquí. Filtrar por form_id apunta a los adjuntos que pertenecen a un formulario — un camino aún no implementado, así que ese filtro hoy devuelve una lista vacía.

Campos de la respuesta

CampoTipoDescripción
seridstringID de la tarea resuelta (BigInt como string)
service_numberstring | nullNúmero de servicio (BigInt como string)
assistance_numberstring | nullNúmero de asistencia (BigInt como string)
attachmentsarrayMetadatos de los adjuntos — sin el contenido del archivo
attachments[].media_idstringIdentificador del archivo para el endpoint de descarga
attachments[].namestring | nullNombre visible del archivo
attachments[].typestringsignature, image, sketch, audio, qr, barcode u other
attachments[].raw_typestring | nullSolo presente cuando type es other — el código de captura original
attachments[].mime_typestring | nullInferido por la extensión del archivo; null si no se reconoce
attachments[].sizenumber | nullTamaño del archivo en bytes
attachments[].datestring | nullMarca de tiempo de la captura (sin zona horaria)
attachments[].notesstring | nullNotas del adjunto
attachments[].form_idstring | nullID del formulario — siempre null en el listado directo
attachments[].form_namestring | nullNombre del formulario — siempre null en el listado directo
attachments[].providerstring | nullEtiqueta del proveedor de almacenamiento (p. ej., azure, s3)
meta.countnumberCantidad de adjuntos devueltos
Sin detalles internos de almacenamiento

El listado nunca expone la ruta de almacenamiento del archivo, el contenedor, la referencia del proveedor ni ningún enlace firmado. El contenido se trae por el endpoint de descarga.

Ejemplo de código

curl -s "https://$TENANT/apidev/v1/tasks/103878/attachments?type=image" \
-H "Authorization: Bearer $TOKEN" \
-H "X-API-Key: $APIKEY" \
-H "tenant: $TENANT"

Respuesta de ejemplo

{
"success": true,
"data": {
"serid": "1284773829100",
"service_number": "103878",
"assistance_number": "5567",
"attachments": [
{
"media_id": "9981273645",
"name": "foto_siniestro_1.jpg",
"type": "image",
"mime_type": "image/jpeg",
"size": 482113,
"date": "2026-06-22T14:31:07",
"notes": "Frente del vehículo",
"form_id": null,
"form_name": null,
"provider": "azure"
},
{
"media_id": "9981273988",
"name": "conformidad_firma.png",
"type": "signature",
"mime_type": "image/png",
"size": 18422,
"date": "2026-06-22T15:02:44",
"notes": null,
"form_id": null,
"form_name": null,
"provider": "s3"
}
]
},
"meta": { "count": 2 }
}

Descargar adjunto

Trae un archivo puntual por media_id. Por defecto obtenés una URL firmada de corta duración (mode=link); pasá mode=base64 para recibir el contenido completo en línea.

GET/apidev/v1/tasks/{id}/attachments/{media_id}
PermisoAPICLI_TASKS_READ
Límite de solicitudes30 solicitudes/min (ventana deslizante)
CachéNinguna

Parámetros de ruta

ParámetroTipoRequeridoDescripción
idstringIdentificador de la tarea (ID de la tarea, número de servicio o ID externo)
media_idstringIdentificador del adjunto, tomado de la respuesta de Listar adjuntos

Parámetros de consulta

ParámetroTipoRequeridoPor defectoDescripción
modestringNolinklink devuelve una URL firmada con expiración. base64 devuelve el contenido completo del archivo.

Campos de la respuesta

CampoTipoPresente enDescripción
seridstringambosID de la tarea resuelta
service_numberstring | nullambosNúmero de servicio
assistance_numberstring | nullambosNúmero de asistencia
media_idstringambosEco del identificador del adjunto solicitado
namestring | nullambosNombre del archivo
typestringambosClase del adjunto (ver Listar adjuntos)
mime_typestring | nullambosTipo MIME. Con base64, se prefiere el tipo informado por el proveedor de almacenamiento por sobre el inferido por la extensión.
sizenumber | nullambosTamaño del archivo en bytes
modestringambosEco del modo — link o base64
download_urlstringsolo linkURL firmada de corta duración
expires_atstring | nullsolo linkMomento en que la URL firmada deja de servir (sin zona horaria)
file_base64stringsolo base64Contenido completo del archivo
Los enlaces firmados expiran

Una URL de link es efímera. Descargá el contenido antes de expires_at. Para archivado masivo, volvé a llamar a este endpoint para refrescar la URL. Nunca se devuelve un enlace expirado — si no se puede refrescar, recibís 409 ATTACHMENT_UNAVAILABLE en lugar de una URL muerta.

Preferí link para volumen

base64 carga el archivo completo en memoria. Usalo para archivos chicos o descargas puntuales; para archivos grandes o descargas masivas, preferí mode=link.

Ejemplo de código

# Por defecto — enlace firmado
curl -s "https://$TENANT/apidev/v1/tasks/103878/attachments/9981273645" \
-H "Authorization: Bearer $TOKEN" \
-H "X-API-Key: $APIKEY" \
-H "tenant: $TENANT"

# Contenido base64, on-demand
curl -s "https://$TENANT/apidev/v1/tasks/103878/attachments/9981273988?mode=base64" \
-H "Authorization: Bearer $TOKEN" \
-H "X-API-Key: $APIKEY" \
-H "tenant: $TENANT"
{
"success": true,
"data": {
"serid": "1284773829100",
"service_number": "103878",
"assistance_number": "5567",
"media_id": "9981273645",
"name": "foto_siniestro_1.jpg",
"type": "image",
"mime_type": "image/jpeg",
"size": 482113,
"download_url": "https://geotareasstore.blob.core.windows.net/cia-42/9981273645.jpg?sv=2024-08&se=2026-06-25T16%3A10%3A00Z&sig=Rb9...",
"expires_at": "2026-06-25T16:10:00",
"mode": "link"
}
}

Respuesta de ejemplo — mode=base64

{
"success": true,
"data": {
"serid": "1284773829100",
"service_number": "103878",
"assistance_number": "5567",
"media_id": "9981273988",
"name": "conformidad_firma.png",
"type": "signature",
"mime_type": "image/png",
"size": 18422,
"file_base64": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
"mode": "base64"
}
}

PDF del formulario

Genera el PDF de un formulario completado en la tarea. El PDF se produce on-demand y se devuelve como base64 — no se almacena.

GET/apidev/v1/tasks/{id}/forms/{form_id}/pdf
PermisoAPICLI_TASKS_READ
Límite de solicitudes30 solicitudes/min (ventana deslizante)
CachéNinguna

Parámetros de ruta

ParámetroTipoRequeridoDescripción
idstringIdentificador de la tarea (ID de la tarea, número de servicio o ID externo)
form_idstringIdentificador del formulario completado (BigInt opaco)

Parámetros de consulta

ParámetroTipoRequeridoPor defectoDescripción
modestringNobase64Modo de entrega. Por ahora solo se admite base64.

Campos de la respuesta

CampoTipoDescripción
seridstringID de la tarea resuelta
service_numberstring | nullNúmero de servicio
assistance_numberstring | nullNúmero de asistencia
form_idstringEco del identificador del formulario solicitado
form_namestring | nullNombre legible del formulario
filenamestringNombre de archivo sugerido para el PDF
mime_typestringSiempre application/pdf
file_base64stringEl contenido del PDF generado
modestringSiempre base64

Ejemplo de código

curl -s "https://$TENANT/apidev/v1/tasks/103878/forms/77120033/pdf" \
-H "Authorization: Bearer $TOKEN" \
-H "X-API-Key: $APIKEY" \
-H "tenant: $TENANT"

Respuesta de ejemplo

{
"success": true,
"data": {
"serid": "1284773829100",
"service_number": "103878",
"assistance_number": "5567",
"form_id": "77120033",
"form_name": "Acta de conformidad",
"filename": "acta_conformidad_103878.pdf",
"mime_type": "application/pdf",
"file_base64": "JVBERi0xLjQKJeLjz9MKMyAwIG9iago8PC9UeXBlL1BhZ2UvUGFyZW50...",
"mode": "base64"
}
}

Resolución multi-identificador

El parámetro de ruta {id} acepta cualquiera de tres identificadores, intentados en este orden:

  1. ID de la tarea (serid)
  2. Número de servicio (service_number)
  3. ID externo (external_id)

El mismo valor se prueba contra cada candidato dentro de tu tenant hasta que uno coincida con una tarea. Se buscan tanto las tareas activas como las históricas, así que una tarea finalizada igual resuelve. Si ninguno de los tres coincide, recibís 404 TASK_NOT_FOUND.

Esto significa que podés llamar al mismo endpoint con el identificador que tengas a mano — el ID interno de la tarea, el número de servicio impreso en un ticket o el ID externo de tu propio sistema.


Errores

CódigoHTTPAplica aDescripción
UNAUTHORIZED401Todostenant / Authorization / X-API-Key ausente, inválido o expirado
FORBIDDEN403TodosLa credencial no tiene APICLI_TASKS_READ, o la tarea está fuera del alcance del usuario técnico
TASK_NOT_FOUND404TodosNinguna tarea coincide con el identificador enviado en {id}
ATTACHMENT_NOT_FOUND404DescargaLa tarea no tiene un adjunto con ese media_id
FORM_NOT_FOUND404PDF del formularioLa tarea no tiene un formulario con ese form_id
INVALID_MODE400Descarga, PDF del formulariomode no es uno de los valores admitidos (link/base64 para descarga, base64 para PDF)
ATTACHMENT_UNAVAILABLE409DescargaEl archivo existe en la base pero no se pudo resolver en el almacenamiento (enlace expirado que no se pudo refrescar, o el archivo fue movido/eliminado)
PDF_GENERATION_FAILED422PDF del formularioEl formulario existe pero no se pudo generar el PDF
RATE_LIMITED429TodosSe superaron 30 solicitudes/min
INTERNAL_ERROR500TodosError inesperado del servidor

Ejemplo de error — tarea fuera de alcance

{
"success": false,
"error": {
"code": "FORBIDDEN",
"message": "Esta credencial no tiene acceso a los archivos de esta tarea.",
"hint": "Usá una credencial con acceso a esa tarea, o pedí el permiso de lectura de tareas."
}
}

Ejemplo de error — archivo no disponible en almacenamiento

{
"success": false,
"error": {
"code": "ATTACHMENT_UNAVAILABLE",
"message": "El archivo existe pero no se pudo recuperar del almacenamiento en este momento.",
"hint": "Reintentá más tarde; si persiste, el archivo puede haberse eliminado del almacenamiento."
}
}