Skip to content

Dashboard Push API

POST /v1/dashboard/push

Authentication: API key via X-API-Key header. Required tier: Team+ (hosted_dashboard feature).

The CLI wraps this endpoint. After a scan, push results in one command:

Terminal window
complyform dashboard push --project-label=prod-gcp

The CLI reads scan results from the local state, serializes them, and posts to the API. You do not need to construct the JSON payload manually unless you are integrating outside the CLI.

Content-Type: application/json
X-API-Key: cf_api_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
{
"project_label": "prod-gcp",
"cloud": "gcp",
"cloud_account_id": "my-org-project-123",
"frameworks": ["cis_gcp_v2.0", "soc2"],
"score": 78.4,
"passed": 142,
"failed": 39,
"severity_counts": {
"critical": 3,
"high": 12,
"medium": 18,
"low": 6
},
"findings": [
{
"rule_id": "cis_gcp_v2.0_2.1",
"resource": "google_sql_database_instance.production",
"status": "FAIL",
"severity": "high",
"message": "Cloud SQL instance does not enforce SSL connections",
"remediation": "Set `settings.ip_configuration.require_ssl = true`"
},
{
"rule_id": "cis_gcp_v2.0_4.3",
"resource": "google_compute_firewall.allow_all_ingress",
"status": "FAIL",
"severity": "critical",
"message": "Firewall rule allows unrestricted ingress on all ports",
"remediation": "Restrict source_ranges from 0.0.0.0/0 to specific CIDRs"
}
],
"state_source": "local",
"scanned_at": "2026-03-23T14:30:00Z"
}
FieldTypeRequiredDescription
project_labelstringyesUnique label for the project within your account
cloudstringyesCloud provider: gcp, aws, or azure
cloud_account_idstringyesCloud account or project identifier
frameworksstring[]yesList of framework IDs scanned
scorenumberyesOverall compliance score (0-100)
passedintegeryesNumber of passed checks
failedintegeryesNumber of failed checks
severity_countsobjectyesBreakdown by severity: critical, high, medium, low
findingsobject[]yesArray of individual finding objects
state_sourcestringyesSource of Terraform state: local, remote, or ci
scanned_atstringyesISO 8601 timestamp of the scan
{
"project_id": "proj_a1b2c3d4e5f6",
"scan_id": "scan_20260323_143000_prod-gcp",
"score_delta": -2.1,
"dashboard_url": "https://dashboard.complyform.dev/projects/proj_a1b2c3d4e5f6/scans/scan_20260323_143000_prod-gcp"
}
FieldTypeDescription
project_idstringStable project identifier
scan_idstringUnique scan identifier for this push
score_deltanumberChange from the previous scan score (negative = regression)
dashboard_urlstringDirect link to view this scan in the dashboard

score_delta is computed as an atomic Firestore transaction. The API reads the previous scan’s score and writes the new score in a single operation, preventing race conditions when multiple CI jobs push concurrently.

Individual findings are stored in Google Cloud Storage, not in Firestore. The Firestore document for each scan contains metadata (score, counts, timestamp) and a GCS reference to the full findings payload. This keeps Firestore document sizes small and query performance predictable.

The API matches on project_label within your account:

  • If a project with that label exists, the scan is appended to its history.
  • If no matching project exists, one is created automatically.

The number of active projects is capped by tier:

TierMax Projects
Team1
Agency5

Pushing to a new project_label when you have reached your limit returns 409.

{
"error": "insufficient_tier",
"message": "hosted_dashboard requires Team tier or above. Current tier: Individual."
}

Your license does not include the hosted_dashboard feature. Upgrade to Team+ to use the dashboard push API.

{
"error": "project_limit_reached",
"message": "Team tier allows 1 project. Archive an existing project or upgrade to Agency."
}

You have reached the maximum number of active projects for your tier.

{
"error": "rate_limit_exceeded",
"message": "Dashboard write limit: 5/min. Retry after 42 seconds."
}

Back off and retry. In CI/CD pipelines, add a delay between parallel scan jobs that push results.

For automated pushes in CI/CD pipelines, see the CI/CD guide which covers GitHub Actions, GitLab CI, and other providers.

Ensure your API key is stored as a secret in your CI environment — never hardcode it in pipeline definitions. See Authentication for key storage guidance.