Download OpenAPI specification:
Programmatic access to security findings and project data.
Pass your API token in the Authorization header:
curl -H "Authorization: Bearer sh_live_k9s8d_9f8s7d6f5..." \
https://service.shinobi.security/v1/projects/{projectId}/findings
Token format: sh_<env>_<id>_<secret>
sh - Shinobi prefix (helps secret scanners detect leaked tokens)env - Environment: live (production) or test (sandbox)id - Public key identifier (safe to log)secret - Secret part (never log this)All major HTTP libraries support Bearer tokens:
# Python requests
requests.get(url, headers={"Authorization": "Bearer sh_live_..."})
// Node.js axios
axios.get(url, { headers: { Authorization: "Bearer sh_live_..." } })
This API uses cursor-based pagination for consistent results:
{
"data": [...],
"cursor": "eyJ0ZW5hbnQiOiJ...",
"hasMore": true
}
Pass the cursor value in subsequent requests to fetch the next page.
Use query parameters to filter results server-side:
severity: Comma-separated severity levels (e.g., CRITICAL,HIGH)status: Comma-separated statuses (e.g., OPEN,IN_PROGRESS)since: ISO-8601 timestamp for incremental sync - returns findings updated after this time (e.g., 2024-01-01T00:00:00Z)Returns a paginated list of projects accessible by the API token.
Required Scope: project:view (enabled by default on all keys)
Results are sorted by creation time (newest first).
| limit | integer [ 1 .. 100 ] Default: 100 Items per page (1-100, default 100) |
| cursor | string Pagination cursor from previous response. |
| name | string Example: name=Payment Filter by project name (case-insensitive contains match) |
| createdAfter | string <date-time> Example: createdAfter=2024-01-01T00:00:00Z Filter projects created after this ISO-8601 timestamp |
| createdBefore | string <date-time> Example: createdBefore=2024-12-31T23:59:59Z Filter projects created before this ISO-8601 timestamp |
| status | string Enum: "PENDING" "IN_PROGRESS" "PAUSED" "COMPLETED" Filter by latest run status |
| stage | string Enum: "Scoping" "Exploring" "Creating Attack Scenarios" "Awaiting Test Start" "Testing" "Reporting" "Completed" Filter by current stage (milestone) |
{- "data": [
- {
- "id": "f8P9_01I0AN1ZL6sN5-gw",
- "name": "Payment Gateway Prod",
- "createdAt": "2024-06-15T10:30:00.000Z",
- "description": "Production payment processing API security assessment",
- "status": "IN_PROGRESS",
- "stage": "Testing"
}
], - "cursor": "string",
- "hasMore": true
}Returns details for a single project.
Required Scope: project:view (enabled by default on all keys)
| projectId required | string^[A-Za-z0-9_-]{21}$|^[0-9a-f]{8}-[0-9a-f]{4}-... Project identifier (21-char nanoid or UUID format) |
{- "data": {
- "id": "f8P9_01I0AN1ZL6sN5-gw",
- "name": "Payment Gateway Prod",
- "createdAt": "2024-06-15T10:30:00.000Z",
- "description": "Production payment processing API security assessment",
- "status": "IN_PROGRESS",
- "stage": "Testing"
}
}Returns a paginated list of findings for a project.
Use the view parameter to control response detail:
summary (default): Returns core fields only (id, title, severity, status, timestamps)full: Returns all available fields including CVSS details and remediation (slower, lower limits)Results are sorted by creation time (createdAt). Use sort=desc for newest first.
| projectId required | string^[A-Za-z0-9_-]{21}$|^[0-9a-f]{8}-[0-9a-f]{4}-... Project identifier (21-char nanoid or UUID format) |
| view | string Default: "summary" Enum: "summary" "full" Data density. |
| severity | string Example: severity=CRITICAL,HIGH Filter by severity. Comma-separated values. |
| status | string Example: status=OPEN,RETESTING Filter by status. Comma-separated values. |
| since | string <date-time> Example: since=2024-01-01T00:00:00Z Return findings updated (modified) after this ISO-8601 timestamp. Useful for incremental sync - captures both new findings and status changes. |
| sort | string Default: "asc" Enum: "asc" "desc" Sort direction by creation time. |
| cursor | string Pagination cursor from previous response. |
| limit | integer [ 1 .. 100 ] Default: 50 Items per page. Max 100 for summary view, 25 for full view. |
{- "data": [
- {
- "id": "abc123def456",
- "title": "SQL Injection in login endpoint",
- "severity": "HIGH",
- "cvssScore": 8.6,
- "cvssVector": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N",
- "status": "OPEN",
- "createdAt": "2024-06-15T10:30:00.000Z",
- "updatedAt": "2024-06-20T14:45:00.000Z",
- "description": "string",
- "remediation": "string",
- "cwe_id": [
- "CWE-269",
- "CWE-915",
- "CWE-284"
], - "owasp_flairs": [
- "A01-Broken-Access-Control"
], - "affectedEndpoint": "/api/v1/login"
}
], - "cursor": "string",
- "hasMore": true
}Returns full details for a single finding including CVSS information, remediation steps, and affected endpoints.
| projectId required | string^[A-Za-z0-9_-]{21}$|^[0-9a-f]{8}-[0-9a-f]{4}-... Project identifier (21-char nanoid or UUID format) |
| findingId required | string^[A-Za-z0-9_-]{10,50}$ Finding identifier |
{- "data": {
- "id": "abc123def456",
- "title": "SQL Injection in login endpoint",
- "severity": "HIGH",
- "cvssScore": 8.6,
- "cvssVector": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N",
- "status": "OPEN",
- "createdAt": "2024-06-15T10:30:00.000Z",
- "updatedAt": "2024-06-20T14:45:00.000Z",
- "description": "string",
- "remediation": "string",
- "cwe_id": [
- "CWE-269",
- "CWE-915",
- "CWE-284"
], - "owasp_flairs": [
- "A01-Broken-Access-Control"
], - "affectedEndpoint": "/api/v1/login"
}
}Triggers a CI-initiated test run on a whitebox project.
The project must be whitebox (at least one repository configured), otherwise
the request is rejected with NOT_WHITEBOX. Mobile projects are also
supported and may optionally supply an apkUrl (HTTPS) to a fresh build —
Shinobi securely downloads it, stores it against the project, and tests that
build. When omitted, the project's current APK is tested.
At least one of repositories (scopes the test per repository to a PR,
commit, or range) or releaseNotes (a free-text description of what
changed) is required for whitebox (repository-backed) projects. Projects
without repositories must provide releaseNotes.
A project can have several repositories linked. Each repositories entry
names a repository that is linked to the project and optionally carries a
diff describing what changed in it. Repositories you leave out — or leave
without a diff — are tested in full at their configured branch, so you
only send change context for the repos that actually changed.
Only repoFullName and diff are accepted. The repository's connection,
organisation and branches are always taken from the project's own
configuration and are echoed back on the response.
Required Scope: trigger:write
| projectId required | string^[A-Za-z0-9_-]{21}$|^[0-9a-f]{8}-[0-9a-f]{4}-... Project identifier (21-char nanoid or UUID format) |
Array of objects (TriggerTestRepository) <= 50 items The repositories that changed, each with an optional | |
| releaseNotes | string [ 1 .. 10000 ] characters Free-text description of changes being tested. Whitebox projects need this
or a scoped |
| apkUrl | string <uri> <= 2048 characters Mobile projects only. HTTPS URL to a fresh APK/APKS/XAPK build. Shinobi securely downloads the build, stores it against the project, and tests it. Omit to test the project's current APK. Rejected for non-mobile projects. |
{- "releaseNotes": "Fixed auth redirect handling",
- "repositories": [
- {
- "repoFullName": "acme/storefront",
- "diff": {
- "type": "pr",
- "prNumber": 42,
- "branch": "feature/auth-fix"
}
}
]
}{- "data": {
- "runId": "run_abc123",
- "projectId": "f8P9_01I0AN1ZL6sN5-gw",
- "status": "IN_PROGRESS",
- "runNumber": 5,
- "repositories": [
- {
- "orgName": "acme",
- "repoFullName": "acme/storefront",
- "defaultBranch": "main",
- "branch": "develop",
- "diff": {
- "type": "pr",
- "prNumber": 42,
- "commitSha": "a1b2c3d4e5f",
- "commitRange": {
- "from": "a1b2c3d",
- "to": "f6e5d4c"
}, - "branch": "main"
}
}
], - "releaseNotes": "string"
}
}Returns a paginated list of tenant-wide audit log events.
Includes project-level, org-level, and system access events.
Use the tenant, project, and access category params to include or
exclude each category independently.
Required Scope: audit-logs:read
Required Key Type: All-projects key (allProjects: true)
| limit | integer [ 1 .. 200 ] Default: 100 Items per page (1-200, default 100) |
| cursor | string Pagination cursor from previous response. |
| from | integer Example: from=1716300000000 Start of time range (epoch milliseconds) |
| to | integer Example: to=1716400000000 End of time range (epoch milliseconds) |
| taskId | string Filter by project ID. Repeatable (max 50). Implies |
| userId | string Filter by user principal ID. Repeatable (max 50). |
| tenant | string Default: "include" Enum: "include" "exclude" Include or exclude org-level events (default |
| project | string Default: "include" Enum: "include" "exclude" Include or exclude project-scoped events (default |
| access | string Default: "include" Enum: "include" "exclude" Include or exclude system access events like login/logout (default |
{- "data": [
- {
- "id": "abc123def456",
- "timestamp": 1716300000000,
- "date": "2026-05-21T15:20:00.000Z",
- "action": "project.create",
- "resource": "project",
- "resourceId": "f8P9_01I0AN1ZL6sN5-gw",
- "taskId": "f8P9_01I0AN1ZL6sN5-gw",
- "userId": "string",
- "userName": "Jane Doe",
- "userEmail": "jane@example.com",
- "source": "WEB_UI",
- "description": "Created project 'API Server'",
- "metadata": { },
- "ipAddress": "203.0.113.42",
- "userAgent": "string"
}
], - "cursor": "string",
- "hasMore": true
}