Developer docs

API reference

Reference for the CertScore.ai API v2 resource model, OpenAPI contract, status lifecycle, public-safe evidence summaries, errors, throttling, and legal posture.

CertScore.ai outputs are automated public-web observations for review. They are not legal advice, certification, or a compliance determination.

Routes

API v2 resources

MethodRoutePurpose
POST/api/v2/keys/requestIssue a self-serve read-only + MCP key for a signed-in verified user.
GET/api/v2/auth/checkValidate a bearer credential and return its granted scopes without creating a scan.
POST/api/v2/scansCreate or reuse a public scan; authentication is optional for 20 new anonymous scans per requester IP per UTC day.
GET/api/v2/scans/{scanId}Retrieve the public-safe scan resource.
GET/api/v2/scans/{scanId}/diagnosticsRetrieve bounded scan timing and collection diagnostics.
GET/api/v2/scans/{scanId}/statusCheck scan or job status without inferring from partial evidence.
GET/api/v2/scans/{scanId}/findingsList already-projected public findings for a scan.
GET/api/v2/scans/{scanId}/findings/{findingId}Retrieve one public-safe finding and capped evidence summary.
GET/api/v2/scans/{scanId}/pulseRetrieve the Pulse projection wrapper for a completed public scan.
GET/api/v2/scans/{scanId}/pre-consent-cookies-trackersRetrieve Pre-consent Cookies & Trackers report table data as public-safe JSON.
GET/api/v2/domains/{domain}/latestFind the latest eligible public scan for a domain.
GET/api/v2/domains/{domain}/latest/pre-consent-cookies-trackersRetrieve the latest-domain Pre-consent Cookies & Trackers table projection.
GET/api/v2/healthCheck API v2 discovery health.

Contract

OpenAPI and operation IDs

GET https://certscore.ai/api/v2/openapi.json

The OpenAPI contract uses stable operation IDs, explicit status examples, error examples, retry guidance, and public-safe evidence language for generic AI agents and developer tools.

Projection

What is Pulse?

Pulse is CertScore.ai's compact public projection for agents and developer workflows. It packages the scan summary, top findings, evidence highlights, caveats, links, and disclaimer text derived from the same already-projected public scan resources and findings. API v2 exposes the scan resource as the durable object, while the Pulse wrapper is useful when an agent needs the report-style projection in one response. Response types such as certscore_pulse and certscore_pulse_evidence refer to that projection.

Examples

Small response shapes

Scan creation

{
  "type": "certscore_scan_job",
  "jobId": "job_123",
  "scanId": "00000000-0000-4000-8000-000000000123",
  "domain": "ergoveritas.com",
  "status": "queued",
  "retryAfterSeconds": 1
}

Pending or running status

{
  "type": "certscore_scan_job",
  "jobId": "job_123",
  "scanId": "00000000-0000-4000-8000-000000000123",
  "status": "running",
  "phase": "runtime_observation",
  "retryAfterSeconds": 2
}

Completed scan

{
  "type": "certscore_scan",
  "scanId": "00000000-0000-4000-8000-000000000123",
  "domain": "ergoveritas.com",
  "status": "completed",
  "score": 72,
  "links": {
    "findings": "https://certscore.ai/api/v2/scans/00000000-0000-4000-8000-000000000123/findings",
    "preConsentCookiesTrackers": "https://certscore.ai/api/v2/scans/00000000-0000-4000-8000-000000000123/pre-consent-cookies-trackers",
    "report": "https://certscore.ai/scan/00000000-0000-4000-8000-000000000123"
  }
}

Partial or failed scan

{
  "type": "certscore_scan",
  "scanId": "00000000-0000-4000-8000-000000000123",
  "status": "completed_limited",
  "coverage": {
    "status": "partial",
    "summary": "Automated public-web scan completed with coverage limitations."
  }
}

Findings

{
  "type": "certscore_finding_list",
  "scanId": "00000000-0000-4000-8000-000000000123",
  "findings": [
    {
      "id": "pre_consent_tracking_detected",
      "label": "Third-party tracking observed before recorded consent",
      "criticality": "high",
      "evidence": {
        "basis": "public_report_projection",
        "exampleCount": 3,
        "examplesShown": 2
      }
    }
  ]
}

Pre-consent cookies/trackers

{
  "type": "certscore_pre_consent_cookies_trackers",
  "summary": {
    "rowCount": 28,
    "trackerCount": 24,
    "cookieCount": 4,
    "requestCount": 14
  },
  "rows": [
    {
      "kind": "tracker",
      "vendor": "LinkedIn Insight Tag",
      "host": "snap.licdn.com",
      "purpose": "Advertising",
      "evidenceBasis": "public_report_projection"
    }
  ]
}

Runtime inventory

Pre-consent Cookies & Trackers JSON

GET /api/v2/scans/{scanId}/pre-consent-cookies-trackers
GET /api/v2/domains/{domain}/latest/pre-consent-cookies-trackers

{
  "type": "certscore_pre_consent_cookies_trackers",
  "summary": {
    "rowCount": 12,
    "trackerCount": 6,
    "cookieCount": 8,
    "requestCount": 10
  },
  "rows": [
    {
      "kind": "cookie",
      "vendor": "Google",
      "host": "doubleclick.net",
      "purpose": "Advertising",
      "phase": "pre_consent",
      "evidenceBasis": "public_report_projection"
    }
  ]
}

This endpoint exposes the public report projection used for the Pre-consent Cookies & Trackers table. It strips cookie values, raw request bodies, full request URLs, sensitive query strings, internal artifacts, and scanner-only details. The initial version returns the complete table; server-side filters are deferred while integrations validate usage. Clients can group or filter rows by kind, priority, party, vendor, purpose, and host.

Auth

API keys, scopes, and rate limits

Authorization: Bearer <token>

Current scopes:
- scan:read
- scan:create
- mcp

Authentication is optional for low-volume scan creation: unauthenticated POST /api/v2/scanspermits up to 20 new scans per requester IP per UTC day, and eligible recent-result reuse is free. Contact [email protected] for a higher-volume allowance. Scoped integrations use bearer API keys. Read-only + MCP keys are self-serve for signed-in verified users through POST /api/v2/keys/request. Scan creation keys remain developer-preview; request those at [email protected] with your organization, integration type, expected volume, and requested scopes. Self-serve keys expire after 90 days, are prefixed cs_ro_, and are capped at 60 requests/minute and 500 scan reads/day. HTTP 202 pending responses and HTTP 429 throttled responses may include Retry-After; agents and SDKs should honor that value rather than tight polling.

Read protection

Weighted scan-resource limits

Completed scan and domain resources use weighted, rolling limits. These protections apply in addition to account, API-key, and scan-creation quotas. Policy version 2026-08-14.

Terminal-read scopeRolling 10 minutesRolling 24 hours
Caller + scan/resource120 units1200 units
Scan/resource across callers4000 units
Caller across scans/resources480 units

Read weights

  • Ordinary scan, finding, inventory, or domain read: 1 unit.
  • Evidence, full report, diagnostics, export, or composite bundle: 4 units.
  • That permits 30 direct heavy reads per caller and resource in 10 minutes, and 300 in a rolling 24 hours.

Status polling

  • Caller + scan: 120 units per rolling 10 minutes.
  • Scan across callers: 10000 units per rolling 10 minutes.
  • Caller across scans: 600 units per rolling 10 minutes.

HTTP 429 and MCP rate-limit errors include Retry-After when a retry time is available, plus machine-readable policy version, profile, scope, window, limit, usage, and requested-unit fields. Wait for that delay. Poll only active status resources and stop polling when a scan becomes terminal.

Errors

Public-safe error envelope

{
  "type": "certscore_api_error",
  "error": {
    "code": "not_found",
    "message": "Scan not found."
  },
  "links": {
    "docs": "https://certscore.ai/developers/reference"
  }
}
HTTP 401
{
  "type": "certscore_api_error",
  "error": {
    "code": "unauthorized",
    "message": "Missing or invalid API key."
  }
}
HTTP 429
Retry-After: 60
{
  "type": "certscore_api_error",
  "error": {
    "code": "rate_limited",
    "message": "Retry later.",
    "retryAfterSeconds": 60
  }
}
HTTP 500
{
  "type": "certscore_api_error",
  "error": {
    "code": "internal_error",
    "message": "CertScore.ai API v2 is temporarily unavailable."
  }
}

Status

Polling and retry behavior

completed

The scan resource and public-safe projections are ready.

pending/running/finalizing

Poll the status resource and honor Retry-After when present.

failed/not_found/throttled

Use the public error envelope and do not infer missing findings from failed work.

Evidence discipline

What API v2 exposes

API v2 exposes scan resources, status, already-projected findings, public-safe evidence summaries, latest-domain lookup, and report-ready review context. It does not expose raw DOM, raw request bodies, internal scanner artifacts, internal reasoning, or display-only findings. Failed or partial scans should be surfaced as incomplete evidence, not compliance failures. Do not infer legal conclusions from scan output.

Developer support

Need an API key, endpoint, SDK helper, MCP tool, or docs fix?

Contact [email protected] for preview API keys, feature requests, broken examples, schema questions, integration issues, or missing API coverage. Include the route, SDK method, MCP tool, scan ID, requested scopes, expected volume, or page URL when useful.