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.
| Necesita | Método recomendado |
|---|---|
| Cargar unos pocos archivos multimedia y activar una campaña | Administración |
| Actualizar contenido con regularidad, pero manualmente | Administración |
| Cargar archivos multimedia en bloque desde su propio sistema | API |
| Crear campañas automáticamente desde su propio planificador | API |
| Incorporar los resultados de las campañas a sus propios informes | API |
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 porhttps://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/loginLa 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
- Obtener el identificador de la empresa. Lo utilizará en todas las llamadas posteriores.
- Cargar un archivo multimedia. La respuesta devuelve su identificador.
- Cargar una plantilla de campaña. El servidor la rellena con los ajustes de la empresa y la lista de ubicaciones y dispositivos.
- Editar la plantilla : nombre, periodo, dispositivos de destino y creatividad.
- Crear la campaña. Se crea como borrador y todavía no se reproduce.
- Activar la campaña. El sistema prepara un nuevo plan de reproducción y lo envía a los dispositivos.
- 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| Cabecera | Contenido |
|---|---|
file-type | Tipo de contenido multimedia según la tabla Tipos de contenido multimedia, por ejemplo IMAGE. |
file-mime | Tipo MIME del archivo, por ejemplo image/jpeg, video/mp4 o application/pdf. |
file-name | Nombre del archivo mostrado en la administración; el servidor elimina la extensión. Codifique para URL los nombres con caracteres no ASCII (encodeURIComponent). |
file-suffix | Extensió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 endt_ready. Las imágenes se preparan prácticamente al instante. - Cabecera ausente: sin
file-mime,file-nameofile-suffixel servidor devuelve204y no crea el archivo multimedia. Compruebe siempre que la respuesta contieneidantes 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.jsonEjemplo 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 entruepara 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
}
]
}
]| Campo | Significado |
|---|---|
id | Cualquier número único dentro de la campaña; el servidor lo renumera al crearla. |
isPrimary | true para la creatividad principal, false para los demás. |
isCustom | true : la creatividad pertenece a esta campaña. |
resourceId | Identificador del archivo del paso 2. |
duration | Duración de visualización en milisegundos. |
type | Tipo 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.jsonSi 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:00en invierno y+02:00durante el horario de verano.0: número de impresiones esperado para toda la campaña. Se aplica en modo IMPRESSION; en modo SLOT, utilice0.
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étodo | Ruta | Finalidad |
|---|---|---|
GET | /api/public/login | Verifica las credenciales y devuelve el perfil del usuario, incluido company.id. |
GET | /api/user/info | Información sobre el usuario que ha iniciado sesión. |
GET | /api/user/check | Comprobación rápida de la validez de las credenciales. |
Multimedia
| Método | Ruta | Finalidad |
|---|---|---|
PUT | /api/resource/single/{c} | Carga un archivo (file-* cabeceras; cuerpo = datos binarios). |
GET | /api/resource/listing/{c}/1 | Lista 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étodo | Ruta | Finalidad |
|---|---|---|
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étodo | Ruta | Finalidad |
|---|---|---|
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étodo | Ruta | Finalidad |
|---|---|---|
GET | /api/report/{c}/campaign/{groupId} | Resumen de la campaña. |
GET | /api/report/{c}/campaign/{groupId}/impression | Cifras de impresiones registradas. |
Listas de valores
Los valores de las listas se escriben como números en JSON.
Estado de la campaña (state)
| Valor | Estado | Significado |
|---|---|---|
2 | Borrador | Campaña guardada que no se reproduce. |
4 | Publicada | Campaña activada a la espera de su día de inicio. |
8 | Activas | La campaña se está reproduciendo. |
16 | Finalizada | Ha pasado la fecha de fin de la campaña. |
32 | Detenida | La campaña se ha detenido de forma permanente. |
64 | Eliminada | La campaña se ha eliminado. |
128 | Pausada | La reproducción está interrumpida temporalmente. |
Tipos de contenido multimedia
type valor | file-type cabecera | Multimedia |
|---|---|---|
2 | IMAGE | Imagen (JPG, PNG, WebP) |
4 | VIDEO | Vídeo |
8 | PDF | Documento PDF |
16 | WWW_APP | Aplicación web |
32 | TEXT | Texto largo |
128 | VIDEO_ALPHA | Vídeo con fondo transparente |
256 | AUDIO | Audio |
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:
| Valor | Derecho dentro de su empresa |
|---|---|
4 | Ver |
8 | Añadir |
16 | Editar |
32 | Eliminar |
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.
| Área | Mínimo para el proceso descrito |
|---|---|
resource : contenido multimedia | 12 (ver, añadir) |
device_layer_top : campañas | 12 (ver, añadir) |
report_layer_top : informes de campaña | 4 (ver) |
location : ubicaciones | 4 (ver) |
device_info : dispositivos | 4 (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ódigo | Significado | Qué hacer |
|---|---|---|
400 | Solicitud incorrecta | Compruebe los identificadores de la ruta, la zona horaria y los datos obligatorios. |
401 | Permiso ausente | El usuario no tiene el derecho necesario o acceso a la empresa. En las campañas suele faltar el derecho Añadir. |
404 | No encontrado | El registro no existe o no pertenece a la empresa indicada. |
406 | No aceptable | Credenciales no válidas o estado de campaña que no permite la transición solicitada, por ejemplo, detenida. |
409 | Conflicto de estado | La campaña que se está creando no es un borrador. |
413 | Archivo demasiado grande | Reduzca el tamaño del archivo; consulte los límites en el paso 2. |
500 | Error del servidor | Inténtelo más tarde; si el error persiste, contacte con su proveedor. |
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"Temas relacionados y siguientes pasos
← Volver al resumen: integraciones y creación de contenido
Póngase en contacto con su proveedor de software.
