API para programadores

Esta página descreve os endpoints públicos que pode usar para integrar com o Imbecis. Não é necessária autenticação para o endpoint documentado abaixo.

URL base da API neste ambiente: https://api.imbecis.app

GET /reports/confirmed

Devolve uma lista paginada de denúncias públicas confirmadas, ordenadas pela ocorrência mais recente primeiro.

Pedido

GET /reports/confirmed

Parâmetros de query

ParâmetroTipoObrig.PredefiniçãoRestriçõesDescrição
pageintegerNão1≥ 1Número da página.
pageSizeintegerNão105 – 50Resultados por página.
from_timestringNãoISO 8601Limite inferior no tempo da ocorrência (occurredAt, com recurso a createdAt em relatórios antigos).
to_timestringNãoISO 8601, ≥ from_timeLimite superior (mesma lógica de fallback que from_time).
municipalitystringNãoMunicípio português válidoFiltra pelo campo municipality do relatório (geocodificação).

Exemplos de URL completas

Primeira página (predefinições):

GET https://api.imbecis.app/reports/confirmed

Página 2, 25 resultados, Braga:

GET https://api.imbecis.app/reports/confirmed?page=2&pageSize=25&municipality=Braga

Janela temporal:

GET https://api.imbecis.app/reports/confirmed?from_time=2026-04-01T00:00:00.000Z&to_time=2026-04-30T23:59:59.999Z

Resposta: 200 OK

{
  "success": true,
  "message": "Confirmed reports",
  "meta": {
    "page": 1,
    "pageSize": 10,
    "total": 84,
    "totalPages": 9
  },
  "payload": [
    {
      "id": "69f3a084f3a164e5562c4d20",
      "occurredAt": "2026-04-30T14:22:00.000Z",
      "createdAt": "2026-04-30T14:23:11.000Z",
      "picture": "https://cdn.imbecis.app/reports/69f3a084f3a164e5562c4d20.jpg",
      "plateNumber": "AA-00-BB",
      "plateCountry": "pt",
      "location": {
        "latitude": 41.54321,
        "longitude": -8.42109,
        "municipality": "Braga",
        "freguesia": "Maximinos",
        "street": "Rua de Santa Margarida",
        "doorNumber": 12,
        "postal_code": "4710-306"
      }
    }
  ]
}

Campos do corpo (nível superior)

CampoTipoDescrição
successbooleanSempre true em sucesso.
messagestringMensagem legível.
metaobjectMetadados de paginação.
payloadarrayLista de denúncias confirmadas.

meta

CampoTipoDescrição
pageintegerPágina atual.
pageSizeintegerItens por página nesta resposta.
totalintegerTotal de registos que correspondem ao filtro.
totalPagesintegerTotal de páginas; 0 se total for 0.

Itens em payload[]

CampoTipoDescrição
idstringObjectId MongoDB em hexadecimal.
occurredAtstringISO 8601 — quando a infração foi observada; em relatórios antigos pode coincidir com createdAt.
createdAtstringISO 8601 — quando a denúncia foi submetida.
picturestring | nullURL pública da imagem (matrícula desfocada); null se não houver.
plateNumberstring | nullMatrícula; null se não confirmada.
plateCountrystring | nullCódigo ISO do país da matrícula (ex.: pt).
locationobjectLocalização (ver tabela seguinte).

location

CampoTipoDescrição
latitudenumberArredondada a 5 casas decimais.
longitudenumberArredondada a 5 casas decimais.
municipalitystring | undefinedMunicípio (geocodificação).
freguesiastring | undefinedFreguesia.
streetstring | undefinedNome da rua.
doorNumberinteger | undefinedNúmero de porta.
postal_codestring | undefinedCódigo postal (ex.: 4710-306).

Erros: 400 Bad Request

Devolvido quando os parâmetros de query falham a validação.

{
  "success": false,
  "errors": [
    "pageSize must not be less than 5",
    "municipality is not a valid municipality"
  ]
}
CondiçãoMensagem (exemplo)
page < 1page must not be less than 1
pageSize fora de 5 – 50pageSize must not be less than 5 / must not be greater than 50
from_time inválidofrom_time must be a valid ISO date string
to_time inválidoto_time must be a valid ISO date string
from_time > to_timefrom_time must be earlier than or equal to to_time
municipality inválidomunicipality is not a valid municipality

Notas

  • Ordenação: por occurredAt decrescente; registos sem esse campo usam createdAt para ordenação e tendem a aparecer depois dos mais recentes com occurredAt explícito.
  • Filtro municipality: corresponde ao campo de topo do relatório preenchido por geocodificação, não pesquisa dentro de geoInfo.
  • Campos geográficos opcionais: municipality, freguesia, street, doorNumber e postal_code em location podem ser omitidos se ainda não houver enriquecimento ou o geocoder não devolver valor.
  • Autenticação: endpoint público, sem credenciais.