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
| Rotas | Credencial | Header |
|---|---|---|
| Ingestão (enviar dados) | chave de projeto: fgsk_ no servidor, stk_ no navegador | x-fg-tracker-key: fgsk_… |
| Leitura e automação | token pessoal fgt_ | Authorization: Bearer fgt_… |
GET /v1/health | nenhuma | — |
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)
| Método | Caminho | Para quê | Autenticação | Permissão |
|---|---|---|---|---|
POST | /v1/ingest | Spans, pageviews e agregados de infra | chave de projeto | fgsk_; stk_ só eventos de navegador no modo restrito |
POST | /v1/logs | Linhas de log (até 500 por lote) | chave de projeto | fgsk_ (stk_ só no modo legado) |
POST | /v1/releases | Registrar release no deploy | chave de projeto | fgsk_ (stk_ só no modo legado) |
POST | /v1/sourcemaps | Enviar source maps do front | chave de projeto | fgsk_ (stk_ só no modo legado) |
POST | /v1/monitors/:slug/checkin | Check-in de job com corpo JSON | chave de projeto | fgsk_ (stk_ só no modo legado) |
GET | /v1/monitors/:slug/ping | Check-in por GET (crontab) | chave de projeto | fgsk_ 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.
| Método | Caminho | Para quê | Autenticação | Permissão |
|---|---|---|---|---|
GET | /v1/auth/me | Quem é o token e quais permissões tem | Bearer fgt_ | qualquer |
GET | /v1/projects | Projetos em que você é membro | Bearer fgt_ | projects:read |
POST | /v1/projects | Criar projeto | Bearer fgt_ | projects:write (token sem restrição de projeto) |
GET | /v1/projects/:id | Detalhe do projeto | Bearer fgt_ | projects:read |
PATCH | /v1/projects/:id | Nome, limiares, domínios permitidos | Bearer fgt_ | projects:write + owner/admin |
GET | /v1/projects/:id/ingest-keys | Chaves stk_/fgsk_, modo e uso | Bearer fgt_ | ingest_key:read + owner/admin |
PATCH | /v1/projects/:id/ingest-keys | Modo legado ou restrito da stk_ | Bearer fgt_ | ingest_key:write + owner/admin |
POST | /v1/projects/:id/ingest-keys/server | Gerar ou rotacionar a fgsk_ | Bearer fgt_ | ingest_key:write + owner/admin |
POST | /v1/projects/:id/rotate-key | Rotacionar a stk_ | Bearer fgt_ | ingest_key:write + owner/admin |
GET | /v1/projects/:id/ingest-health | Últimos recebidos, recusas por motivo, atraso | Bearer fgt_ | telemetry:read |
GET | /v1/projects/:id/overview | Requisições, erros e percentis da janela | Bearer fgt_ | telemetry:read |
GET | /v1/projects/:id/endpoints | Endpoints e jobs com percentis | Bearer fgt_ | telemetry:read |
GET | /v1/projects/:id/endpoints/detail | Um endpoint (?name=) | Bearer fgt_ | telemetry:read |
GET | /v1/projects/:id/endpoints/history | Histórico por hora, até 400 dias | Bearer fgt_ | telemetry:read |
GET | /v1/projects/:id/compare | Comparar duas janelas ou releases | Bearer fgt_ | telemetry:read |
GET | /v1/projects/:id/traces | Lista de traces (cursor) | Bearer fgt_ | telemetry:read |
GET | /v1/projects/:id/traces/:traceId | Waterfall de um trace | Bearer fgt_ | telemetry:read |
GET | /v1/projects/:id/database | Queries mais lentas e frequentes | Bearer fgt_ | telemetry:read |
GET | /v1/projects/:id/providers | Chamadas externas por host | Bearer fgt_ | telemetry:read |
GET | /v1/projects/:id/traffic | Pageviews por dia e dimensões | Bearer fgt_ | telemetry:read |
GET | /v1/projects/:id/logs | Busca de logs (cursor) | Bearer fgt_ | telemetry:read |
GET | /v1/projects/:id/logs/histogram | Contagem por intervalo e nível | Bearer fgt_ | telemetry:read |
GET | /v1/projects/:id/logs/facets | Serviços, níveis e ambientes | Bearer fgt_ | telemetry:read |
GET | /v1/projects/:id/logs/tail | Linhas mais novas que since | Bearer fgt_ | telemetry:read |
GET | /v1/projects/:id/issues | Issues (array, ou página com limit/cursor) | Bearer fgt_ | issues:read |
GET | /v1/projects/:id/issues/:issueId | Detalhe e commits suspeitos | Bearer fgt_ | issues:read |
PATCH | /v1/projects/:id/issues/:issueId | Triagem: status, responsável, prioridade | Bearer fgt_ | issues:write |
GET | /v1/projects/:id/releases | Releases com saúde | Bearer fgt_ | releases:read |
GET | /v1/projects/:id/releases/:version | Detalhe da release | Bearer fgt_ | releases:read |
POST | /v1/projects/:id/releases | Registrar release com token | Bearer fgt_ | releases:write + owner/admin |
GET | /v1/projects/:id/release-environments | Ambientes com releases | Bearer fgt_ | releases:read |
GET | /v1/projects/:id/sourcemaps | Source maps por release | Bearer fgt_ | sourcemaps:read |
DELETE | /v1/projects/:id/sourcemaps/:release | Apagar source maps de uma release | Bearer fgt_ | sourcemaps:delete + owner/admin |
GET / POST | /v1/projects/:id/monitors | Listar e criar monitores | Bearer fgt_ | monitors:read / monitors:write + owner/admin |
GET / PATCH / DELETE | /v1/projects/:id/monitors/:monitorId | Detalhe, editar, excluir | Bearer fgt_ | monitors:read / write / delete |
POST | /v1/projects/:id/monitors/:monitorId/run | Rodar check HTTP agora | Bearer fgt_ | monitors:write + owner/admin |
GET / POST | /v1/projects/:id/alerts/rules | Regras de alerta | Bearer fgt_ | alerts:read / alerts:write + owner/admin |
PATCH / DELETE | /v1/projects/:id/alerts/rules/:ruleId | Editar, excluir regra | Bearer fgt_ | alerts:write / alerts:delete |
GET | /v1/projects/:id/alerts/events | Alertas disparados (cursor) | Bearer fgt_ | alerts:read |
POST | /v1/projects/:id/alerts/events/:eventId/ack | Reconhecer alerta | Bearer fgt_ | alerts:write |
GET / PATCH | /v1/projects/:id/alerts/delivery | Severidade mínima por canal | Bearer fgt_ | alerts:read / alerts:write |
GET / POST / PATCH / DELETE | /v1/projects/:id/alerts/channels[/:channelId] | Canais Slack, Discord, webhook | Bearer fgt_ | alert_channels:* |
GET / POST | /v1/projects/:id/slos | SLOs com orçamento e queima | Bearer fgt_ | telemetry:read / alerts:write |
GET / PATCH / DELETE | /v1/projects/:id/slos/:sloId | Detalhe, editar, excluir SLO | Bearer fgt_ | telemetry:read / alerts:write / alerts:delete |
GET | /v1/projects/:id/members | Membros do projeto | Bearer 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:
| Campo | Tipo | Regra |
|---|---|---|
traceId | string | obrigatório, 1–128 (use 32 hex para combinar com traceparent) |
spanId | string | obrigatório, 1–128 (16 hex) |
parentSpanId | string | null | null na raiz |
kind | string | http.server, db.query, http.client, custom ou browser |
name | string | obrigatório, até 512 (rota normalizada ou SQL normalizado) |
method | string | null | até 16 |
route | string | null | até 512 |
statusCode | number | null | 100–599 |
startedAt | string ISO 8601 | obrigatório; número (epoch) dá 400. Até 14 dias atrás e até 5 min no futuro |
endedAt | string ISO 8601 | obrigatório; se não bater com startedAt + durationMs (±1 s), é recalculado |
durationMs | number | obrigatório, 0 a 86.400.000 |
attributes | objeto | até 64 KiB; serviceName, environment (ou env), release e user.id viram colunas |
error | objeto | null | até 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):
{"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:
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
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}]}]}'{"accepted":1,"rejected":0,"duplicates":0,"adjusted":0,"errors":[],"issuesDetected":0,"live":false,"liveIntervalMs":60000}Ler o trace enviado
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:
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
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
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}}]}'{"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
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
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:
429comRetry-After(segundos) ecode: INGEST_QUOTA_EXCEEDED, sem gravar nada; reenvie o mesmo lote depois do prazo. Um lote maior que a rajada permitida recebe413comcode: INGEST_BATCH_EXCEEDS_QUOTA. Os SDKs a partir defg-tracker-sdk0.10.0,fg-tracker-browser0.3.0 efg-tracker-lambda-extension0.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),7dou30d; oufrom/toem ISO 8601, com no máximo 31 dias. Com janela absoluta, a resposta traz o headerx-fg-tracker-windowcom a janela aplicada. - Filtros de métricas e traces:
rootKind=http(padrão),custom(jobs),browserouall;serviceeenvcomparam por igualdade exata com o span raiz. - O filtro de ambiente se chama
envem métricas, traces e logs, eenvironmentem monitores, releases e SLOs. - Paginação por cursor:
traces(padrão 50, máximo 200),logs(100/200),alerts/events(50/200) eissues(50/200). Passe onextCursorda resposta emcursor;nullé o fim. Semlimitnemcursor,issuesdevolve 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.
| Status | Corpo (resumo) | Causa e ação |
|---|---|---|
400 | message: ["traces.0.spans.0.startedAt must be a valid ISO 8601 date string"] | Estrutura ou tipo inválido; nada gravado. Corrija e reenvie. |
401 | message: "Header x-fg-tracker-key ausente" / "API key inválida" | Chave ausente, errada ou rotacionada. |
401 | code: SERVER_KEY_IN_URL | fgsk_ em ?key=. Mande no header e rotacione a chave. |
401 | message: "Token pessoal (fgt_…) não é chave de projeto…" | Token no header de chave. |
401 | message: "Sessão ausente. Entre para continuar" | Rota de leitura sem Authorization. |
401 | message: "Token pessoal inválido, expirado ou revogado…" | Crie outro token. |
403 | code: TOKEN_SCOPE_INSUFFICIENT, requiredScope | Falta a permissão indicada (ou a operação é só do painel: sessionOnly). |
403 | code: PROJECT_ACCESS_DENIED | Não é membro ativo do projeto. |
403 | code: PROJECT_ROLE_INSUFFICIENT | Papel insuficiente (viewer em operação de owner/admin). |
403 | code: PUBLIC_KEY_NOT_ALLOWED, capability | stk_ restrita em rota de servidor; use fgsk_. |
403 | code: EMAIL_VERIFICATION_REQUIRED | Confirme o e-mail da conta. |
409 | code: SERVER_KEY_REQUIRED | Restringir a stk_ sem ter gerado a fgsk_. |
413 | message: "request entity too large" | Corpo acima de 2 MiB; divida. |
429 | code: INGEST_QUOTA_EXCEEDED, retryAfterSeconds | Espere o Retry-After e reenvie o mesmo lote. |
{"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.