Pular para o conteúdo
FG Tracker
Documentação · API HTTP

Documentação

API HTTP

Rotas públicas de integração, autenticação, corpo da ingestão, limites, idempotência, erros, paginação e filtros.

Conferido com o código e os pacotes publicados em 2026-10-16

Base, formatos e versão

  • Base: https://tracker-api.fortground.com.br. Todas as rotas começam com /v1.
  • JSON em UTF-8. Datas em ISO 8601 (as respostas vêm em UTC, com Z); durações em milissegundos (durationMs, decimais aceitos).
  • A referência gerada do código está em tracker-api.fortground.com.br/docs. Ela lista também as rotas internas do painel e ainda não descreve o token Bearer nem a maioria das respostas; esta página é a referência para integrações.

Autenticação

Credencial por grupo de rotas
RotasCredencialHeader
Ingestão (enviar dados)chave de projeto: fgsk_ no servidor, stk_ no navegadorx-fg-tracker-key: fgsk_…
Leitura e automaçãotoken pessoal fgt_Authorization: Bearer fgt_…
GET /v1/healthnenhuma—

Chave de projeto não lê nada e token não envia telemetria: a API recusa um fgt_ no header de chave e uma chave no Bearer. Como obter e quando usar cada uma: Chaves e tokens.

Rotas públicas de integração

Estas são as rotas que esta documentação cobre para integrações. Todas foram conferidas no código da API; as que têm exemplo nesta página foram executadas.

Ingestão (chave de projeto)

Rotas de ingestão
MétodoCaminhoPara quêAutenticaçãoPermissão
POST/v1/ingestSpans, pageviews e agregados de infrachave de projetofgsk_; stk_ só eventos de navegador no modo restrito
POST/v1/logsLinhas de log (até 500 por lote)chave de projetofgsk_ (stk_ só no modo legado)
POST/v1/releasesRegistrar release no deploychave de projetofgsk_ (stk_ só no modo legado)
POST/v1/sourcemapsEnviar source maps do frontchave de projetofgsk_ (stk_ só no modo legado)
POST/v1/monitors/:slug/checkinCheck-in de job com corpo JSONchave de projetofgsk_ (stk_ só no modo legado)
GET/v1/monitors/:slug/pingCheck-in por GET (crontab)chave de projetofgsk_ no header; stk_ também em ?key=

Leitura e automação (token pessoal)

Além da permissão do token, a pessoa dona do token precisa ser membro ativo do projeto; onde aparece owner/admin, o papel dela no projeto também conta.

Rotas de leitura e automação
MétodoCaminhoPara quêAutenticaçãoPermissão
GET/v1/auth/meQuem é o token e quais permissões temBearer fgt_qualquer
GET/v1/projectsProjetos em que você é membroBearer fgt_projects:read
POST/v1/projectsCriar projetoBearer fgt_projects:write (token sem restrição de projeto)
GET/v1/projects/:idDetalhe do projetoBearer fgt_projects:read
PATCH/v1/projects/:idNome, limiares, domínios permitidosBearer fgt_projects:write + owner/admin
GET/v1/projects/:id/ingest-keysChaves stk_/fgsk_, modo e usoBearer fgt_ingest_key:read + owner/admin
PATCH/v1/projects/:id/ingest-keysModo legado ou restrito da stk_Bearer fgt_ingest_key:write + owner/admin
POST/v1/projects/:id/ingest-keys/serverGerar ou rotacionar a fgsk_Bearer fgt_ingest_key:write + owner/admin
POST/v1/projects/:id/rotate-keyRotacionar a stk_Bearer fgt_ingest_key:write + owner/admin
GET/v1/projects/:id/ingest-healthÚltimos recebidos, recusas por motivo, atrasoBearer fgt_telemetry:read
GET/v1/projects/:id/overviewRequisições, erros e percentis da janelaBearer fgt_telemetry:read
GET/v1/projects/:id/endpointsEndpoints e jobs com percentisBearer fgt_telemetry:read
GET/v1/projects/:id/endpoints/detailUm endpoint (?name=)Bearer fgt_telemetry:read
GET/v1/projects/:id/endpoints/historyHistórico por hora, até 400 diasBearer fgt_telemetry:read
GET/v1/projects/:id/compareComparar duas janelas ou releasesBearer fgt_telemetry:read
GET/v1/projects/:id/tracesLista de traces (cursor)Bearer fgt_telemetry:read
GET/v1/projects/:id/traces/:traceIdWaterfall de um traceBearer fgt_telemetry:read
GET/v1/projects/:id/databaseQueries mais lentas e frequentesBearer fgt_telemetry:read
GET/v1/projects/:id/providersChamadas externas por hostBearer fgt_telemetry:read
GET/v1/projects/:id/trafficPageviews por dia e dimensõesBearer fgt_telemetry:read
GET/v1/projects/:id/logsBusca de logs (cursor)Bearer fgt_telemetry:read
GET/v1/projects/:id/logs/histogramContagem por intervalo e nívelBearer fgt_telemetry:read
GET/v1/projects/:id/logs/facetsServiços, níveis e ambientesBearer fgt_telemetry:read
GET/v1/projects/:id/logs/tailLinhas mais novas que sinceBearer fgt_telemetry:read
GET/v1/projects/:id/issuesIssues (array, ou página com limit/cursor)Bearer fgt_issues:read
GET/v1/projects/:id/issues/:issueIdDetalhe e commits suspeitosBearer fgt_issues:read
PATCH/v1/projects/:id/issues/:issueIdTriagem: status, responsável, prioridadeBearer fgt_issues:write
GET/v1/projects/:id/releasesReleases com saúdeBearer fgt_releases:read
GET/v1/projects/:id/releases/:versionDetalhe da releaseBearer fgt_releases:read
POST/v1/projects/:id/releasesRegistrar release com tokenBearer fgt_releases:write + owner/admin
GET/v1/projects/:id/release-environmentsAmbientes com releasesBearer fgt_releases:read
GET/v1/projects/:id/sourcemapsSource maps por releaseBearer fgt_sourcemaps:read
DELETE/v1/projects/:id/sourcemaps/:releaseApagar source maps de uma releaseBearer fgt_sourcemaps:delete + owner/admin
GET / POST/v1/projects/:id/monitorsListar e criar monitoresBearer fgt_monitors:read / monitors:write + owner/admin
GET / PATCH / DELETE/v1/projects/:id/monitors/:monitorIdDetalhe, editar, excluirBearer fgt_monitors:read / write / delete
POST/v1/projects/:id/monitors/:monitorId/runRodar check HTTP agoraBearer fgt_monitors:write + owner/admin
GET / POST/v1/projects/:id/alerts/rulesRegras de alertaBearer fgt_alerts:read / alerts:write + owner/admin
PATCH / DELETE/v1/projects/:id/alerts/rules/:ruleIdEditar, excluir regraBearer fgt_alerts:write / alerts:delete
GET/v1/projects/:id/alerts/eventsAlertas disparados (cursor)Bearer fgt_alerts:read
POST/v1/projects/:id/alerts/events/:eventId/ackReconhecer alertaBearer fgt_alerts:write
GET / PATCH/v1/projects/:id/alerts/deliverySeveridade mínima por canalBearer fgt_alerts:read / alerts:write
GET / POST / PATCH / DELETE/v1/projects/:id/alerts/channels[/:channelId]Canais Slack, Discord, webhookBearer fgt_alert_channels:*
GET / POST/v1/projects/:id/slosSLOs com orçamento e queimaBearer fgt_telemetry:read / alerts:write
GET / PATCH / DELETE/v1/projects/:id/slos/:sloIdDetalhe, editar, excluir SLOBearer fgt_telemetry:read / alerts:write / alerts:delete
GET/v1/projects/:id/membersMembros do projetoBearer fgt_members:read
POST / PATCH / DELETE/v1/projects/:id/members[/:memberId]Convidar, editar, remover (envia e-mail)Bearer fgt_members:write / members:delete + owner/admin

Ingestão de spans

POST /v1/ingest recebe traces agrupados. Cada span:

Campos do span
CampoTipoRegra
traceIdstringobrigatório, 1–128 (use 32 hex para combinar com traceparent)
spanIdstringobrigatório, 1–128 (16 hex)
parentSpanIdstring | nullnull na raiz
kindstringhttp.server, db.query, http.client, custom ou browser
namestringobrigatório, até 512 (rota normalizada ou SQL normalizado)
methodstring | nullaté 16
routestring | nullaté 512
statusCodenumber | null100–599
startedAtstring ISO 8601obrigatório; número (epoch) dá 400. Até 14 dias atrás e até 5 min no futuro
endedAtstring ISO 8601obrigatório; se não bater com startedAt + durationMs (±1 s), é recalculado
durationMsnumberobrigatório, 0 a 86.400.000
attributesobjetoaté 64 KiB; serviceName, environment (ou env), release e user.id viram colunas
errorobjeto | nullaté 64 KiB, por exemplo { name, message, stack }

Resposta parcial

Erro de estrutura ou de tipo (campo obrigatório faltando, data como número) recusa o lote inteiro com 400 e nada é gravado. Um valor fora da faixa recusa só aquele span: a resposta é 202, com rejected e o motivo em errors[] (até 100 itens):

202 com um span recusado (startedAt de mais de 14 dias)
{"accepted":0,"rejected":1,"duplicates":0,"adjusted":0,"errors":[{"traceId":"cb5991b1fef1bbd8b000a0a95bdc8495","spanId":"d57234e92bc131c3","reason":"started_at_too_old"}],"issuesDetected":0,"live":false,"liveIntervalMs":60000}

Motivos: started_at_too_old, started_at_in_future, ended_at_in_future, status_code_out_of_range, duration_out_of_range, attributes_too_large, error_too_large e public_key_not_allowed. Span recusado não deve ser reenviado igual.

Idempotência

Um span é identificado por projeto, traceId e spanId. Reenviar o mesmo span responde accepted: 1, duplicates: 1 e não grava de novo, então é seguro repetir um lote depois de timeout ou 5xx. Logs, pageviews e agregados de infra usam o id do emissor (eventId, event_id, id, de 8 a 128 caracteres) e são deduplicados por 48 horas; sem id, cada envio grava.

Exemplos com curl

Variáveis usadas em todos os exemplos:

terminal
export FG_TRACKER_URL=https://tracker-api.fortground.com.br
export FG_TRACKER_KEY=fgsk_<chave_de_servidor>        # ingestão do servidor
export FG_TRACKER_TOKEN=fgt_<token_pessoal>           # leitura e automação
export FG_TRACKER_PROJECT_ID=<uuid_do_projeto>        # aparece na URL do painel: ?project=…

Enviar um span

terminal
TRACE_ID=$(openssl rand -hex 16)
SPAN_ID=$(openssl rand -hex 8)
NOW=$(date -u +%Y-%m-%dT%H:%M:%SZ)

curl -sS -X POST "$FG_TRACKER_URL/v1/ingest" \
  -H 'content-type: application/json' \
  -H "x-fg-tracker-key: $FG_TRACKER_KEY" \
  -d '{"traces":[{"traceId":"'"$TRACE_ID"'","spans":[{
        "spanId":"'"$SPAN_ID"'","parentSpanId":null,"kind":"http.server",
        "name":"GET /hello/:name","method":"GET","route":"/hello/:name","statusCode":200,
        "startedAt":"'"$NOW"'","endedAt":"'"$NOW"'","durationMs":12,
        "attributes":{"serviceName":"checkout-api","environment":"development"},"error":null}]}]}'
202
{"accepted":1,"rejected":0,"duplicates":0,"adjusted":0,"errors":[],"issuesDetected":0,"live":false,"liveIntervalMs":60000}

Ler o trace enviado

terminal (mesma sessão do exemplo anterior)
curl -sS "$FG_TRACKER_URL/v1/projects/$FG_TRACKER_PROJECT_ID/traces/$TRACE_ID" \
  -H "authorization: Bearer $FG_TRACKER_TOKEN"

A resposta traz o trace com spans[] (cada um com offsetMs, depth, service e environment). A lista recente:

terminal
curl -sS "$FG_TRACKER_URL/v1/projects/$FG_TRACKER_PROJECT_ID/traces?range=1h&limit=5" \
  -H "authorization: Bearer $FG_TRACKER_TOKEN"

Saúde da ingestão

terminal
curl -sS "$FG_TRACKER_URL/v1/projects/$FG_TRACKER_PROJECT_ID/ingest-health?range=1h" \
  -H "authorization: Bearer $FG_TRACKER_TOKEN"

Mostra lastReceivedAt, o atraso entre o fim do span e a gravação (lagMs), quantos spans foram aceitos, duplicados e recusados por motivo, com a última recusa. É o primeiro lugar para olhar quando nada aparece no painel.

Logs

terminal
curl -sS -X POST "$FG_TRACKER_URL/v1/logs" \
  -H 'content-type: application/json' \
  -H "x-fg-tracker-key: $FG_TRACKER_KEY" \
  -d '{"logs":[{"eventId":"'"$(openssl rand -hex 16)"'","level":"info","service":"checkout-api",
        "env":"development","message":"pedido criado","context":{"orderId":42}}]}'
202
{"accepted":1,"duplicates":0}

Até 500 linhas por lote; level é trace, debug, info, warn, error ou fatal; ts é opcional (padrão: agora); mensagem até 32 KB e context até 8 KB.

Release

terminal
curl -sS -X POST "$FG_TRACKER_URL/v1/releases" \
  -H 'content-type: application/json' \
  -H "x-fg-tracker-key: $FG_TRACKER_KEY" \
  -d '{"version":"checkout-api@1.4.0","environment":"development","commitSha":"<sha_do_commit>"}'

Responde 201 com a release. Repetir com a mesma version atualiza a existente.

Check-in de job

crontab ou fim do script
curl -sS "$FG_TRACKER_URL/v1/monitors/backup-diario/ping?status=ok&environment=development" \
  -H "x-fg-tracker-key: $FG_TRACKER_KEY"

O primeiro check-in cria o monitor do slug no ambiente informado. status aceita ok, fail e in_progress. A chave de servidor vai no header; em ?key= ela é recusada.

Limites, 413 e 429

  • Corpo JSON até 2 MiB depois de descomprimir (Content-Encoding: gzip é aceito). Acima disso: 413; divida o lote. Os SDKs mandam no máximo 1,5 MiB e 1000 spans por lote.
  • Por lote: até 2000 traces, 5000 spans por trace, 500 pageviews e 500 agregados de infra.
  • A API pode limitar a vazão de ingestão por projeto. Quando isso acontece: 429 com Retry-After (segundos) e code: INGEST_QUOTA_EXCEEDED, sem gravar nada; reenvie o mesmo lote depois do prazo. Um lote maior que a rajada permitida recebe 413 com code: INGEST_BATCH_EXCEEDS_QUOTA. Os SDKs a partir de fg-tracker-sdk 0.10.0, fg-tracker-browser 0.3.0 e fg-tracker-lambda-extension 0.2.0 já tratam os dois casos.
  • Spans ficam 14 dias, logs 7 dias; o histórico por hora de cada rota, até 400 dias.

Leitura: janelas, filtros e paginação

  • Janela: range = 15m, 1h, 6h, 24h (padrão), 7d ou 30d; ou from/to em ISO 8601, com no máximo 31 dias. Com janela absoluta, a resposta traz o header x-fg-tracker-window com a janela aplicada.
  • Filtros de métricas e traces: rootKind = http (padrão), custom (jobs), browser ou all; service e env comparam por igualdade exata com o span raiz.
  • O filtro de ambiente se chama env em métricas, traces e logs, e environment em monitores, releases e SLOs.
  • Paginação por cursor: traces (padrão 50, máximo 200), logs (100/200), alerts/events (50/200) e issues (50/200). Passe o nextCursor da resposta em cursor; null é o fim. Sem limit nem cursor, issues devolve o array completo (formato antigo).
  • Listas sem paginação: projetos, endpoints, monitores, membros, regras de alerta, SLOs e source maps.

Erros

Erros simples vêm como { statusCode, message, error }. Erros com code trazem o code e a message (e, às vezes, campos extras), sem statusCode; use o status HTTP da resposta.

Erros comuns
StatusCorpo (resumo)Causa e ação
400message: ["traces.0.spans.0.startedAt must be a valid ISO 8601 date string"]Estrutura ou tipo inválido; nada gravado. Corrija e reenvie.
401message: "Header x-fg-tracker-key ausente" / "API key inválida"Chave ausente, errada ou rotacionada.
401code: SERVER_KEY_IN_URLfgsk_ em ?key=. Mande no header e rotacione a chave.
401message: "Token pessoal (fgt_…) não é chave de projeto…"Token no header de chave.
401message: "Sessão ausente. Entre para continuar"Rota de leitura sem Authorization.
401message: "Token pessoal inválido, expirado ou revogado…"Crie outro token.
403code: TOKEN_SCOPE_INSUFFICIENT, requiredScopeFalta a permissão indicada (ou a operação é só do painel: sessionOnly).
403code: PROJECT_ACCESS_DENIEDNão é membro ativo do projeto.
403code: PROJECT_ROLE_INSUFFICIENTPapel insuficiente (viewer em operação de owner/admin).
403code: PUBLIC_KEY_NOT_ALLOWED, capabilitystk_ restrita em rota de servidor; use fgsk_.
403code: EMAIL_VERIFICATION_REQUIREDConfirme o e-mail da conta.
409code: SERVER_KEY_REQUIREDRestringir a stk_ sem ter gerado a fgsk_.
413message: "request entity too large"Corpo acima de 2 MiB; divida.
429code: INGEST_QUOTA_EXCEEDED, retryAfterSecondsEspere o Retry-After e reenvie o mesmo lote.
403 de exemplo (token sem a permissão)
{"code":"TOKEN_SCOPE_INSUFFICIENT","message":"Falta a permissão \"Chave de ingestão: ler\" neste token. Edite as permissões em Conta → Tokens de acesso","requiredScope":"ingest_key:read","requiredPermission":"Chave de ingestão: ler","sessionOnly":false}

Rotas internas e estabilidade

A API ainda não tem uma política de versionamento publicada. O prefixo /v1 e as rotas desta página são as que integrações devem usar; mudanças nelas aparecem nesta documentação. Não construa integrações sobre as demais rotas que aparecem na referência OpenAPI:

  • Rotas do painel: login, cadastro, MFA, sessões, criação de tokens, convites, WhatsApp, IA em streaming e o diagrama ao vivo. Exigem a sessão do painel e podem mudar com ele.
  • Rotas de operação: /v1/internal/*, o tick de alertas, webhooks de eventos da AWS e o relatório do executor de teste de carga. Exigem segredos da operação e não são para clientes.
  • Infraestrutura AWS e testes de carga (/v1/projects/:id/infra/*, /v1/projects/:id/loadtest/*): aceitam token, mas são usadas pelo painel e pelo MCP e não estão documentadas aqui. Use pelo MCP.