GlobalIA API

API de gestão de sinalização digital da Global IA: devices (painéis/totens), lojas, campanhas, conteúdos, formulários e estatísticas de audiência — tudo em um único ponto de acesso REST.

https://api.globalia.com.br/v1
Formato JSON
Autenticação X-API-Key
Rate limit 100 req/min
TLS 1.2+

Autenticação

Toda requisição (exceto GET /health) exige o header X-API-Key com a chave fornecida pela equipe Global IA. A chave identifica a sua conta — cada cliente enxerga apenas os próprios dados.

curl -X POST https://api.globalia.com.br/v1/devices/list \
  -H "X-API-Key: GIA-XXXX-XXXX-XXXX-XXXX" \
  -H "Content-Type: application/json" \
  -d '{}'
Guarde a chave com segurança. Ela é exibida uma única vez na emissão e não pode ser recuperada — apenas substituída. Não a exponha em código-fonte público, URLs ou logs. Em caso de vazamento, solicite a rotação imediata à equipe Global IA.

Sem chave ou com chave inválida, a API responde 401:

{ "msg": "Invalid API key", "code": 5000, "key": "InvalidKey" }

Convenções & paginação

A API segue o padrão search-with-body: todas as consultas de listagem usam POST com filtros no corpo JSON (um corpo vazio {} é válido e retorna tudo). Criação usa POST, atualização PUT e remoção DELETE — sempre com corpo JSON.

Paginação

Todos os endpoints de listagem aceitam limit (padrão 100) e offset (padrão 0) no corpo, e devolvem o envelope:

{
  "pagination": { "total": 171, "limit": 100, "offset": 0 },
  "data": [ /* itens */ ]
}

Para percorrer tudo: repita a chamada somando limit ao offset até offset ≥ pagination.total.

Operações em lote

Criação e atualização recebem uma lista de objetos em data — é possível criar/atualizar vários registros numa única chamada. Remoção recebe uma lista de IDs.

Erros

Erros retornam sempre o mesmo formato:

{
  "msg":  "descrição legível do erro",
  "code": 2011,
  "key":  "InvalidJSON",
  "data": /* detalhes opcionais (ex.: campos inválidos) */
}
HTTPkeyQuando ocorre
400InvalidJSONCorpo malformado ou campo com tipo errado
401InvalidKeyHeader X-API-Key ausente ou inválido
422variaRegra de negócio violada (nome duplicado, referência inexistente…)
429RateLimitExceededMais de 100 requisições por minuto
500variaErro interno — tente novamente; persistindo, contate o suporte

Atualização dos dados

Os recursos de cadastro (cache 60s) — devices, pastas, tags, venues, profiles, campanhas e conteúdos — são servidos de uma réplica local sincronizada a cada 60 segundos, garantindo respostas rápidas e alta disponibilidade. Na pior hipótese, uma leitura reflete o estado de até 1 minuto atrás.

Escritas (write-through) têm efeito imediato: a mudança é aplicada na plataforma e refletida na leitura seguinte, sem esperar o ciclo de sincronização.

Formulários e estatísticas (tempo real) são consultados ao vivo a cada chamada — sempre atuais, com latência um pouco maior.

POST/v1/devices/listDevices

Lista os devices (painéis, totens, players) da sua conta. cache 60s

Corpo (todos opcionais)

CampoTipoDescrição
idint[]Filtra por IDs específicos
namestringBusca parcial por nome (case-insensitive)
parent_idsint[]Filtra por pastas (lojas) — ver /device-folders/list
recursiveboolCom parent_ids: inclui subpastas (padrão true)
limit / offsetintPaginação (padrão 100 / 0)

Exemplo

curl -X POST https://api.globalia.com.br/v1/devices/list \
  -H "X-API-Key: $GIA_KEY" -H "Content-Type: application/json" \
  -d '{ "parent_ids": [1077], "limit": 10 }'
{
  "pagination": { "total": 12, "limit": 10, "offset": 0 },
  "data": [{
    "id": 15267,
    "parent_id": 1077,
    "name": "LJ 144 ARICANDUVA - Painel Entrada 1",
    "address": { "venue_id": 2242, "floor": null, "room": null, "description": null },
    "activation_state": true,
    "connection_state": "online",        // online | offline
    "player_status": "playback",          // playback | empty | pause | problem
    "last_online": "2026-07-15T12:26:26Z",
    "player_version": "6.31.65",
    "time_zone": "-03:00",
    "tags": [3913],
    "profile": null,
    "created_at": "2025-09-11T04:57:30Z",
    "updated_at": "2026-07-13T11:01:17Z"
  }]
}
POST/v1/devicesDevices

Cria um ou mais devices. write-through

Corpo

CampoTipoDescrição
data[].name obrigatóriostringNome do device (único)
data[].parent_id opcionalintID da pasta (loja) onde criar
data[].tags opcionalstring[]Nomes de tags (criadas se não existirem)
data[].address opcionalobject{ venue_id, floor, room, description }

Exemplo

curl -X POST https://api.globalia.com.br/v1/devices \
  -H "X-API-Key: $GIA_KEY" -H "Content-Type: application/json" \
  -d '{ "data": [{ "name": "LJ 200 - Painel Entrada", "parent_id": 1077, "tags": ["entrada"] }] }'
{ "data": [{ "id": 18001, "name": "LJ 200 - Painel Entrada", "parent_id": 1077 }] }
PUT/v1/devicesDevices

Atualiza um ou mais devices. Só envie os campos que quer alterar — exceto tags e address, que quando enviados substituem por completo o valor anterior. write-through

Corpo

CampoTipoDescrição
data[].id obrigatóriointID do device
data[].name opcionalstringNovo nome
data[].parent_id opcionalintMove para outra pasta
data[].tags opcionalstring[]Substitui todas as tags ([] remove todas)
data[].address opcionalobjectSubstitui o endereço ({} limpa; venue_id: null desvincula o local)
curl -X PUT https://api.globalia.com.br/v1/devices \
  -H "X-API-Key: $GIA_KEY" -H "Content-Type: application/json" \
  -d '{ "data": [{ "id": 18001, "name": "LJ 200 - Painel Entrada 1" }] }'

Resposta de sucesso: 200 com corpo vazio {}.

DELETE/v1/devicesDevices

Remove devices pelos IDs. Ação irreversível. write-through

curl -X DELETE https://api.globalia.com.br/v1/devices \
  -H "X-API-Key: $GIA_KEY" -H "Content-Type: application/json" \
  -d '{ "data": [18001, 18002] }'
POST/v1/device-folders/listPastas (lojas)

Lista as pastas que organizam os devices — em geral, cada pasta representa uma loja. Use o id da pasta como parent_ids em /devices/list para ver os devices daquela loja. cache 60s

Corpo (todos opcionais)

CampoTipoDescrição
idint[]Filtra por IDs
namestringBusca parcial por nome
parent_idsint[]Filtra por pasta-mãe
recursiveboolInclui subpastas (padrão true)
limit / offsetintPaginação
{
  "pagination": { "total": 30, "limit": 100, "offset": 0 },
  "data": [{ "id": 1077, "name": "LJ 144 ARICANDUVA", "parent_id": null }]
}
POST/v1/device-foldersPastas (lojas)

Cria pastas (lojas). write-through

CampoTipoDescrição
data[].name obrigatóriostringNome da pasta
data[].parent_id opcionalintPasta-mãe (para hierarquia)
curl -X POST https://api.globalia.com.br/v1/device-folders \
  -H "X-API-Key: $GIA_KEY" -H "Content-Type: application/json" \
  -d '{ "data": [{ "name": "LJ 201 CAMPINAS" }] }'
POST/v1/tags/listTags

Lista as tags e os devices vinculados a cada uma. Tags são criadas/alteradas indiretamente pelo campo tags na criação/edição de devices. cache 60s

CampoTipoDescrição
id opcionalint[]Filtra por IDs
limit / offsetintPaginação
{
  "data": [{ "id": 3913, "name": "loja_aricanduva", "devices": [15267] }]
}
POST/v1/profiles/listProfiles

Lista os perfis de configuração de devices (somente leitura). Mesmo corpo e formato de /tags/list: { id, name, devices[] }. cache 60s

POST/v1/venues/listVenues

Lista os locais físicos (endereço + coordenadas) onde os devices estão instalados. cache 60s

CampoTipoDescrição
id opcionalint[]Filtra por IDs
limit / offsetintPaginação
{
  "data": [{
    "id": 1536, "name": "Av. Ayrton Senna",
    "latitude": -22.9591463, "longitude": -43.3561969,
    "postal_code": "22775-005", "country": "Brasil",
    "city": "Rio de Janeiro", "street": "Av. Ayrton Senna",
    "building": "6000", "struct": null, "devices": []
  }]
}
POST/v1/venuesVenues

Cria locais. Atenção: na criação/edição, latitude e longitude são enviadas como strings (nas leituras retornam como números). write-through

CampoTipoDescrição
data[].name obrigatóriostringNome do local
data[].latitude obrigatóriostring"-90" a "90"
data[].longitude obrigatóriostring"-180" a "180"
data[].postal_code … struct opcionaisstringpostal_code, country, city, street, building, struct
data[].devices opcionalint[]IDs de devices a vincular
curl -X POST https://api.globalia.com.br/v1/venues \
  -H "X-API-Key: $GIA_KEY" -H "Content-Type: application/json" \
  -d '{ "data": [{ "name": "LJ 201", "latitude": "-22.90", "longitude": "-47.06", "city": "Campinas" }] }'
PUT/v1/venuesVenues

Atualiza locais — mesmos campos da criação, todos opcionais exceto data[].id. Sucesso: 200 com {}. write-through

DELETE/v1/venuesVenues

Remove locais pelos IDs: { "data": [1536] }. Irreversível. write-through

POST/v1/campaigns/listCampanhas

Lista as campanhas de veiculação (somente leitura). cache 60s

CampoTipoDescrição
id opcionalint[]Filtra por IDs
limit / offsetintPaginação
{
  "data": [{
    "id": 44088, "name": "Portico Entrada",
    "status": "active",     // draft | planned | active | paused | stopped | finished
    "type": 1,               // 1 = timeline, 2 = loop
    "start_at": null, "end_at": null,
    "timing_rules": ["(00:00:00-23:59:59);d1111111"],
    "target": { "gender": 3, "min_age": null, "max_age": null },
    "archived": false,
    "devices": [], "tags": [], "profiles": []
  }]
}

timing_rules: janela de horário + dias da semana (d1111111 = seg→dom, 1 ativo / 0 inativo). target.gender: 0 = M+F, 1 = M, 2 = F, 3 = desativado.

POST/v1/content/listConteúdo

Lista os arquivos de mídia (somente leitura). cache 60s

CampoTipoDescrição
id opcionalint[]Filtra por IDs
name opcionalstringBusca parcial por nome
campaign_ids opcionalint[]Só conteúdos das campanhas indicadas tempo real
limit / offsetintPaginação
{
  "data": [{
    "id": 91117, "name": "oferta-semana.png",
    "type": "image",   // text | image | video | audio | rate | pack
    "duration": null,  // segundos — apenas video/audio
    "lifetime": { "from": null, "end": null }
  }]
}
POST/v1/forms/listFormulários

Lista os formulários interativos configurados nos devices. tempo real

CampoTipoDescrição
name opcionalstring[]Filtra por nomes
limit / offsetintPaginação
{ "data": [{ "id": 641, "name": "Pesquisa de Satisfação", "fields": ["nota", "comentario"] }] }
POST/v1/forms/records/listFormulários

Retorna as respostas enviadas em um período (janela máxima de 90 dias). tempo real

CampoTipoDescrição
forms obrigatórioint[]IDs dos formulários
start / end obrigatóriodatetimePeríodo RFC 3339 (ex.: 2026-07-01T00:00:00Z), máx. 90 dias
devices opcionalint[]Filtra por devices
tags opcionalint[]Filtra por tags de device
limit / offsetintPaginação
curl -X POST https://api.globalia.com.br/v1/forms/records/list \
  -H "X-API-Key: $GIA_KEY" -H "Content-Type: application/json" \
  -d '{ "forms": [641], "start": "2026-07-01T00:00:00Z", "end": "2026-07-15T23:59:59Z" }'
{
  "data": [{
    "id": 9911, "form_id": 641, "device_id": 15267,
    "local_date": "2026-07-10T14:22:05", "server_date": "2026-07-10T17:22:09Z",
    "fields": [{ "name": "nota", "value": "5" }]
  }]
}
POST/v1/stats/visitors/listEstatísticas

Sessões de visitantes detectadas pelos sensores (audiência): idade e sexo estimados, tempo de permanência e de visualização, por device e campanha. Janela máxima de 1 ano. tempo real

Corpo

CampoTipoDescrição
start / end obrigatóriodatetimePeríodo RFC 3339, máx. 1 ano
devices opcionalint[]Filtra por devices
campaigns opcionalint[]Filtra por campanhas
tracks opcionalboolInclui os intervalos individuais de detecção
face_quality, glasses, facial_hair, hair_color, hair_type, headwear opcionaisboolIncluem atributos visuais estimados adicionais na resposta
limit / offsetintPaginação — limit máx. 1000 neste endpoint

Exemplo

curl -X POST https://api.globalia.com.br/v1/stats/visitors/list \
  -H "X-API-Key: $GIA_KEY" -H "Content-Type: application/json" \
  -d '{ "start": "2026-07-01T00:00:00Z", "end": "2026-07-15T23:59:59Z", "devices": [15267], "limit": 100 }'
{
  "pagination": { "total": 1333599, "limit": 100, "offset": 0 },
  "data": [{
    "session_id": "d8n52qo2tmk000e4lctg",
    "visitor_id": "d8mhr7o2tmk000fq14d0",
    "start": "2026-07-10T05:22:17Z", "end": "2026-07-10T05:24:36Z",
    "tracks_count": 3,
    "tracks_duration": 139,          // segundos no campo de visão
    "content_view_duration": 112,    // segundos olhando o conteúdo
    "age": 42, "age_deviation": 4,
    "sex": 1,                        // 0 = indefinido, 1 = masc., 2 = fem.
    "tags": [], "devices": [15267], "campaigns": [44088]
  }]
}
POST/v1/stats/content-shows/listEstatísticas

Histórico de exibições: cada vez que um conteúdo foi reproduzido, em qual device e campanha. tempo real

CampoTipoDescrição
start / end obrigatóriodatetimePeríodo RFC 3339
content obrigatórioint[]IDs dos conteúdos (ver /content/list)
limit / offsetintPaginação
{
  "data": [{
    "show_id": "c81a2f00tmk0009x1a3g",
    "start": "2026-07-10T12:00:05Z", "end": "2026-07-10T12:00:20Z",
    "content_id": 91117, "campaign_id": 44088, "device_id": 15267
  }]
}
GET/healthUtilitário

Verificação de disponibilidade. Não exige autenticação. Resposta: { "status": "ok" }.

Precisa de uma chave de acesso ou suporte? Entre em contato com a equipe Global IA. A documentação interativa (Swagger) também está disponível em api.globalia.com.br/docs.