Get an async trust-signals scan by ID
Get the current state of an async trust-signals scan. Returns the scan's lifecycle (queued / running / completed / failed) along with createdAt and expiresAt always, plus startedAt once the runner picks it up and completedAt once it reaches a terminal state. On completed the full canonical scan response is in item.result (tier verdict, category scores, detected signals with evidence, suspicious patterns, gaps). Roughly 1% of sites run behavioral protection that hides response headers from us. Those scans carry item.result.headerInspection = { available: false, reason: "site_uses_behavioral_protection" }, and the result beside it is COMPLETE — the page body was read in full, all 34 trust-signal rules read the body and none reads headers, so the tier, score, category breakdown and meta.signalsEvaluated are exact and comparable against any other domain. Report them as ordinary results; the marker only means no evidence entry can carry kind: "header". A null in verdict, categoryScores, signalsDetected, suspiciousPatterns, gapsVsBenchmark or meta.signalsEvaluated therefore means the page was never inspected at all, and appears only on scans stored before this behavior shipped (results persist 24h). It never means the site scored zero, has no trust signals, or sits in the minimal tier. An empty ARRAY is the opposite case and is a real finding: we looked and found none. On failed the failure details are in item.error with a machine-readable code — currently homepage_fetch_failed (upstream homepage fetch threw) or scan_failed (any other error during scan execution). Scoped to the API key's organization — cross-tenant access, never-existed IDs, expired IDs (24h TTL), and malformed IDs all return 404 scan_not_found with an identical envelope to prevent existence-disclosure. Typically sub-second — safe to poll on a 2–5 second interval depending on your timeout budget.
Request
- Base URL: https://api.competlab.com
- URL: https://api.competlab.com/v1/tools/trust-signals/scans/{scanId}
- Auth: API key in header CL-API-Key
Path parameters
Response
Example response
{
"item": {
"id": "6638e9a1b2c3d4e5f6a7b8c9",
"status": "completed",
"createdAt": "2026-05-17T14:30:00.000Z",
"expiresAt": "2026-05-18T14:30:00.000Z",
"startedAt": "2026-05-17T14:30:00.412Z",
"completedAt": "2026-05-17T14:30:02.840Z",
"result": {
"domain": "stripe.com",
"finalUrl": "https://stripe.com/",
"fetchedAt": "2026-05-17T14:30:02.000Z",
"verdict": {
"tier": "substantial",
"score": 38,
"benchmarkForTier": 34,
"benchmarkComparison": "above-average",
"summary": "Substantial trust coverage — strong social proof and some compliance signals, above-average for tier"
},
"categoryScores": {
"enterpriseReadiness": {
"score": 8,
"max": 25,
"signalsFound": 1
},
"thirdPartyValidation": {
"score": 12,
"max": 20,
"signalsFound": 3
},
"socialProof": {
"score": 10,
"max": 20,
"signalsFound": 2
},
"brandAuthority": {
"score": 5,
"max": 20,
"signalsFound": 1
},
"riskReversal": {
"score": 3,
"max": 15,
"signalsFound": 1
}
},
"signalsDetected": [
{
"signal": "SOC 2",
"category": "enterpriseReadiness",
"weight": 8,
"confidence": "high",
"evidenceCount": 1,
"evidence": [
{
"kind": "html",
"source": "soc 2",
"matched": "SOC 2 Type II compliant"
}
]
}
],
"suspiciousPatterns": [],
"gapsVsBenchmark": [
{
"signal": "Customer logos",
"category": "socialProof",
"benchmarkPrevalence": "87% of substantial-tier peers have this",
"ciInsight": "Add customer logos to homepage — table stakes for substantial-tier SaaS positioning"
}
],
"meta": {
"signalsEvaluated": 34,
"benchmarkSource": "CompetLab SaaS Trust Benchmarks 2026-Q2 (n=247)",
"scanDurationMs": 2840
}
}
}
}Changes
No recorded changes to this operation across all 1 revision of this API.