Skip to main content

Webhook subscription patterns

Lists the subscription pattern grammar, its validation rules, the default subscriptions, and the live events the defaults skip.

A webhook endpoint is the HTTPS address that receives DALP events. It receives an event when one of its subscription patterns matches the event name. A pattern is an exact name, *, a name prefix ending in .*, or a state pattern such as *.final.

Pattern grammar

A pattern has one of four forms. For a new event, the platform matches it against the event name only. An event name has three parts separated by dots, for example token.transfer.final. Many names end in a lifecycle state. Some end in another word, such as funding.requirement.raised.

Form
Pattern
Delivers
Catch-all
*
Every event.
State pattern
*.final
Every event whose name ends in .final.
Name prefix
token.transfer.*
Every event whose name starts with token.transfer..
Exact name
token.transfer.final
That event.

Syntax rules

  • A segment contains lowercase letters, digits, and hyphens. A hyphen sits between two letters or digits.
  • Dots separate segments, and no segment is empty.
  • * is a complete segment. It stands alone, comes first in a state pattern, or comes last in a name prefix.
  • A name prefix has one or more segments before .*.
  • An exact name has exactly three segments.

The patterns token.*.final and Token.transfer.* break these rules. The platform answers a request that contains such a pattern with status 400 and the error REQUEST_INVALID, id DALP-14261.

Validation

A pattern with valid syntax must also pass the registry rules. The platform applies them on POST /api/v2/webhooks, and on PATCH /api/v2/webhooks/{webhookId} when the body supplies subscriptions. A pattern or list that fails answers status 400 with the error WEBHOOK_SUBSCRIPTION_INVALID, id DALP-0534. The error is not retryable. Change the list and send the request again. The Platform API error reference lists both errors.

The state in a state pattern must be one of pending, provisional, final, retracted, or recalled. A name prefix or an exact name must match a registered event. The retired custody ledger events are no longer registered (the SDK changelog names each removed event). An endpoint that already holds one keeps working, but saving a list that still names one is rejected with WEBHOOK_SUBSCRIPTION_INVALID until the name is dropped. The pattern *.recalled is accepted. It delivers only a recalled event that DALP 3.1 stored and a Replay resends. The reserved name compliance.freeze.recalled is also accepted as an exact subscription, although no action sends it. The other reserved names, token.transfer.pending and settlement.transfer.retracted, are rejected as exact names.

Pattern
Result
Reason
*
Accepted
The catch-all is always valid.
*.final
Accepted
final is a lifecycle state.
*.pending
Accepted
pending is a lifecycle state. No live event name ends in .pending, so the pattern delivers nothing.
*.confirmed
Rejected
confirmed is not a lifecycle state.
ledger.entry.*
Rejected
No registered event name starts with ledger.entry..
token.transfer.retracted
Rejected
A retraction of a .provisional or .final event cannot be named exactly. Use token.transfer.* or *.

Retraction subscriptions

A retraction is an event whose name ends in .retracted. It withdraws an earlier event, and the retraction supersedes that event. The platform rejects a list when one of its patterns matches a retraction and no pattern in the list matches the event that the retraction supersedes. The rule applies when the name of the superseded event ends in .pending, .provisional, or .final.

For a chain reorganisation correction, the platform checks whether it recorded a successful delivery of the removed chain observation. The endpoint's subscription patterns do not decide whether the platform generates that automatic correction. Receiver-side processing alone is not a recorded delivery. Your receiver must handle these corrections. The retraction rules cover lost acknowledgements.

List
Result
Reason
*.provisional, *.final, *.retracted
Accepted
Every retraction has its source event in the list.
*.retracted
Rejected
The list contains no source events.
*.final, *.retracted
Rejected
Retractions of .provisional events, such as the retraction of token.transfer.provisional, have no source.
*.provisional, *.retracted
Rejected
Retractions of .final events, such as trading-venue.trade-fee.retracted, have no source.
token.transfer.*
Accepted
The prefix delivers token.transfer.provisional, token.transfer.final, and token.transfer.retracted.
token.corporate-action.retracted
Accepted
The event it supersedes, token.corporate-action.announced, has no lifecycle state at the end of its name.

Worked examples

Pattern
Delivers
*
Every event.
*.final
Every event whose name ends in .final, such as token.transfer.final and asset.burn.final. It skips token.transfer.provisional.
token.transfer.*
token.transfer.provisional, token.transfer.final, and token.transfer.retracted.
funding.*
funding.requirement.raised, funding.requirement.resolved, and funding.requirement.expired.
identity.registration.provisional
Selects that initial event. A chain reorganisation can also send identity.registration.retracted after a successful provisional delivery, without a matching retraction pattern.

Bank rail endpoints select bank-rail.credit.* and bank-rail.cash-out.* explicitly. The defaults skip these milestone names, including bank-rail.credit.recalled, whose envelope state is final. A *.recalled pattern matches that event's name too, but matching a suffix never changes its envelope state.

Default subscriptions

A new endpoint receives events that match three state patterns: *.provisional, *.final, and *.retracted. The platform applies them when the create request omits subscriptions. The Console create form starts with the same three patterns selected.

State patterns match the last part of the event name. They never read the lifecycle_state field of the envelope. The defaults therefore skip an event whose name ends in a word other than a state, even when its envelope shows provisional or final. funding.requirement.raised shows final and ends in raised. trading-venue.price-alert.triggered shows provisional and ends in triggered. No default pattern matches either name.

An explicit empty list, [], selects no new events. It does not request the defaults. Repeated or overlapping patterns select an endpoint once, rather than creating a copy for each matching pattern. Automatic chain reorganisation corrections for provisional events delivered earlier can still arrive.

An existing endpoint keeps its stored list. The defaults apply only at creation. An update that supplies subscriptions replaces the stored list, so adding one pattern means sending the full list. An update that omits subscriptions leaves the list unchanged.

Events the default subscriptions do not deliver

A new endpoint does not receive these events, because the last part of each name matches no default pattern. The name prefix in the second column delivers the event, and it also delivers the other live events that start with it. The exact event name works as well.

Event
Subscribe with
access-control.role-grant.expired
access-control.role-grant.*
access-control.role-grant.expiring
access-control.role-grant.*
bank-rail.cash-out.instructed
bank-rail.cash-out.*
bank-rail.cash-out.paid
bank-rail.cash-out.*
bank-rail.cash-out.released
bank-rail.cash-out.*
bank-rail.cash-out.requested
bank-rail.cash-out.*
bank-rail.cash-out.returned
bank-rail.cash-out.*
bank-rail.credit.admitted
bank-rail.credit.*
bank-rail.credit.allocated
bank-rail.credit.*
bank-rail.credit.cancelled
bank-rail.credit.*
bank-rail.credit.minted
bank-rail.credit.*
bank-rail.credit.parked
bank-rail.credit.*
bank-rail.credit.recalled
bank-rail.credit.*
bank-rail.credit.returned-to-payer
bank-rail.credit.*
custody.gateway-deposit.settled
custody.gateway-deposit.*
custody.gateway-withdrawal.settled
custody.gateway-withdrawal.*
funding.requirement.expired
funding.requirement.*
funding.requirement.raised
funding.requirement.*
funding.requirement.resolved
funding.requirement.*
operations.case.acknowledged
operations.case.*
operations.case.opened
operations.case.*
operations.case.resolved
operations.case.*
reporting.filing.deadline-warning
reporting.filing.*
reporting.filing.sla-breached
reporting.filing.*
token.corporate-action.announced
token.corporate-action.*
token.corporate-action.completed
token.corporate-action.*
token.corporate-action.paid
token.corporate-action.*
token.document.published
token.document.*
trading-venue.announcement.published
trading-venue.announcement.*
trading-venue.announcement.updated
trading-venue.announcement.*
trading-venue.announcement.withdrawn
trading-venue.announcement.*
trading-venue.cancellation-batch.completed
trading-venue.cancellation-batch.*
trading-venue.market-status.changed
trading-venue.market-status.*
trading-venue.price-alert.triggered
trading-venue.price-alert.*
trading-venue.settlement-fill.aged
trading-venue.settlement-fill.*
trading-venue.settlement-fill.parked
trading-venue.settlement-fill.*
trading-venue.trade-leg.parked
trading-venue.trade-leg.*
transaction.request.broadcast
transaction.request.*
transaction.request.cancelled
transaction.request.*
transaction.request.confirmed
transaction.request.*
transaction.request.dead-lettered
transaction.request.*
transaction.request.failed
transaction.request.*

Choose patterns for your integration

Each row maps a need to a list that the platform accepts.

You need
Subscribe with
Behaviour
Every event
*
Delivers every live event, including the events that the defaults skip.
The defaults and one skipped family
*.provisional, *.final, *.retracted, funding.requirement.*
An update replaces the stored list, so the request must contain all four patterns.
Final events only
*.final
Delivers no retraction, including trading-venue.trade-fee.retracted, the retraction of a final event. It skips every event whose name does not end in .final, such as identity.registration.provisional.
Events and their corrections
*.provisional, *.final, *.retracted
These are the defaults. A list with *.retracted and without the matching source patterns is rejected.
One event family
token.transfer.*
Delivers the provisional, final, and retracted events of the family. It passes the retraction rule on its own.
One event
identity.registration.provisional
Selects that initial event. Automatic chain reorganisation corrections for a previously delivered provisional event can also arrive.

The Console create and edit forms offer *.pending, *.provisional, *.final, *.retracted, and transaction.request.* as checkboxes. The transaction-request option starts unchecked. Their “Event names” field takes any other name prefix or exact name. It lists the published names grouped by their first segment, such as token, and offers a prefix such as token.transfer.* for each family of more than one event. The form refuses a name that matches no published event before it saves.

  • Event catalogue: the events of every domain except token sales, trading venues and XvP settlements, when the platform sends each one and what to do with it.
  • Market and settlement events: the events of token sales, trading venues and XvP settlements, when the platform sends each one and what to do with it.
  • Lifecycle states: what each state means and which sequences an endpoint sees.
  • Consuming webhooks: identifiers, deduplication, retries, and retractions on the receiving side.
  • Receive DALP webhooks: register an endpoint, verify the signature, and rotate the secret.
  • Webhook endpoints in the Console: create an endpoint and choose its subscriptions.

Was this page helpful?