Skip to main content
CMDashCybersecurity Maturity Dashboard
DocsDevelopersPublic API — Reference (generated)

Public API — Reference (generated)

<!-- GENERATED FILE — do not hand-edit. Regenerate: `npm run docs:public-api`. -->

For the versioning policy (what v1 guarantees, what forces a v2, the v1 deprecation window, auth, error shapes, pagination — all independently verified prose), see public-api-versioning.md. For an interactive, always-current copy of this same information, see the live docs portal: /api/v1/reference / /api/v2/reference (ReDoc), /api/v1/docs / /api/v2/docs (Swagger UI), /api/v1/docs-json / /api/v2/docs-json (raw OpenAPI 3.0). All paths below are relative to the API base URL (e.g. https://app.cmdash.net/api). For the exact shape of a failed request and every fixed error value the API can return, see error-catalogue.md. For safe request retries — including a curl example against this API — see the public-API section of idempotency.md.

v1 Endpoints

16 endpoints across 5 resource groups. v1 is deprecated but unchanged — every response below still carries the exact shape it always has, including the two known 200 { error: ... } cases (see public-api-versioning.md's "Error shapes" section).

MethodPathPermission scopeParamsSummary
GET/v1/compliance/frameworkscompliance:read—List compliance frameworks with progress
GET/v1/compliance/frameworks/:slug/controlscompliance:readslugGet control statuses for a framework
GET/v1/compliance/progresscompliance:read—Get compliance progress across all frameworks
POST/v1/gate/evaluategate:read—Evaluate the posture-as-code CI gate
GET/v1/gate/policygate:read—Get the effective posture-gate policy (defaults if never configured)
GET/v1/integrationsintegrations:read—List connected integrations
GET/v1/integrations/:id/healthintegrations:readidGet integration sync status and health
GET/v1/posture/historyposture:readdaysGet posture score history
GET/v1/posture/latestposture:read—Get latest posture score
GET/v1/posture/signalsposture:read—Get detailed signal breakdown
GET/v1/risksrisks:readstatus, category, minScore, limit, offsetList risks with optional filtering
POST/v1/risksrisks:write—Create a new risk
PUT/v1/risks/:idrisks:writeidUpdate a risk
GET/v1/risks/:id/controlsrisks:readidGet linked controls for a risk
GET/v1/risks/:id/loss-exposurefair:readidGet FAIR loss exposure for a single risk
GET/v1/risks/loss-exposurefair:read—Get FAIR loss-exposure summary (ALE + percentiles)

v2 Endpoints

45 endpoints across 15 resource groups. Every v1 route has a v2 counterpart at the same sub-path; v2 additionally fixes the two 200 { error: ... } cases to a real 404, and adds new resources (webhooks, reports, audit-logs) that have no v1 equivalent.

MethodPathPermission scopeParamsSummary
GET/v2/assetsassets:readassetType, criticality, limit, offsetList assets
GET/v2/assets/:idassets:readidGet one asset by id
GET/v2/audit-logsaudit-logs:readpage, limit, action, from, toList audit logs with pagination and optional filters
GET/v2/audit-logs/exportaudit-logs:readformat, from, to, actionExport audit logs as CSV or JSON for external auditors
GET/v2/collector/definitionsintegrations:readconnectorIdConnector definitions this tenant has marked COLLECTOR-mode. Never includes credentials —
POST/v2/collector/keysobservations:write—Register the collector’s Ed25519 public key with a one-time token and a proof of possession. The private key never leaves the collector.
POST/v2/collector/keys/rotateobservations:write—Replace the collector’s key; the rotation is signed by BOTH the registered key and the new one.
POST/v2/collector/pushobservations:write—Push results collected inside your own network. Requires a valid X-CMDash-Collector-Signature.
GET/v2/compliance/frameworkscompliance:read—List compliance frameworks with progress
GET/v2/compliance/frameworks/:slug/controlscompliance:readslugGet control statuses for a framework
GET/v2/compliance/progresscompliance:read—Get compliance progress across all frameworks
GET/v2/evidenceevidence:readstatus, collectionMethod, frameworkSlug, controlId, limit, offsetList evidence items
POST/v2/evidenceevidence:write—File evidence against controls from your own tooling
GET/v2/evidence/:idevidence:readidGet one evidence by id
POST/v2/gate/evaluategate:read—Evaluate the posture-as-code CI gate
GET/v2/gate/policygate:read—Get the effective gate policy (defaults if never configured)
GET/v2/incidentsincidents:readstatus, severity, limit, offsetList incidents
GET/v2/incidents/:idincidents:readidGet one incident by id
GET/v2/integrationsintegrations:read—List connected integrations
GET/v2/integrations/:id/healthintegrations:readidGet integration sync status and health
POST/v2/integrations/:id/syncintegrations:writeidTrigger an on-demand sync for a connection
POST/v2/observationsobservations:write—Push maturity observations from your own tooling
GET/v2/policiespolicies:readstatus, category, limit, offsetList policies
GET/v2/policies/:idpolicies:readidGet one policy by id
GET/v2/posture/historyposture:readdaysGet posture score history
GET/v2/posture/latestposture:read—Get latest posture score
GET/v2/posture/signalsposture:read—Get detailed signal breakdown
GET/v2/reportsreports:readlimitList generated reports
GET/v2/reports/:idreports:readidGet a generated report status and content
POST/v2/reports/generatereports:generate—Generate a report from a template or ad-hoc sections
GET/v2/risksrisks:readstatus, category, minScore, limit, offsetList risks with optional filtering
POST/v2/risksrisks:write—Create a new risk
PUT/v2/risks/:idrisks:writeidUpdate a risk
GET/v2/risks/:id/controlsrisks:readidGet linked controls for a risk
GET/v2/risks/:id/loss-exposurefair:readidGet FAIR loss exposure for a single risk
GET/v2/risks/loss-exposurefair:read—Get FAIR loss-exposure summary (ALE + percentiles)
GET/v2/vendorsvendors:readstatus, tier, criticality, limit, offsetList vendors
GET/v2/vendors/:idvendors:readidGet one vendor by id
GET/v2/webhookswebhooks:read—List all webhook registrations for the tenant
POST/v2/webhookswebhooks:write—Register a new webhook endpoint
DELETE/v2/webhooks/:idwebhooks:writeidDelete a webhook registration
PUT/v2/webhooks/:idwebhooks:writeidUpdate a webhook registration
GET/v2/webhooks/:id/logswebhooks:readid, limitGet delivery logs for a webhook
POST/v2/webhooks/:id/rotate-secretwebhooks:writeid, overlapHoursRotate the webhook HMAC signing secret
POST/v2/webhooks/:id/testwebhooks:writeidSend a single synthetic test event through the real delivery path

Permission scopes

Every scope in ApiKeyService's VALID_PERMISSIONS whitelist — which is NOT versioned, a key's scopes work against whichever version's routes it calls — and whether a v1 route and/or a v2 route actually checks it today. A key may be issued with a scope neither version enforces yet; see public-api-versioning.md for what that means and for the one scope (compliance:write) that was removed from this whitelist entirely rather than carried into v2 unenforced.

ScopeEnforced by v1Enforced by v2
posture:readYesYes
risks:readYesYes
risks:writeYesYes
compliance:readYesYes
integrations:readYesYes
integrations:writeNoYes
reports:readNoYes
reports:generateNoYes
webhooks:readNoYes
webhooks:writeNoYes
audit-logs:readNoYes
fair:readYesYes
gate:readYesYes
evidence:writeNoYes
observations:writeNoYes
policies:readNoYes
vendors:readNoYes
evidence:readNoYes
assets:readNoYes
incidents:readNoYes

API key lifetime

Default expiry: 90 days. Maximum expiry: 365 days (enforced at creation and rotation).

Re-authentication for key management

An API key is a bearer credential that outlives the session that minted it, so the routes that mint, rotate or revoke one are gated on a FRESH credential — a stolen access token is not enough on its own.

MethodPathGated action
POST/api-keyscreate an API key
DELETE/api-keys/:idrevoke this API key
POST/api-keys/:id/rotaterotate this API key

Call POST /auth/reauth with { "password": "…" } (or { "mfaCode": "123456" } on an account with MFA) on the authenticated session. It returns a short-lived proof; replay it in the X-Fresh-Auth header on the gated call. The proof is valid for 10 minutes by default (FRESH_AUTH_TTL_MINUTES), is bound to the user who obtained it, and grants nothing on its own.

Without a valid proof the call returns 403 with error: "FRESH_AUTH_REQUIRED" (repeated in details.code). The session is still valid — refresh nothing and sign nobody out; obtain a proof and retry once. See error-catalogue.md.

Listing keys and reading a key's rate-limit usage are NOT gated: a read changes no credential.

Rate limits

Per-API-key, Redis-backed, fixed 60-minute window, resolved from the calling tenant's org tier. Applies identically to v1 and v2 (the limiter keys on the API key, not the path version).

TierRequests / window
STARTER500
ESSENTIALS2,000
COMMAND10,000
ENTERPRISE20,000
(tenant/tier unresolvable)1,000 (flat fallback)

Plans without Public API access are not listed: no API key can be minted on them.

This page is the product manual, published from the repository at docs/developers/public-api-reference.md. Customers read the same text inside CMDash under Help. Last updated October 12, 2026.

Public API — Reference (generated) — CMDash Docs