Events

Events are the triggers that cause a webhook delivery. Event names are hierarchical: a parent topic (file) groups its child events (file.deduction.ready, file.validation.success, ...), and you can subscribe at either level.

How matching works

A published event is delivered to your subscriptions that match it:

  • Exact match — a subscription on file.deduction.ready receives file.deduction.ready events.
  • Parent match — a subscription on a parent prefix receives everything under it: a subscription on file receives file.deduction.ready, file.validation.failed, and any other file.* event.
  • The hierarchy flows downward only: subscribing to a child (file.deduction.ready) does not deliver parent or sibling events.
  • If the same targetUrl would be matched more than once for one event (e.g. via parent and child subscriptions), it receives a single delivery.

Choose your granularity:

{ "events": ["file"] }                    // everything in the file lifecycle
{ "events": ["file.deduction.ready"] }    // only deduction-ready notifications

Available events

Event When it fires Payload highlights
file Parent topic — subscribe to receive all events below.
file.deduction.ready A deduction file was generated and is ready. data.url — pre-signed download URL (15-min expiry).
file.validation.success An uploaded Census/Receipt passed validation and is being processed. data.fileName, data.message.
file.validation.failed An uploaded file failed validation. data.errors — list of { propertyName, errorMessage }.
file.processing.error An unexpected error occurred while processing a file. data.fileName, data.message.

Every import outcome produces a notification. Files that fail before processing even starts (e.g. transfer or format issues) also trigger file.processing.error — you never need to poll to discover that an import silently died.

Delivered payload shape

Every delivery has exactly two top-level fields — the event field always carries the specific event that happened, even when matched through a parent subscription:

{
  "event": "file.validation.failed",
  "data": {
    "fileName": "census_2026_05.csv",
    "message": "The file does not adhere to the required template.",
    "errors": [
      { "propertyName": "hireDate", "errorMessage": "Invalid date format." }
    ]
  }
}
data field Type Description
fileName string The file the event refers to.
message string Human-readable summary.
url string Pre-signed download URL. Present on file.deduction.ready.
errors array Validation failures. Present on file.validation.failed.

For the complete walkthrough (signature validation, download, sandbox testing), see Receiving the Deduction File.