Authentication
Every request sends an API key in the Authorization header. Keys are opaque strings, not JWTs or OAuth tokens.
Authorization: Bearer <api_key>
Create a key on the API keys page. It is shown once, so put it straight into a secret manager or your CI secrets. A key lasts 90 days by default, and you can choose anything from 1 hour to 365 days. You can hold 10 active keys, and a revoked key stops working on its next request.
Keep keys on the server. Never put one in a browser or mobile bundle, a URL, source control, logs or a screenshot. Give each integration its own key with only the scopes it needs. To rotate a key, create the new one, switch the integration over, then revoke the old one.
Scopes
account:readOn by default audit:readOpt-in findings:readOn by default scans:createOn by default scans:deleteOpt-in scans:readOn by default workspaces:readOn by default
A key only sees its owner's data. There are no team members or roles yet. Browser cookies are not accepted on the JSON API, and the owner must have accepted the current terms in the browser.
Run a scan
Five calls take you from a key to a list of findings. Each step opens its full reference.
Leave out branch to scan the default branch. Name a branch to scan its latest commit, and add commit_sha (the full 40-character SHA) to scan one exact commit on it. A commit that isn't on that branch returns 409 commit_not_on_branch before anything is charged. Through …/submissions, the submission ends failed with that error_code instead. A scan of any other branch never changes the default branch's issues, score trend or badge.
The examples below submit a scan. Set SENTRINT_API_KEY and WORKSPACE_ID in your environment first, and swap in your own repository.
cURL curl --fail-with-body -X POST \
"https://sentrint.com/api/v1/workspaces/$WORKSPACE_ID/scans" \
-H "Authorization: Bearer $SENTRINT_API_KEY" \
-H "Content-Type: application/json" \
--data '{"repo_url":"https://github.com/your-org/your-repo","branch":"main","force":false}'
Python, standard library import json
import os
from urllib.request import Request, urlopen
workspace = os.environ["WORKSPACE_ID"]
request = Request(
f"https://sentrint.com/api/v1/workspaces/{workspace}/scans",
data=json.dumps({
"repo_url": "https://github.com/your-org/your-repo",
"branch": "main", "force": False,
}).encode(),
headers={
"Authorization": f"Bearer {os.environ['SENTRINT_API_KEY']}",
"Content-Type": "application/json",
}, method="POST",
)
with urlopen(request, timeout=30) as response:
scan = json.load(response)
print(scan["scan_id"], scan["status_url"])
JavaScript, Node.js server const response = await fetch(
`https://sentrint.com/api/v1/workspaces/${process.env.WORKSPACE_ID}/scans`,
{
method: "POST",
headers: {
Authorization: `Bearer ${process.env.SENTRINT_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
repo_url: "https://github.com/your-org/your-repo",
branch: "main", force: false,
}),
signal: AbortSignal.timeout(30_000),
},
);
const result = await response.json();
if (!response.ok) throw new Error(`${result.code}: ${result.detail}`);
console.log(result.scan_id, result.status_url);
Repeat submissions A live scan with the same inputs is returned as it is. A finished scan is returned too, unless you send "force": true. A reused result costs no scan credit, and a failed scan can be retried.
Limits The usual limits still apply: one running scan per workspace, workspace locks, repository size and file limits, and your scan allowance.
Private repositories Scans use the GitHub access linked to the owner's account. The API takes no personal access token, and no shared server credential opens private repositories. If Sentrint can't reach the repository you get repository_unavailable.
Locked guidance If guidance is locked on your account, reports and findings come back with guidance_locked set and without suggestions, snippets, prompts or evidence.
Size caps Workspace detail returns up to 100 repositories, and repositories_truncated tells you when there are more. Finding detail returns up to 100 evidence records.
Open an endpoint to see its scope, parameters, request examples and response. Every ID in a path is a UUID. The examples read your key and IDs from environment variables such as SENTRINT_API_KEY, WORKSPACE_ID and SCAN_ID; use IDs from your own responses.
Account1
GET/api/v1/accountGet your account account:read
Plan, scans used and left this period, and scan credits.
Scope account:read
Success 200
Response fields
Field Type Details
iduuidRequired loginstringRequired planstringRequired included_scans_remainingintegerRequired scan_creditsintegerRequired scans_used_in_periodintegerRequired scan_limit_in_periodinteger | nullRequired periodstringRequired
HTTP status codes Status Meaning 200Successful Response 400Repository exceeds the configured size or scannable file limit. 401Missing, malformed, expired or revoked API key. 403Missing scope, current terms, workspace permission or owner deletion approval. 404Resource missing or unavailable to this account. 409Scan or approval state conflicts with this operation. 413Request body exceeds 16 KiB. 422Invalid request, filter, date range or pagination cursor. 429Rate limit or scan quota exceeded. Retry-After accompanies rate limits. 503Authentication/rate infrastructure or repository access is unavailable. 500Unexpected server error. Keep the request ID for support.
curl --fail-with-body --request GET \
"https://sentrint.com/api/v1/account" \
--header "Authorization: Bearer $SENTRINT_API_KEY" \
--header "Accept: application/json"
{
"body": null,
"headers": {
"Accept": "application/json",
"Authorization": "Bearer $SENTRINT_API_KEY"
},
"method": "GET",
"path": "/api/v1/account",
"path_parameters": {},
"query_parameters": {}
}
{
"id": "00000000-0000-4000-8000-000000000001",
"included_scans_remaining": 0,
"login": "example",
"period": "example",
"plan": "example",
"scan_credits": 0,
"scan_limit_in_period": 0,
"scans_used_in_period": 0
}
Workspaces2
GET/api/v1/workspacesList workspaces workspaces:read
Workspaces on the key owner's account. Start here to get a workspace ID.
Scope workspaces:read
Success 200
Parameters
Parameter In Type Details
limitOptional query integerDefault: 25 Minimum: 1; Maximum: 100 cursorOptional query string | null
Response fields
Field Type Details
dataWorkspaceOut[]Required next_cursorstring | nullOptional
HTTP status codes Status Meaning 200Successful Response 422Invalid request, filter, date range or pagination cursor. 400Repository exceeds the configured size or scannable file limit. 401Missing, malformed, expired or revoked API key. 403Missing scope, current terms, workspace permission or owner deletion approval. 404Resource missing or unavailable to this account. 409Scan or approval state conflicts with this operation. 413Request body exceeds 16 KiB. 429Rate limit or scan quota exceeded. Retry-After accompanies rate limits. 503Authentication/rate infrastructure or repository access is unavailable. 500Unexpected server error. Keep the request ID for support.
curl --fail-with-body --request GET \
"https://sentrint.com/api/v1/workspaces" \
--header "Authorization: Bearer $SENTRINT_API_KEY" \
--header "Accept: application/json" \
--get \
--data-urlencode limit=25
{
"body": null,
"headers": {
"Accept": "application/json",
"Authorization": "Bearer $SENTRINT_API_KEY"
},
"method": "GET",
"path": "/api/v1/workspaces",
"path_parameters": {},
"query_parameters": {
"cursor": "\u003cnext_cursor\u003e",
"limit": 25
}
}
{
"data": [],
"next_cursor": "example"
}
GET/api/v1/workspaces/{workspace_id}Get a workspace workspaces:read
One workspace and up to 100 of its repositories.
Scope workspaces:read
Success 200
Parameters
Parameter In Type Details
workspace_idRequired path uuid
Response fields
Field Type Details
iduuidRequired namestringRequired created_atdate-timeRequired tracked_repository_countintegerRequired repositoriesRepositoryOut[]Optional repositories_truncatedbooleanOptional
HTTP status codes Status Meaning 200Successful Response 422Invalid request, filter, date range or pagination cursor. 400Repository exceeds the configured size or scannable file limit. 401Missing, malformed, expired or revoked API key. 403Missing scope, current terms, workspace permission or owner deletion approval. 404Resource missing or unavailable to this account. 409Scan or approval state conflicts with this operation. 413Request body exceeds 16 KiB. 429Rate limit or scan quota exceeded. Retry-After accompanies rate limits. 503Authentication/rate infrastructure or repository access is unavailable. 500Unexpected server error. Keep the request ID for support.
curl --fail-with-body --request GET \
"https://sentrint.com/api/v1/workspaces/$WORKSPACE_ID" \
--header "Authorization: Bearer $SENTRINT_API_KEY" \
--header "Accept: application/json"
{
"body": null,
"headers": {
"Accept": "application/json",
"Authorization": "Bearer $SENTRINT_API_KEY"
},
"method": "GET",
"path": "/api/v1/workspaces/{workspace_id}",
"path_parameters": {
"workspace_id": "00000000-0000-4000-8000-000000000001"
},
"query_parameters": {}
}
{
"created_at": "2026-09-30T12:00:00Z",
"id": "00000000-0000-4000-8000-000000000001",
"name": "example",
"repositories": [],
"repositories_truncated": false,
"tracked_repository_count": 0
}
Scans4
POST/api/v1/workspaces/{workspace_id}/scansSubmit a scan scans:create
Checks the repository with GitHub, then queues the scan and returns its ID.
Scope scans:create
Success 202
Body JSON
Parameters
Parameter In Type Details
workspace_idRequired path uuid
JSON body
Field Type Details
repo_urlRequired stringMaximum length: 512 branchOptional string | nullforceOptional booleanDefault: false commit_shaOptional string | null
Response fields
Field Type Details
scan_iduuidRequired statusstringRequired status_urlstringRequired reusedbooleanRequired
HTTP status codes Status Meaning 202Successful Response 422Invalid request, filter, date range or pagination cursor. 400Repository exceeds the configured size or scannable file limit. 401Missing, malformed, expired or revoked API key. 403Missing scope, current terms, workspace permission or owner deletion approval. 404Resource missing or unavailable to this account. 409Scan or approval state conflicts with this operation. 413Request body exceeds 16 KiB. 429Rate limit or scan quota exceeded. Retry-After accompanies rate limits. 503Authentication/rate infrastructure or repository access is unavailable. 500Unexpected server error. Keep the request ID for support.
curl --fail-with-body --request POST \
"https://sentrint.com/api/v1/workspaces/$WORKSPACE_ID/scans" \
--header "Authorization: Bearer $SENTRINT_API_KEY" \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
--data '{
"repo_url": "https://github.com/your-org/your-repo",
"branch": "main",
"force": false
}'
{
"body": {
"branch": "main",
"force": false,
"repo_url": "https://github.com/your-org/your-repo"
},
"headers": {
"Accept": "application/json",
"Authorization": "Bearer $SENTRINT_API_KEY",
"Content-Type": "application/json"
},
"method": "POST",
"path": "/api/v1/workspaces/{workspace_id}/scans",
"path_parameters": {
"workspace_id": "00000000-0000-4000-8000-000000000001"
},
"query_parameters": {}
}
{
"reused": false,
"scan_id": "00000000-0000-4000-8000-000000000001",
"status": "pending",
"status_url": "/api/v1/scans/00000000-0000-4000-8000-000000000001"
}
GET/api/v1/workspaces/{workspace_id}/scansList scans in a workspace scans:read
List scans in a workspace Link
Every scan in one workspace, a page at a time.
Scope scans:read
Success 200
Parameters
Parameter In Type Details
workspace_idRequired path uuidlimitOptional query integerDefault: 25 Minimum: 1; Maximum: 100 cursorOptional query string | null
Response fields
Field Type Details
dataScanOut[]Required next_cursorstring | nullOptional
HTTP status codes Status Meaning 200Successful Response 422Invalid request, filter, date range or pagination cursor. 400Repository exceeds the configured size or scannable file limit. 401Missing, malformed, expired or revoked API key. 403Missing scope, current terms, workspace permission or owner deletion approval. 404Resource missing or unavailable to this account. 409Scan or approval state conflicts with this operation. 413Request body exceeds 16 KiB. 429Rate limit or scan quota exceeded. Retry-After accompanies rate limits. 503Authentication/rate infrastructure or repository access is unavailable. 500Unexpected server error. Keep the request ID for support.
curl --fail-with-body --request GET \
"https://sentrint.com/api/v1/workspaces/$WORKSPACE_ID/scans" \
--header "Authorization: Bearer $SENTRINT_API_KEY" \
--header "Accept: application/json" \
--get \
--data-urlencode limit=25
{
"body": null,
"headers": {
"Accept": "application/json",
"Authorization": "Bearer $SENTRINT_API_KEY"
},
"method": "GET",
"path": "/api/v1/workspaces/{workspace_id}/scans",
"path_parameters": {
"workspace_id": "00000000-0000-4000-8000-000000000001"
},
"query_parameters": {
"cursor": "\u003cnext_cursor\u003e",
"limit": 25
}
}
{
"data": [],
"next_cursor": "example"
}
GET/api/v1/scans/{scan_id}Get scan status scans:read
Status, commit and score for one scan. Poll this until the scan finishes.
Scope scans:read
Success 200
Parameters
Parameter In Type Details
scan_idRequired path uuid
Response fields
Field Type Details
iduuidRequired workspace_iduuid | nullRequired statusstringRequired repo_urlstringRequired commit_shastringRequired scoreinteger | nullRequired created_atdate-timeRequired updated_atdate-timeRequired
HTTP status codes Status Meaning 200Successful Response 422Invalid request, filter, date range or pagination cursor. 400Repository exceeds the configured size or scannable file limit. 401Missing, malformed, expired or revoked API key. 403Missing scope, current terms, workspace permission or owner deletion approval. 404Resource missing or unavailable to this account. 409Scan or approval state conflicts with this operation. 413Request body exceeds 16 KiB. 429Rate limit or scan quota exceeded. Retry-After accompanies rate limits. 503Authentication/rate infrastructure or repository access is unavailable. 500Unexpected server error. Keep the request ID for support.
curl --fail-with-body --request GET \
"https://sentrint.com/api/v1/scans/$SCAN_ID" \
--header "Authorization: Bearer $SENTRINT_API_KEY" \
--header "Accept: application/json"
{
"body": null,
"headers": {
"Accept": "application/json",
"Authorization": "Bearer $SENTRINT_API_KEY"
},
"method": "GET",
"path": "/api/v1/scans/{scan_id}",
"path_parameters": {
"scan_id": "00000000-0000-4000-8000-000000000001"
},
"query_parameters": {}
}
{
"commit_sha": "example",
"created_at": "2026-09-30T12:00:00Z",
"id": "00000000-0000-4000-8000-000000000001",
"repo_url": "example",
"score": 0,
"status": "example",
"updated_at": "2026-09-30T12:00:00Z",
"workspace_id": "00000000-0000-4000-8000-000000000001"
}
GET/api/v1/scans/{scan_id}/reportGet a scan report scans:read
Score, grade, counts by severity and the rules that fired most.
Scope scans:read
Success 200
Parameters
Parameter In Type Details
scan_idRequired path uuid
Response fields
Field Type Details
scan_iduuidRequired scoreintegerRequired gradestringRequired criticalintegerRequired highintegerRequired mediumintegerRequired lowintegerRequired top_rulesstring[]Required summary_textstringRequired guidance_lockedbooleanRequired
HTTP status codes Status Meaning 200Successful Response 422Invalid request, filter, date range or pagination cursor. 400Repository exceeds the configured size or scannable file limit. 401Missing, malformed, expired or revoked API key. 403Missing scope, current terms, workspace permission or owner deletion approval. 404Resource missing or unavailable to this account. 409Scan or approval state conflicts with this operation. 413Request body exceeds 16 KiB. 429Rate limit or scan quota exceeded. Retry-After accompanies rate limits. 503Authentication/rate infrastructure or repository access is unavailable. 500Unexpected server error. Keep the request ID for support.
curl --fail-with-body --request GET \
"https://sentrint.com/api/v1/scans/$SCAN_ID/report" \
--header "Authorization: Bearer $SENTRINT_API_KEY" \
--header "Accept: application/json"
{
"body": null,
"headers": {
"Accept": "application/json",
"Authorization": "Bearer $SENTRINT_API_KEY"
},
"method": "GET",
"path": "/api/v1/scans/{scan_id}/report",
"path_parameters": {
"scan_id": "00000000-0000-4000-8000-000000000001"
},
"query_parameters": {}
}
{
"critical": 0,
"grade": "example",
"guidance_locked": false,
"high": 0,
"low": 0,
"medium": 0,
"scan_id": "00000000-0000-4000-8000-000000000001",
"score": 0,
"summary_text": "example",
"top_rules": []
}
Submissions2
POST/api/v1/workspaces/{workspace_id}/submissionsSubmit a scan without waiting scans:create
Submit a scan without waiting Link
Returns at once and checks GitHub in the background. Needs an Idempotency-Key header.
Scope scans:create
Success 202
Body JSON
Parameters
Parameter In Type Details
workspace_idRequired path uuididempotency-keyRequired header stringMinimum length: 8; Maximum length: 128
JSON body
Field Type Details
repo_urlRequired stringMaximum length: 512 branchOptional string | nullforceOptional booleanDefault: false commit_shaOptional string | null
Response fields
Field Type Details
iduuidRequired statusstringRequired status_urlstringRequired scan_iduuid | nullRequired scan_status_urlstring | nullRequired reusedbooleanRequired error_codestring | nullRequired error_detailstring | nullRequired created_atdate-timeRequired updated_atdate-timeRequired
HTTP status codes Status Meaning 202Successful Response 422Invalid request, filter, date range or pagination cursor. 400Repository exceeds the configured size or scannable file limit. 401Missing, malformed, expired or revoked API key. 403Missing scope, current terms, workspace permission or owner deletion approval. 404Resource missing or unavailable to this account. 409Scan or approval state conflicts with this operation. 413Request body exceeds 16 KiB. 429Rate limit or scan quota exceeded. Retry-After accompanies rate limits. 503Authentication/rate infrastructure or repository access is unavailable. 500Unexpected server error. Keep the request ID for support.
curl --fail-with-body --request POST \
"https://sentrint.com/api/v1/workspaces/$WORKSPACE_ID/submissions" \
--header "Authorization: Bearer $SENTRINT_API_KEY" \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
--header "idempotency-key: submission-request-001" \
--data '{
"repo_url": "https://github.com/your-org/your-repo",
"branch": "main",
"force": false
}'
{
"body": {
"branch": "main",
"force": false,
"repo_url": "https://github.com/your-org/your-repo"
},
"headers": {
"Accept": "application/json",
"Authorization": "Bearer $SENTRINT_API_KEY",
"Content-Type": "application/json",
"idempotency-key": "submission-request-001"
},
"method": "POST",
"path": "/api/v1/workspaces/{workspace_id}/submissions",
"path_parameters": {
"workspace_id": "00000000-0000-4000-8000-000000000001"
},
"query_parameters": {}
}
{
"created_at": "2026-09-30T12:00:00Z",
"error_code": "example",
"error_detail": "example",
"id": "00000000-0000-4000-8000-000000000001",
"reused": false,
"scan_id": "00000000-0000-4000-8000-000000000001",
"scan_status_url": "example",
"status": "accepted",
"status_url": "example",
"updated_at": "2026-09-30T12:00:00Z"
}
GET/api/v1/submissions/{submission_id}Get submission status scans:read
Get submission status Link
Accepted, validating, failed or scan_ready. Once ready it carries the scan ID.
Scope scans:read
Success 200
Parameters
Parameter In Type Details
submission_idRequired path uuid
Response fields
Field Type Details
iduuidRequired statusstringRequired status_urlstringRequired scan_iduuid | nullRequired scan_status_urlstring | nullRequired reusedbooleanRequired error_codestring | nullRequired error_detailstring | nullRequired created_atdate-timeRequired updated_atdate-timeRequired
HTTP status codes Status Meaning 200Successful Response 422Invalid request, filter, date range or pagination cursor. 400Repository exceeds the configured size or scannable file limit. 401Missing, malformed, expired or revoked API key. 403Missing scope, current terms, workspace permission or owner deletion approval. 404Resource missing or unavailable to this account. 409Scan or approval state conflicts with this operation. 413Request body exceeds 16 KiB. 429Rate limit or scan quota exceeded. Retry-After accompanies rate limits. 503Authentication/rate infrastructure or repository access is unavailable. 500Unexpected server error. Keep the request ID for support.
curl --fail-with-body --request GET \
"https://sentrint.com/api/v1/submissions/$SUBMISSION_ID" \
--header "Authorization: Bearer $SENTRINT_API_KEY" \
--header "Accept: application/json"
{
"body": null,
"headers": {
"Accept": "application/json",
"Authorization": "Bearer $SENTRINT_API_KEY"
},
"method": "GET",
"path": "/api/v1/submissions/{submission_id}",
"path_parameters": {
"submission_id": "00000000-0000-4000-8000-000000000001"
},
"query_parameters": {}
}
{
"created_at": "2026-09-30T12:00:00Z",
"error_code": "example",
"error_detail": "example",
"id": "00000000-0000-4000-8000-000000000001",
"reused": false,
"scan_id": "00000000-0000-4000-8000-000000000001",
"scan_status_url": "example",
"status": "accepted",
"status_url": "example",
"updated_at": "2026-09-30T12:00:00Z"
}
Findings2
GET/api/v1/findingsList findings findings:read
Findings across your scans, filtered by severity, status, rule and more.
Scope findings:read
Success 200
Parameters
Parameter In Type Details
workspace_idOptional query uuid | nullscan_idOptional query uuid | nullseverityOptional query string | nullAccepted values: CRITICAL, HIGH, LOW, MEDIUM categoryOptional query string | nullAccepted values: code, dependency, secret rule_idOptional query string | nullstatusOptional query string | nullAccepted values: fixed, ignored, in_progress, open verification_stateOptional query string | nullAccepted values: ai_reviewed, corroborated, detected, disproved, runtime_confirmed qOptional query string | nulllimitOptional query integerDefault: 25 Minimum: 1; Maximum: 100 cursorOptional query string | null
Response fields
Field Type Details
dataFindingOut[]Required next_cursorstring | nullOptional
HTTP status codes Status Meaning 200Successful Response 422Invalid request, filter, date range or pagination cursor. 400Repository exceeds the configured size or scannable file limit. 401Missing, malformed, expired or revoked API key. 403Missing scope, current terms, workspace permission or owner deletion approval. 404Resource missing or unavailable to this account. 409Scan or approval state conflicts with this operation. 413Request body exceeds 16 KiB. 429Rate limit or scan quota exceeded. Retry-After accompanies rate limits. 503Authentication/rate infrastructure or repository access is unavailable. 500Unexpected server error. Keep the request ID for support.
curl --fail-with-body --request GET \
"https://sentrint.com/api/v1/findings" \
--header "Authorization: Bearer $SENTRINT_API_KEY" \
--header "Accept: application/json" \
--get \
--data-urlencode workspace_id=00000000-0000-4000-8000-000000000001 \
--data-urlencode scan_id=00000000-0000-4000-8000-000000000001 \
--data-urlencode severity=CRITICAL \
--data-urlencode category=code \
--data-urlencode rule_id=example \
--data-urlencode status=fixed \
--data-urlencode verification_state=ai_reviewed \
--data-urlencode q=example \
--data-urlencode limit=25
{
"body": null,
"headers": {
"Accept": "application/json",
"Authorization": "Bearer $SENTRINT_API_KEY"
},
"method": "GET",
"path": "/api/v1/findings",
"path_parameters": {},
"query_parameters": {
"category": "code",
"cursor": "\u003cnext_cursor\u003e",
"limit": 25,
"q": "example",
"rule_id": "example",
"scan_id": "00000000-0000-4000-8000-000000000001",
"severity": "CRITICAL",
"status": "fixed",
"verification_state": "ai_reviewed",
"workspace_id": "00000000-0000-4000-8000-000000000001"
}
}
{
"data": [],
"next_cursor": "example"
}
GET/api/v1/findings/{finding_id}Get a finding findings:read
File, line, message, fix suggestion and up to 100 evidence records. Evidence names the kind of check that saw it, never an internal tool.
Scope findings:read
Success 200
Parameters
Parameter In Type Details
finding_idRequired path uuid
Response fields
Field Type Details
iduuidRequired scan_iduuidRequired rule_idstringRequired file_pathstringRequired lineinteger | nullRequired severitystringRequired categorystringRequired messagestringRequired statusstringRequired verification_statestring | nullRequired suggestionstring | nullRequired snippetstring | nullRequired evidenceEvidenceOut[]Optional guidance_lockedbooleanRequired
HTTP status codes Status Meaning 200Successful Response 422Invalid request, filter, date range or pagination cursor. 400Repository exceeds the configured size or scannable file limit. 401Missing, malformed, expired or revoked API key. 403Missing scope, current terms, workspace permission or owner deletion approval. 404Resource missing or unavailable to this account. 409Scan or approval state conflicts with this operation. 413Request body exceeds 16 KiB. 429Rate limit or scan quota exceeded. Retry-After accompanies rate limits. 503Authentication/rate infrastructure or repository access is unavailable. 500Unexpected server error. Keep the request ID for support.
curl --fail-with-body --request GET \
"https://sentrint.com/api/v1/findings/$FINDING_ID" \
--header "Authorization: Bearer $SENTRINT_API_KEY" \
--header "Accept: application/json"
{
"body": null,
"headers": {
"Accept": "application/json",
"Authorization": "Bearer $SENTRINT_API_KEY"
},
"method": "GET",
"path": "/api/v1/findings/{finding_id}",
"path_parameters": {
"finding_id": "00000000-0000-4000-8000-000000000001"
},
"query_parameters": {}
}
{
"category": "example",
"evidence": [],
"file_path": "example",
"guidance_locked": false,
"id": "00000000-0000-4000-8000-000000000001",
"line": 0,
"message": "example",
"rule_id": "example",
"scan_id": "00000000-0000-4000-8000-000000000001",
"severity": "example",
"snippet": "example",
"status": "example",
"suggestion": "example",
"verification_state": "example"
}
Deletion approval3
POST/api/v1/scans/{scan_id}/deletion-requestsRequest a deletion scans:delete
Returns an approval link the account owner opens in a browser.
Scope scans:delete
Success 201
Parameters
Parameter In Type Details
scan_idRequired path uuid
Response fields
Field Type Details
request_iduuidRequired scan_iduuidRequired statusstringRequired expires_atdate-timeRequired approval_urlstringRequired
HTTP status codes Status Meaning 201Successful Response 422Invalid request, filter, date range or pagination cursor. 400Repository exceeds the configured size or scannable file limit. 401Missing, malformed, expired or revoked API key. 403Missing scope, current terms, workspace permission or owner deletion approval. 404Resource missing or unavailable to this account. 409Scan or approval state conflicts with this operation. 413Request body exceeds 16 KiB. 429Rate limit or scan quota exceeded. Retry-After accompanies rate limits. 503Authentication/rate infrastructure or repository access is unavailable. 500Unexpected server error. Keep the request ID for support.
curl --fail-with-body --request POST \
"https://sentrint.com/api/v1/scans/$SCAN_ID/deletion-requests" \
--header "Authorization: Bearer $SENTRINT_API_KEY" \
--header "Accept: application/json"
{
"body": null,
"headers": {
"Accept": "application/json",
"Authorization": "Bearer $SENTRINT_API_KEY"
},
"method": "POST",
"path": "/api/v1/scans/{scan_id}/deletion-requests",
"path_parameters": {
"scan_id": "00000000-0000-4000-8000-000000000001"
},
"query_parameters": {}
}
{
"approval_url": "https://sentrint.com/dashboard/api/deletion-approvals/00000000-0000-4000-8000-000000000001",
"expires_at": "2026-09-30T12:10:00Z",
"request_id": "00000000-0000-4000-8000-000000000001",
"scan_id": "00000000-0000-4000-8000-000000000001",
"status": "pending"
}
GET/api/v1/deletion-requests/{request_id}Get approval status scans:delete
Shows whether the owner has approved the deletion yet.
Scope scans:delete
Success 200
Parameters
Parameter In Type Details
request_idRequired path uuid
Response fields
Field Type Details
request_iduuidRequired scan_iduuidRequired statusstringRequired expires_atdate-timeRequired approval_urlstringRequired
HTTP status codes Status Meaning 200Successful Response 422Invalid request, filter, date range or pagination cursor. 400Repository exceeds the configured size or scannable file limit. 401Missing, malformed, expired or revoked API key. 403Missing scope, current terms, workspace permission or owner deletion approval. 404Resource missing or unavailable to this account. 409Scan or approval state conflicts with this operation. 413Request body exceeds 16 KiB. 429Rate limit or scan quota exceeded. Retry-After accompanies rate limits. 503Authentication/rate infrastructure or repository access is unavailable. 500Unexpected server error. Keep the request ID for support.
curl --fail-with-body --request GET \
"https://sentrint.com/api/v1/deletion-requests/$DELETION_REQUEST_ID" \
--header "Authorization: Bearer $SENTRINT_API_KEY" \
--header "Accept: application/json"
{
"body": null,
"headers": {
"Accept": "application/json",
"Authorization": "Bearer $SENTRINT_API_KEY"
},
"method": "GET",
"path": "/api/v1/deletion-requests/{request_id}",
"path_parameters": {
"request_id": "00000000-0000-4000-8000-000000000001"
},
"query_parameters": {}
}
{
"approval_url": "https://sentrint.com/dashboard/api/deletion-approvals/00000000-0000-4000-8000-000000000001",
"expires_at": "2026-09-30T12:10:00Z",
"request_id": "00000000-0000-4000-8000-000000000001",
"scan_id": "00000000-0000-4000-8000-000000000001",
"status": "pending"
}
DELETE/api/v1/scans/{scan_id}Delete a scan scans:delete
Removes a finished scan and its findings once the owner has approved.
Scope scans:delete
Success 204
Parameters
Parameter In Type Details
scan_idRequired path uuidX-Deletion-ApprovalOptional header uuid | null
HTTP status codes Status Meaning 204Successful Response 422Invalid request, filter, date range or pagination cursor. 400Repository exceeds the configured size or scannable file limit. 401Missing, malformed, expired or revoked API key. 403Missing scope, current terms, workspace permission or owner deletion approval. 404Resource missing or unavailable to this account. 409Scan or approval state conflicts with this operation. 413Request body exceeds 16 KiB. 429Rate limit or scan quota exceeded. Retry-After accompanies rate limits. 503Authentication/rate infrastructure or repository access is unavailable. 500Unexpected server error. Keep the request ID for support.
curl --fail-with-body --request DELETE \
"https://sentrint.com/api/v1/scans/$SCAN_ID" \
--header "Authorization: Bearer $SENTRINT_API_KEY" \
--header "Accept: application/json" \
--header "X-Deletion-Approval: $DELETION_REQUEST_ID"
{
"body": null,
"headers": {
"Accept": "application/json",
"Authorization": "Bearer $SENTRINT_API_KEY",
"X-Deletion-Approval": "$DELETION_REQUEST_ID"
},
"method": "DELETE",
"path": "/api/v1/scans/{scan_id}",
"path_parameters": {
"scan_id": "00000000-0000-4000-8000-000000000001"
},
"query_parameters": {}
}
A 204 response has no body.
Audit events1
GET/api/v1/audit-eventsList audit events audit:read
Account activity, as far back as your plan keeps it.
Scope audit:read
Success 200
Parameters
Parameter In Type Details
fromOptional query date-time | nulltoOptional query date-time | nullcategoryOptional query string | nullAccepted values: account, billing, mcp, repo, scan, workspace actionOptional query string | nullsourceOptional query string | nullAccepted values: account, audit, payment, plan, scan_log, workspace limitOptional query integerDefault: 25 Minimum: 1; Maximum: 100 cursorOptional query string | null
Response fields
Field Type Details
dataAuditOut[]Required next_cursorstring | nullOptional
HTTP status codes Status Meaning 200Successful Response 422Invalid request, filter, date range or pagination cursor. 400Repository exceeds the configured size or scannable file limit. 401Missing, malformed, expired or revoked API key. 403Missing scope, current terms, workspace permission or owner deletion approval. 404Resource missing or unavailable to this account. 409Scan or approval state conflicts with this operation. 413Request body exceeds 16 KiB. 429Rate limit or scan quota exceeded. Retry-After accompanies rate limits. 503Authentication/rate infrastructure or repository access is unavailable. 500Unexpected server error. Keep the request ID for support.
curl --fail-with-body --request GET \
"https://sentrint.com/api/v1/audit-events" \
--header "Authorization: Bearer $SENTRINT_API_KEY" \
--header "Accept: application/json" \
--get \
--data-urlencode from=2026-09-30T12:00:00Z \
--data-urlencode to=2026-09-30T12:00:00Z \
--data-urlencode category=account \
--data-urlencode action=example \
--data-urlencode source=account \
--data-urlencode limit=25
{
"body": null,
"headers": {
"Accept": "application/json",
"Authorization": "Bearer $SENTRINT_API_KEY"
},
"method": "GET",
"path": "/api/v1/audit-events",
"path_parameters": {},
"query_parameters": {
"action": "example",
"category": "account",
"cursor": "\u003cnext_cursor\u003e",
"from": "2026-09-30T12:00:00Z",
"limit": 25,
"source": "account",
"to": "2026-09-30T12:00:00Z"
}
}
{
"data": [],
"next_cursor": "example"
}
No endpoint matches. Try a path such as /scans or a scope such as findings:read.
List endpoints return {"data": [...], "next_cursor": "..."}. Set limit from 1 to 100; the default is 25. For the next page, send next_cursor back as cursor, and stop when it is null. Keep the filters the same from page to page: a cursor only works for the owner, resource and filters it came from.
GET /api/v1/findings?scan_id={scan_id}&severity=HIGH&status=open&limit=25
Finding filters workspace_id, scan_id, severity, category, rule_id, status, verification_state and q. Values are case-sensitive, and each endpoint lists the values it accepts. q searches the message, file path and rule ID, up to 120 characters; rule_id takes up to 128. If you pass both IDs, the scan must belong to that workspace.
Audit filters from, to, category, action (up to 48 characters) and source. Dates are ISO 8601, in order, and inside your plan's audit retention. Use explicit UTC dates for a fixed window. action takes the same codes the API returns, including the log_ and payment_ ones. Only retained history comes back.
Errors
Errors come back as application/problem+json with type, title, status, code, detail and request_id. Branch on code, never on the wording of detail, and quote request_id when you contact support.
{
"code": "invalid_api_key",
"detail": "A valid Bearer API key is required.",
"request_id": "example-request-id",
"status": 401,
"title": "Unauthorized",
"type": "about:blank"
}
Status Codes What to do
400repository_too_largeCut the repository size or the number of files that get scanned.
401invalid_api_keyCheck the Bearer header, and whether the key expired or was revoked.
403insufficient_scope, terms_required, workspace_read_only, approval_requiredAdd the scope, accept the terms, or get the owner's approval.
404workspace_not_found, scan_not_found, finding_not_found, approval_not_foundUse an ID that belongs to this account.
409workspace_conflict, scan_not_finished, approval_unavailable, scan_requires_force, rules_version_changed, commit_not_on_branchFix the state of the resource, then retry.
413, 422body_too_large, validation_error, invalid_filter, invalid_cursor, invalid_date_rangeSend valid parameters and a JSON body of 16 KiB or less.
429rate_limit_exceeded, quota_exhaustedWait for Retry-After on a rate limit. On quota, check your allowance.
503rate_limit_unavailable, repository_unavailableRetry reads with backoff. Check repository access before you submit again.
The limit for each kind of request is on the Rate limits tab of your dashboard. When you hit one, wait for the time in Retry-After and add jitter to your retries. Don't retry writes blindly. quota_exhausted means the scan allowance is used up, so waiting won't help.
An ID that doesn't exist and an ID that belongs to someone else both return 404. A deletion request can fail its approval check before the scan is looked up. No response is cached, success or error.
Delete scan results
Deleting a finished scan removes it and its findings for good. The audit record stays. Even with a scans:delete key, the account owner approves each deletion in a browser.
1
2 The owner opens approval_url, checks the scan and the key, confirms their linked sign-in through OAuth, then approves. GitHub may reuse a session it already has, so this is not a guaranteed fresh password or MFA prompt. The email is only a notice. It does not approve anything.
3
4
curl --fail-with-body -X DELETE \
"https://sentrint.com/api/v1/scans/$SCAN_ID" \
-H "Authorization: Bearer $SENTRINT_API_KEY" \
-H "X-Deletion-Approval: $DELETION_REQUEST_ID"
An approval lasts 10 minutes and works once, for one owner, one key and one scan. Retrying or rescanning the scan cancels it, and a used or expired approval returns 409. A running scan can't be deleted; stop it in the dashboard first. If the owner has a verified email on a linked sign-in, we send a deletion notice. The deletion stands even if that email fails.
Response schemas
The objects the endpoints return, field by field. Pick one to see its fields. A linked type opens the object it contains. The raw JSON Schema is in the OpenAPI file.
AccountOut8 ApprovalOut5 AuditOut8 EvidenceOut5 FindingDetailOut14 FindingOut10 HTTPValidationError1 Page_AuditOut_2 Page_FindingOut_2 Page_ScanOut_2 Page_WorkspaceOut_2 Problem6 ReportOut10 RepositoryOut2 ScanOut8 ScanQueued4 ScanRequest4 SubmissionOut10 ValidationError5 WorkspaceDetailOut6 WorkspaceOut3
AccountOut8 fields
Field Type Details
idRequired uuidloginRequired stringplanRequired stringincluded_scans_remainingRequired integerscan_creditsRequired integerscans_used_in_periodRequired integerscan_limit_in_periodRequired integer | nullperiodRequired string
ApprovalOut5 fields
Field Type Details
request_idRequired uuidscan_idRequired uuidstatusRequired stringexpires_atRequired date-timeapproval_urlRequired string
AuditOut8 fields
Field Type Details
idRequired stringatRequired date-timesourceRequired stringcategoryRequired stringactionRequired stringlabelRequired stringtargetRequired string | nulldetailRequired string | null
EvidenceOut5 fields
Field Type Details
idRequired uuidoriginRequired stringkindRequired stringproducerRequired stringpayloadRequired object
FindingDetailOut14 fields
Field Type Details
idRequired uuidscan_idRequired uuidrule_idRequired stringfile_pathRequired stringlineRequired integer | nullseverityRequired stringcategoryRequired stringmessageRequired stringstatusRequired stringverification_stateRequired string | nullsuggestionRequired string | nullsnippetRequired string | nullevidenceOptional EvidenceOut[]guidance_lockedRequired boolean
FindingOut10 fields
Field Type Details
idRequired uuidscan_idRequired uuidrule_idRequired stringfile_pathRequired stringlineRequired integer | nullseverityRequired stringcategoryRequired stringmessageRequired stringstatusRequired stringverification_stateRequired string | null
HTTPValidationError1 field
Page_AuditOut_2 fields
Field Type Details
dataRequired AuditOut[]next_cursorOptional string | null
Page_FindingOut_2 fields
Field Type Details
dataRequired FindingOut[]next_cursorOptional string | null
Page_ScanOut_2 fields
Field Type Details
dataRequired ScanOut[]next_cursorOptional string | null
Page_WorkspaceOut_2 fields
Field Type Details
dataRequired WorkspaceOut[]next_cursorOptional string | null
Problem6 fields
Field Type Details
typeRequired stringtitleRequired stringstatusRequired integercodeRequired stringdetailRequired stringrequest_idRequired string
ReportOut10 fields
Field Type Details
scan_idRequired uuidscoreRequired integergradeRequired stringcriticalRequired integerhighRequired integermediumRequired integerlowRequired integertop_rulesRequired string[]summary_textRequired stringguidance_lockedRequired boolean
RepositoryOut2 fields
Field Type Details
full_nameRequired stringrepo_urlRequired string
ScanOut8 fields
Field Type Details
idRequired uuidworkspace_idRequired uuid | nullstatusRequired stringrepo_urlRequired stringcommit_shaRequired stringscoreRequired integer | nullcreated_atRequired date-timeupdated_atRequired date-time
ScanQueued4 fields
Field Type Details
scan_idRequired uuidstatusRequired stringstatus_urlRequired stringreusedRequired boolean
ScanRequest4 fields
Field Type Details
repo_urlRequired stringMaximum length: 512 branchOptional string | nullforceOptional booleancommit_shaOptional string | null
SubmissionOut10 fields
Field Type Details
idRequired uuidstatusRequired stringaccepted, validating, failed, scan_readystatus_urlRequired stringscan_idRequired uuid | nullscan_status_urlRequired string | nullreusedRequired booleanerror_codeRequired string | nullerror_detailRequired string | nullcreated_atRequired date-timeupdated_atRequired date-time
ValidationError5 fields
Field Type Details
locRequired (string | integer)[]msgRequired stringtypeRequired stringinputOptional valuectxOptional object
WorkspaceDetailOut6 fields
Field Type Details
idRequired uuidnameRequired stringcreated_atRequired date-timetracked_repository_countRequired integerrepositoriesOptional RepositoryOut[]repositories_truncatedOptional boolean
WorkspaceOut3 fields
Field Type Details
idRequired uuidnameRequired stringcreated_atRequired date-time
Postman and OpenAPI
Import the contract into your API client. The Postman collection has base_url, api_key and resource ID variables to fill in locally, and its optional query rows start switched off. Keep a filled-in environment private. Insomnia and other OpenAPI 3.1 clients can import the JSON or YAML file.