Troubleshooting
Symptom-first index of common Checkpoint issues: what you see, the likely cause, and the page that fixes it
Find the symptom you are seeing, check the likely cause, and follow the fix link. The full diagnostic steps live in each page's Troubleshooting section; this page is the index that gets you there.
Install
| Symptom | Likely cause | Fix |
|---|---|---|
| Fresh install, no detections anywhere | Project ID wrong, or env vars not loaded by the runtime | Quick Start: not detecting agents |
| Not sure which credential goes in which env var | Project ID and API key each map to a specific variable per integration | Credentials |
| Next.js middleware never runs | middleware.ts not at the project root, or the matcher skips your route | Next.js: middleware not running |
| Express middleware does nothing | tenantHost not set, or the middleware is mounted after your routes | Express: middleware not working |
.NET responses carry KYA-Detection: unavailable | The app pool runs 32-bit; the detection engine requires a 64-bit host process | .NET: detection unavailable on a 32-bit host |
.NET Framework: first request returns 500 with FileLoadException (0x80131040) | Binding redirects missing in a PackageReference project | .NET: FileLoadException |
.NET Framework: FileNotFoundException for wasmtime.dll | KyaOs.Checkpoint older than 0.2.2, or the project references only Checkpoint.Core | .NET: wasmtime.dll not found |
Detect
| Symptom | Likely cause | Fix |
|---|---|---|
| Pixel script not loading | Ad blocker or CSP blocking the script, or the Project ID is wrong | Pixel: not loading |
| Pixel loads but the dashboard stays empty | Project ID mismatch, unpublished GTM container, or the visitor sends Do Not Track | Pixel: no detections in dashboard |
| CSP violation for the pixel script | script-src does not allow https://kya.vouched.id | Pixel: Content Security Policy |
| Beacon throws "Project ID is required" | projectId missing or empty in the config | Beacon: Project ID required |
| Beacon sends nothing, and no errors appear | Do Not Track is honored by default, or a CSP, proxy, or tracker blocker blocks the request | Beacon: no detections in the dashboard |
| Beacon worker failures are invisible | Expected behavior: the Beacon falls back to the main thread; enable debug logging to see it | Beacon: worker failures |
| Custom events not appearing | Events are batched until the flush interval, and queued while offline | Beacon cookbook: events not appearing |
| Middleware verdicts computed but never reported | apiKey not set, so results stay local | Middleware cookbook: no detections in the dashboard |
onAgentDetected never fires (Next.js) | It only runs when a request is classified as an agent | Middleware cookbook: callback never fires |
req.checkpoint is undefined (Express) | Session tracking wiring (withSessionTracking plus cookie-parser) is missing | Middleware cookbook: req.checkpoint undefined |
| Too many false positives | Policy too aggressive for your traffic; observe before enforcing | Quick Start: too many false positives |
Enforce
| Symptom | Likely cause | Fix |
|---|---|---|
| Gateway status stuck on "Pending" | DNS record not detected: typo, conflicting records, or propagation still in progress | Gateway: DNS record not detected |
| Gateway status shows "Error" | Conflicting DNS records, unreachable origin, or CAA blocking certificate issuance | Monitoring: gateway shows Error |
| SSL certificate not provisioning | CAA records block issuance, or the Cloudflare proxy is on (the record must be DNS-only) | Gateway: SSL certificate not provisioning |
| Site returns 502 after adding the Gateway CNAME | The Gateway cannot reach your origin sidecar | Sidecar cookbook: 502 after CNAME |
| Apex DNS records keep reappearing | A hosting provider with DNS access recreates them | Sidecar cookbook: apex records rewritten |
| Agents not being blocked (Gateway) | Policy saved as a draft and never deployed, or the deployed-policy cache has not refreshed | Gateway cookbook: requests not being blocked |
| Blocking not working (middleware) | enforcementMode set to 'observe', or the route is outside the matcher | Enforce middleware cookbook: blocking not working |
| Everything gets blocked, humans included | A forbid rule is too broad | Enforce middleware cookbook: all requests blocked |
| Policy edits not taking effect (middleware) | Policies are cached for policyCacheTtlSeconds (default 300s), or the edit is still a draft | Express: policy changes not taking effect |
| Policy edits not live after Compose changes | Draft saved but not redeployed, or the gateway's policy cache has not expired | Policies cookbook: troubleshooting |
| Wrong verdict on a request | A different rule matched; forbid overrides permit | Policies cookbook: troubleshooting |
| High detection latency at the Gateway | Uncached signature key fetch, or a slow origin | Monitoring: high latency |
| Health endpoint reports the engine degraded | The WASM detection module failed to initialize | Monitoring: WASM not initialized |
| Gateway traffic missing from the dashboard | Project ID mismatch, or requests bypass the Gateway DNS | Monitoring: detection not appearing |
Govern
| Symptom | Likely cause | Fix |
|---|---|---|
redirect_uri_mismatch on the GitHub consent screen | The registered callback URL differs from what the gateway sends, character for character | GitHub connection: redirect_uri_mismatch |
| "Bad credentials" on tool calls after a successful connect | The GitHub token was revoked externally; the reconnect is manual | GitHub connection: bad credentials |
state mismatch in gateway logs on OAuth callback | Authorize and callback more than 10 minutes apart, or the flow finished in a different browser | GitHub connection: state mismatch |
| Bouncer returns 401 for every request | Wrong API key or project ID, or the client omits the _meta.proof.jws envelope | Migration cookbook: 401 for all requests |
| Scopes always empty | The delegation grants no scopes, tools are unregistered, or consent was skipped | Migration cookbook: scopes always empty |
| Proof verification fails | Private key does not match the DID, or the proof's validity window expired | Migration cookbook: proof verification fails |
| Tool marked protected in the dashboard, but the server still allows calls | The tool is not discovered or assigned to a protection yet, or the middleware's config cache (default 5 minutes) has not refreshed | Tool Protection: configuring tools |
| Identity not loading on a self-hosted server | .mcpi/identity.json missing, or MCP_IDENTITY_PRIVATE_KEY wrong | Self-host cookbook: identity not loading |
| Delegation verification fails on a self-hosted server | Wrong API key and project ID pair, or the proof is not a compact JWS | Self-host cookbook: delegation verification fails |
| Dashboard deploy pipeline fails | GitHub App not installed, repo name taken, or App permissions insufficient | Deploy cookbook: pipeline fails |
| Cloudflare deploy step fails | Token missing scopes, wrong account ID, or a worker name conflict | Deploy cookbook: Cloudflare deployment fails |
DID document empty at /.well-known/did.json | Identity secret not set on the deployed worker | Deploy cookbook: identity not resolving |
| identiclaw deploy or bot issues | See the symptom table in the quickstart | identiclaw quickstart: troubleshooting |
Dashboard and API
| Symptom | Likely cause | Fix |
|---|---|---|
429 with code RATE_LIMIT_EXCEEDED | Your plan's request rate is exceeded; the X-RateLimit-* response headers say when the window resets | API Reference: rate limits |
CORS error calling /api/v1/detect from a browser | The detect API is server-side only: it needs an API key, and keys must never ship to the browser. Use the Pixel or Beacon on the client | API Reference: which endpoints need a key |
401 with code AUTH_INVALID_API_KEY, AUTH_MISSING_CREDENTIALS, or AUTH_UNAUTHORIZED | Key sent in the wrong header (it belongs in X-API-Key), no key sent at all, or the key belongs to a different project | API Reference: authentication |
window.Checkpoint is undefined | The pixel script had not loaded when identify() ran | Identify Users cookbook: window.Checkpoint undefined |
| User badge not appearing in the Activity feed | identify() not reaching the API, or the data has not landed yet | Identify Users cookbook: badge not appearing |
| Identified user not showing in the dashboard | Pixel not loaded, project mismatch, or a CSP or network error | Identify Users cookbook: user not showing |
| Session resets on every page reload | Cookies blocked, or consent required but not granted | Identify Users cookbook: session not persisting |
| "window is not defined" in Next.js | Browser-only code running during server-side rendering | Identify Users cookbook: window is not defined |
Still Stuck?
- Email support with the error message, the integration you use, and the steps to reproduce
- Report an issue
