API¶
Objetivo¶
Usar a API do RR Flow para integrar sistemas externos, automatizar listas, consultar conexões, localizar arquivos nfcapd, ler logs de CGNAT e consumir séries temporais de tráfego.
Como acessar¶
- URL base: use o mesmo host do RR Flow, por exemplo
https://rrflow.seudominio.com. - Autenticação: prefira o cabeçalho
Authorization: Bearer <token>. - Alternativa suportada:
X-API-Token: <token>. - Onde configurar o token: em Configurações > Sistema.
Exemplo base:
export RR_URL="https://rrflow.seudominio.com"
export RR_TOKEN="SEU_TOKEN"
Formatos aceitos¶
source: use exatamente o nome da fonte cadastrada em Operação > Fontes.startestop: aceitam:2026-03-12 10:002026-03-12 10:00:002026-03-12T10:00:00- epoch em segundos
- epoch em milissegundos
- Janela relativa: nas rotas de consulta baseadas em arquivos, você também pode usar
window_sec,window_seconds,range_secourelative_secem vez destartestop.
Observações importantes¶
- Se o token da API estiver habilitado, ele passa a ser obrigatório para chamadas externas.
- Nas rotas de alteração de whitelist e blacklist, o token precisa estar configurado e é sempre exigido.
- Em consultas pesadas, chamadas paralelas do mesmo cliente podem invalidar a requisição anterior.
- Se você precisar rodar várias consultas ao mesmo tempo, envie
X-Client-Keydiferente em cada uma. - IDs de grupos e serviços podem ser obtidos exportando os cadastros pelas telas do sistema ou usando o testador interno em Outros > API.
Endpoints¶
POST /api/add-blacklist¶
O que faz¶
Adiciona um IP ou prefixo na blacklist.
Parâmetros¶
target: obrigatório. IP ou prefixo CIDR.- Se você enviar um host sem máscara, o RR Flow normaliza para
/32em IPv4 ou/128em IPv6.
- Se você enviar um host sem máscara, o RR Flow normaliza para
group_id: opcional. ID do grupo de blacklist que deve receber a entrada.- Pode ser repetido mais de uma vez.
direction: opcional.source,destinationouboth.- Só é usado quando o sistema precisa criar o grupo técnico
API External.
- Só é usado quando o sistema precisa criar o grupo técnico
Exemplo¶
curl -X POST "$RR_URL/api/add-blacklist" \
-H "Authorization: Bearer $RR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"target": "203.0.113.45",
"direction": "both"
}'
Resposta esperada¶
status=success: entrada adicionada.status=permitted: a entrada já existia.- Campos mais comuns:
listactiontargetaffected_groupschanged_groups
Observações¶
- Se
group_idnão for informado, o sistema tenta aplicar nos grupos de blacklist já usados por regras de FlowSpec. - Se não existir grupo em uso, o RR Flow usa ou cria o grupo
API External.
POST /api/add-whitelist¶
O que faz¶
Adiciona um IP ou prefixo na whitelist.
Parâmetros¶
target: obrigatório. IP ou prefixo CIDR. - Se você enviar um host sem máscara, o RR Flow normaliza para/32em IPv4 ou/128em IPv6.group_id: opcional. ID do grupo de whitelist. - Pode ser repetido.direction: opcional.source,destinationouboth. - Só é usado quando o grupo técnicoAPI Externalprecisa ser criado.
Exemplo¶
curl -X POST "$RR_URL/api/add-whitelist" \
-H "Authorization: Bearer $RR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"target": "198.51.100.0/24"
}'
Resposta esperada¶
status=success: entrada adicionada.status=permitted: a entrada já existia.- Campos mais comuns:
listactiontargetaffected_groupschanged_groups
Observações¶
- Quando
group_idnão é enviado, a whitelist usa ou cria o grupo técnicoAPI External.
GET /api/cgnat-logs¶
O que faz¶
Consulta logs de CGNAT a partir de uma fonte configurada com CGNAT.
Parâmetros¶
source: obrigatório.type: obrigatório.publicouprivate.ip: opcional. Filtra um IP específico.port: opcional. Filtra uma porta específica.limit: opcional. Quantidade máxima de linhas.- O sistema limita o valor entre
1e500.
- O sistema limita o valor entre
start,stop: opcionais.- Se omitidos, o padrão é os últimos
5minutos.
- Se omitidos, o padrão é os últimos
Exemplo¶
curl -G "$RR_URL/api/cgnat-logs" \
-H "Authorization: Bearer $RR_TOKEN" \
--data-urlencode "source=BORDA-RS" \
--data-urlencode "type=public" \
--data-urlencode "ip=200.160.2.10" \
--data-urlencode "port=443" \
--data-urlencode "limit=20"
Resposta esperada¶
meta: trazsource,mode,start,stop,type,ip,port,limiterange.mode: indica o modo da fonte, por exemplopba,dynamicoudeterministic.rows: lista os eventos encontrados.- Em fontes
pba, as linhas costumam trazer:allocatedeventstatusprotoipnat_ipstartendtotalpba_blocks
- Em fontes
dynamicoudeterministic, as linhas costumam trazer:allocatedeventprotosrc_ip,src_portdst_ip,dst_portx_src_ip,x_src_portx_dst_ip,x_dst_port
Observações¶
- A fonte precisa estar marcada como CGNAT em Operação > Fontes.
- Se a fonte não tiver CGNAT habilitado, a API retorna erro.
POST /api/del-blacklist¶
O que faz¶
Remove um IP ou prefixo da blacklist por correspondência exata.
Parâmetros¶
target: obrigatório.group_id: opcional.- Se for omitido, o RR Flow procura em todos os grupos de blacklist.
Exemplo¶
curl -X POST "$RR_URL/api/del-blacklist" \
-H "Authorization: Bearer $RR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"target": "203.0.113.45/32"
}'
Resposta esperada¶
status=success: entrada removida.status=permitted: a entrada não foi encontrada.
Observações¶
- A remoção é exata.
- Exemplo: remover
203.0.113.45/32não remove203.0.113.0/24.
POST /api/del-whitelist¶
O que faz¶
Remove um IP ou prefixo da whitelist por correspondência exata.
Parâmetros¶
target: obrigatório.group_id: opcional.- Se for omitido, o RR Flow procura em todos os grupos de whitelist.
Exemplo¶
curl -X POST "$RR_URL/api/del-whitelist" \
-H "Authorization: Bearer $RR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"target": "198.51.100.0/24"
}'
Resposta esperada¶
status=success: entrada removida.status=permitted: a entrada não foi encontrada.
GET /api/list-connections¶
O que faz¶
Executa nfdump e retorna conexões em JSON. É a rota mais flexível para consumo externo quando você precisa de linhas detalhadas, não só séries temporais.
Parâmetros¶
source: obrigatório.start,stop: opcionais.order: opcional.flowsbytesobytepacketsopkgppsoppsbpsobpsbppobppduration
limit: opcional. Máximo de linhas retornadas.top: opcional. Quantidade usada no blocostats.agg: opcional. Agrega o resultado.- Pode ser repetido ou enviado separado por vírgula.
- Valores aceitos:
protoflagssrcipdstipsrcnetdstnetsrcnet,dstnetsrcportdstportsrcasdstasinifoutifbgpnextinsrcmacoutdstmacindstmacoutsrcmac
filter: opcional. Expressão donfdump.cgnatmap: opcional.- Use
1para aplicar o mapeamento determinístico de CGNAT definido em Meu ISP.
- Use
Exemplo¶
curl -G "$RR_URL/api/list-connections" \
-H "Authorization: Bearer $RR_TOKEN" \
-H "X-Client-Key: conexoes-top" \
--data-urlencode "source=BORDA-RS" \
--data-urlencode "window_sec=3600" \
--data-urlencode "order=bytes" \
--data-urlencode "limit=20" \
--data-urlencode "filter=(in if 169) and proto tcp"
Exemplo com agregação¶
curl -G "$RR_URL/api/list-connections" \
-H "Authorization: Bearer $RR_TOKEN" \
--data-urlencode "source=BORDA-RS" \
--data-urlencode "window_sec=1800" \
--data-urlencode "agg=srcip,dstip" \
--data-urlencode "order=bytes" \
--data-urlencode "top=10"
Resposta esperada¶
meta: contexto da consulta.columns: nomes das colunas efetivamente retornadas.rows: linhas da consulta.stats: resumo pré-agregado por bytes.
Observações¶
- O formato de
rowsmuda conformeagg. - Para filtros complexos, use
--data-urlencodenocurl.
GET /api/list-files¶
O que faz¶
Lista os arquivos nfcapd existentes para uma fonte em um intervalo de tempo.
Parâmetros¶
source: obrigatório.start,stop: opcionais.window_sec,window_seconds,range_sec,relative_sec: opcionais.- São atalhos de janela relativa.
Exemplo¶
curl -G "$RR_URL/api/list-files" \
-H "Authorization: Bearer $RR_TOKEN" \
--data-urlencode "source=BORDA-RS" \
--data-urlencode "window_sec=3600"
Resposta esperada¶
- O bloco
datacostuma trazer:sourcestartstoprounded_startrounded_stopinterval_minutesfirst_filelast_filerangecounttruncatedfiles
Observações¶
- Essa rota também existe como alias legado em
/api/demo-files. - É útil para validar se a janela consultada realmente possui arquivos antes de chamar outras rotas.
GET /api/traffic-as¶
O que faz¶
Retorna tráfego por ASN ao longo do tempo.
Parâmetros¶
source: obrigatório.start,stop: opcionais.direction:rx,txouboth.order: usa o mesmo conjunto de ordenação das outras rotas de tráfego.filter: expressão donfdump.group_type: opcional.- Nome do arquivo JSON de grupos, sem extensão.
group_ids: opcional.- IDs separados por vírgula.
group_id: opcional.- Alternativa repetível para
group_ids.
- Alternativa repetível para
top: opcional.- Só é usado quando você quer a lista bruta de ASNs, sem grupos.
max_points: opcional.timeout: opcional.
Exemplo com lista bruta¶
curl -G "$RR_URL/api/traffic-as" \
-H "Authorization: Bearer $RR_TOKEN" \
--data-urlencode "source=BORDA-RS" \
--data-urlencode "window_sec=3600" \
--data-urlencode "direction=rx" \
--data-urlencode "top=10"
Exemplo com grupos¶
curl -G "$RR_URL/api/traffic-as" \
-H "Authorization: Bearer $RR_TOKEN" \
--data-urlencode "source=BORDA-RS" \
--data-urlencode "window_sec=3600" \
--data-urlencode "group_type=as_fav" \
--data-urlencode "group_ids=<id-grupo-1>,<id-grupo-2>"
Resposta esperada¶
labels: eixo do tempo.series: séries por direção e por grupo ou ASN.totals: somatórios.meta: contexto da consulta.
GET /api/traffic-flags¶
O que faz¶
Retorna tráfego por flags TCP ao longo do tempo.
Parâmetros¶
source: obrigatório.start,stop: opcionais.direction:rx,txouboth.order: ordenação.filter: expressão donfdump.max_points: opcional.timeout: opcional.
Exemplo¶
curl -G "$RR_URL/api/traffic-flags" \
-H "Authorization: Bearer $RR_TOKEN" \
--data-urlencode "source=BORDA-RS" \
--data-urlencode "window_sec=1800" \
--data-urlencode "direction=both" \
--data-urlencode "filter=proto tcp"
Resposta esperada¶
series: séries comoSYN,ACK,SYN+ACK,RSTe similares.labels: eixo do tempo.totals: totais por série.
GET /api/traffic-geo¶
O que faz¶
Retorna tráfego por país ao longo do tempo.
Parâmetros¶
source: obrigatório.start,stop: opcionais.direction:rx,txouboth.order: ordenação.filter: expressão donfdump.top: opcional.- Mantém só os principais países.
max_points: opcional.timeout: opcional.
Exemplo¶
curl -G "$RR_URL/api/traffic-geo" \
-H "Authorization: Bearer $RR_TOKEN" \
--data-urlencode "source=BORDA-RS" \
--data-urlencode "window_sec=7200" \
--data-urlencode "direction=rx" \
--data-urlencode "top=10" \
--data-urlencode "filter=(in if 169) and any"
Resposta esperada¶
series: séries por país.totals: totais por país.meta.top: valor aplicado na consulta.
GET /api/traffic-interfaces¶
O que faz¶
Retorna tráfego por interface ao longo do tempo.
Parâmetros¶
source: obrigatório.start,stop: opcionais.direction:rx,txouboth.order: ordenação.filter: expressão donfdump.top: opcional.- Mantém só as principais interfaces.
max_points: opcional.timeout: opcional.
Exemplo¶
curl -G "$RR_URL/api/traffic-interfaces" \
-H "Authorization: Bearer $RR_TOKEN" \
--data-urlencode "source=BORDA-RS" \
--data-urlencode "window_sec=3600" \
--data-urlencode "direction=both" \
--data-urlencode "top=5"
Resposta esperada¶
series: séries por interface.labels: timestamps baseados nos arquivosnfcapd.totals: somatório por interface.
GET /api/traffic-prefixes¶
O que faz¶
Retorna tráfego por grupos de prefixos ao longo do tempo.
Parâmetros¶
source: obrigatório.start,stop: opcionais.direction:rx,txouboth.order: ordenação.filter: expressão donfdump.group_type: obrigatório.- Nome do cadastro exportado em JSON, sem extensão.
- Exemplo comum:
cdns.
group_ids: obrigatório.- IDs separados por vírgula.
group_id: opcional.- Alternativa repetível.
max_points: opcional.timeout: opcional.
Exemplo¶
curl -G "$RR_URL/api/traffic-prefixes" \
-H "Authorization: Bearer $RR_TOKEN" \
--data-urlencode "source=BORDA-RS" \
--data-urlencode "window_sec=3600" \
--data-urlencode "direction=tx" \
--data-urlencode "group_type=cdns" \
--data-urlencode "group_ids=<id-globo>,<id-google>"
Resposta esperada¶
series: séries por grupo consultado.meta.group_type: origem do catálogo usado.meta.group_ids: grupos aplicados.
GET /api/traffic-proto¶
O que faz¶
Retorna tráfego por protocolo ao longo do tempo.
Parâmetros¶
source: obrigatório.start,stop: opcionais.direction:rx,txouboth.order: ordenação.filter: expressão donfdump.max_points: opcional.timeout: opcional.
Exemplo¶
curl -G "$RR_URL/api/traffic-proto" \
-H "Authorization: Bearer $RR_TOKEN" \
--data-urlencode "source=BORDA-RS" \
--data-urlencode "window_sec=3600" \
--data-urlencode "direction=both"
Resposta esperada¶
series: séries por protocolo, por exemploTCP,UDP,ICMP.totals: totais por protocolo.
GET /api/traffic-services¶
O que faz¶
Retorna tráfego por serviços cadastrados em Operação > Serviços.
Parâmetros¶
source: obrigatório.start,stop: opcionais.direction:rx,txouboth.order: ordenação.filter: expressão donfdump.group_ids: obrigatório.- UUIDs dos serviços separados por vírgula.
group_id: opcional.- Alternativa repetível.
max_points: opcional.timeout: opcional.
Exemplo¶
curl -G "$RR_URL/api/traffic-services" \
-H "Authorization: Bearer $RR_TOKEN" \
--data-urlencode "source=BORDA-RS" \
--data-urlencode "window_sec=3600" \
--data-urlencode "group_ids=<uuid-http>,<uuid-dns>"
Resposta esperada¶
series: séries por serviço.meta.group_ids: serviços efetivamente usados.
GET /api/traffic-subnet¶
O que faz¶
Retorna tráfego agrupado por sub-redes.
Parâmetros¶
source: obrigatório.start,stop: opcionais.family: obrigatório.ipv4ouipv6.mask: opcional.- IPv4:
1a32 - IPv6:
1a128 - Padrão em IPv4:
24 - Padrão em IPv6:
34
- IPv4:
direction:rx,txouboth.agg: opcional.srcoudst.agg_rx: opcional. Lado da agregação para RX.agg_tx: opcional. Lado da agregação para TX.order: ordenação.filter: expressão donfdump.top: opcional.- Mantém só as principais sub-redes.
max_points: opcional.timeout: opcional.
Exemplo IPv4¶
curl -G "$RR_URL/api/traffic-subnet" \
-H "Authorization: Bearer $RR_TOKEN" \
--data-urlencode "source=BORDA-RS" \
--data-urlencode "window_sec=3600" \
--data-urlencode "family=ipv4" \
--data-urlencode "mask=24" \
--data-urlencode "direction=rx" \
--data-urlencode "agg=src" \
--data-urlencode "top=10"
Exemplo IPv6¶
curl -G "$RR_URL/api/traffic-subnet" \
-H "Authorization: Bearer $RR_TOKEN" \
--data-urlencode "source=BORDA-RS" \
--data-urlencode "window_sec=3600" \
--data-urlencode "family=ipv6" \
--data-urlencode "mask=48" \
--data-urlencode "direction=both" \
--data-urlencode "agg_rx=src" \
--data-urlencode "agg_tx=dst"
Resposta esperada¶
series: séries por bucket de sub-rede.meta.family: família consultada.meta.mask: máscara aplicada.meta.agg,meta.agg_rx,meta.agg_tx: lado da agregação.
Problemas comuns¶
401 Unauthorized: token ausente, inválido ou não enviado no cabeçalho correto.503 API token is not configured: rota de mutação chamada antes de configurar o token da API.source is requiredouinvalid source: nome da fonte não corresponde ao cadastro em Operação > Fontes.group_type is required,group_id is requiredou grupos vazios: faltou informar o catálogo ou os IDs esperados pela rota.filter too long: a expressão enviada passou do limite aceito.409 cancelled: uma consulta mais nova substituiu a anterior.- Para rodar em paralelo, envie
X-Client-Keydiferente em cada chamada.
- Para rodar em paralelo, envie
- Retorno
status=permittednas rotas de lista: a API entendeu a chamada, mas não precisou alterar nada.- Exemplo: item já existia ao adicionar.
- Exemplo: item não existia ao remover.