SENTINEL SIGNALVERIFY
DOCUMENTATION

Errors -- Verify API

Status codes and error shapes across Verify's API, documented as they actually behave today -- including where that shape is not uniform across surfaces.

Not one uniform envelope

Verify has no single global exception handler, so the error body is whatever the failing route itself raised. Two real shapes exist side by side: {"error": "<code>", "message": "..."} for validation/business errors, and a plain string for authentication failures (for example {"detail": "Missing bearer token"}). Both are wrapped by FastAPI's default {"detail": ...} envelope. Documented here as the real, current contract -- not smoothed into a single idealized shape.

400 -- invalid target / SSRF restriction (audit endpoints)

POST /v1/audits/mcp and POST /v1/audits/readiness return 400 for a rejected target, with detail.error set to one of:

422 -- invalid target / SSRF restriction (Watch)

The identical target-validation failures on /v1/watch/* routes return 422, not 400 -- a real, deliberate cross-surface difference from the audit endpoints above, not a typo to be normalized away in these docs. 422 is also returned for a malformed cursor, an empty PATCH body, and other request-shape validation failures on Watch.

401 -- unauthenticated

Shape differs by which token system rejected the request.

403 -- insufficient scope / entitlement

404 -- not found

Returned for an unknown or archived (soft-deleted) watch/policy id, and for any route path that does not exist.

409 -- conflict (Watch)

429 -- rate limited

Not currently applied to the audit or Watch API routes themselves -- these codes are real, but on adjacent legacy/public endpoints: scan_rate_limited (free public scan form), team_creation_rate_limited, watch_rate_limited (the older email-subscription flow, unrelated to the /v1/watch/* API above), and contact_rate_limited.

5xx -- server/provider failure

verify_dependency_unavailable or verify_audit_failed (both 503) from POST /v1/audits/mcp mean Verify itself could not complete the check against the target -- this is Verify's own failure to complete evaluation, not a finding about the target, and is distinct from a 400 SSRF rejection. Internal stack traces and provider secrets are never included in an error body.