// docs / rest api
REST API
Bearer-authenticated JSON API for passive scan automation, scan status, and findings. Cursor-paginated, rate-limited, and shipped with a machine-readable OpenAPI spec for client codegen. Active scans stay in the dashboard UI for ownership attestation.
Autenticação
Cada requisição deve carregar um token bearer no header Authorization. Tokens são emitidos em Conta → Tokens de API; o texto simples é mostrado a você exatamente uma vez na criação. Revogar um token retorna 401 na próxima chamada.
curl -H "Authorization: Bearer fxw_..." \
https://fixweb.app/api/v1/scansFormato do token: fxw_ seguido de 43 caracteres base64url. Armazenado em repouso como hash SHA-256; o texto simples nunca é persistido no servidor.
Limites de taxa
Duas janelas em cada requisição autenticada: burst de 10 req/s e estado estável de 60 req/min, ambas indexadas pelo hash bearer. A aplicação de cota (limites de varredura por mês) é adicionada por cima — veja Cotas e limites.
Paginação
Endpoints de listagem (/api/v1/scans, /api/v1/findings) usam paginação baseada em cursor indexada por (created_at, id) em ordem descendente. Passe ?cursor=<next_cursor> para buscar a próxima página. O cursor continua correto sob escritas concorrentes (sem desvio de OFFSET).
Formatos de erro
Todo erro é um objeto JSON com pelo menos uma chave error.
{ "error": "invalid_token" } // 401
{ "error": "forbidden" } // 403
{ "error": "not_found" } // 404
{ "error": "quota_exceeded", "quota": {...} } // 429
{ "error": "rate_limited", "retry_after_seconds": 47 } // 429
{ "error": "invalid_input", "issues": [...] } // 400Endpoints
Iniciar uma varredura
/api/v1/scansEnqueues a passive scan. Returns immediately with a queued scan id; poll GET /api/v1/scans/[scanId] until status === "completed". Owner-depth mode is not exposed — see Scan types for the attestation-flow rationale.
curl -X POST https://fixweb.app/api/v1/scans \
-H "Authorization: Bearer fxw_..." \
-H "content-type: application/json" \
-d '{"target":"https://staging.example.com"}'// resposta 200
{
"id": "8f1c4e2a-8c3a-4b6f-9c0d-9b1e8f3c2a4d",
"status": "queued",
"target": "https://staging.example.com",
"mode": "passive"
}Listar suas varreduras
/api/v1/scansRetorna varreduras da org vinculada ao token chamador, mais recentes primeiro. Pagine com ?cursor=. Limite padrão 50, máximo 100.
curl -H "Authorization: Bearer fxw_..." \
"https://fixweb.app/api/v1/scans?limit=25"// resposta 200
{
"scans": [
{
"id": "8f1c4e2a-...",
"target_url": "https://staging.example.com",
"target_hostname": "staging.example.com",
"mode": "passive",
"status": "completed",
"started_at": "2026-05-07T14:00:00Z",
"completed_at": "2026-05-07T14:00:23Z",
"findings_count": { "critical": 1, "high": 3, "medium": 7, "low": 2, "info": 4 },
"triggered_by": "api",
"created_at": "2026-05-07T14:00:00Z"
}
],
"next_cursor": "2026-05-07T14:00:00Z:8f1c4e2a-..."
}Obter uma varredura
/api/v1/scans/{scanId}Retorna o envelope da varredura + resumo de severidade por categoria por padrão. Passe ?include_findings=true para obter o relatório completo (grande para varreduras ruidosas — prefira o endpoint de findings com filtros).
curl -H "Authorization: Bearer fxw_..." \
https://fixweb.app/api/v1/scans/8f1c4e2a-8c3a-4b6f-9c0d-9b1e8f3c2a4dListar findings
/api/v1/findingsFilterable findings list across every scan in the caller's org. Filters: severity=critical,high, check_id=performance.delivery, since=2026-04-01T00:00:00Z. Cursor-paginated.
curl -H "Authorization: Bearer fxw_..." \
"https://fixweb.app/api/v1/findings?severity=critical,high&limit=50"// resposta 200
{
"findings": [
{
"id": "...",
"scan_id": "...",
"check_id": "secrets.js-bundle-sweep",
"severity": "critical",
"title": "Supabase service role key exposed in JS bundle",
"description": "...",
"evidence": { ... },
"remediation": "...",
"cwe_id": "CWE-798",
"created_at": "2026-05-07T14:00:23Z"
}
],
"next_cursor": null
}Spec OpenAPI
Spec legível por máquina em /docs/api/openapi (text/yaml). Coloque no seu codegen favorito (openapi-typescript, openapi-python-client ou qualquer toolchain OpenAPI 3.1) para clientes tipados.
