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 review. They are not legal advice, certification, or a compliance determination.
For AI agents
Agent quick path
- Read /llms.txt.
- Read /.well-known/certscore-ai.json.
- Fetch /api/v2/openapi.json.
- Check /api/v2/health before creating scan requests.
- 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.
- Poll status and honor Retry-After.
- Retrieve findings and pre-consent cookies/trackers.
- Treat outputs as automated public-web observations for review, not legal advice, certification, or a compliance determination.
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, mcpSelf-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.
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.jsonComplete 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.jsonThis 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.
