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.
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 '{}'
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) */
}
| HTTP | key | Quando ocorre |
|---|---|---|
| 400 | InvalidJSON | Corpo malformado ou campo com tipo errado |
| 401 | InvalidKey | Header X-API-Key ausente ou inválido |
| 422 | varia | Regra de negócio violada (nome duplicado, referência inexistente…) |
| 429 | RateLimitExceeded | Mais de 100 requisições por minuto |
| 500 | varia | Erro 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.
Lista os devices (painéis, totens, players) da sua conta. cache 60s
Corpo (todos opcionais)
| Campo | Tipo | Descrição |
|---|---|---|
| id | int[] | Filtra por IDs específicos |
| name | string | Busca parcial por nome (case-insensitive) |
| parent_ids | int[] | Filtra por pastas (lojas) — ver /device-folders/list |
| recursive | bool | Com parent_ids: inclui subpastas (padrão true) |
| limit / offset | int | Paginaçã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"
}]
}
Cria um ou mais devices. write-through
Corpo
| Campo | Tipo | Descrição |
|---|---|---|
| data[].name obrigatório | string | Nome do device (único) |
| data[].parent_id opcional | int | ID da pasta (loja) onde criar |
| data[].tags opcional | string[] | Nomes de tags (criadas se não existirem) |
| data[].address opcional | object | { 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 }] }
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
| Campo | Tipo | Descrição |
|---|---|---|
| data[].id obrigatório | int | ID do device |
| data[].name opcional | string | Novo nome |
| data[].parent_id opcional | int | Move para outra pasta |
| data[].tags opcional | string[] | Substitui todas as tags ([] remove todas) |
| data[].address opcional | object | Substitui 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 {}.
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] }'
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)
| Campo | Tipo | Descrição |
|---|---|---|
| id | int[] | Filtra por IDs |
| name | string | Busca parcial por nome |
| parent_ids | int[] | Filtra por pasta-mãe |
| recursive | bool | Inclui subpastas (padrão true) |
| limit / offset | int | Paginação |
{
"pagination": { "total": 30, "limit": 100, "offset": 0 },
"data": [{ "id": 1077, "name": "LJ 144 ARICANDUVA", "parent_id": null }]
}
Cria pastas (lojas). write-through
| Campo | Tipo | Descrição |
|---|---|---|
| data[].name obrigatório | string | Nome da pasta |
| data[].parent_id opcional | int | Pasta-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" }] }'
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
| Campo | Tipo | Descrição |
|---|---|---|
| id opcional | int[] | Filtra por IDs |
| limit / offset | int | Paginação |
{
"data": [{ "id": 3913, "name": "loja_aricanduva", "devices": [15267] }]
}
Lista os perfis de configuração de devices (somente leitura). Mesmo corpo e formato de
/tags/list: { id, name, devices[] }. cache 60s
Lista os locais físicos (endereço + coordenadas) onde os devices estão instalados. cache 60s
| Campo | Tipo | Descrição |
|---|---|---|
| id opcional | int[] | Filtra por IDs |
| limit / offset | int | Paginaçã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": []
}]
}
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
| Campo | Tipo | Descrição |
|---|---|---|
| data[].name obrigatório | string | Nome do local |
| data[].latitude obrigatório | string | "-90" a "90" |
| data[].longitude obrigatório | string | "-180" a "180" |
| data[].postal_code … struct opcionais | string | postal_code, country, city, street, building, struct |
| data[].devices opcional | int[] | 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" }] }'
Atualiza locais — mesmos campos da criação, todos opcionais exceto data[].id.
Sucesso: 200 com {}. write-through
Remove locais pelos IDs: { "data": [1536] }. Irreversível. write-through
Lista as campanhas de veiculação (somente leitura). cache 60s
| Campo | Tipo | Descrição |
|---|---|---|
| id opcional | int[] | Filtra por IDs |
| limit / offset | int | Paginaçã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.
Lista os arquivos de mídia (somente leitura). cache 60s
| Campo | Tipo | Descrição |
|---|---|---|
| id opcional | int[] | Filtra por IDs |
| name opcional | string | Busca parcial por nome |
| campaign_ids opcional | int[] | Só conteúdos das campanhas indicadas tempo real |
| limit / offset | int | Paginaçã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 }
}]
}
Lista os formulários interativos configurados nos devices. tempo real
| Campo | Tipo | Descrição |
|---|---|---|
| name opcional | string[] | Filtra por nomes |
| limit / offset | int | Paginação |
{ "data": [{ "id": 641, "name": "Pesquisa de Satisfação", "fields": ["nota", "comentario"] }] }
Retorna as respostas enviadas em um período (janela máxima de 90 dias). tempo real
| Campo | Tipo | Descrição |
|---|---|---|
| forms obrigatório | int[] | IDs dos formulários |
| start / end obrigatório | datetime | Período RFC 3339 (ex.: 2026-07-01T00:00:00Z), máx. 90 dias |
| devices opcional | int[] | Filtra por devices |
| tags opcional | int[] | Filtra por tags de device |
| limit / offset | int | Paginaçã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" }]
}]
}
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
| Campo | Tipo | Descrição |
|---|---|---|
| start / end obrigatório | datetime | Período RFC 3339, máx. 1 ano |
| devices opcional | int[] | Filtra por devices |
| campaigns opcional | int[] | Filtra por campanhas |
| tracks opcional | bool | Inclui os intervalos individuais de detecção |
| face_quality, glasses, facial_hair, hair_color, hair_type, headwear opcionais | bool | Incluem atributos visuais estimados adicionais na resposta |
| limit / offset | int | Paginaçã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]
}]
}
Histórico de exibições: cada vez que um conteúdo foi reproduzido, em qual device e campanha. tempo real
| Campo | Tipo | Descrição |
|---|---|---|
| start / end obrigatório | datetime | Período RFC 3339 |
| content obrigatório | int[] | IDs dos conteúdos (ver /content/list) |
| limit / offset | int | Paginaçã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
}]
}
Verificação de disponibilidade. Não exige autenticação. Resposta: { "status": "ok" }.