Dmetrics API

API para gerenciamento de painéis OOH (Out of Home)

Versão 2.0.0

Visão Geral

A Dmetrics API fornece acesso programático aos dados de painéis OOH (Out of Home), incluindo informações de pontos, mapeamentos e métricas de audiência.

1.619
Pontos Cadastrados
23
Painéis Mapeados
365
Cidades
315
Exibidores

Base URL

https://dmetrics.freedomai.dev.br

Documentação Interativa

Swagger UI

Interface interativa para testar endpoints

/docs

ReDoc

Documentação alternativa em formato limpo

/redoc

Autenticação

Todos os endpoints (exceto /health) requerem autenticação via Bearer Token.

Importante: Inclua o token em todas as requisições no header Authorization.

Como Autenticar

Adicione o header Authorization com o prefixo Bearer seguido do seu token:

Authorization: Bearer seu_token_aqui

Tokens Disponíveis

Token Nome Permissões Descrição
ooh_prod_2024 Token Produção read, write, admin Acesso completo a todos os recursos
ooh_read_2024 Token Somente Leitura read Apenas consultas (GET)

Exemplo de Requisição Autenticada

curl -X GET "https://dmetrics.freedomai.dev.br/pontos" \
  -H "Authorization: Bearer ooh_prod_2024" \
  -H "Content-Type: application/json"

Conexões e Infraestrutura

API REST

URL Base
https://dmetrics.freedomai.dev.br
Protocolo
HTTPS (TLS 1.3)
Formato
JSON
Encoding
UTF-8

Banco de Dados (ClickHouse)

Host
177.67.54.126
Porta HTTP
8123
Porta TCP
9000
Database
ooh
Usuário
default
Senha
(vazia)

Tabelas do Banco

Tabela/View Colunas Descrição
lista_pontos 28 Cadastro principal de pontos OOH
painel_mapeamento 35 Mapeamento entre painéis e pontos
vw_painel_metricas 39 View com métricas consolidadas

Endpoints

Sistema

GET /health

Verifica se a API está funcionando. Não requer autenticação.

Resposta (200 OK):
{
  "status": "healthy",
  "service": "OOH API",
  "version": "2.0.0"
}

Lista Pontos

GET /pontos

Lista todos os pontos OOH com paginação e filtros.

Parâmetros de Query

page integer opcional Número da página (padrão: 1)
per_page integer opcional Itens por página (1-1000, padrão: 50)
cidade string opcional Filtrar por cidade
tipo string opcional Filtrar por tipo (Outdoor, Painel, LED, etc)
exibidor string opcional Filtrar por exibidor
status string opcional Filtrar por status
bairro string opcional Filtrar por bairro
Resposta (200 OK):
{
  "total": 1619,
  "page": 1,
  "per_page": 50,
  "data": [
    {
      "id": 56152,
      "area": "PA",
      "status": 1,
      "promocao": "",
      "titulo": "123CST",
      "cidade": "Barcarena",
      "endereco": "AV.FRANCISCO VINAGRE, ESQUINA COM LIDER",
      "complemento": "9X3",
      "bairro": "CENTRO",
      "tipo": "Outdoor",
      "slug": "123cst",
      "imagem": "56152_nova.webp",
      "valor": "",
      "exibidor": "STAMPAS BRASIL COMUNICAÇÃO VISUAL",
      "codigo_exibidor": "ST",
      "observacao": "",
      "link_mapa": "",
      "lat": "",
      "lng": "",
      "iluminacao": "NÃO ILUMINADO",
      "led_insercoes": "",
      "led_resolucao": "",
      "led_tempo": "",
      "cobertura": "",
      "frequencia": "",
      "grp": "",
      "criado_em": "29/01/25 11:54",
      "codigo_unico": "PA56152"
    }
  ]
}
GET /pontos/{ponto_id}

Obtém um ponto específico pelo ID.

Parâmetros de Path

ponto_id integer obrigatório ID único do ponto
GET /pontos/codigo/{codigo_unico}

Obtém um ponto pelo código único (formato: UF + ID, ex: PA56152).

Parâmetros de Path

codigo_unico string obrigatório Código único do ponto
GET /pontos/cidade/{cidade}

Lista todos os pontos de uma cidade específica.

Parâmetros

cidade string obrigatório Nome da cidade
limit integer opcional Limite de resultados (padrão: 100, máx: 1000)
GET /pontos/geo/proximidade

Busca pontos próximos a uma coordenada geográfica usando a fórmula de Haversine.

Parâmetros de Query

lat float obrigatório Latitude do ponto central (-90 a 90)
lng float obrigatório Longitude do ponto central (-180 a 180)
raio_km float opcional Raio de busca em quilômetros (padrão: 5.0)
limit integer opcional Limite de resultados (padrão: 50, máx: 500)
Exemplo de Requisição:
GET /pontos/geo/proximidade?lat=-23.5505&lng=-46.6333&raio_km=10

Painel Mapeamento

GET /paineis

Lista todos os painéis mapeados com paginação e filtros.

Parâmetros de Query

page integer opcional Número da página
per_page integer opcional Itens por página
painel_cidade string opcional Filtrar por cidade do painel
painel_uf string opcional Filtrar por UF (ex: SP, RJ, MG)
match_tipo string opcional Tipo de match (automatico/manual)
tipo string opcional Tipo de painel
GET /paineis/{painel_id}

Obtém um painel mapeado específico pelo ID.

GET /paineis/uf/{uf}

Lista todos os painéis de uma UF específica.

Painel Métricas

GET /metricas

Lista métricas dos painéis com dados de capturas, placas únicas, multiplicador de pessoas e média FIPE.

Parâmetros de Query

page integer opcional Número da página
per_page integer opcional Itens por página
cidade string opcional Filtrar por cidade
tipo string opcional Filtrar por tipo
exibidor string opcional Filtrar por exibidor
painel_uf string opcional Filtrar por UF
Campos de Métricas Retornados:
{
  "qtd_capturas": 295,        // Quantidade de capturas
  "qtd_placas_unicas": 190,   // Placas únicas identificadas
  "multiplicador_pessoas": 325, // Estimativa de pessoas
  "media_fipe": 11375.65,     // Média da tabela FIPE
  "versao": "v1"              // Versão do cálculo
}
GET /metricas/{ponto_id}

Obtém métricas de um ponto específico.

GET /metricas/resumo/cidade/{cidade}

Resumo agregado das métricas por cidade, incluindo totais e médias.

Resposta:
{
  "cidade": "São Paulo",
  "total_pontos": 150,
  "total_capturas": 45000,
  "total_placas_unicas": 28000,
  "media_fipe_cidade": 15230.50,
  "media_multiplicador": 420.5
}
GET /metricas/resumo/geral

Resumo geral das métricas agrupado por todas as cidades.

Estatísticas

GET /stats/tipos

Contagem de pontos agrupados por tipo de painel.

Resposta:
[
  { "tipo": "Outdoor", "quantidade": 850 },
  { "tipo": "Painel LED", "quantidade": 320 },
  { "tipo": "Frontlight", "quantidade": 180 }
]
GET /stats/cidades

Contagem de pontos agrupados por cidade.

GET /stats/exibidores

Contagem de pontos agrupados por exibidor.

GET /stats/resumo

Resumo geral do sistema com todos os contadores.

Resposta:
{
  "total_pontos": 1619,
  "total_paineis": 23,
  "total_cidades": 365,
  "total_exibidores": 315,
  "total_tipos": 33
}

Busca

GET /busca

Busca geral por título, endereço, bairro ou cidade.

Parâmetros de Query

q string obrigatório Termo de busca (mínimo 2 caracteres)
limit integer opcional Limite de resultados (padrão: 50, máx: 200)
Exemplo:
GET /busca?q=paulista&limit=10

Exemplos de Uso

cURL

# Listar pontos
curl -X GET "https://dmetrics.freedomai.dev.br/pontos?per_page=10" \
  -H "Authorization: Bearer ooh_prod_2024"

# Buscar por cidade
curl -X GET "https://dmetrics.freedomai.dev.br/pontos?cidade=São Paulo" \
  -H "Authorization: Bearer ooh_prod_2024"

# Buscar pontos próximos
curl -X GET "https://dmetrics.freedomai.dev.br/pontos/geo/proximidade?lat=-23.55&lng=-46.63&raio_km=5" \
  -H "Authorization: Bearer ooh_prod_2024"

# Estatísticas gerais
curl -X GET "https://dmetrics.freedomai.dev.br/stats/resumo" \
  -H "Authorization: Bearer ooh_prod_2024"

Python

import requests

BASE_URL = "https://dmetrics.freedomai.dev.br"
TOKEN = "ooh_prod_2024"

headers = {
    "Authorization": f"Bearer {TOKEN}",
    "Content-Type": "application/json"
}

# Listar pontos
response = requests.get(f"{BASE_URL}/pontos", headers=headers)
pontos = response.json()
print(f"Total de pontos: {pontos['total']}")

# Buscar por cidade
params = {"cidade": "São Paulo", "per_page": 100}
response = requests.get(f"{BASE_URL}/pontos", headers=headers, params=params)

# Métricas de uma cidade
response = requests.get(f"{BASE_URL}/metricas/resumo/cidade/Olinda", headers=headers)
metricas = response.json()
print(f"Total capturas: {metricas['total_capturas']}")

JavaScript (Fetch)

const BASE_URL = "https://dmetrics.freedomai.dev.br";
const TOKEN = "ooh_prod_2024";

const headers = {
  "Authorization": `Bearer ${TOKEN}`,
  "Content-Type": "application/json"
};

// Listar pontos
async function listarPontos() {
  const response = await fetch(`${BASE_URL}/pontos?per_page=10`, { headers });
  const data = await response.json();
  console.log(`Total: ${data.total}`);
  return data;
}

// Buscar por proximidade
async function buscarProximos(lat, lng, raioKm = 5) {
  const url = `${BASE_URL}/pontos/geo/proximidade?lat=${lat}&lng=${lng}&raio_km=${raioKm}`;
  const response = await fetch(url, { headers });
  return response.json();
}

// Estatísticas
async function getStats() {
  const response = await fetch(`${BASE_URL}/stats/resumo`, { headers });
  return response.json();
}

PHP

<?php
$baseUrl = "https://dmetrics.freedomai.dev.br";
$token = "ooh_prod_2024";

$headers = [
    "Authorization: Bearer $token",
    "Content-Type: application/json"
];

// Função para fazer requisições
function apiRequest($endpoint, $params = []) {
    global $baseUrl, $headers;

    $url = $baseUrl . $endpoint;
    if (!empty($params)) {
        $url .= '?' . http_build_query($params);
    }

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $response = curl_exec($ch);
    curl_close($ch);

    return json_decode($response, true);
}

// Listar pontos
$pontos = apiRequest("/pontos", ["per_page" => 10]);
echo "Total: " . $pontos['total'];

// Estatísticas
$stats = apiRequest("/stats/resumo");
print_r($stats);
?>

Códigos de Erro

Código Status Descrição
200 OK Requisição bem-sucedida
400 Bad Request Parâmetros inválidos ou malformados
401 Unauthorized Token ausente ou inválido
403 Forbidden Token não possui permissão necessária
404 Not Found Recurso não encontrado
422 Unprocessable Entity Erro de validação dos dados
500 Internal Server Error Erro interno do servidor

Formato de Erro

{
  "detail": {
    "error": "Token inválido",
    "message": "O token fornecido não é válido ou expirou",
    "code": "INVALID_TOKEN"
  }
}
Erro 401 - Token Inválido: Verifique se o token está correto e se está incluindo o prefixo "Bearer " no header Authorization.
Erro 403 - Permissão Negada: O token utilizado não possui permissão para acessar este recurso. Utilize um token com permissões adequadas.