Start a security scan
POST /api/projects/{projectId}/security/scan-profiles/{profileId}/run
Queues a scan for the given profile and returns immediately with the tracking id,
because a scan runs in the background. Poll the scan run endpoint until its
status leaves queued and running.
Parameters
| Name |
In |
Type |
Required |
Description |
Idempotency-Key |
header |
string |
no |
Makes a retry of this write safe. Send a new value of 1 to 255 characters for each logical request and the same value on every retry. A successful result is kept for 24 hours, and a retry within that time returns it with the Idempotency-Replayed header instead of running the request again. |
profileId |
path |
string (uuid) |
yes |
Public id of the scan profile. |
X-RB-Region |
header |
string |
no |
Region of your organization. US organizations must send us; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401. |
Responses
202 — The scan was queued.
| Property |
Type |
Required |
Description |
id |
string (uuid) |
yes |
Public id of the scan run. |
scanProfilePublicId |
string (uuid) |
yes |
Profile the run was started from. |
status |
ScanStatus |
yes |
Where the run stands. Poll until it leaves queued and running. |
trigger |
ScanTrigger |
yes |
What started the run. |
startedAt |
string (date-time) |
yes |
When the run was queued, in UTC. |
completedAt |
string (date-time) |
null |
no |
totalChecks |
integer (int32) |
yes |
How many individual checks the enabled scanners performed. |
checksPassed |
integer (int32) |
yes |
Checks that found nothing. |
checksFailed |
integer (int32) |
yes |
Checks that produced a finding. |
checksSkipped |
integer (int32) |
yes |
Checks that could not run, for example because an endpoint needs authentication the profile does not carry. |
securityScore |
integer (int32) |
yes |
Score between 0 and 100, final once the status is completed. |
errorMessage |
string |
null |
no |
openFindingsCount |
integer (int32) |
yes |
Findings still open after this run. |
enabledScannerCount |
integer (int32) |
no |
Scanners the profile enables. |
scannersCompleted |
integer (int32) |
no |
Scanners finished so far. |
currentScannerId |
string |
null |
no |
cancelRequestedAt |
string (date-time) |
null |
no |
400 — The request was malformed or failed validation.
| Property |
Type |
Required |
Description |
type |
string |
no |
A URI identifying the problem type. |
title |
string |
no |
A short summary of the problem type. |
status |
integer (int32) |
yes |
The HTTP status code. |
detail |
string |
no |
A human readable explanation. |
instance |
string |
no |
The path that produced the error. |
code |
string |
no |
The stable machine readable error code, for example CONCURRENCY_CONFLICT, PROJECT_LOCKED, API_KEY_SCOPE_DENIED or NOT_A_MEMBER. |
401 — The API key is missing, invalid, expired or revoked. A US organization calling
without X-RB-Region: us also lands here, because the request reached the wrong
region.
| Property |
Type |
Required |
Description |
type |
string |
no |
A URI identifying the problem type. |
title |
string |
no |
A short summary of the problem type. |
status |
integer (int32) |
yes |
The HTTP status code. |
detail |
string |
no |
A human readable explanation. |
instance |
string |
no |
The path that produced the error. |
code |
string |
no |
The stable machine readable error code, for example CONCURRENCY_CONFLICT, PROJECT_LOCKED, API_KEY_SCOPE_DENIED or NOT_A_MEMBER. |
403 — The key is valid but lacks the permission or the project scope for this call.
A scoped key is also refused on organization level operations by design.
| Property |
Type |
Required |
Description |
type |
string |
no |
A URI identifying the problem type. |
title |
string |
no |
A short summary of the problem type. |
status |
integer (int32) |
yes |
The HTTP status code. |
detail |
string |
no |
A human readable explanation. |
instance |
string |
no |
The path that produced the error. |
code |
string |
no |
The stable machine readable error code, for example CONCURRENCY_CONFLICT, PROJECT_LOCKED, API_KEY_SCOPE_DENIED or NOT_A_MEMBER. |
404 — The resource does not exist, or it belongs to another organization or project.
Both cases answer the same way on purpose, so the API cannot be used to probe
for foreign identifiers.
| Property |
Type |
Required |
Description |
type |
string |
no |
A URI identifying the problem type. |
title |
string |
no |
A short summary of the problem type. |
status |
integer (int32) |
yes |
The HTTP status code. |
detail |
string |
no |
A human readable explanation. |
instance |
string |
no |
The path that produced the error. |
code |
string |
no |
The stable machine readable error code, for example CONCURRENCY_CONFLICT, PROJECT_LOCKED, API_KEY_SCOPE_DENIED or NOT_A_MEMBER. |
409 — A request with this Idempotency-Key is still running, or its response was too large to keep. The code is IDEMPOTENCY_KEY_IN_PROGRESS or IDEMPOTENCY_RESPONSE_NOT_STORED, and in the second case the request is not run again.
| Property |
Type |
Required |
Description |
type |
string |
no |
A URI identifying the problem type. |
title |
string |
no |
A short summary of the problem type. |
status |
integer (int32) |
yes |
The HTTP status code. |
detail |
string |
no |
A human readable explanation. |
instance |
string |
no |
The path that produced the error. |
code |
string |
no |
The stable machine readable error code, for example CONCURRENCY_CONFLICT, PROJECT_LOCKED, API_KEY_SCOPE_DENIED or NOT_A_MEMBER. |
422 — This Idempotency-Key was already used with a different request body, so use a new key. The code is IDEMPOTENCY_KEY_REUSED.
| Property |
Type |
Required |
Description |
type |
string |
no |
A URI identifying the problem type. |
title |
string |
no |
A short summary of the problem type. |
status |
integer (int32) |
yes |
The HTTP status code. |
detail |
string |
no |
A human readable explanation. |
instance |
string |
no |
The path that produced the error. |
code |
string |
no |
The stable machine readable error code, for example CONCURRENCY_CONFLICT, PROJECT_LOCKED, API_KEY_SCOPE_DENIED or NOT_A_MEMBER. |
| Property |
Type |
Required |
Description |
type |
string |
no |
A URI identifying the problem type. |
title |
string |
no |
A short summary of the problem type. |
status |
integer (int32) |
yes |
The HTTP status code. |
detail |
string |
no |
A human readable explanation. |
instance |
string |
no |
The path that produced the error. |
code |
string |
no |
The stable machine readable error code, for example CONCURRENCY_CONFLICT, PROJECT_LOCKED, API_KEY_SCOPE_DENIED or NOT_A_MEMBER. |
Get a scan run
GET /api/projects/{projectId}/security/scan-runs/{runId}
Returns the state of a scan, including how many scanners have finished and which
one is running. Once status is completed, securityScore and
openFindingsCount are final and a pipeline can gate on them.
Parameters
| Name |
In |
Type |
Required |
Description |
runId |
path |
string (uuid) |
yes |
Public id of the scan run. |
X-RB-Region |
header |
string |
no |
Region of your organization. US organizations must send us; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401. |
Responses
200 — The scan run.
| Property |
Type |
Required |
Description |
id |
string (uuid) |
yes |
Public id of the scan run. |
scanProfilePublicId |
string (uuid) |
yes |
Profile the run was started from. |
status |
ScanStatus |
yes |
Where the run stands. Poll until it leaves queued and running. |
trigger |
ScanTrigger |
yes |
What started the run. |
startedAt |
string (date-time) |
yes |
When the run was queued, in UTC. |
completedAt |
string (date-time) |
null |
no |
totalChecks |
integer (int32) |
yes |
How many individual checks the enabled scanners performed. |
checksPassed |
integer (int32) |
yes |
Checks that found nothing. |
checksFailed |
integer (int32) |
yes |
Checks that produced a finding. |
checksSkipped |
integer (int32) |
yes |
Checks that could not run, for example because an endpoint needs authentication the profile does not carry. |
securityScore |
integer (int32) |
yes |
Score between 0 and 100, final once the status is completed. |
errorMessage |
string |
null |
no |
openFindingsCount |
integer (int32) |
yes |
Findings still open after this run. |
enabledScannerCount |
integer (int32) |
no |
Scanners the profile enables. |
scannersCompleted |
integer (int32) |
no |
Scanners finished so far. |
currentScannerId |
string |
null |
no |
cancelRequestedAt |
string (date-time) |
null |
no |
401 — The API key is missing, invalid, expired or revoked. A US organization calling
without X-RB-Region: us also lands here, because the request reached the wrong
region.
| Property |
Type |
Required |
Description |
type |
string |
no |
A URI identifying the problem type. |
title |
string |
no |
A short summary of the problem type. |
status |
integer (int32) |
yes |
The HTTP status code. |
detail |
string |
no |
A human readable explanation. |
instance |
string |
no |
The path that produced the error. |
code |
string |
no |
The stable machine readable error code, for example CONCURRENCY_CONFLICT, PROJECT_LOCKED, API_KEY_SCOPE_DENIED or NOT_A_MEMBER. |
403 — The key is valid but lacks the permission or the project scope for this call.
A scoped key is also refused on organization level operations by design.
| Property |
Type |
Required |
Description |
type |
string |
no |
A URI identifying the problem type. |
title |
string |
no |
A short summary of the problem type. |
status |
integer (int32) |
yes |
The HTTP status code. |
detail |
string |
no |
A human readable explanation. |
instance |
string |
no |
The path that produced the error. |
code |
string |
no |
The stable machine readable error code, for example CONCURRENCY_CONFLICT, PROJECT_LOCKED, API_KEY_SCOPE_DENIED or NOT_A_MEMBER. |
404 — The resource does not exist, or it belongs to another organization or project.
Both cases answer the same way on purpose, so the API cannot be used to probe
for foreign identifiers.
| Property |
Type |
Required |
Description |
type |
string |
no |
A URI identifying the problem type. |
title |
string |
no |
A short summary of the problem type. |
status |
integer (int32) |
yes |
The HTTP status code. |
detail |
string |
no |
A human readable explanation. |
instance |
string |
no |
The path that produced the error. |
code |
string |
no |
The stable machine readable error code, for example CONCURRENCY_CONFLICT, PROJECT_LOCKED, API_KEY_SCOPE_DENIED or NOT_A_MEMBER. |
| Property |
Type |
Required |
Description |
type |
string |
no |
A URI identifying the problem type. |
title |
string |
no |
A short summary of the problem type. |
status |
integer (int32) |
yes |
The HTTP status code. |
detail |
string |
no |
A human readable explanation. |
instance |
string |
no |
The path that produced the error. |
code |
string |
no |
The stable machine readable error code, for example CONCURRENCY_CONFLICT, PROJECT_LOCKED, API_KEY_SCOPE_DENIED or NOT_A_MEMBER. |
List security findings
GET /api/projects/{projectId}/security/findings
Returns the findings of a project across all scans, filtered as you need them.
A pipeline that only wants to know whether anything new broke should filter on
status=open and on the severities it cares about.
Parameters
| Name |
In |
Type |
Required |
Description |
assignedToMe |
query |
boolean |
no |
Return only findings assigned to the calling user. |
scannerId |
query |
string |
no |
Filter by the scanner that produced the finding. |
search |
query |
string |
no |
Free-text search across title and description. |
severity |
query |
Severity |
no |
Filter by severity. |
sortBy |
query |
string |
no |
Sort order of the result. |
status |
query |
FindingStatus |
no |
Filter by finding status. |
take |
query |
integer (int32) |
no |
Maximum number of items to return. Defaults to 50. |
X-RB-Region |
header |
string |
no |
Region of your organization. US organizations must send us; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401. |
Responses
200 — A page of findings.
| Property |
Type |
Required |
Description |
items |
SecurityFinding[] |
yes |
The findings on this page. |
total |
integer (int32) |
yes |
Total number of matching findings, ignoring paging. |
skip |
integer (int32) |
yes |
How many findings were skipped to reach this page. |
take |
integer (int32) |
yes |
Page size that was applied. |
401 — The API key is missing, invalid, expired or revoked. A US organization calling
without X-RB-Region: us also lands here, because the request reached the wrong
region.
| Property |
Type |
Required |
Description |
type |
string |
no |
A URI identifying the problem type. |
title |
string |
no |
A short summary of the problem type. |
status |
integer (int32) |
yes |
The HTTP status code. |
detail |
string |
no |
A human readable explanation. |
instance |
string |
no |
The path that produced the error. |
code |
string |
no |
The stable machine readable error code, for example CONCURRENCY_CONFLICT, PROJECT_LOCKED, API_KEY_SCOPE_DENIED or NOT_A_MEMBER. |
403 — The key is valid but lacks the permission or the project scope for this call.
A scoped key is also refused on organization level operations by design.
| Property |
Type |
Required |
Description |
type |
string |
no |
A URI identifying the problem type. |
title |
string |
no |
A short summary of the problem type. |
status |
integer (int32) |
yes |
The HTTP status code. |
detail |
string |
no |
A human readable explanation. |
instance |
string |
no |
The path that produced the error. |
code |
string |
no |
The stable machine readable error code, for example CONCURRENCY_CONFLICT, PROJECT_LOCKED, API_KEY_SCOPE_DENIED or NOT_A_MEMBER. |
404 — The resource does not exist, or it belongs to another organization or project.
Both cases answer the same way on purpose, so the API cannot be used to probe
for foreign identifiers.
| Property |
Type |
Required |
Description |
type |
string |
no |
A URI identifying the problem type. |
title |
string |
no |
A short summary of the problem type. |
status |
integer (int32) |
yes |
The HTTP status code. |
detail |
string |
no |
A human readable explanation. |
instance |
string |
no |
The path that produced the error. |
code |
string |
no |
The stable machine readable error code, for example CONCURRENCY_CONFLICT, PROJECT_LOCKED, API_KEY_SCOPE_DENIED or NOT_A_MEMBER. |
| Property |
Type |
Required |
Description |
type |
string |
no |
A URI identifying the problem type. |
title |
string |
no |
A short summary of the problem type. |
status |
integer (int32) |
yes |
The HTTP status code. |
detail |
string |
no |
A human readable explanation. |
instance |
string |
no |
The path that produced the error. |
code |
string |
no |
The stable machine readable error code, for example CONCURRENCY_CONFLICT, PROJECT_LOCKED, API_KEY_SCOPE_DENIED or NOT_A_MEMBER. |
Export findings as SARIF
GET /api/projects/{projectId}/security/findings/export/sarif
Returns the findings of a project as a SARIF 2.1.0 document, which GitHub code
scanning and comparable tools ingest directly. Upload it from your pipeline and
the findings show up next to the code they concern. Without a status filter it
returns the open ones, which is what a build gate wants.
Parameters
| Name |
In |
Type |
Required |
Description |
status |
query |
FindingStatus |
no |
Filter by finding status. Defaults to open. |
X-RB-Region |
header |
string |
no |
Region of your organization. US organizations must send us; EU organizations leave the header out. Without it a US call is routed to the EU region and answered with 401. |
Responses
200 — The SARIF document.
401 — The API key is missing, invalid, expired or revoked. A US organization calling
without X-RB-Region: us also lands here, because the request reached the wrong
region.
| Property |
Type |
Required |
Description |
type |
string |
no |
A URI identifying the problem type. |
title |
string |
no |
A short summary of the problem type. |
status |
integer (int32) |
yes |
The HTTP status code. |
detail |
string |
no |
A human readable explanation. |
instance |
string |
no |
The path that produced the error. |
code |
string |
no |
The stable machine readable error code, for example CONCURRENCY_CONFLICT, PROJECT_LOCKED, API_KEY_SCOPE_DENIED or NOT_A_MEMBER. |
403 — The key is valid but lacks the permission or the project scope for this call.
A scoped key is also refused on organization level operations by design.
| Property |
Type |
Required |
Description |
type |
string |
no |
A URI identifying the problem type. |
title |
string |
no |
A short summary of the problem type. |
status |
integer (int32) |
yes |
The HTTP status code. |
detail |
string |
no |
A human readable explanation. |
instance |
string |
no |
The path that produced the error. |
code |
string |
no |
The stable machine readable error code, for example CONCURRENCY_CONFLICT, PROJECT_LOCKED, API_KEY_SCOPE_DENIED or NOT_A_MEMBER. |
404 — The resource does not exist, or it belongs to another organization or project.
Both cases answer the same way on purpose, so the API cannot be used to probe
for foreign identifiers.
| Property |
Type |
Required |
Description |
type |
string |
no |
A URI identifying the problem type. |
title |
string |
no |
A short summary of the problem type. |
status |
integer (int32) |
yes |
The HTTP status code. |
detail |
string |
no |
A human readable explanation. |
instance |
string |
no |
The path that produced the error. |
code |
string |
no |
The stable machine readable error code, for example CONCURRENCY_CONFLICT, PROJECT_LOCKED, API_KEY_SCOPE_DENIED or NOT_A_MEMBER. |
| Property |
Type |
Required |
Description |
type |
string |
no |
A URI identifying the problem type. |
title |
string |
no |
A short summary of the problem type. |
status |
integer (int32) |
yes |
The HTTP status code. |
detail |
string |
no |
A human readable explanation. |
instance |
string |
no |
The path that produced the error. |
code |
string |
no |
The stable machine readable error code, for example CONCURRENCY_CONFLICT, PROJECT_LOCKED, API_KEY_SCOPE_DENIED or NOT_A_MEMBER. |