Skip to content

Errors

The API uses standard HTTP status codes plus a structured JSON error body for machine-readable detail.

{
"error": {
"code": "monitor_not_found",
"message": "Monitor with ID 01HXABC... does not exist or is not visible to this key.",
"request_id": "req_01HXDEF...",
"details": {
"monitor_id": "01HXABC..."
}
}
}
FieldMeaning
codeStable machine-readable identifier. Safe to match on.
messageHuman-readable description. Subject to copy changes; do not match on.
request_idQuote this in support tickets.
detailsOptional structured context. Shape varies by error code.
StatusMeaningWhen
400 Bad RequestMalformed request.Invalid JSON, missing required fields, schema violations.
401 UnauthorizedNo or invalid credentials.Missing Authorization header, expired session, revoked API key.
402 Payment RequiredPlan does not permit this feature.Free tier attempting a Pro-gated feature (e.g. Knative Eventing).
403 ForbiddenCredentials valid but scope insufficient.API key missing a required scope; non-admin user hitting an admin route.
404 Not FoundResource does not exist or is cross-org.Includes cases where an object exists in a different org; we never leak existence.
409 ConflictState conflict.Double-ack of an alert, duplicate Idempotency-Key, edit race.
413 Payload Too LargeBody exceeded a documented cap.Batched ingest > 256 events; body > 1 MiB.
422 Unprocessable EntityBusiness-logic validation failed.Invalid enum value, cross-field constraint violation.
429 Too Many RequestsRate-limited.See Rate Limits. Honour Retry-After.
500 Internal Server ErrorUnhandled server error.Report to support with the request_id.
502/503/504Transient upstream/infrastructure failure.Retry with backoff.
CodeTypical statusMeaning
invalid_request400Request body or parameters failed schema validation.
unauthorized401Missing/invalid credentials.
scope_missing403API key lacks a required scope.
plan_gate_blocked402Feature requires a paid plan.
not_found404Generic “resource not visible to this caller”.
monitor_not_found404Specifically a monitor ID that doesn’t resolve.
alert_not_found404
conflict409Generic state conflict.
alert_already_resolved409
duplicate_idempotency_key409Same key used with different body within the 24h window.
payload_too_large413Body exceeds the endpoint cap.
rate_limited429Per-org or per-key rate limit hit.
ssrf_blocked400URL in the request resolves to a private or reserved address.
tier_gate_blocked402Feature is plan-gated (e.g. Knative Eventing, bulk import).

Some endpoints intentionally return 200 OK on what looks like a no-op (e.g. acking an already-acked alert, unsubscribing a non-subscriber). This keeps integrations idempotent. The response body indicates what changed:

{ "data": { "already_acknowledged": true, "acknowledged_at": "2026-04-24T10:00:00Z" } }
  1. Always log request_id. Without it, support can’t find your request.
  2. Check scope before assuming bugs. A 403 with scope_missing is almost always a key without the right scope for the path.
  3. Rate-limit headers are authoritative. Don’t guess; read X-RateLimit-Remaining and Retry-After.
  4. SSRF blocks are intentional. If a URL in your request is rejected with ssrf_blocked, check whether it resolves to an RFC1918 / link-local / loopback / metadata range. Self-hosted deployments can opt in via the YIPYAP_ALLOW_PRIVATE_TARGETS env var.