API para conectar su sistema

Introducción y orientación

Gestione contenido multimedia, campañas e informes directamente desde su propio sistema, sin iniciar sesión en la administración.

Para qué sirve la API

La API conecta el sistema del cliente, por ejemplo, una tienda en línea, un planificador de campañas publicitarias o un catálogo interno, directamente con la gestión de contenido de los dispositivos. Su sistema puede cargar archivos multimedia, crear y activar campañas y obtener sus resultados sin que nadie tenga que realizar estas operaciones manualmente en la administración.

La interfaz es la misma que utiliza la administración web. Por tanto, la API permite las mismas operaciones, dentro de los permisos del usuario que ha iniciado sesión.

Cuándo utilizar la API

Para cargar ocasionalmente unos pocos archivos y activar una campaña manualmente, conviene utilizar la administración: el asistente muestra una vista previa y comprueba los formatos y la capacidad de los dispositivos. La API tiene sentido cuando el trabajo manual empieza a ralentizarle.

NecesitaMétodo recomendado
Cargar unos pocos archivos multimedia y activar una campañaAdministración
Actualizar contenido con regularidad, pero manualmenteAdministración
Cargar archivos multimedia en bloque desde su propio sistemaAPI
Crear campañas automáticamente desde su propio planificadorAPI
Incorporar los resultados de las campañas a sus propios informesAPI

La interfaz no tiene versiones y puede cambiar con la evolución de la plataforma. Avise a su proveedor de software antes de desplegar una integración y compruebe que sigue funcionando tras las actualizaciones del sistema.

A quién va dirigida esta guía y responsabilidades

  • El proveedor de la plataforma opera la interfaz, facilita la dirección de administración y establece el modo de reproducción de la empresa.
  • El cliente decide el alcance de la integración y crea en su empresa un usuario específico con los permisos necesarios; consulte Crear un usuario y realizar el primer inicio de sesión.
  • El desarrollador de la integración conecta el sistema del cliente con la interfaz. Las instrucciones técnicas y los ejemplos de código de esta guía están dirigidos a ese desarrollador. Si desarrolla la integración por su cuenta, también desempeña esta función.

Referencia técnica

Guía técnica para desarrolladores de integraciones

Empiece por las convenciones de llamada comunes y el inicio de sesión. Después siga el proceso desde la carga de un archivo hasta la activación de una campaña y consulte los puntos de acceso disponibles.

Convenciones comunes de llamada

  • Dirección: la interfaz funciona en la misma dirección que su administración; todas las rutas empiezan por /api/. En los ejemplos, la dirección se sustituye por https://admin.example.org. Si hay un entorno de pruebas disponible, su proveedor le facilitará su dirección.
  • Inicio de sesión: cada solicitud incluye las credenciales mediante HTTP Basic Auth. No se utilizan sesiones ni tokens.
  • Formato de datos: los cuerpos de las solicitudes y las respuestas son JSON. La excepción es la carga de archivos, cuyo cuerpo contiene los datos binarios sin procesar.
  • Identificadores y valores: los identificadores son números enteros. La fecha y la hora utilizan el formato YYYY-MM-DDTHH:MM:SS; las duraciones de visualización se expresan en milisegundos (10000 = 10 s).
  • Resultado: el éxito se confirma con el estado 200. Esto significa que la solicitud se ha aceptado, no que el contenido ya se esté reproduciendo en los dispositivos.

Inicio de sesión

El identificador de acceso no es una dirección de correo, sino un código de ocho caracteres generado al crear el usuario, por ejemplo A1B2C3D4. Cree un usuario específico con los permisos mínimos necesarios para la integración; así podrá revocar su acceso en cualquier momento sin afectar a otros usuarios.

curl -u "A1B2C3D4:your-password" https://admin.example.org/api/public/login

La contraseña se envía con cada solicitud. Guárdela como secreto, por ejemplo, en una variable de entorno o en un gestor de contraseñas; nunca en el código fuente, un repositorio o los registros.

Los siguientes ejemplos suponen que estas variables están definidas:

export API="https://admin.example.org"
export AUTH="A1B2C3D4:su-contrasena"

Los ejemplos utilizan curl porque no depende de un lenguaje de programación. La interfaz utiliza HTTP, por lo que puede llamarse desde cualquier lenguaje o herramienta compatible con Basic Auth, como Python, JavaScript, PHP, Postman o Make.

Proceso: de un archivo a una campaña en reproducción

  1. Obtener el identificador de la empresa. Lo utilizará en todas las llamadas posteriores.
  2. Cargar un archivo multimedia. La respuesta devuelve su identificador.
  3. Cargar una plantilla de campaña. El servidor la rellena con los ajustes de la empresa y la lista de ubicaciones y dispositivos.
  4. Editar la plantilla : nombre, periodo, dispositivos de destino y creatividad.
  5. Crear la campaña. Se crea como borrador y todavía no se reproduce.
  6. Activar la campaña. El sistema prepara un nuevo plan de reproducción y lo envía a los dispositivos.
  7. Supervisar los resultados en el informe de campaña.

1. Identificador de la empresa

curl -u "$AUTH" "$API/api/public/login"

Respuesta abreviada:

{
  "id": 1715714421868,
  "name": "Integración – tienda en línea",
  "login": "A1B2C3D4",
  "company": { "id": 1698234512001, "name": "Agencia publicitaria S. L." },
  "permission": {
    "resource": 12,
    "device_layer_top": 12,
    "report_layer_top": 4
  }
}

Guarde el valor de company.id; los ejemplos lo utilizan como variable COMPANY. La sección permission enumera los permisos del usuario; su significado se describe en Permisos.

2. Carga de un archivo multimedia

El archivo se envía como cuerpo binario de la solicitud mediante PUT; sus propiedades se indican en las cabeceras.

curl -u "$AUTH" -X PUT \
  "$API/api/resource/single/$COMPANY" \
  -H "file-type: IMAGE" \
  -H "file-mime: image/jpeg" \
  -H "file-name: oferta-verano.jpg" \
  -H "file-suffix: jpg" \
  --data-binary @oferta-verano.jpg
CabeceraContenido
file-typeTipo de contenido multimedia según la tabla Tipos de contenido multimedia, por ejemplo IMAGE.
file-mimeTipo MIME del archivo, por ejemplo image/jpeg, video/mp4 o application/pdf.
file-nameNombre del archivo mostrado en la administración; el servidor elimina la extensión. Codifique para URL los nombres con caracteres no ASCII (encodeURIComponent).
file-suffixExtensión del archivo sin el punto.

La misma llamada en Python:

import requests

with open("oferta-verano.jpg", "rb") as f:
    r = requests.put(
        f"{API}/api/resource/single/{COMPANY}",
        auth=("A1B2C3D4", "su-contrasena"),
        headers={
            "file-type": "IMAGE",
            "file-mime": "image/jpeg",
            "file-name": "oferta-verano.jpg",
            "file-suffix": "jpg",
        },
        data=f,
    )
r.raise_for_status()
resource_id = r.json()["id"]

La respuesta contiene el identificador del archivo (id) y su tipo (type); utilizará ambos valores en la creatividad de la campaña.

{
  "id": 1724832015443,
  "type": 2,
  "name": "oferta-verano",
  "width": 1920,
  "height": 1080,
  "duration": 0,
  "aspectRatio": 32
}
  • Tamaño: archivos normales hasta aproximadamente 1,1 GB y vídeo con transparencia hasta aproximadamente 2,1 GB. El servidor rechaza los archivos mayores con 413.
  • Preparación del vídeo: el vídeo se convierte en segundo plano tras la carga. Está listo cuando los detalles del archivo (GET /api/resource/single/{companyId}/{id}) contienen un valor en dt_ready. Las imágenes se preparan prácticamente al instante.
  • Cabecera ausente: sin file-mime, file-name o file-suffix el servidor devuelve 204 y no crea el archivo multimedia. Compruebe siempre que la respuesta contiene id antes de continuar.

3. Plantilla de campaña

No construya la campaña a mano. Solicite una plantilla que el servidor rellena con un periodo predeterminado de un mes desde hoy, los ajustes de la empresa y todas las ubicaciones y dispositivos. Cada dispositivo aparece marcado como isActive: false.

curl -u "$AUTH" "$API/api/campaign/company/$COMPANY" > campaign.json

Ejemplo de plantilla abreviado:

{
  "id": -1,
  "groupId": -1,
  "state": 2,
  "name": "",
  "start": "2026-11-01T10:00:00",
  "end": "2026-12-01T10:00:00",
  "isCommercial": true,
  "isNonCommercial": false,
  "settings": {
    "type": 2,
    "companyCount": 10,
    "companyDuration": 10000,
    "campaignCount": 1,
    "campaignDuration": 10000
  },
  "locations": [
    {
      "id": 1698234512100,
      "name": "Centro comercial del centro",
      "days": [ { "day": 1, "start": "09:00", "end": "21:00" } ],
      "devices": [
        {
          "id": 1698234512201,
          "name": "Entrada A",
          "screenRatio": 32,
          "isHorizontal": true,
          "isActive": false
        }
      ]
    }
  ],
  "visuals": []
}

El valor de settings.type determina el modo de reproducción de la empresa: 2 = SLOT, 4 = IMPRESSION. El proveedor establece el modo y no puede modificarse mediante la API.

4. Edición de la plantilla

  • name: nombre de la campaña mostrado en la administración y los informes.
  • start, end: inicio y fin de la campaña.
  • isActive: establecer en true para los dispositivos en los que deba reproducirse la campaña.
  • visuals: añadir una creatividad con el archivo cargado.
"visuals": [
  {
    "id": 1,
    "name": "Creatividad principal",
    "isPrimary": true,
    "isCustom": true,
    "res": [
      {
        "id": 1,
        "conditionId": 0,
        "resourceId": 1724832015443,
        "name": "oferta-verano",
        "duration": 10000,
        "type": 2
      }
    ]
  }
]
CampoSignificado
idCualquier número único dentro de la campaña; el servidor lo renumera al crearla.
isPrimarytrue para la creatividad principal, false para los demás.
isCustomtrue : la creatividad pertenece a esta campaña.
resourceIdIdentificador del archivo del paso 2.
durationDuración de visualización en milisegundos.
typeTipo de contenido multimedia; el mismo valor devuelto por la carga en type.

La plantilla puede editarse mediante un script, por ejemplo, con jq:

jq --argjson res "$RESOURCE" '
  .name = "Oferta de verano 2026"
  | .start = "2026-11-02T00:00:00"
  | .end   = "2026-11-09T00:00:00"
  | .locations[].devices[].isActive = true
  | .visuals = [{
      id: 1, name: "Creatividad principal", isPrimary: true, isCustom: true,
      res: [{ id: 1, conditionId: 0, resourceId: $res,
              name: "oferta-verano", duration: 10000, type: 2 }]
    }]
' campaign.json > campaign-edited.json

Si la campaña se dirige a pantallas horizontales y verticales (isHorizontal), añada una creatividad para cada orientación. De lo contrario, el contenido se recortará o reducirá en algunas pantallas. Consulte Creatividades de las campañas para obtener más información.

5. Creación de la campaña

curl -u "$AUTH" -X POST \
  "$API/api/campaign/company/$COMPANY" \
  -H "Content-Type: application/json" \
  --data @campaign-edited.json \
  -o response.json

export CAMPAIGN=$(jq -r '.id' response.json)
export GROUP=$(jq -r '.groupId' response.json)

La campaña se crea como borrador y no se reproduce en ningún dispositivo. La respuesta contiene la campaña guardada con los valores asignados de id y groupId. La plantilla ya contiene state: 2 (borrador); el servidor rechaza cualquier otro valor con 409.

6. Activación de la campaña

curl -u "$AUTH" -X PATCH \
  "$API/api/campaign/company/$COMPANY/$CAMPAIGN/+01:00/0"
  • +01:00: zona horaria que sigue la campaña, como desplazamiento respecto a UTC. Para Europa Central, utilice +01:00 en invierno y +02:00 durante el horario de verano.
  • 0: número de impresiones esperado para toda la campaña. Se aplica en modo IMPRESSION; en modo SLOT, utilice 0.

Una campaña cuyo inicio sea hoy o anterior pasa a estar activa y su inicio se fija en el momento de la activación. Una campaña con inicio futuro pasa a estar publicada y empieza el día previsto.

El sistema recalcula el plan de reproducción y lo envía a los dispositivos afectados. En los conectados suele tardar unas decenas de segundos; un dispositivo desconectado lo recibe al recuperar la conexión. Compruebe la capacidad en la administración; consulte Capacidad de las campañas.

7. Resultados de la campaña

curl -u "$AUTH" "$API/api/report/$COMPANY/campaign/$GROUP"
curl -u "$AUTH" "$API/api/report/$COMPANY/campaign/$GROUP/impression"

Los informes utilizan groupId, no el identificador de campaña id. El primer punto de acceso devuelve el resumen de la campaña; el segundo, las cifras de impresiones registradas. Los dispositivos envían registros continuamente por lotes, por lo que las cifras no están disponibles en tiempo real. Consulte Informe de campaña para conocer el significado de las cifras.

Pausar, detener y eliminar

# Pausar una campaña activa; otra llamada la reanuda
curl -u "$AUTH" -X PATCH \
  "$API/api/campaign/company/$COMPANY/$CAMPAIGN/+01:00/0"

# Detener de forma permanente
curl -u "$AUTH" -X PATCH \
  "$API/api/campaign/company/$COMPANY/$CAMPAIGN/+01:00"

# Eliminar
curl -u "$AUTH" -X DELETE \
  "$API/api/campaign/company/$COMPANY/$CAMPAIGN"

El punto de acceso del paso 6 actúa como un conmutador: pausa una campaña activa o publicada y reanuda una pausada. Compruebe el estado actual (state en los detalles) antes de llamarlo. Una campaña detenida no puede volver a iniciarse, pero permanece en la lista con sus informes. Una campaña eliminada desaparece de la lista.

Resumen de puntos de acceso

Las rutas son relativas a la dirección de administración. {c} representa el identificador de la empresa.

Cuenta

MétodoRutaFinalidad
GET/api/public/loginVerifica las credenciales y devuelve el perfil del usuario, incluido company.id.
GET/api/user/infoInformación sobre el usuario que ha iniciado sesión.
GET/api/user/checkComprobación rápida de la validez de las credenciales.

Multimedia

MétodoRutaFinalidad
PUT/api/resource/single/{c}Carga un archivo (file-* cabeceras; cuerpo = datos binarios).
GET/api/resource/listing/{c}/1Lista de contenido multimedia; 1 = sin restricción de tipo.
GET/api/resource/single/{c}/{id}Detalles del archivo multimedia.
DELETE/api/resource/single/{c}/{id}Elimina un archivo multimedia.

Campañas

MétodoRutaFinalidad
GET/api/campaign/company/{c}Plantilla de una campaña nueva.
POST/api/campaign/company/{c}Crea una campaña como borrador.
PATCH/api/campaign/company/{c}Guarda los cambios de una campaña existente.
POST/api/campaign/listing/company/{c}Lista de campañas; el cuerpo de la solicitud contiene un filtro.
GET/api/campaign/company/{c}/{id}Detalles de la campaña.
GET/api/campaign/company/{c}/group/{groupId}Detalles de la campaña por groupId.
PATCH/api/campaign/company/{c}/{id}/{tz}/{impressions}Activa, pausa o reanuda una campaña.
PATCH/api/campaign/company/{c}/{id}/{tz}Detiene una campaña de forma permanente.
DELETE/api/campaign/company/{c}/{id}Elimina una campaña.

Ubicaciones y dispositivos

MétodoRutaFinalidad
GET/api/location/listing/{c}Lista de ubicaciones.
GET/api/location/single/{id}Detalles de la ubicación, incluido el horario de apertura.
GET/api/device/listing/{c}/{locationId}Lista de dispositivos de una ubicación.
GET/api/device/single/{id}/{lang}Detalles del dispositivo; lang es un código de idioma, por ejemplo en.

Informes

MétodoRutaFinalidad
GET/api/report/{c}/campaign/{groupId}Resumen de la campaña.
GET/api/report/{c}/campaign/{groupId}/impressionCifras de impresiones registradas.

Listas de valores

Los valores de las listas se escriben como números en JSON.

Estado de la campaña (state)

ValorEstadoSignificado
2BorradorCampaña guardada que no se reproduce.
4PublicadaCampaña activada a la espera de su día de inicio.
8ActivasLa campaña se está reproduciendo.
16FinalizadaHa pasado la fecha de fin de la campaña.
32DetenidaLa campaña se ha detenido de forma permanente.
64EliminadaLa campaña se ha eliminado.
128PausadaLa reproducción está interrumpida temporalmente.

Tipos de contenido multimedia

type valorfile-type cabeceraMultimedia
2IMAGEImagen (JPG, PNG, WebP)
4VIDEOVídeo
8PDFDocumento PDF
16WWW_APPAplicación web
32TEXTTexto largo
128VIDEO_ALPHAVídeo con fondo transparente
256AUDIOAudio

Para los documentos, la cabecera file-type utiliza el valor PDF, no DOCUMENT.

Permisos

La interfaz aplica los mismos permisos que la administración y los comprueba en cada solicitud. En la respuesta de inicio de sesión, cada área se expresa mediante un número que es la suma de los derechos individuales:

ValorDerecho dentro de su empresa
4Ver
8Añadir
16Editar
32Eliminar

Por ejemplo, resource: 28 (4 + 8 + 16) significa que el usuario puede ver, añadir y editar contenido multimedia, pero no eliminarlo. Los valores superiores (128 en 1024) representan los mismos derechos fuera de la empresa del usuario; una integración no los necesita.

ÁreaMínimo para el proceso descrito
resource : contenido multimedia12 (ver, añadir)
device_layer_top : campañas12 (ver, añadir)
report_layer_top : informes de campaña4 (ver)
location : ubicaciones4 (ver)
device_info : dispositivos4 (ver)

Activar, pausar y detener una campaña requiere el derecho Añadir. Eliminar una campaña activada o un archivo requiere Eliminar; un borrador puede eliminarse sin ese derecho. Un buen punto de partida es el rol Gestor de publicidad de la empresa, eliminando los derechos innecesarios.

Códigos de error

CódigoSignificadoQué hacer
400Solicitud incorrectaCompruebe los identificadores de la ruta, la zona horaria y los datos obligatorios.
401Permiso ausenteEl usuario no tiene el derecho necesario o acceso a la empresa. En las campañas suele faltar el derecho Añadir.
404No encontradoEl registro no existe o no pertenece a la empresa indicada.
406No aceptableCredenciales no válidas o estado de campaña que no permite la transición solicitada, por ejemplo, detenida.
409Conflicto de estadoLa campaña que se está creando no es un borrador.
413Archivo demasiado grandeReduzca el tamaño del archivo; consulte los límites en el paso 2.
500Error del servidorInténtelo más tarde; si el error persiste, contacte con su proveedor.
Recomendaciones de implementación

Pruebe primero la integración en un entorno de pruebas o en un dispositivo no visible al público: una campaña activada se reproduce realmente en los dispositivos de producción. No se reproduce contenido fuera del horario de apertura, aunque la campaña esté programada las 24 horas.

Guarde los identificadores de archivos y campañas (id, groupId) en su sistema; la interfaz no permite buscar campañas por nombre. Cargue los archivos de uno en uno y no solicite informes más de una vez cada pocos minutos. Utilice únicamente los puntos de acceso de esta guía.

Ejemplo completo

El script realiza todo el proceso, desde la carga de una imagen hasta la activación de una campaña en todos los dispositivos de la empresa. Requiere curl y jq.

#!/usr/bin/env bash
set -euo pipefail

API="https://admin.example.org"
AUTH="${INTEGRATION_AUTH:?defina INTEGRATION_AUTH=usuario:contrasena}"
FILE="oferta-verano.jpg"
NAME="Oferta de verano 2026"
FROM="2026-11-02T00:00:00"
TO="2026-11-09T00:00:00"
TZ_OFFSET="+01:00"

# 1) Identificador de la empresa
COMPANY=$(curl -sf -u "$AUTH" "$API/api/public/login" | jq -r '.company.id')

# 2) Cargar el archivo multimedia
RESOURCE=$(curl -sf -u "$AUTH" -X PUT \
  "$API/api/resource/single/$COMPANY" \
  -H "file-type: IMAGE" \
  -H "file-mime: image/jpeg" \
  -H "file-name: $FILE" \
  -H "file-suffix: jpg" \
  --data-binary "@$FILE" | jq -r '.id')

# 3) Plantilla de campaña
curl -sf -u "$AUTH" "$API/api/campaign/company/$COMPANY" > template.json

# 4) Editar la plantilla
jq --argjson res "$RESOURCE" --arg n "$NAME" --arg from "$FROM" --arg to "$TO" '
  .name = $n
  | .start = $from
  | .end = $to
  | .locations[].devices[].isActive = true
  | .visuals = [{
      id: 1, name: "Creatividad principal", isPrimary: true, isCustom: true,
      res: [{ id: 1, conditionId: 0, resourceId: $res,
              name: $n, duration: 10000, type: 2 }]
    }]
' template.json > campaign.json

# 5) Crear un borrador
RESPONSE=$(curl -sf -u "$AUTH" -X POST \
  "$API/api/campaign/company/$COMPANY" \
  -H "Content-Type: application/json" \
  --data @campaign.json)
CAMPAIGN=$(echo "$RESPONSE" | jq -r '.id')
GROUP=$(echo "$RESPONSE" | jq -r '.groupId')

# 6) Activar
curl -sf -u "$AUTH" -X PATCH \
  "$API/api/campaign/company/$COMPANY/$CAMPAIGN/$TZ_OFFSET/0" > /dev/null

echo "Campaña $CAMPAIGN activada, informe: $API/api/report/$COMPANY/campaign/$GROUP"
¿No ha encontrado lo que buscaba?
Póngase en contacto con su proveedor de software.