API para ligar o seu sistema
Introdução e orientação
Gira conteúdos multimédia, campanhas e relatórios diretamente a partir do seu próprio sistema, sem iniciar sessão na administração.
Para que serve a API
A API liga o sistema do cliente, por exemplo, uma loja online, um planeador de campanhas publicitárias ou um catálogo interno, diretamente à gestão de conteúdos dos dispositivos. O seu sistema pode carregar ficheiros multimédia, criar e iniciar campanhas e obter os respetivos resultados sem ser necessário executar estas operações manualmente na administração.
A interface é a mesma que é utilizada pela administração Web. Por isso, a API permite as mesmas operações, dentro das permissões do utilizador com sessão iniciada.
Quando utilizar a API
Para carregar ocasionalmente alguns ficheiros e iniciar uma campanha manualmente, a administração é a melhor opção: o assistente apresenta uma pré-visualização e verifica os formatos e a capacidade dos dispositivos. A API faz sentido quando o trabalho manual começa a atrasar o processo.
| Necessita de | Método recomendado |
|---|---|
| Carregar alguns ficheiros multimédia e iniciar uma campanha | Administração |
| Atualizar conteúdos regularmente, mas de forma manual | Administração |
| Carregar ficheiros multimédia em massa a partir do seu sistema | API |
| Criar campanhas automaticamente a partir do seu planeador | API |
| Integrar os resultados das campanhas nos seus relatórios | API |
A interface não tem versões e pode mudar com a evolução da plataforma. Informe o fornecedor do software antes de implementar uma integração e verifique o seu funcionamento após as atualizações do sistema.
A quem se destina este guia e responsabilidades
- O fornecedor da plataforma opera a interface, fornece o endereço da administração e define o modo de reprodução da empresa.
- O cliente decide o âmbito da integração e cria na sua empresa um utilizador dedicado com as permissões necessárias; consulte Criar um utilizador e efetuar o primeiro início de sessão.
- O programador da integração liga o sistema do cliente à interface. As instruções técnicas e os exemplos de código deste guia destinam-se a esse programador. Se desenvolver a integração por sua conta, assume também esta função.
Referência técnica
Guia técnico para programadores de integrações
Comece pelas convenções de chamada comuns e pelo início de sessão. Siga depois o processo desde o carregamento de um ficheiro até ao início de uma campanha e consulte os endpoints disponíveis.
Convenções comuns de chamada
- Endereço: a interface funciona no mesmo endereço da administração; todos os percursos começam por
/api/. Nos exemplos, o endereço é substituído porhttps://admin.example.org. Se existir um ambiente de testes, o fornecedor disponibilizará o respetivo endereço. - Início de sessão: cada pedido transmite as credenciais através de HTTP Basic Auth. Não são utilizadas sessões nem tokens.
- Formato dos dados: os corpos dos pedidos e as respostas são JSON. A exceção é o carregamento de ficheiros, em que o corpo contém os dados binários em bruto.
- Identificadores e valores: os identificadores são números inteiros. A data e a hora utilizam o formato
YYYY-MM-DDTHH:MM:SS; as durações de apresentação são expressas em milissegundos (10000= 10 s). - Resultado: o sucesso é confirmado pelo estado
200. Isto significa que o pedido foi aceite, não que o conteúdo já esteja a ser reproduzido nos dispositivos.
Início de sessão
O identificador de início de sessão não é um endereço de e-mail, mas um código de oito caracteres gerado quando o utilizador é criado, por exemplo A1B2C3D4. Crie um utilizador dedicado com as permissões mínimas necessárias para a integração; o acesso poderá ser revogado a qualquer momento sem afetar outros utilizadores.
curl -u "A1B2C3D4:your-password" https://admin.example.org/api/public/loginA palavra-passe é enviada em cada pedido. Guarde-a como um segredo, por exemplo, numa variável de ambiente ou num cofre de palavras-passe; nunca no código-fonte, num repositório ou nos registos.
Os exemplos seguintes pressupõem que estas variáveis estão definidas:
export API="https://admin.example.org"
export AUTH="A1B2C3D4:a-sua-palavra-passe"Os exemplos utilizam curl por não depender de uma linguagem de programação. A interface utiliza HTTP, pelo que pode ser chamada a partir de qualquer linguagem ou ferramenta que suporte Basic Auth, como Python, JavaScript, PHP, Postman ou Make.
Processo: de um ficheiro a uma campanha em reprodução
- Obter o identificador da empresa. Será utilizado em todas as chamadas seguintes.
- Carregar um ficheiro multimédia. A resposta devolve o respetivo identificador.
- Carregar um modelo de campanha. O servidor preenche-o com as definições da empresa e a lista de locais e dispositivos.
- Editar o modelo : nome, período, dispositivos de destino e visual.
- Criar a campanha. É criada como rascunho e ainda não é reproduzida.
- Ativar a campanha. O sistema prepara um novo plano de reprodução e envia-o para os dispositivos.
- Acompanhar os resultados no relatório da campanha.
1. Identificador da empresa
curl -u "$AUTH" "$API/api/public/login"Resposta abreviada:
{
"id": 1715714421868,
"name": "Integração – loja online",
"login": "A1B2C3D4",
"company": { "id": 1698234512001, "name": "Agência publicitária Lda." },
"permission": {
"resource": 12,
"device_layer_top": 12,
"report_layer_top": 4
}
}Guarde o valor de company.id; os exemplos utilizam-no na variável COMPANY. A secção permission lista as permissões do utilizador; o respetivo significado é descrito em Permissões.
2. Carregamento de um ficheiro multimédia
O ficheiro é enviado como corpo binário do pedido através de PUT; as suas propriedades são indicadas nos cabeçalhos.
curl -u "$AUTH" -X PUT \
"$API/api/resource/single/$COMPANY" \
-H "file-type: IMAGE" \
-H "file-mime: image/jpeg" \
-H "file-name: promocao-verao.jpg" \
-H "file-suffix: jpg" \
--data-binary @promocao-verao.jpg| Cabeçalho | Conteúdo |
|---|---|
file-type | Tipo de multimédia de acordo com a tabela Tipos de multimédia, por exemplo IMAGE. |
file-mime | Tipo MIME do ficheiro, por exemplo image/jpeg, video/mp4 ou application/pdf. |
file-name | Nome do ficheiro apresentado na administração; o servidor remove a extensão. Codifique para URL os nomes com caracteres não ASCII (encodeURIComponent). |
file-suffix | Extensão do ficheiro sem o ponto. |
A mesma chamada em Python:
import requests
with open("promocao-verao.jpg", "rb") as f:
r = requests.put(
f"{API}/api/resource/single/{COMPANY}",
auth=("A1B2C3D4", "a-sua-palavra-passe"),
headers={
"file-type": "IMAGE",
"file-mime": "image/jpeg",
"file-name": "promocao-verao.jpg",
"file-suffix": "jpg",
},
data=f,
)
r.raise_for_status()
resource_id = r.json()["id"]A resposta contém o identificador do ficheiro (id) e o respetivo tipo (type); estes dois valores serão utilizados no visual da campanha.
{
"id": 1724832015443,
"type": 2,
"name": "promocao-verao",
"width": 1920,
"height": 1080,
"duration": 0,
"aspectRatio": 32
}- Tamanho: ficheiros normais até cerca de 1,1 GB e vídeos com transparência até cerca de 2,1 GB. O servidor rejeita ficheiros maiores com
413. - Preparação do vídeo: o vídeo é convertido em segundo plano após o carregamento. Está pronto quando os detalhes do ficheiro (
GET /api/resource/single/{companyId}/{id}) contêm um valor emdt_ready. As imagens ficam prontas praticamente de imediato. - Cabeçalho em falta: sem
file-mime,file-nameoufile-suffixo servidor devolve204e não cria o ficheiro multimédia. Verifique sempre se a resposta contémidantes de continuar.
3. Modelo de campanha
Não construa a campanha manualmente. Peça um modelo que o servidor preenche com um período predefinido de um mês a partir de hoje, as definições da empresa e todos os locais e dispositivos. Cada dispositivo surge marcado como isActive: false.
curl -u "$AUTH" "$API/api/campaign/company/$COMPANY" > campaign.jsonExemplo de modelo 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 do centro",
"days": [ { "day": 1, "start": "09:00", "end": "21:00" } ],
"devices": [
{
"id": 1698234512201,
"name": "Entrada A",
"screenRatio": 32,
"isHorizontal": true,
"isActive": false
}
]
}
],
"visuals": []
}O valor de settings.type determina o modo de reprodução da empresa: 2 = SLOT, 4 = IMPRESSION. O fornecedor define o modo, que não pode ser alterado através da API.
4. Edição do modelo
name: nome da campanha apresentado na administração e nos relatórios.start,end: início e fim da campanha.isActive: definir comotruepara os dispositivos em que a campanha deve ser reproduzida.visuals: adicionar um visual com o ficheiro carregado.
"visuals": [
{
"id": 1,
"name": "Visual principal",
"isPrimary": true,
"isCustom": true,
"res": [
{
"id": 1,
"conditionId": 0,
"resourceId": 1724832015443,
"name": "promocao-verao",
"duration": 10000,
"type": 2
}
]
}
]| Campo | Significado |
|---|---|
id | Qualquer número único dentro da campanha; o servidor renumera-o na criação. |
isPrimary | true para o visual principal, false para os restantes. |
isCustom | true – o visual pertence a esta campanha. |
resourceId | Identificador do ficheiro do passo 2. |
duration | Duração de apresentação em milissegundos. |
type | Tipo de multimédia; o mesmo valor devolvido pelo carregamento em type. |
O modelo pode ser editado por um script, por exemplo, com jq:
jq --argjson res "$RESOURCE" '
.name = "Promoção de verão 2026"
| .start = "2026-11-02T00:00:00"
| .end = "2026-11-09T00:00:00"
| .locations[].devices[].isActive = true
| .visuals = [{
id: 1, name: "Visual principal", isPrimary: true, isCustom: true,
res: [{ id: 1, conditionId: 0, resourceId: $res,
name: "promocao-verao", duration: 10000, type: 2 }]
}]
' campaign.json > campaign-edited.jsonSe a campanha se destinar a ecrãs horizontais e verticais (isHorizontal), adicione um visual para cada orientação. Caso contrário, o conteúdo será cortado ou reduzido em alguns ecrãs. Consulte Visuais das campanhas para obter mais informações.
5. Criação da campanha
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)A campanha é criada como rascunho e não é reproduzida em nenhum dispositivo. A resposta contém a campanha guardada com os valores atribuídos de id e groupId. O modelo já contém state: 2 (rascunho); o servidor rejeita qualquer outro valor com 409.
6. Ativação da campanha
curl -u "$AUTH" -X PATCH \
"$API/api/campaign/company/$COMPANY/$CAMPAIGN/+01:00/0"+01:00: fuso horário da campanha como desvio em relação a UTC. Para a Europa Central, utilize+01:00no inverno e+02:00durante a hora de verão.0: número de impressões esperado para toda a campanha. Aplica-se no modo IMPRESSION; no modo SLOT, utilize0.
Uma campanha com início hoje ou anterior passa a ativa e o início é definido para o momento da ativação. Uma campanha com início futuro passa a publicada e começa no dia previsto.
O sistema recalcula o plano de reprodução e envia-o para os dispositivos afetados. Nos dispositivos ligados, isto demora normalmente algumas dezenas de segundos; um dispositivo desligado recebe o plano quando a ligação é restabelecida. Verifique a capacidade na administração; consulte Capacidade das campanhas.
7. Resultados da campanha
curl -u "$AUTH" "$API/api/report/$COMPANY/campaign/$GROUP"
curl -u "$AUTH" "$API/api/report/$COMPANY/campaign/$GROUP/impression"Os relatórios utilizam groupId, e não o identificador da campanha id. O primeiro endpoint devolve o resumo da campanha; o segundo, os números de impressões registadas. Os dispositivos enviam registos continuamente em lotes, pelo que os valores não estão disponíveis em tempo real. Consulte Relatório da campanha para conhecer o significado dos valores.
Pausar, parar e eliminar
# Pausar uma campanha ativa; uma nova chamada retoma-a
curl -u "$AUTH" -X PATCH \
"$API/api/campaign/company/$COMPANY/$CAMPAIGN/+01:00/0"
# Parar definitivamente
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"O endpoint do passo 6 funciona como um comutador: pausa uma campanha ativa ou publicada e retoma uma campanha pausada. Verifique o estado atual (state nos detalhes) antes da chamada. Uma campanha parada não pode voltar a ser iniciada, mas permanece na lista com os respetivos relatórios. Uma campanha eliminada desaparece da lista.
Resumo dos endpoints
Os percursos são relativos ao endereço da administração. {c} representa o identificador da empresa.
Conta
| Método | Percurso | Finalidade |
|---|---|---|
GET | /api/public/login | Verifica as credenciais e devolve o perfil do utilizador, incluindo company.id. |
GET | /api/user/info | Informações sobre o utilizador com sessão iniciada. |
GET | /api/user/check | Verificação rápida da validade das credenciais. |
Multimédia
| Método | Percurso | Finalidade |
|---|---|---|
PUT | /api/resource/single/{c} | Carrega um ficheiro (file-* cabeçalhos; corpo = dados binários). |
GET | /api/resource/listing/{c}/1 | Lista de multimédia; 1 = sem restrição de tipo. |
GET | /api/resource/single/{c}/{id} | Detalhes do ficheiro multimédia. |
DELETE | /api/resource/single/{c}/{id} | Elimina um ficheiro multimédia. |
Campanhas
| Método | Percurso | Finalidade |
|---|---|---|
GET | /api/campaign/company/{c} | Modelo de uma nova campanha. |
POST | /api/campaign/company/{c} | Cria uma campanha como rascunho. |
PATCH | /api/campaign/company/{c} | Guarda as alterações de uma campanha existente. |
POST | /api/campaign/listing/company/{c} | Lista de campanhas; o corpo do pedido contém um filtro. |
GET | /api/campaign/company/{c}/{id} | Detalhes da campanha. |
GET | /api/campaign/company/{c}/group/{groupId} | Detalhes da campanha por groupId. |
PATCH | /api/campaign/company/{c}/{id}/{tz}/{impressions} | Ativa, pausa ou retoma uma campanha. |
PATCH | /api/campaign/company/{c}/{id}/{tz} | Para uma campanha definitivamente. |
DELETE | /api/campaign/company/{c}/{id} | Elimina uma campanha. |
Locais e dispositivos
| Método | Percurso | Finalidade |
|---|---|---|
GET | /api/location/listing/{c} | Lista de locais. |
GET | /api/location/single/{id} | Detalhes do local, incluindo o horário de funcionamento. |
GET | /api/device/listing/{c}/{locationId} | Lista de dispositivos de um local. |
GET | /api/device/single/{id}/{lang} | Detalhes do dispositivo; lang é um código de idioma, por exemplo en. |
Relatórios
| Método | Percurso | Finalidade |
|---|---|---|
GET | /api/report/{c}/campaign/{groupId} | Resumo da campanha. |
GET | /api/report/{c}/campaign/{groupId}/impression | Números de impressões registadas. |
Listas de valores
Os valores das listas são escritos como números em JSON.
Estado da campanha (state)
| Valor | Estado | Significado |
|---|---|---|
2 | Rascunho | Campanha guardada que não é reproduzida. |
4 | Publicada | Campanha ativada à espera do dia de início. |
8 | Ativas | A campanha está em reprodução. |
16 | Concluída | A data de fim da campanha já passou. |
32 | Parada | A campanha foi parada definitivamente. |
64 | Eliminada | A campanha foi eliminada. |
128 | Pausada | A reprodução está temporariamente interrompida. |
Tipos de multimédia
type valor | file-type cabeçalho | Multimédia |
|---|---|---|
2 | IMAGE | Imagem (JPG, PNG, WebP) |
4 | VIDEO | Vídeo |
8 | PDF | Documento PDF |
16 | WWW_APP | Aplicação Web |
32 | TEXT | Texto longo |
128 | VIDEO_ALPHA | Vídeo com fundo transparente |
256 | AUDIO | Áudio |
Para os documentos, o cabeçalho file-type utiliza o valor PDF, não DOCUMENT.
Permissões
A interface aplica as mesmas permissões que a administração e verifica-as em cada pedido. Na resposta de início de sessão, cada área é expressa por um número igual à soma dos direitos individuais:
| Valor | Direito na própria empresa |
|---|---|
4 | Ver |
8 | Adicionar |
16 | Editar |
32 | Eliminar |
Por exemplo, resource: 28 (4 + 8 + 16) significa que o utilizador pode ver, adicionar e editar conteúdos multimédia, mas não eliminá-los. Os valores superiores (128 como 1024) representam os mesmos direitos fora da empresa do utilizador; uma integração não necessita deles.
| Área | Mínimo para o processo descrito |
|---|---|
resource – multimédia | 12 (ver, adicionar) |
device_layer_top – campanhas | 12 (ver, adicionar) |
report_layer_top – relatórios de campanha | 4 (ver) |
location – locais | 4 (ver) |
device_info – dispositivos | 4 (ver) |
Ativar, pausar e parar uma campanha exige o direito Adicionar. Eliminar uma campanha ativada ou um ficheiro exige o direito Eliminar; um rascunho pode ser eliminado sem esse direito. Um bom ponto de partida é a função Gestor de publicidade da empresa, removendo os direitos desnecessários.
Códigos de erro
| Código | Significado | O que fazer |
|---|---|---|
400 | Pedido inválido | Verifique os identificadores no percurso, o fuso horário e os dados obrigatórios. |
401 | Permissão em falta | O utilizador não tem o direito necessário ou acesso à empresa. Nas campanhas, falta mais frequentemente o direito Adicionar. |
404 | Não encontrado | O registo não existe ou não pertence à empresa indicada. |
406 | Não aceitável | Credenciais inválidas ou estado da campanha que não permite a transição pedida, por exemplo, parada. |
409 | Conflito de estado | A campanha que está a ser criada não é um rascunho. |
413 | Ficheiro demasiado grande | Reduza o tamanho do ficheiro; consulte os limites no passo 2. |
500 | Erro do servidor | Tente novamente mais tarde; se o erro persistir, contacte o fornecedor. |
Teste primeiro a integração num ambiente de testes ou num dispositivo não visível ao público: uma campanha ativada é efetivamente reproduzida nos dispositivos de produção. Não são reproduzidos conteúdos fora do horário de funcionamento, mesmo numa campanha agendada para as 24 horas.
Guarde os identificadores de ficheiros e campanhas (id, groupId) no seu sistema; a interface não permite pesquisar campanhas pelo nome. Carregue os ficheiros um de cada vez e não peça relatórios mais do que uma vez a cada poucos minutos. Utilize apenas os endpoints deste guia.
Exemplo completo
O script executa todo o processo, desde o carregamento de uma imagem até à ativação de uma campanha em todos os dispositivos da empresa. Requer curl e jq.
#!/usr/bin/env bash
set -euo pipefail
API="https://admin.example.org"
AUTH="${INTEGRATION_AUTH:?defina INTEGRATION_AUTH=utilizador:palavra-passe}"
FILE="promocao-verao.jpg"
NAME="Promoção de verão 2026"
FROM="2026-11-02T00:00:00"
TO="2026-11-09T00:00:00"
TZ_OFFSET="+01:00"
# 1) Identificador da empresa
COMPANY=$(curl -sf -u "$AUTH" "$API/api/public/login" | jq -r '.company.id')
# 2) Carregar o ficheiro multimédia
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) Modelo de campanha
curl -sf -u "$AUTH" "$API/api/campaign/company/$COMPANY" > template.json
# 4) Editar o modelo
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: "Visual principal", isPrimary: true, isCustom: true,
res: [{ id: 1, conditionId: 0, resourceId: $res,
name: $n, duration: 10000, type: 2 }]
}]
' template.json > campaign.json
# 5) Criar um rascunho
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) Ativar
curl -sf -u "$AUTH" -X PATCH \
"$API/api/campaign/company/$COMPANY/$CAMPAIGN/$TZ_OFFSET/0" > /dev/null
echo "Campanha $CAMPAIGN ativada, relatório: $API/api/report/$COMPANY/campaign/$GROUP"Temas relacionados e passos seguintes
← Voltar à visão geral – Integrações e criação de conteúdos
Contacte o seu fornecedor de software.
