OutboundWebhookEndpoint— a URL you register, with a list ofsubscribedEventsand a signing secret.OutboundWebhookEvent— a queued event with aneventTypeandpayload, fanned out to every matching endpoint as one or more deliveries.OutboundWebhookDelivery— one delivery attempt record per(event, endpoint)pair, tracked throughpending→delivered/failed/retry_scheduled.
Registering an endpoint
A human-readable label shown in the dashboard.
Must be a valid URL. ReconLayer will POST event payloads here.
At least one entry. Use
"*" to subscribe to all event types — an endpoint matches an event if subscribedEvents contains the event’s eventType or contains "*".active or disabled. (deleted is a terminal status set by DELETE, not settable on create.)Managing endpoints
PATCH requires at least one field. DELETE performs a soft delete — the endpoint’s status is set to deleted, it stops appearing in GET /v1/outbound-webhook-endpoints, and it stops matching new events, but its historical events/deliveries remain queryable. Both PATCH and DELETE return 404 not_found for an unknown or already-deleted outboundWebhookEndpointId.
See List Outbound Webhook Endpoints, Update an Outbound Webhook Endpoint, and Delete an Outbound Webhook Endpoint.
Events ReconLayer emits
subscribedEvents accepts any non-empty string, so you can use this system for your own custom event types via POST /v1/outbound-webhook-events (see below). As of this writing, the platform automatically emits one event type as part of its core flow:| Event type | Emitted when | Payload |
|---|---|---|
payment_intent.created | A PaymentIntent is created (directly via the API or via a client_internal_ledger file import row) | { paymentIntentId, caseId, externalReference, sourceAmount, sourceCurrency, destinationAmount, destinationCurrency } |
subscribedEvents when creating a new endpoint, and the sourceKey used for deduplication follows the pattern payment_intent.created:{paymentIntentId} (see Deduplication below).
Subscribe to "*" if you want to receive every event type ReconLayer emits now and in the future without updating your endpoint configuration each time new event types are added.
Queueing your own events
POST /v1/outbound-webhook-events lets you (or an internal service) queue an arbitrary event for fan-out to matching endpoints — useful for custom integrations or for replaying a notification.
Any non-empty string. Matched against endpoints’
subscribedEvents.Optional dedup key, unique per organization. See below.
Arbitrary JSON delivered to subscribed endpoints.
Deduplication with sourceKey
If sourceKey is provided and an OutboundWebhookEvent with the same (organizationId, sourceKey) already exists, no new event or deliveries are created — the existing event is returned with "outcome": "duplicate". This makes it safe to call repeatedly from a retried operation.
Fan-out and status when nothing is subscribed
WhencreateOutboundWebhookEvent runs, ReconLayer finds every active endpoint whose subscribedEvents contains the event’s eventType or contains "*", and creates one OutboundWebhookDelivery per matching endpoint, each starting in pending. If no endpoint matches, the event is created with status: "skipped" and zero deliveries — it is recorded for audit purposes but nothing is queued for delivery.
See Queue an Outbound Webhook Event and List Outbound Webhook Events.
Listing events
1-100.
Filter by exact
eventType.One of
pending, delivered, failed, skipped.deliveries[], so you can see per-endpoint outcomes without a separate call.
Recording delivery attempts
POST /v1/outbound-webhook-deliveries/{outboundWebhookDeliveryId}/attempts records the outcome of an attempt to deliver an event to an endpoint — for example, from a delivery worker that performs the actual HTTP POST (signing the payload with the endpoint’s signingSecret) and reports back the result.
One of
pending, retry_scheduled, delivered, failed.100-599, or
null.Arbitrary JSON, or
null.Error description if the attempt failed, or
null.ISO 8601 timestamp for the next retry, if
status: "retry_scheduled".- Increments the delivery’s
attemptCount, setsattemptedAtto now. - Sets
deliveredAtto now ifstatus: "delivered", otherwise clears it. - If
statusis"delivered"andlastErrorwas not supplied, clearslastError. Ifstatusis"retry_scheduled"andnextRetryAtwas not supplied, leaves the existingnextRetryAtunchanged; for any other status,nextRetryAtdefaults tonullunless explicitly provided.
404 not_found if the delivery doesn’t exist for the organization.
How the parent event’s status is derived
After recording an attempt, ReconLayer recomputes the parentOutboundWebhookEvent.status from all of its deliveries:
| Condition | Resulting event status |
|---|---|
| No deliveries at all | skipped |
Every delivery is delivered | delivered |
At least one delivery is pending or retry_scheduled (and not all delivered) | pending |
Otherwise (all deliveries are terminal and at least one failed) | failed |
Security
Each endpoint has a uniquesigningSecret (rlwhsec_<32-hex>), generated once at creation and never re-displayed. Use this secret to verify that a delivery genuinely originated from your registered endpoint configuration and has not been tampered with — store it securely alongside your endpoint’s URL.
Next steps
- Ingestion Flows —
payment_intent.createdevents are queued at the same point aPaymentIntent/ReconciliationCaseis created. - File Imports —
client_internal_ledgerrows that createPaymentIntents also triggerpayment_intent.createdoutbound events.
