Lists all webhooks configured on the instance or returns a single one by label
Auth:Documentation Index
Fetch the complete documentation index at: https://docs.ryzeapi.cloud/llms.txt
Use this file to discover all available pages before exploring further.
TokenAccount or TokenInstance • Rate limit: Global (100/min) • Idempotent: yes
?label=<name>, returns the single webhook with that label (or 404).
webhooks[] array with all webhooks on the instance (enabled and disabled), sorted alphabetically by label.
?label=analytics-pipeline, returns just the webhook with that label in the envelope’s webhook field (or 404 if it doesn’t exist).
?label=default. Useful when you created the webhook without specifying a label and want to read just that entry instead of the full list.
?label=, returns webhooks[] (sorted alphabetically by label, always present, comes back as [] if no webhook exists, and also includes the ones with enabled=false for operational inspection). With ?label=<name>, returns the single object in webhook (same shape as POST). The authorization is decrypted when ENCRYPTION_KEY is configured; if the key was rotated and some value cannot be decrypted, the field is returned encrypted instead of failing the request.
?label=. Sorted alphabetically by label. Always returned even when no webhook exists (webhooks: []).?label=<name> is used. Same shape as POST.TokenAccount or TokenInstance.webhook in the envelope). When absent, returns the list (webhooks[]).Passing ?label= (empty) is still considered “present” → it becomes "default" and looks up the row with that label.enabled=false, operators see the full history. To list only active ones, filter on the client by w.enabled === true.authorization decrypted: if ENCRYPTION_KEY is configured and the value is encrypted at rest, the repository decrypts it before returning. If the key was rotated and a value cannot be decrypted, the field is returned encrypted (with a warning in the log) instead of failing the request.webhook_queue and processed by parallel workers.
| Attempt | Next retry |
|---|---|
| 1 (fail) | +1s |
| 2 (fail) | +5s |
| 3 (fail) | +30s |
| 4 (fail) | +5min |
| 5 (fail) | +30min |
| 6+ | +1h (cap) |
max_attempts (default 5), status becomes failed (DLQ). The row is not deleted automatically, operators can inspect last_error and re-enqueue manually (UPDATE webhook_queue SET status='pending', next_retry_at=now()).
webhook_queue table (ops summary)| Column | Description |
|---|---|
id | BIGSERIAL PK |
instance_name | Instance name |
url | Final destination (already with /event-name suffix if byEvents) |
payload | BYTEA, JSON body of the event |
auth_header | Configured Authorization (encrypted at rest) |
event_type | Event name (message.exchange etc.) |
status | pending | delivered | failed |
attempts | Attempt counter |
max_attempts | Default 5 |
next_retry_at | Next attempt window |
last_error | Last error message from the consumer |
created_at / updated_at | Timestamps |
POST to your webhook arrives with:
| HTTP | error.message | Applies to |
|---|---|---|
| 400 | label too long (max 50 chars) | ?label= |
| 400 | label may only contain letters, digits, underscore or dash | ?label= |
| 401 | Invalid token | both |
| 404 | Instance not found | both |
| 404 | Webhook not configured for this label | ?label= |
| 429 | Rate limit exceeded. Try again later. | both |
| 500 | Failed to get instance | both |
| 500 | Failed to list webhook configurations | no query |
POST /api/events/webhook/:instance