Skip to main content
Before you run these examples, select your deployment API address. Set VIDOC_API_URL without a trailing slash or /v1, and keep the key in VIDOC_API_KEY. Example dashboard URLs below use https://app.vidoc.dev. The API returns links with the web app host configured for your deployment. The Issues API gives programmatic access to the validated security issues of one project: list them, read one issue with its detail fields, get its fix prompt, and change its status one at a time or in bulk.
The API key names the project. Every route reads and writes that project only, so there is no projectId parameter. For a second project, create a second key. See API Authentication.
If a route on this page answers 404 Cannot GET /v1/issues, the API you call runs a release that does not have the Issues API yet. The older route GET /v1/codebase/:codebaseId/issues?branchName=main keeps working; see Legacy Route.
Find repository IDs with List Codebases.

List Issues

Endpoint

Requires issue:view. Lists the validated issues of the project, most severe first. The API returns true positives only: findings that validation marked as false positives, or that validation has not finished, never appear. Without codebaseId, every repository of the project contributes its default branch.

Query Parameters

Unknown query parameters return 400 with code: unknown_parameter. There is no category filter. Filter by category on the client after the read. The scanId filter reads current issue records. It is not a historical snapshot: later scans and triage actions can change these records. Use updatedAfter with status=all for synchronization. The time comparison is inclusive; de-duplicate records by instanceId when you repeat a timestamp. Sorting notes:
  • The list keeps the order of the dashboard. When the project has triage priorities, issues come in priority order first, and sort and dir order the issues inside each priority group. sort=severity&dir=asc can therefore return high before medium.
  • sort=category orders by the platform’s category order, not alphabetically, and ignores dir.

Example Request

Response

This example shows one issue; additional rows are omitted.
  • total counts the issues that pass the filters, not the rows in this page. To read the next page, add limit to offset.
  • stats.severityCounts counts the issues that pass every filter, by severity.
  • stats.statusCounts counts the issues that pass the other filters, by status, so you see how many issues are ignored or closed while you list the open ones.
  • stats.triage is null without a triage view. Otherwise, hiddenByPolicy counts issues hidden by the triage policy. The list and its severity counts use that policy.

Get Issue Details

Endpoint

Requires issue:view. instanceId is the instanceId of a list row.

Example Request

Response

Every field of a list row, plus the detail fields validationVerdict, validationReason, attackVector, statusChangedBy, fileId and snippet:
Two gates apply:
  • 404 for an issue you must not see. The API answers 404 Issue not found when the instance is not in the key’s project, when it is deleted, and when it belongs to an experiment pull request. The answer is the same as for an unknown ID.
  • Teaser redaction. An organization in the onboarding teaser sees a small part of the scan. For a redacted issue, tldr, statusReason, validationReason and snippet hold the notice Unlock the full Vidoc report to view this finding detail. The other fields keep their values.

Get the Fix Prompt

Endpoint

Requires issue:view. Returns the same text as the Copy fix prompt button in the dashboard. Give the prompt to a coding agent to start the fix. The 404 rules of GET /v1/issues/:instanceId apply.

Response

The prompt has the sections /goal, /context, /code, /fix and /done-when. The /code section holds the source lines with a gutter; line numbers in the prompt start at 1.

Update Issue Status

Endpoint

Requires issue:update_status (roles developer, security_engineer, admin) and a key that belongs to a user. Keys created in the dashboard qualify; system, GitHub and legacy tokens get 403 Status changes need a user API key.

Request Body

Effects, in this order:
  1. The API writes the row: status, statusReason, statusChangedBy (the user of the key), statusChangedAt, and fixedAt for closed.
  2. When status is ignored and a reason is present, a learning workflow starts. The learning changes how later scans judge similar code, so write a reason that says why the code is safe or why the team accepts the risk.

Close an Issue

Ignore an Issue

Reopen an Issue

Response

learningWorkflowId is null when no learning workflow starts (every status other than ignored).
The call is not idempotent for the learning. A second call with the same body writes the same row but starts a second learning workflow. Send the request one time per verdict.
statusChangedAt in this response has millisecond precision. The stored value is truncated to the second, so a later GET of the same issue returns 2026-09-18T12:00:00.000Z for this change. Compare timestamps at second precision.

Update Many Issues (Bulk)

Endpoint

Same permission and user-key rule as the single update. Use it to triage a filtered list.

Request Body

Each item runs on its own: the items share no transaction, a failed item does not stop the others, and the API runs 4 items at a time.

Response

200, with one result per item, in the order of the input:
The route answers 200 always, also when every item fails. Read summary.failed, then the items with ok: false. A failed item has a code: issue_not_found for an unknown issue, internal_error for any other failure. Validation of the body itself (an empty array, more than 100 items, a duplicate ID, an invalid status) fails the whole request with 400.

Field Reference

Summary Fields

These fields are in each row of GET /v1/issues and in the response of GET /v1/issues/:instanceId.

Detail Fields

GET /v1/issues/:instanceId adds these fields.

Line Numbers

line, rangeStart and rangeEnd are zero-based line indexes, as the platform stores them. The dashboard shows line + 1. Add 1 before you show a line number to a person.

Status Values

status is the value the platform stores:
  • fixed: a scan automatically resolved the issue. This value is still used for new scan results.
  • closed: a user closed the issue, or revalidation no longer confirmed it.
The web app shows both as Closed. Use status=fixed to select automatic resolutions only, or status=closed to select both values. Status-update requests do not accept fixed; a user sends closed instead. Refer to Finding lifecycle.

Issue Categories

category holds one of these values:
See Security Categories for what each category means.

Pagination

For large result sets, use total to drive pagination:

Filtering Examples

Critical and High Open Issues

By Repository and Branch

By File Path

Every State, Newest First

Ignored Issues of One Repository

Errors

See API Authentication for the body shape.

Legacy Route

GET /v1/codebase/:codebaseId/issues?branchName=main is the older route that feeds the vidoc CLI. It needs branchName, pages with page and pageSize (maximum 500), and returns a different shape: issues[] with a nested issue object, stats, and pagination. It stays available, but use GET /v1/issues for new work.

Limits, and What Is Not Here Yet

  • No rate limiting. The API does not count your requests today. Keep bulk requests at 100 items or fewer and do not run many at the same time.
  • No dedicated pull request route. Find a PR scan with GET /v1/scans?type=pull_request, then use its codebaseId, branch, and scanId to filter issues. The response is current state, not an immutable PR review.
  • No category filter. Filter on the client.
  • No webhooks. There is no event subscription. Poll with status=all&sort=updatedAt&dir=asc&updatedAfter=<timestamp>. Read every page and de-duplicate by instanceId at the inclusive timestamp boundary.
  • No OpenAPI document and no SDK. This page is the contract.

API Authentication

Authentication setup

Scanning API

Trigger scans

Issues Dashboard

Web interface

Security Categories

Issue categories