Code Audit
Get scan issues
Last updated 5 November 2026
/v1/code-audit/scans/{scanId}/issuesAuthentication
- bearerAuth
bearerAuth: http / bearer — Use an Inth API key or OAuth access token in the Authorization header. Product operations need a capability. Feedback intake only requires authentication. An OAuth access token carries the capabilities it was granted as scopes; an organization API key carries a fixed set (`organizations.read`, `projects.read`, `projects.write`, `api-keys.read`, `inbox.read`, `billing.read`), so writes that name the person who made them, such as `inbox.write` and `vendors.write`, need a user token. A credential without the capability an operation needs is answered with `403 INSUFFICIENT_SCOPE`. `GET /v1/me` reports the capabilities of the calling credential. OAuth scopes: - `organizations.read`: List the organizations you belong to. - `organizations.write`: Create organizations you will own. - `projects.read`: Read projects, their consent configuration, and the vendors seen on them. - `projects.write`: Create, update, and delete projects and their consent configuration. - `members.read`: Read member names, email addresses, profile images, roles, and pending invitation email addresses. - `members.write`: Invite members, change member roles, remove members, and cancel invitations. - `api-keys.read`: List organization API keys. - `api-keys.write`: Create, roll, and delete organization API keys. - `code-audit.read`: Read Code Audit scans, their findings, and connected repositories. - `code-audit.write`: Start Code Audit scans and unlock their reports. - `inbox.read`: Read Inbox findings. - `inbox.write`: Change Inbox status or assignment and open GitHub issues for findings. - `vendors.write`: Approve or ignore vendors detected on your projects, which resolves their Inbox findings. - `billing.read`: Read the plan and credit balance of an organization. - `billing.details.read`: Read invoices, billing profiles, and payment method summaries for organizations you own. - `consent.read`: Read consent records, analytics, configuration, and runtime status. - `consent.write`: Update consent settings, translations, IAB configuration, and policies. - `consent.keys.read`: Read consent runtime key metadata. Secret values are never returned. - `website-audit.read`: Read website audit targets, scans, reports, cookies, and evidence. - `website-audit.write`: Manage website audit targets, verify domains, review findings, and start scans. - `account.read`: Read your account profile. - `notifications.read`: Read your notification preferences and organization routing. - `organization-retention.read`: Read organization provider data retention policy. - `support.read`: Read support conversations you own or can access through sharing. - `support.write`: Create support conversations, send messages, share or close them, and upload support attachments. - `consent.lifecycle.write`: Update, upgrade or delete Consent runtimes. - `consent.keys.write`: Create, rotate and revoke Consent runtime keys. - `billing.write`: Preview and change plans, buy credits, manage billing details and subscriptions, and open hosted payment flows. - `account.security.read`: Read your active browser sessions and connected device grants. - `account.security.write`: Revoke your browser sessions and connected device grants. - `integrations.read`: Read connected integration accounts, repositories, provider properties and project links. - `integrations.write`: Connect and sync providers, manage repository settings, project links and pull request monitoring. - `account.write`: Update your name, avatar and PII masking preference. - `account.delete`: Permanently delete your account after ownership checks and confirmation. - `notifications.write`: Update your notification preferences. - `notifications.routing.write`: Manage organization notification routing. - `organization-retention.write`: Change organization provider data retention policy. - `organizations.settings.write`: Update organization name, logo and slug. - `organizations.delete`: Permanently delete organizations you own after confirmation. - `agents.read`: Read your Inth Agent chats and chats shared with your organization. - `agents.write`: Start Inth Agent chats, send messages, share your chats with the organization, and delete your chats. Agent replies use organization credits.
Request
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
scanId | string | Required | Scan ID. |
Query Parameters
| Name | Type | Required | Description |
|---|---|---|---|
detail | "summary" | "full" | Optional | Full includes all available evidence blocks, assumptions, verification, decisions and coverage. Omitted historical fields mean unrecorded, not empty. |
Responses
200
Scan findings.
Content type application/json
| Property | Type | Required | Description |
|---|---|---|---|
success | boolean | Required | — |
data | object | Required | — |
data.access | "full" | "free-preview" | "locked" | Required | — |
data.coverageGaps | object | Optional | — |
data.coverageGaps.abandonedFileCount | integer | Required | — |
data.contextQuestions | object[] | Optional | — |
data.contextQuestions[].answerKind | "approval-status" | "control-status" | "duration" | "evidence-reference" | "policy-selection" | "review-decision" | Required | — |
data.contextQuestions[].claimIds | string[] | Required | — |
data.contextQuestions[].priority | "urgent" | "high" | "normal" | "low" | Required | — |
data.contextQuestions[].prompt | string | Required | — |
data.contextQuestions[].questionId | string | Required | — |
data.contextQuestions[].requirementKind | string | Required | — |
data.contextQuestions[].status | "missing" | "conflicting" | Required | — |
data.contextQuestions[].subjectRefs | string[] | Required | — |
data.decisions | object[] | Optional | — |
data.decisions[].decisionId | string | Required | — |
data.decisions[].decisionRevisionId | string | Required | — |
data.decisions[].facts | object | Optional | — |
data.decisions[].facts.dataCategories | string[] | Required | — |
data.decisions[].facts.dominantFixCluster | object | Optional | — |
data.decisions[].facts.dominantFixCluster.faultSlug | string | Required | — |
data.decisions[].facts.dominantFixCluster.sinkFamily | string | Required | — |
data.decisions[].facts.dominantFixCluster.primaryMemberCount | integer | Required | — |
data.decisions[].facts.dominantFixCluster.share | number | "Infinity" | "-Infinity" | "NaN" | Required | — |
data.decisions[].facts.issueGroupCount | integer | Required | — |
data.decisions[].facts.primaryMemberCount | integer | Required | — |
data.decisions[].facts.serviceCount | integer | Required | — |
data.decisions[].facts.topServices | string[] | Required | — |
data.decisions[].facts.unclassifiedFindingCount | integer | Required | — |
data.decisions[].memberRefs | string[] | Required | — |
data.decisions[].plan | object | Optional | — |
data.decisions[].plan.fallbackReason | string | Optional | — |
data.decisions[].plan.narrative | string | Optional | — |
data.decisions[].plan.narrativeFallbackReason | string | Optional | — |
data.decisions[].plan.narrativeSource | "reconciled" | "fallback" | Optional | — |
data.decisions[].plan.source | "reconciled" | "fallback" | Required | — |
data.decisions[].plan.steps | object[] | Required | — |
data.decisions[].plan.steps[].detail | string | Optional | — |
data.decisions[].plan.steps[].fix | string | Required | — |
data.decisions[].plan.steps[].paths | object[] | Required | — |
data.decisions[].plan.steps[].paths[].line | integer | Optional | — |
data.decisions[].plan.steps[].paths[].note | string | Optional | — |
data.decisions[].plan.steps[].paths[].path | string | Required | — |
data.decisions[].plan.summary | string | Optional | — |
data.decisions[].plan.summaryFallbackReason | string | Optional | — |
data.decisions[].plan.summarySource | "reconciled" | "fallback" | Optional | — |
data.decisions[].priority | "P0" | "P1" | "P2" | "P3" | Optional | — |
data.decisions[].questionKeys | string[] | Required | — |
data.decisions[].rationale | string | Required | — |
data.decisions[].recommendation | string | Required | — |
data.decisions[].state | "proposed" | "needs-context" | Required | — |
data.decisions[].statement | string | Required | — |
data.decisions[].title | string | Required | — |
data.decisionCount | integer | Optional | — |
data.quote | object | null | Required | — |
data.issues | object[] | Required | — |
data.issues[].assumptions | object[] | Optional | — |
data.issues[].assumptions[].materiality | "changes-evidence-verdict" | "changes-presentation" | "changes-priority" | "context-only" | Required | — |
data.issues[].assumptions[].resolutionQuestion | string | Optional | — |
data.issues[].assumptions[].statement | string | Required | — |
data.issues[].assumptions[].status | "unresolved" | "supported" | "refuted" | Required | — |
data.issues[].claimSummary | object | Optional | — |
data.issues[].claimSummary.confirmed | integer | Required | — |
data.issues[].claimSummary.dissenting | integer | Required | — |
data.issues[].claimSummary.notEvidenced | integer | Required | — |
data.issues[].claimSummary.total | integer | Required | — |
data.issues[].claimSummary.unassessed | integer | Required | — |
data.issues[].claimSummary.uncertain | integer | Required | — |
data.issues[].actions | object[] | Optional | — |
data.issues[].actions[].blockers | string[] | Required | — |
data.issues[].actions[].eligible | boolean | Required | — |
data.issues[].actions[].kind | "draft-fix-pr" | "accept-risk" | "mark-known-non-issue" | Required | — |
data.issues[].closedByRunId | string | null | Optional | — |
data.issues[].contextFreshness | "current" | "stale" | "unknown" | Optional | — |
data.issues[].controlAreas | string[] | Optional | — |
data.issues[].description | string | null | Required | — |
data.issues[].disposition | "accepted-risk" | "known-non-issue" | null | Optional | — |
data.issues[].dispositionReason | string | null | Optional | — |
data.issues[].evidence | object | null | Required | — |
data.issues[].evidenceBlocks | object[] | Optional | — |
data.issues[].evidenceBlocks[].filePath | string | Required | — |
data.issues[].evidenceBlocks[].lineNumbers | integer[] | Required | — |
data.issues[].evidenceBlocks[].snippet | string | Optional | — |
data.issues[].evidenceBlocks[].snippetEndLine | integer | Optional | — |
data.issues[].evidenceBlocks[].snippetStartLine | integer | Optional | — |
data.issues[].evidenceBlocks[].source | "backfilled" | "model" | Optional | — |
data.issues[].files | string[] | Required | — |
data.issues[].faultSlug | string | Optional | — |
data.issues[].groupingConfidence | "high" | "medium" | "low" | null | Optional | — |
data.issues[].id | string | Required | — |
data.issues[].origin | "group" | "unclassified" | Optional | — |
data.issues[].potentialImpact | "critical" | "high" | "medium" | "low" | null | Required | — |
data.issues[].presentationState | string | null | Required | — |
data.issues[].priority | string | Required | — |
data.issues[].reachability | "reachable" | "exported-surface" | "not-reachable" | null | Optional | — |
data.issues[].reachabilitySearchScope | string | null | Optional | — |
data.issues[].recommendation | string | null | Required | — |
data.issues[].resolutionState | "active" | "fixed" | "superseded" | null | Optional | — |
data.issues[].reviewPriority | "urgent" | "high" | "normal" | "low" | null | Required | — |
data.issues[].sinkFamily | string | Optional | — |
data.issues[].title | string | Required | — |
data.issues[].verification | object | Optional | — |
data.issues[].verification.status | "complete" | "not-required" | "partial" | Required | — |
data.issues[].verification.totalClaimCount | integer | Required | — |
data.issues[].verification.verifiedClaimCount | integer | Required | — |
data.issues[].feedbackTarget | object | null | Optional | — |
data.issues[].category | string | null | Required | — |
data.issues[].resolution | "active" | "fixed" | "superseded" | null | Required | — |
data.lockedCount | integer | Required | — |
data.notYetClassified | string[] | Optional | — |
data.priorityCounts | object | null | Required | — |
data.projectionKind | "authoritative" | "provisional" | null | Required | — |
data.totalCount | integer | Required | — |
data.unlockQuote | object | null | Required | — |
data.scanId | string | Required | — |
data.detail | "summary" | "full" | Required | — |
data.unlockCredits | number | "Infinity" | "-Infinity" | "NaN" | null | Required | — |
View JSON schema
400
The request payload or parameters are invalid.
Content type application/json
| Property | Type | Required | Description |
|---|---|---|---|
success | boolean | Required | — |
error | object | Required | — |
error.code | "UNAUTHORIZED" | "FORBIDDEN" | "INSUFFICIENT_SCOPE" | "PLAN_LIMIT_REACHED" | "PLAN_REQUIRED" | "INVALID_ORIGIN" | "INVALID_REGION" | "INVALID_PAYLOAD" | "NOT_FOUND" | "CONFLICT" | "KEY_LIMIT_REACHED" | "INSUFFICIENT_CREDITS" | "SCAN_IN_PROGRESS" | "UNLOCK_REQUIRED" | "REPOSITORY_NOT_LINKED" | "PAYLOAD_TOO_LARGE" | "RATE_LIMITED" | "SERVICE_UNAVAILABLE" | "INTERNAL_ERROR" | Required | — |
error.message | string | Required | — |
error.details | unknown | Optional | Optional structured error details. |
View JSON schema
401
Authentication is missing, invalid, or expired.
Content type application/json
| Property | Type | Required | Description |
|---|---|---|---|
success | boolean | Required | — |
error | object | Required | — |
error.code | "UNAUTHORIZED" | "FORBIDDEN" | "INSUFFICIENT_SCOPE" | "PLAN_LIMIT_REACHED" | "PLAN_REQUIRED" | "INVALID_ORIGIN" | "INVALID_REGION" | "INVALID_PAYLOAD" | "NOT_FOUND" | "CONFLICT" | "KEY_LIMIT_REACHED" | "INSUFFICIENT_CREDITS" | "SCAN_IN_PROGRESS" | "UNLOCK_REQUIRED" | "REPOSITORY_NOT_LINKED" | "PAYLOAD_TOO_LARGE" | "RATE_LIMITED" | "SERVICE_UNAVAILABLE" | "INTERNAL_ERROR" | Required | — |
error.message | string | Required | — |
error.details | unknown | Optional | Optional structured error details. |
View JSON schema
403
The credential is valid but may not perform the operation. `INSUFFICIENT_SCOPE`: the credential was never granted the capability the operation needs. `details.requiredScope` names it, and the `WWW-Authenticate` header carries `Bearer error="insufficient_scope"`. An OAuth client fixes this by requesting the scope; an organization API key cannot gain it. `FORBIDDEN`: the capability is present but the membership behind the credential lacks the role, or the resource belongs to another organization.
Content type application/json
| Property | Type | Required | Description |
|---|---|---|---|
success | boolean | Required | — |
error | object | Required | — |
error.code | "UNAUTHORIZED" | "FORBIDDEN" | "INSUFFICIENT_SCOPE" | "PLAN_LIMIT_REACHED" | "PLAN_REQUIRED" | "INVALID_ORIGIN" | "INVALID_REGION" | "INVALID_PAYLOAD" | "NOT_FOUND" | "CONFLICT" | "KEY_LIMIT_REACHED" | "INSUFFICIENT_CREDITS" | "SCAN_IN_PROGRESS" | "UNLOCK_REQUIRED" | "REPOSITORY_NOT_LINKED" | "PAYLOAD_TOO_LARGE" | "RATE_LIMITED" | "SERVICE_UNAVAILABLE" | "INTERNAL_ERROR" | Required | — |
error.message | string | Required | — |
error.details | unknown | Optional | Optional structured error details. |
View JSON schema
Headers
| Name | Type | Description |
|---|---|---|
WWW-Authenticate | string | Present on `INSUFFICIENT_SCOPE`: `Bearer error="insufficient_scope", scope="<required scope>"`. |
404
The requested resource was not found.
Content type application/json
| Property | Type | Required | Description |
|---|---|---|---|
success | boolean | Required | — |
error | object | Required | — |
error.code | "UNAUTHORIZED" | "FORBIDDEN" | "INSUFFICIENT_SCOPE" | "PLAN_LIMIT_REACHED" | "PLAN_REQUIRED" | "INVALID_ORIGIN" | "INVALID_REGION" | "INVALID_PAYLOAD" | "NOT_FOUND" | "CONFLICT" | "KEY_LIMIT_REACHED" | "INSUFFICIENT_CREDITS" | "SCAN_IN_PROGRESS" | "UNLOCK_REQUIRED" | "REPOSITORY_NOT_LINKED" | "PAYLOAD_TOO_LARGE" | "RATE_LIMITED" | "SERVICE_UNAVAILABLE" | "INTERNAL_ERROR" | Required | — |
error.message | string | Required | — |
error.details | unknown | Optional | Optional structured error details. |
View JSON schema
429
The rate limit was exceeded. API key limits are set by plan tier (Starter 600/min, Pro 1500/min, Enterprise 3000/min). Check the Retry-After header before retrying.
Content type application/json
| Property | Type | Required | Description |
|---|---|---|---|
success | boolean | Required | — |
error | object | Required | — |
error.code | "UNAUTHORIZED" | "FORBIDDEN" | "INSUFFICIENT_SCOPE" | "PLAN_LIMIT_REACHED" | "PLAN_REQUIRED" | "INVALID_ORIGIN" | "INVALID_REGION" | "INVALID_PAYLOAD" | "NOT_FOUND" | "CONFLICT" | "KEY_LIMIT_REACHED" | "INSUFFICIENT_CREDITS" | "SCAN_IN_PROGRESS" | "UNLOCK_REQUIRED" | "REPOSITORY_NOT_LINKED" | "PAYLOAD_TOO_LARGE" | "RATE_LIMITED" | "SERVICE_UNAVAILABLE" | "INTERNAL_ERROR" | Required | — |
error.message | string | Required | — |
error.details | unknown | Optional | Optional structured error details. |
View JSON schema
500
An unexpected internal error occurred.
Content type application/json
| Property | Type | Required | Description |
|---|---|---|---|
success | boolean | Required | — |
error | object | Required | — |
error.code | "UNAUTHORIZED" | "FORBIDDEN" | "INSUFFICIENT_SCOPE" | "PLAN_LIMIT_REACHED" | "PLAN_REQUIRED" | "INVALID_ORIGIN" | "INVALID_REGION" | "INVALID_PAYLOAD" | "NOT_FOUND" | "CONFLICT" | "KEY_LIMIT_REACHED" | "INSUFFICIENT_CREDITS" | "SCAN_IN_PROGRESS" | "UNLOCK_REQUIRED" | "REPOSITORY_NOT_LINKED" | "PAYLOAD_TOO_LARGE" | "RATE_LIMITED" | "SERVICE_UNAVAILABLE" | "INTERNAL_ERROR" | Required | — |
error.message | string | Required | — |
error.details | unknown | Optional | Optional structured error details. |
View JSON schema
Related
- REST API overview: Every operation in this API.