Skip to main content

Cloud Security API

Everything on the Cloud Security pages is available over the REST API. This page maps each workflow to its endpoints; the API Reference covers authentication, conventions and full request/response examples, and the live Swagger UI at https://<your-host>/api/docs is the exhaustive list.

export OFFLOAD_HOST="https://your-instance.example.com"
export OFFLOAD_API_KEY="osk_xxxxxxxxxxxxxxxxxxxx" # Settings → API Keys

Send the key as X-API-Key. Every call is scoped to the key's team. A few endpoints noted below are session-only (they accept a signed-in user's X-Session-ID but not an API key).

Accounts

TaskEndpointNotes
List connected accountsGET /api/cloud-accounts/Credentials are never returned.
Connect an accountPOST /api/cloud-accounts/provider, account_id, account_name, region, credentials{} — per-provider keys in Cloud Accounts API. Validates before saving; returns scan_run_id of the first scan.
Get / update / removeGET · PUT · DELETE /api/cloud-accounts/{id}PUT accepts regions (the scan scope) among other fields. DELETE cascades findings, scores, scan history and schedules.
Test connectionPOST /api/cloud-accounts/{id}/revalidateSame check as onboarding step 6.
Scan one accountPOST /api/cloud-accounts/{id}/scanBody { "scan_type": "quick" | "full" | "comprehensive" }. Needs Run Scans.
Bulk actionsPOST /api/cloud-accounts/bulk/revalidate · /bulk/scan · /bulk/deleteBody { "account_ids": [...] } (+ scan_type for scan). Result lists queued / already running / skipped / failed.
GCP organizationPOST /api/gcp/org/readiness · POST /api/gcp/org/connections · GET /api/gcp/org/connections/{id}/hierarchy · POST …/rediscoverOrg/folder onboarding, project discovery, per-project toggle (PUT …/projects/{project_id}/toggle).
curl -s -X POST "$OFFLOAD_HOST/api/cloud-accounts/$ACCOUNT_ID/scan" \
-H "X-API-Key: $OFFLOAD_API_KEY" -H "Content-Type: application/json" \
-d '{ "scan_type": "full" }'

Scans

TaskEndpointNotes
Start a scanPOST /api/cloud-scans/initiateBody { "account_id", "provider", "scan_type": "full", "regions": ["us-east-1", …] } — omit regions to use the account's configured scope. Session-only; from automation use POST /api/cloud-accounts/{id}/scan above. Returns run_id, status, sub_jobs_count, estimated_completion.
List scansGET /api/cloud-scans/?account_id=&provider=&status=&limit=50&skip=0Team-scoped history.
Poll one scanGET /api/cloud-scans/{run_id}/statusstatus (queuedrunningcompleted / partial / failed / cancelled), progress.overall, per-job and per-region status, summary.
Run summaryGET /api/cloud-scans/{run_id}/summaryTotals and severity breakdown.
CancelDELETE /api/cloud-scans/{run_id}Needs Manage Scans.
Coverage dashboardGET /api/cloud/coverage-summary?scan_stale_days=30The Coverage tab's data: scanned / scheduled / not covered, findings by severity, stale accounts.
# poll until terminal
curl -s "$OFFLOAD_HOST/api/cloud-scans/$RUN_ID/status" -H "X-API-Key: $OFFLOAD_API_KEY" \
| jq '{status: .status, overall: .progress.overall, findings: .summary.total_findings}'

Findings

TaskEndpointNotes
Grouped findings (the Scanning tab)GET /api/cspm/findings/groupedFilters: account_id, provider, category, severity, status (default fail), service, framework, search, limit, skip. Returns one group per check with instance counts, regions, accounts and risk score.
Raw findingsGET /api/cspm/findingsPer-resource rows with the same filters.
One findingGET /api/cspm/findings/{finding_id}Full detail incl. remediation and framework controls.
StatsGET /api/cspm/findings/stats · /category-summary · /risk-trend · /posture-trend/{account_id}Severity counts, per-category posture scores (incl. IAM and network scores), trends. stats-by-account and compliance-scores are session-only.
ResolvePOST /api/cspm/findings/{finding_id}/resolveBody { "resolution_notes": "…" }. Needs Manage Risks.
Suppress / unsuppressPOST /api/cspm/findings/{finding_id}/suppress · /unsuppressBody { "reason": "…", "duration_days": 30 } or { "suppress_until": "2026-12-31T00:00:00Z" }; omit both for permanent.
Bulk action on a checkPOST /api/cspm/findings/grouped/{check_id}/bulk-actionBody { "action": "resolve_all" | "suppress_all" | "create_remediation", "reason": "…" } — every instance of the check in one call.
Create remediation taskPOST /api/cspm/findings/{finding_id}/remediationBody { "assigned_to", "priority", "due_date", "notes" }.
ExportGET /api/cspm/findings/export?format=csvformat = csv | xlsx. Session-only; honours the same filters.
# critical, still-failing checks in one account
curl -s "$OFFLOAD_HOST/api/cspm/findings/grouped?account_id=$ACCOUNT_ID&severity=critical&status=fail" \
-H "X-API-Key: $OFFLOAD_API_KEY"

Remediation tasks

TaskEndpointNotes
List the queueGET /api/cspm/remediation-tasks?status=open&severity=&priority=&search=&limit=20&skip=0Non-terminal tasks first; response carries tasks, summary (count per status) and total.
Update a taskPATCH /api/cspm/remediation-tasks/{task_id}Any of status (open · in_progress · done · wont_fix · cancelled), assigned_to, priority, due_date, notes.

Compliance

TaskEndpointNotes
Per-framework scoresGET /api/cspm/findings/compliance-scores?account_id=&provider=&framework=&scan_run_id=Session-only. One row per account × framework from the latest finished scan: score, passed_checks, failed_checks, total_checks, by_severity.

Identity & network analysis

TaskEndpointNotes
CIEM coverageGET /api/ciem/coverage-summaryThe IAM tab's identity coverage & risk.
Run IAM analysisPOST /api/advanced-cspm/identity-analysisBody { "account_id" }. Live, read-only; result persisted for the roster and graph.
Access review / unusedPOST /api/advanced-cspm/identity-analysis/access-review · /cleanup-unusedcleanup-unused is a dry-run listing — nothing is deleted.
Network analysesPOST /api/advanced-cspm/network-analysis/firewall-audit · /public-exposure · /segmentationBody { "account_id" }.

Cloud events

TaskEndpointNotes
Receive eventsPOST /api/cloud-events/webhook/aws · /gcp · /azureTarget of your EventBridge / Pub/Sub / Event Grid route — see Real-Time Cloud Events.
Recent eventsGET /api/cloud-events/recent?limit=50&provider=&severity=Enriched events (raw log omitted).
Ingestion statsGET /api/cloud-events/statsTotals and per-provider counts.

SSL certificates

TaskEndpointNotes
Manage domainsGET · POST /api/ssl-monitor/domains · PUT · DELETE /api/ssl-monitor/domains/{id}POST body { "domain", "port": 443, "alert_threshold_days": 30, "enabled": true, "tags": [] }; checks immediately.
Check nowPOST /api/ssl-monitor/domains/{id}/check · POST /api/ssl-monitor/domains/check-all · POST /api/ssl-monitor/check (ad-hoc, unsaved)
Dashboard / expiringGET /api/ssl-monitor/dashboard · GET /api/ssl-monitor/expiring · GET /api/ssl-monitor/domains/{id}/history

Assets and attack paths

TaskEndpointNotes
InventoryGET /api/unified-cloud-security/assets · /assets/summary · /assets/by-accountFilters mirror the Detailed Inventory tab.
Refresh discoveryPOST /api/unified-cloud-security/assets/refresh?account_id=Background job.
Security graphPOST /api/security-graph/sync · GET /api/security-graph/statsBuild / inspect the graph.
Attack pathsPOST /api/attack-paths/analyze · GET /api/attack-paths/latest · GET /api/attack-paths/blast-radius/{node_id} · POST /api/attack-paths/simulateAnalysis, last result, blast radius, what-if.

Permissions

ActionPlatform permission
Read accounts, scans, findingsView Cloud Accounts / View Scans
Connect, update, remove accountsManage Cloud Accounts
Start or cancel scansRun Scans / Manage Scans
Resolve, suppress, create tasksManage Risks

See Authentication for creating keys with the right scopes and Conventions for pagination, error shapes and rate limits.