Catch Errors

All errors return JSON with error, code, and optional fields.

Common errors

CodeStatusCauseFix
validation_error400Invalid request body or parametersCheck fields in the response
unauthorized401Missing or invalid API keyAdd Authorization: Bearer sm_.... See Authentication
forbidden403Authenticated but not authorizedVerify you own the bucket
not_found404Resource does not existCheck bucket or event ID
rate_limit_exceeded429Too many requestsBack off and retry. See Rate Limits

Catch-specific errors

CodeStatusCauseFix
catch.bucket_not_found404Bucket does not exist or you lack accessVerify bucket ID with GET /v1/catch/buckets
catch.event_not_found404Event does not exist in this bucketEvents expire per retention policy
catch.signature_invalid400Signature verification failedVerify signing secret matches provider
catch.provider_unsupported400Provider not recognizedUse stripe, github, shopify, or svix
catch.replay_failed500Could not deliver to target URLVerify target_url is reachable and accepts POST
bucket_limit_exceeded403Tier bucket limit reachedDelete unused buckets or upgrade
bucket_paused400Replay attempted on paused bucketSet bucket to live via PATCH /v1/catch/buckets/:id

Signature verification tips

  • Stripe: Secret starts with whsec_. Get from Dashboard > Developers > Webhooks.
  • GitHub: Uses X-Hub-Signature-256. Secret must match exactly (no trailing whitespace).
  • Shopify: Uses X-Shopify-Hmac-Sha256. Secret is base64 encoded.
  • Svix: Secret starts with whsec_. Supports multiple signatures for key rotation.

For detailed debugging, see Troubleshooting.