Create a webhook in the UI
Open Webhooks and select Trigger webhook. The form exposes:
The Platform API also supports searchable
metadata, static-egress proxy, maskDetails, and controlled creator/system attribution.
maxRetries; maxAttempts is rejected. An instance retry policy can impose a lower cap. Job and Agent retry policies keep their separate maxAttempts contract.
Credentials and sensitive details
Static headers are persisted configuration. Do not place a long-lived API key in a screenshot, example, searchable metadata, or unmasked history. For stronger credential control, call the external API from a Component withapi.httpCall() and resolve the credential from Secrets. This also lets you compute signatures, rotate versions, validate responses, and write a business transaction around the call.
If a Webhook must contain a sensitive header, disable unnecessary detail retention and configure maskDetails for the persisted projection.
Attempt lifecycle
The Webhooks grid is operational history. A row records status, attempt count, scheduled time, elapsed time, payload size, creator, and metadata. Message, immediately after Size, previews the persisted request when it is at most 32 KiB; larger requests show a compact placeholder and remain available from Webhook details. You can still filter by fields in the complete stored request. The outbound request belongs to this one Webhook; delivery attempts are separate evidence, not copies of the request payload. Open Delivery attempts in the Webhook details to inspect each attempt’s scheduled, started, response, and retry timestamps, result, and duration. Entries are paginated. The API equivalent isGET /api/v1/automation/webhook/{webhookId}/attempts?offset=0&limit=20; it returns { data, total, offset, limit } and accepts a maximum limit of 200.
A delayed Webhook starts SCHEDULED; an immediately eligible one starts PENDING. PROCESSING means delivery is in progress. FINISHED, ERROR, and CANCELLED describe its terminal outcome. scheduledFor retains the initial requested time, while nextEligibleAt can change for retry backoff.
Attempt evidence can arrive out of order. A late response for attempt 2 does not replace a newer attempt 3 in the summary, and duplicate evidence does not increment the record version. A terminal outcome is not reopened by a late delivery notification. Check individual attempts when investigating timestamps rather than assuming their arrival order is execution order.
Roles
Design for reliable delivery
The receiver should treat the custom ID or another stable business key as idempotent. A transport timeout is ambiguous: the receiver may have committed the request even though RevoEngine did not receive its response. Use metadata to correlate the webhook with the originating Job, Event history, or business object. Alert on terminal failure and exhausted attempts rather than every transient retry.The partner reports a duplicate
The partner reports a duplicate
Verify that the same idempotency key was used on every attempt and that the receiver stores the first accepted result. Do not reduce retries as the primary duplicate-control mechanism.
A request is stuck in a non-terminal state
A request is stuck in a non-terminal state
Check scheduled time, current attempt, cancellation state, and platform delivery logs. Confirm the destination DNS, TLS, timeout, and static-egress allowlist.
The history does not show the request body
The history does not show the request body
Check
saveDetails and masking policy. Absence from history can be intentional and does not mean an empty body was sent.Production checklist
- Require HTTPS.
- Use an idempotency key understood by the receiver.
- Set an explicit maximum attempt policy.
- Mask or avoid credentials in retained request details.
- Use static egress only when the receiver needs allowlisting.
- Correlate the row with an operation or business ID.
- Monitor terminal failure and cancellation.

