FixWeb

// 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.

Autentikasi

Setiap request harus membawa token bearer di header Authorization. Token diterbitkan dari Account โ†’ API tokens; plaintext ditampilkan kepadamu tepat sekali saat dibuat. Mencabut token mengembalikan 401 pada panggilan berikutnya.

bash
curl -H "Authorization: Bearer fxw_..." \
  https://fixweb.app/api/v1/scans

Format token: fxw_ diikuti 43 karakter base64url. Disimpan saat rest sebagai hash SHA-256; plaintext tidak pernah dipersistenkan di sisi server.

Batas laju

Dua window pada setiap request terautentikasi: burst 10 req/detik dan steady 60 req/menit, keduanya dikunci pada hash bearer. Penegakan kuota (batas pemindaian per bulan) dilapiskan di atasnya โ€” lihat Kuota & batas.

Paginasi

Endpoint daftar (/api/v1/scans, /api/v1/findings) memakai paginasi berbasis kursor yang dikunci pada (created_at, id) dalam urutan menurun. Kirim ?cursor=<next_cursor> untuk mengambil halaman berikutnya. Kursor tetap benar di bawah penulisan bersamaan (tanpa skew OFFSET).

Bentuk error

Setiap error adalah objek JSON dengan setidaknya key error.

jsonc
{ "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": [...] }             // 400

Endpoint

Mulai pemindaian

POST/api/v1/scans

Enqueues 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"}'

// respons 200

{
  "id": "8f1c4e2a-8c3a-4b6f-9c0d-9b1e8f3c2a4d",
  "status": "queued",
  "target": "https://staging.example.com",
  "mode": "passive"
}

Daftar pemindaian kamu

GET/api/v1/scans

Mengembalikan pemindaian untuk org yang terikat ke token pemanggil, terbaru dulu. Paginasikan dengan ?cursor=. Limit default 50, maks 100.

curl -H "Authorization: Bearer fxw_..." \
  "https://fixweb.app/api/v1/scans?limit=25"

// respons 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-..."
}

Ambil pemindaian

GET/api/v1/scans/{scanId}

Mengembalikan envelope pemindaian + ringkasan severity per kategori secara default. Kirim ?include_findings=true untuk mendapatkan laporan penuh (besar untuk pemindaian yang ramai โ€” lebih baik gunakan endpoint findings dengan filter).

curl -H "Authorization: Bearer fxw_..." \
  https://fixweb.app/api/v1/scans/8f1c4e2a-8c3a-4b6f-9c0d-9b1e8f3c2a4d

Daftar temuan

GET/api/v1/findings

Filterable 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"

// respons 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
}

Spesifikasi OpenAPI

Spesifikasi yang dapat dibaca mesin di /docs/api/openapi (text/yaml). Masukkan ke codegen favoritmu (openapi-typescript, openapi-python-client, atau toolchain OpenAPI 3.1 apa pun) untuk klien bertipe.

REST API โ€” Docs ยท FixWeb