Developer docs

API quickstart

Start using the CertScore.ai API v2 with curl: create a public website scan, poll status, list public-safe findings, and retrieve latest-domain scan resources.

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

Recommended starting point

Start with Light MCP

Connect an MCP-capable agent to CertScore in about a minute. No account, API key, browser login, or OAuth—just one remote URL and three focused tools.

Remote endpoint

https://mcp.certscore.ai/mcp/light
  1. 1Connect the endpoint
  2. 2Paste the first-run prompt
  3. 3Review the public-safe result

For AI agents

Agent quick path

  1. Read /llms.txt.
  2. Read /.well-known/certscore-ai.json.
  3. Fetch /api/v2/openapi.json.
  4. Check /api/v2/health before creating scan requests.
  5. Create or reuse a scan with POST /api/v2/scans; authentication is optional for up to 20 new scans per requester IP per UTC day. Contact [email protected] for higher volume.
  6. Poll status and honor Retry-After.
  7. Retrieve findings and pre-consent cookies/trackers.
  8. Treat outputs as automated public-web observations for human and agentic review, not legal advice, certification, or a compliance determination.

Choice-path results

Treat coverage before outcome

Completed resources can include postAcceptObservation, postRefusalObservation, and gpcResponse. Read each observation's status before its verdict: a non-confirmed status is limited coverage and must not be reported as clean. Post-Accept activity is a score-neutral baseline.

Already know you want an MCP connection?

Skip the API key setup

Light MCP is the fastest route for a first scan. It uses the same public-safe scan pipeline without account creation, OAuth, or credentials.

Go to Light MCP setup

Access

Get a scoped API key

CertScore.ai API, SDK, and MCP integrations use bearer API keys. Read-only report retrieval and MCP read tools can use a self-serve key after sign-in and email verification. Scan creation keys remain developer-preview and are issued by emailing [email protected].

Self-serve read-only key:
1. Sign in at https://certscore.ai/login and verify your email.
2. POST https://certscore.ai/api/v2/keys/request from the signed-in browser session.
3. Store the returned cs_ro_ key and use it as CERTSCORE_API_KEY.

curl -X POST https://certscore.ai/api/v2/keys/request \
  -H "Content-Type: application/json" \
  --data '{"name":"Read-only MCP key"}'
Recommended scopes by integration:
- REST API read-only: scan:read
- REST API scan creation: scan:read, scan:create
- TypeScript SDK: scan:read, scan:create
- MCP read tools: scan:read, mcp
- MCP scan creation: scan:read, scan:create, mcp

Self-serve keys are prefixed cs_ro_, expire after 90 days, and are limited to read-only report/API access plus MCP. For scan:create, include your organization, integration type, expected volume, callback or contact email, and requested scopes when emailing support. Active Trial workspaces connecting through Claude receive hosted OAuth scan creation automatically, limited to 20 new scans per hour and 100 per day per workspace; eligible recent-result reuse does not consume the allowance.

No account

Run a low-volume scan without signup

For discovery and evaluation, an agent can create a scan without an account or bearer token. New anonymous scans are limited to 20 per requester IP per UTC day; an eligible recent-result reuse does not consume the quota. Contact [email protected] for a higher-volume allowance. Poll the returned status resource and then retrieve findings. Use a scoped key or hosted OAuth for repeated or higher-volume workflows.

curl -X POST https://certscore.ai/api/v2/scans \
  -H "Content-Type: application/json" \
  -d '{"url":"https://ergoveritas.com/.well-known/certscore-canary/sentinels/broad-baseline.html","freshness":"latest","scanFrom":"eu_ie"}'

Health

Check the public API surface

curl https://certscore.ai/api/v2/health
curl https://certscore.ai/api/v2/openapi.json

Complete curl workflow

Create, poll, and retrieve review data

export CERTSCORE_API_KEY="cs_live_..."
TARGET_URL="https://ergoveritas.com/.well-known/certscore-canary/sentinels/broad-baseline.html"

SCAN_RESPONSE=$(curl -sS -D /tmp/certscore-create-headers.txt \
  -X POST https://certscore.ai/api/v2/scans \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $CERTSCORE_API_KEY" \
  --data @- <<JSON
{"url":"$TARGET_URL","freshness":"latest","scanFrom":"eu_ie"}
JSON
)

SCAN_ID=$(printf '%s' "$SCAN_RESPONSE" | jq -r '.scanId // .scan.scanId // empty')
JOB_ID=$(printf '%s' "$SCAN_RESPONSE" | jq -r '.jobId // empty')

if [ -z "$SCAN_ID" ] && [ -n "$JOB_ID" ]; then
  echo "Scan queued as job $JOB_ID; poll the returned status link until a scanId is available."
  exit 1
fi

while true; do
  curl -sS -D /tmp/certscore-status-headers.txt \
    -H "Authorization: Bearer $CERTSCORE_API_KEY" \
    "https://certscore.ai/api/v2/scans/$SCAN_ID/status" \
    -o /tmp/certscore-status.json

  STATUS=$(jq -r '.status // "unknown"' /tmp/certscore-status.json)
  case "$STATUS" in
    completed|completed_limited) break ;;
    failed|expired|rate_limited)
      cat /tmp/certscore-status.json
      exit 1
      ;;
  esac

  RETRY_AFTER=$(awk 'BEGIN{IGNORECASE=1} /^Retry-After:/ {print $2}' /tmp/certscore-status-headers.txt | tr -d '\r')
  sleep "${RETRY_AFTER:-10}"
done

curl -sS -H "Authorization: Bearer $CERTSCORE_API_KEY" \
  "https://certscore.ai/api/v2/scans/$SCAN_ID/findings" \
  -o certscore-findings.json

curl -sS -H "Authorization: Bearer $CERTSCORE_API_KEY" \
  "https://certscore.ai/api/v2/scans/$SCAN_ID/pre-consent-cookies-trackers" \
  -o certscore-pre-consent-cookies-trackers.json

jq '.findings | length' certscore-findings.json
jq '.summary' certscore-pre-consent-cookies-trackers.json

This example uses jq to extract fields and print summaries. jq is optional; any JSON parser can read the same fields. Honor Retry-After on pending or throttled responses.

Create

Create or reuse a public scan

curl -X POST https://certscore.ai/api/v2/scans \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $CERTSCORE_API_KEY" \
  -d '{
    "url": "https://ergoveritas.com/.well-known/certscore-canary/sentinels/broad-baseline.html",
    "freshness": "latest",
    "scanFrom": "eu_ie"
  }'

Scan creation may return a completed scan resource or a queued job resource.

Poll

Poll status when work is pending

curl https://certscore.ai/api/v2/scans/{scanId}/status \
  -H "Authorization: Bearer $CERTSCORE_API_KEY"

Honor Retry-After on pending or throttled responses. Queue time and page runtime can exceed the current HTTP request hold window.

Review

Retrieve findings

curl https://certscore.ai/api/v2/scans/{scanId}/findings \
  -H "Authorization: Bearer $CERTSCORE_API_KEY"

Findings are sourced from already-projected public report artifacts. Evidence examples are compact and capped for public API use.

Latest domain

Find the latest eligible scan

curl https://certscore.ai/api/v2/domains/ergoveritas.com/latest \
  -H "Authorization: Bearer $CERTSCORE_API_KEY"

Runtime inventory

Retrieve pre-consent cookies and trackers

curl https://certscore.ai/api/v2/scans/{scanId}/pre-consent-cookies-trackers \
  -H "Authorization: Bearer $CERTSCORE_API_KEY"

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.