Documentação da API

Entenda os endpoints e o retorno de dados

Documentação da API — Atlas da Notícia

Atualizada em 8 jul. 2026 com base no código atual da API (voltdatalab/api-atlasdanoticia, branch caprover, commit da433d4) e conferência de endpoints em produção (https://api.atlas.jor.br).

Visão geral

A API do Atlas da Notícia é uma API REST versionada. A versão pública principal continua em v1.

  • Base da API: https://api.atlas.jor.br/api/v1
  • Formato de retorno: JSON
  • Autenticação: JWT no header Authorization, com esquema Bearer e o JWT emitido pela API.
  • Cadastro de usuário: https://api.atlas.jor.br/register?ref=atlas.jor.br

Alguns endpoints são públicos, mas a maioria exige JWT. Há também um token “dummy” público para consultas específicas, descrito abaixo.


1. Autenticação

Login

POST https://api.atlas.jor.br/api/v1/auth/login
Content-Type: application/json
{
  "email": "seu@email",
  "password": "sua senha"
}

Resposta:

{
  "access_token": "seu_token",
  "token_type": "bearer",
  "expires_in": 3600
}

Use o token nas próximas requisições:

Authorization: <Bearer JWT_AQUI>

Renovar token

POST https://api.atlas.jor.br/api/v1/auth/refresh
Authorization: <Bearer JWT_AQUI>

Retorna um novo JSON no mesmo formato do login.

Logout

POST https://api.atlas.jor.br/api/v1/auth/logout
Authorization: <Bearer JWT_AQUI>

Resposta:

{
  "message": "Successfully logged out"
}

Token público para consultas online

A API também possui um endpoint público que retorna um JWT de usuário técnico/dummy:

GET https://api.atlas.jor.br/api/v1/auth/dummy-jwt

Esse token permite acessar endpoints liberados para a role dummy, como GET /media/online e os endpoints de dados em /data/*.


2. Filtros e seleção de campos

Os endpoints de dados em /data/* aceitam filtros usando os campos retornados por suas rotas /definitions.

Tipos de filtro

Tipo Exemplo Descrição
Igualdade ?estado=SP Retorna registros em que o campo é igual ao valor informado.
Lista / IN ?estado[]=SP&estado[]=RJ Retorna registros em que o campo está em uma lista de valores.
Busca parcial ?cidade[lk]=Paulo Equivalente a LIKE '%Paulo%'.
Maior ou igual ?populacao[gt]=100000 Retorna valores maiores ou iguais.
Menor ou igual ?populacao[lt]=500000 Retorna valores menores ou iguais.
Intervalo ?populacao[gt]=100000&populacao[lt]=500000 Combina limites inferior e superior.

Seleção de campos

Use field[] para limitar os campos retornados:

GET /data/analytic?field[]=id&field[]=nome_veiculo&field[]=estado

Campos não listados por /definitions são ignorados.


3. Endpoints públicos e semipúblicos da v1

Método Endpoint Autenticação Descrição
POST /auth/login Não Gera JWT para usuário cadastrado.
GET /auth/dummy-jwt Não Gera JWT técnico/dummy para consultas públicas específicas.
POST /auth/refresh Sim Renova JWT.
POST /auth/logout Sim Invalida JWT.
GET /media/verified Não Lista veículos online verificados com pelo menos 8 critérios de transparência.
GET /media/online JWT dummy Lista veículos do segmento online, sem paginação. Aceita filtro por name.
GET /verification-form Não Lista formulários de verificação, paginado.
POST /verification-form Não Envia formulário de verificação.
GET /verification-form/{mediaId} Não Lista formulários de verificação de um veículo.
GET /verification-form/{mediaId}/last Não Retorna o formulário de verificação mais recente de um veículo online ativo.
GET /cities/all JWT Lista cidades para apoio a formulários.
GET /cities/{stateId}/all JWT Lista cidades de um estado.
GET /states/cities JWT Lista cidades agrupadas/relacionadas a estados.
GET /sponsors/all JWT Lista organizações mantenedoras/sponsors.
GET /segments/all JWT Lista segmentos.
GET /regions/all JWT Lista regiões.
GET /states/all JWT Lista estados.
GET /employees-ranges/all JWT Lista faixas de funcionários.
GET /business-models/all JWT Lista modelos de negócio.
GET /features/all JWT Lista características/features.
GET /collaborators/all JWT Lista colaboradores.
GET /channels/all JWT Lista canais.
GET /media-sources/all JWT Lista fontes de mídia.
GET /suggestion/all?value=termo JWT Busca veículos por nome ou ID para sugestão/edição.
GET /suggestion/{mediaId} JWT Retorna dados de um veículo para sugestão.
POST /suggestion JWT Envia sugestão de novo veículo.
PUT /suggestion/{mediaId} JWT Envia sugestão de atualização de veículo existente.

4. Endpoints de dados (/data)

Todos os endpoints abaixo exigem JWT. É possível usar o token retornado por /auth/dummy-jwt quando a consulta for pública.

Cada endpoint possui uma rota /definitions, que retorna os campos disponíveis para filtro e seleção.

4.1 Veículos — Atlas Analytic

GET /data/analytic
GET /data/analytic/definitions

Descrição: lista veículos jornalísticos com dados principais e relações como modelos de negócio, características, colaboradores e canais.

Campos disponíveis em produção:

[
  "id",
  "nome_veiculo",
  "media_source_id",
  "fonte",
  "segment_id",
  "segmento",
  "city_id",
  "cidade",
  "cod_mun_ibge",
  "state_id",
  "estado",
  "region_id",
  "regiao",
  "address",
  "annotations",
  "email",
  "employees_range_id",
  "num_funcionarios",
  "periodicity",
  "another_periodicity",
  "eh_jornal",
  "eh_site_pago",
  "data_fechamento",
  "ativo",
  "data_inclusao"
]

Exemplo:

GET /data/analytic?estado=SP&field[]=id&field[]=nome_veiculo&field[]=cidade&field[]=estado
Authorization: <Bearer JWT_AQUI>

4.2 Pesquisa — Atlas Analytic Research

GET /data/analytic_research

Descrição: endpoint alternativo de dados analíticos para pesquisa.

Observação: há método no controller para definições (analyticResearchDefs), mas a rota /data/analytic_research/definitions não está registrada no código atual. Em produção, essa rota não deve ser documentada como disponível até ser registrada em routes/api.php.

4.3 Cidades sem veículos

GET /data/cities-without-media
GET /data/cities-without-media/definitions

Campos:

[
  "codmun",
  "municipio",
  "uf",
  "regiao",
  "populacao",
  "ano_populacao",
  "IDHM",
  "IDHM_R",
  "IDHM_E"
]

4.4 IDHM médio por UF e região

GET /data/med-idhm-2010-state-region
GET /data/med-idhm-2010-state-region/definitions

Campos:

[
  "estado",
  "regiao",
  "med_idhm",
  "med_idhm_e",
  "med_idhm_r",
  "populacao",
  "qtd_veiculos",
  "veiculos_por_100k_hab",
  "ano_populacao"
]

4.5 Quantidade de cidades sem veículos por região

GET /data/qtd-cities-without-media-region
GET /data/qtd-cities-without-media-region/definitions

Campos:

[
  "estado",
  "qtd_cidades",
  "qtd_desertos"
]

4.6 Quantidade de cidades sem veículos por estado

GET /data/qtd-cities-without-media-state
GET /data/qtd-cities-without-media-state/definitions

Campos:

[
  "estado",
  "qtd_cidades",
  "qtd_desertos"
]

4.7 Quantidade de cidades sem veículos por estado e região

GET /data/qtd-cities-without-media-state-region
GET /data/qtd-cities-without-media-state-region/definitions

Campos:

[
  "estado",
  "regiao",
  "qtd_desertos"
]

4.8 Quase desertos

GET /data/almost-deserts
GET /data/almost-deserts/definitions

Descrição: municípios com poucos veículos jornalísticos.

Campos:

[
  "cidade",
  "estado",
  "regiao",
  "qtd_veiculos",
  "codmun_ibge",
  "populacao",
  "ano_populacao",
  "veiculos_por_100k_hab",
  "IDHM",
  "IDHM_R",
  "IDHM_E"
]

4.9 Veículos por 100 mil habitantes

GET /data/medias-100k-hab
GET /data/medias-100k-hab/definitions

Campos:

[
  "cidade",
  "estado",
  "regiao",
  "qtd_veiculos",
  "codmun_ibge",
  "populacao",
  "ano_populacao",
  "veiculos_por_100k_hab",
  "IDHM",
  "IDHM_R",
  "IDHM_E"
]

5. Veículos online e veículos verificados

Listar veículos online

GET /media/online
Authorization: <Bearer JWT_AQUI>

Aceita filtro opcional por nome:

GET /media/online?name=acre
Authorization: <Bearer JWT_AQUI>

Campos retornados:

[
  {
    "id": 13960,
    "name": "ACRELANDIA NEWS",
    "city": "Acrelândia",
    "state": "AC"
  }
]

Listar veículos verificados

GET /media/verified

Não exige autenticação. Aceita filtro opcional:

GET /media/verified?search=jornal

Retorna veículos com criterios >= 8 a partir da view v_atlas_qtd_criterios_veiculos.

Campos principais observados em produção:

[
  {
    "id": 1969,
    "nome": "JORNAL ATUAL",
    "cidade": "Itaguaí",
    "estado": "RJ",
    "regiao": "Sudeste",
    "cod_municipio": "3302007",
    "ultima_atualizacao": "2026-04-16 14:46:04",
    "criterios": 12,
    "expediente": "sim",
    "expediente_url": "https://...",
    "principiosEditoriais": "sim",
    "principiosEditoriais_url": "https://..."
  }
]

A resposta completa pode incluir pares de campos para critérios de transparência, como expediente/expediente_url, politicaDeCorrecao/politicaDeCorrecao_url, identificacaoDeAutoria/identificacaoDeAutoria_url, acessibilidade/acessibilidade_url etc.


6. Formulário de verificação

Enviar formulário

POST /verification-form
Content-Type: application/json

Estrutura esperada:

{
  "media_id": 123,
  "criterios": {
    "expediente": {
      "resposta": "sim",
      "url": "https://exemplo.com/expediente",
      "data": "2026-07-08",
      "observacoes": ["observação opcional"]
    }
  }
}

Validações principais:

Campo Regra
media_id obrigatório, inteiro
criterios obrigatório
criterios.*.resposta opcional; apenas sim ou não
criterios.*.url opcional; URL válida
criterios.*.data opcional; data válida
criterios.*.observacoes opcional

Resposta de sucesso:

{
  "msg": "Formulário de verificação enviado com sucesso"
}

Último formulário de um veículo

GET /verification-form/{mediaId}/last

Retorna erro 400 se o veículo não estiver ativo ou não for do segmento online. Retorna 404 se não houver formulário para o veículo.


7. Sugestões de veículos

Os endpoints de sugestão exigem JWT.

Buscar veículos para sugestão/edição

GET /suggestion/all?value=termo
Authorization: <Bearer JWT_AQUI>

Retorna veículos cujo nome ou ID combine com o termo pesquisado.

Enviar sugestão de novo veículo

POST /suggestion
Authorization: <Bearer JWT_AQUI>
Content-Type: application/json

Enviar sugestão de atualização

PUT /suggestion/{mediaId}
Authorization: <Bearer JWT_AQUI>
Content-Type: application/json

Campos principais aceitos dentro de media:

Campo Tipo/regra
media.media.text obrigatório
media.segment_id obrigatório; deve existir em segments
media.city_id obrigatório
media.email opcional; e-mail válido
media.periodicity opcional; um de continuous, daily, biweekly, triweekly, monfri, weekly, monsat, fortnightly, monthly, bimonthly, trimonthly, undefined, another
media.another_periodicity obrigatório se periodicity=another
media.paid_site opcional; booleano
media.journalism opcional
media.businessModels opcional; array
media.features opcional; array
media.mediaChannels opcional; array
media.collaborator_id opcional; deve existir em collaborators
media.employees_range_id opcional; deve existir em employees_ranges
media.sponsor.value opcional; deve existir em sponsors
media.initiative_start_year opcional; inteiro entre 1800 e 2100
media.main_coverage_topic opcional; string
media.other_coverage_topics opcional; array
media.target_audiences opcional; array
media.coverage_scopes opcional; array
media.produces_original_content opcional; booleano
media.primary_platform opcional; string
media.primary_platform_followers opcional; inteiro >= 0
media.secondary_platform opcional; string
media.secondary_platform_followers opcional; inteiro >= 0
media.has_responsible_journalist opcional; booleano
media.responsible_journalist_name obrigatório se has_responsible_journalist=1
media.has_suffered_legal_harassment opcional; booleano
media.has_had_channel_suspended opcional; booleano
media.receives_platform_transfers opcional; booleano
media.accessibility_features opcional; array
media.channel_descriptions opcional; array
media.has_editorial_principles opcional; booleano
media.editorial_principles_link obrigatório se has_editorial_principles=1; URL válida
media.content_typologies opcional; array

Campos principais aceitos dentro de media_form:

Campo Regra
media_form.name obrigatório
media_form.organization obrigatório
media_form.is_closing_alert obrigatório
media_form.closing_date obrigatório se is_closing_alert=true; formato YYYY-MM

Resposta de sucesso:

{
  "msg": "Sugestão de mídia enviada com sucesso"
}

8. Observação sobre v2

O código atual também expõe rotas em /api/v2, voltadas principalmente ao painel/admin:

  • GET /api/v2/auth/me
  • GET /api/v2/dashboard/*
  • recursos administrativos como medias, media-forms, states, regions, sponsors, segments, media-sources, employees-ranges, collaborators, cities, features, channels, business-models

Essas rotas exigem JWT e roles específicas (api, admin, regular; algumas apenas admin/regular). Recomenda-se não apresentá-las como API pública geral sem uma documentação separada de painel/admin.


9. Exemplos com curl

Obter token dummy e consultar veículos online

JWT=$(curl -s https://api.atlas.jor.br/api/v1/auth/dummy-jwt | jq -r .access_token)

curl -H "Authorization: Bearer $JWT" \
  "https://api.atlas.jor.br/api/v1/media/online?name=acre"

Consultar definições de campos

JWT=$(curl -s https://api.atlas.jor.br/api/v1/auth/dummy-jwt | jq -r .access_token)

curl -H "Authorization: Bearer $JWT" \
  "https://api.atlas.jor.br/api/v1/data/analytic/definitions"

Consultar veículos por estado com campos selecionados

JWT=$(curl -s https://api.atlas.jor.br/api/v1/auth/dummy-jwt | jq -r .access_token)

curl -G "https://api.atlas.jor.br/api/v1/data/analytic" \
  -H "Authorization: Bearer $JWT" \
  --data-urlencode "estado=SP" \
  --data-urlencode "field[]=id" \
  --data-urlencode "field[]=nome_veiculo" \
  --data-urlencode "field[]=cidade" \
  --data-urlencode "field[]=estado"

10. Mudanças relevantes em relação à documentação antiga

  • GET /auth/dummy-jwt existe e é útil para consultas públicas com token técnico.
  • POST /auth/logout existe e deve ser documentado junto de login/refresh.
  • GET /media/online existe, mas exige JWT com role dummy.
  • GET /media/verified existe e não exige autenticação.
  • Os endpoints de verification-form estão públicos no código atual.
  • Os endpoints auxiliares de formulário (cities/all, segments/all, business-models/all etc.) existem e exigem JWT.
  • GET /data/analytic/definitions agora inclui campos adicionais como media_source_id, IDs relacionais, ativo e data_inclusao.
  • /data/analytic_research está registrado, mas /data/analytic_research/definitions não está registrado.
  • Há novas validações/campos na sugestão de veículo relacionados a plataforma, audiência, cobertura, responsável jornalístico, acessibilidade e princípios editoriais.
Sobre quem escreveu
Sérgio Spagnuolo

Sérgio Spagnuolo

Coordenador de dados

Responsável pela área de dados e tecnologia do Atlas da Notícia. Também é diretor do veículo independente de tecnologia Núcleo Jornalismo, e fundador da agência de dados Volt Data Lab.

Great! You’ve successfully signed up.

Welcome back! You've successfully signed in.

You've successfully subscribed to Atlas da Notícia.

Success! Check your email for magic link to sign-in.

Success! Your billing info has been updated.

Your billing was not updated.