INFINIVIEW/
DocsReferenceAPI contracts

API reference

Every API route a user can call. Authentication uses the dashboard session unless noted.

Note
Authentication uses the dashboard session unless an endpoint is explicitly marked otherwise. The GitHub webhook receiver verifies signatures from GitHub and rejects anything else. Rate limits are per-user per bucket. All annotated rate limits use the format N/Ws — N requests per W seconds.

Conventions

  • Base URL. All endpoints are relative to https://app.infiniview.dev.
  • Content type. Request and response bodies are JSON unless the endpoint advertises another type — CSV exports return text/csv, live progress streams return text/event-stream.
  • Authentication. Endpoints use the dashboard session cookie. Two endpoints are public: GET /api/health and POST /api/validate-infiniview-yml.
  • Idempotency. Mutations are not idempotent unless an endpoint says so. The GitHub webhook receiver deduplicates by X-GitHub-Delivery.
  • Timestamps. ISO 8601 in UTC, ending with Z.

Errors

Error responses share a single shape. The code is stable, the message is human-readable, and details may carry field-level validation errors.

{
  "error": {
    "code": "validation_failed",
    "message": "Invalid request body.",
    "details": {
      "branch": ["must be a non-empty string"]
    }
  }
}
StatusWhen
400Request body or query parameters failed validation.
401Session missing or expired. Sign in again from the dashboard.
403You don’t own the requested resource, or the capability is gated by plan.
404Resource doesn’t exist or isn’t visible to you.
409State conflict — for example, asking for a run CSV before the run reaches a terminal status.
422Request was well-formed but referenced unknown scanner IDs or invalid threshold values.
429Bucket exhausted. See the Retry-After header.
5xxServer-side error. The dashboard surfaces a banner; retries are safe for idempotent reads.

Pagination

List endpoints accept ?page (1-indexed) and ?perPage. Defaults and caps vary by endpoint:

ResourceDefaultMax
Scan runs20100
Findings20500
Suppressions20100
Reviews20100

Responses include page, perPage, total, and a hasMore flag where applicable.

Rate limits

Limits are per signed-in user, per route bucket. When a bucket is exhausted, the API returns 429 with a Retry-After header containing the number of seconds before another request will succeed. Bucketed endpoints are flagged in the tables below — anything without a rate-limit note shares the global account quota.

  • 5/60s — review creation, billing checkout.
  • 10/60s — reruns, repo-secret writes, suppression deletes.

Health

Public health probe. Returns 200 with status ok or 503 with status degraded.

GET/api/health

GitHub

OAuth handshake, repo discovery, and the signed webhook receiver.

GET/api/github/connectredirects to GitHub OAuth
GET/api/github/callbackhandled by Infiniview
DELETE/api/github/disconnect
GET/api/github/repos?page, ?q
POST/api/github/webhooksignature-verified

Reviews

Manage reviews and trigger reruns. DELETE archives by default; hard-delete is available in dev mode.

GET/api/reviews
POST/api/reviews{ repoFullName, branch? } · 5/60s
GET/api/reviews/{id}?includeOverviewStats=1
PATCH/api/reviews/{id}{ name }
DELETE/api/reviews/{id}?mode=hard-delete (dev only)
POST/api/reviews/{id}/rerun10/60s

Scan runs

Listing is paginated (default 20 per page, max 100). Live progress is delivered as Server-Sent Events.

GET/api/scan-runs?scope=active|archived|all
GET/api/scan-runs/{id}/progress
GET/api/scan-runs/{id}/livetext/event-stream
GET/api/scan-runs/{id}/csv
GET/api/scan-runs/{id}/compare
GET/api/scan-runs/{id}/trust

Findings

Listing is paginated (default 20, max 500) with filters: severity, category, exploitability, sourcePhase, reviewId, scanRunId, repoFullName, scope, q.

GET/api/security-findings
GET/api/security-findings/{id}/replay
GET/api/security-findings/{id}/bundle
GET/api/security-findings/export?scope, ?reviewId, ?scanRunId

Configuration

Scan configuration is gated by an account-level capability. The validation endpoint is unauthenticated.

GET/api/scan-config
PUT/api/scan-config
POST/api/validate-infiniview-ymlno auth
GET/api/settings
PUT/api/settings
GET/api/repo-secrets?repoFullName
POST/api/repo-secrets{ repoFullName, key, value } · 10/60s
DELETE/api/repo-secrets{ id } · 10/60s

Suppressions

Listing is paginated (max 100/page) with optional filters scope, repoFullName, search.

GET/api/finding-suppressions
POST/api/finding-suppressions{ query, scope, reviewId?, scanRunId?, repoFullName? }
DELETE/api/finding-suppressions/{id}10/60s

Billing

Plan status and checkout. The dashboard launches checkout via an in-app overlay.

GET/api/billing/status
POST/api/billing/checkout-session{ planKey } · 5/60s