Events
This is the catalog of webhook events. Subscribe a webhook to an event by
adding the event's type to its events list. Every event is delivered as an
HTTP POST with a Content-Type: application/json header, and the body is a
JSON object whose type field identifies the event, plus the common eventId
and requestId fields described in the Overview.
| Event | Description |
|---|---|
application.status.changed.v1 |
Sent when an application's status changes. |
contact.created.v1 |
Sent when a contact is created. |
contact.updated.v1 |
Sent when a contact changes. |
org.status.changed.v1 |
Sent when an organization's status changes. |
payment.status.changed.v1 |
Sent when a payment's status changes. |
application.status.changed.v1
Sent when an application's status changes.
| Field | Type | Description |
|---|---|---|
eventId |
string | Stable id of this delivery; identical across retries (use it to deduplicate). |
requestId |
string | Id of the individual delivery attempt; changes on every retry. |
type |
string | Always "application.status.changed.v1". |
applicationId |
string | The id of the application whose status changed. |
orgId |
string | null | The id of the linked organization, or null until the application is approved. |
status |
string | The new status (see below). |
previousStatus |
string | null | The status before the change, or null for the application's first status. |
occurredAt |
string | ISO-8601 timestamp of when the change occurred. |
status and previousStatus are one of:
| Status | Meaning |
|---|---|
draft |
The application was opened and is being filled out. |
submitted |
The application was submitted by the merchant and is ready for review. |
approved |
The application was reviewed and approved by underwriting. |
declined |
The application was reviewed and declined by underwriting. |
Example payload:
{
"eventId": "WebhookRequest#2cVQF8s0u9c2bq5b3pTn1mY7kde",
"requestId": "2dWRg9t1v0d3cr6c4qUo2nZ8lef",
"type": "application.status.changed.v1",
"applicationId": "2cVQF8s0u9c2bq5b3pTn1mY7kde",
"orgId": null,
"status": "submitted",
"previousStatus": "draft",
"occurredAt": "2026-06-25T17:42:03.118Z"
}contact.created.v1
Sent when a contact is created on an organization. The payload carries identifiers only — fetch the contact through the API for its details.
Like payment.status.changed.v1, this event is delivered to the webhooks of
both the contact's organization and the organization's agency, so the same
payload reaches subscribers on either side.
| Field | Type | Description |
|---|---|---|
eventId |
string | Stable id of this delivery; identical across retries (use it to deduplicate). |
requestId |
string | Id of the individual delivery attempt; changes on every retry. |
type |
string | Always "contact.created.v1". |
contactId |
string | The id of the contact that was created. |
orgId |
string | The id of the organization the contact belongs to. |
occurredAt |
string | ISO-8601 timestamp of when the contact was created. |
Example payload:
{
"eventId": "WebhookRequest#2cVQF8s0u9c2bq5b3pTn1mY7kde",
"requestId": "2dWRg9t1v0d3cr6c4qUo2nZ8lef",
"type": "contact.created.v1",
"contactId": "2cVQF8s0u9c2bq5b3pTn1mY7kde",
"orgId": "2eXSh0u2w1e4ds7d5rVp3oA9mfg",
"occurredAt": "2026-07-26T17:42:03.118Z"
}contact.updated.v1
Sent when an existing contact changes. Deleting a contact is a soft delete — the record is retained so existing references still resolve — so a deletion arrives as an update rather than a separate event. Fetch the contact through the API to see its current state, including whether it is deleted.
Like contact.created.v1, this event is delivered to the webhooks of both
the contact's organization and the organization's agency.
| Field | Type | Description |
|---|---|---|
eventId |
string | Stable id of this delivery; identical across retries (use it to deduplicate). |
requestId |
string | Id of the individual delivery attempt; changes on every retry. |
type |
string | Always "contact.updated.v1". |
contactId |
string | The id of the contact that changed. |
orgId |
string | The id of the organization the contact belongs to. |
occurredAt |
string | ISO-8601 timestamp of when the change occurred. |
Example payload:
{
"eventId": "WebhookRequest#2cVQF8s0u9c2bq5b3pTn1mY7kde",
"requestId": "2dWRg9t1v0d3cr6c4qUo2nZ8lef",
"type": "contact.updated.v1",
"contactId": "2cVQF8s0u9c2bq5b3pTn1mY7kde",
"orgId": "2eXSh0u2w1e4ds7d5rVp3oA9mfg",
"occurredAt": "2026-07-26T17:42:03.118Z"
}org.status.changed.v1
Sent when an organization's status changes.
| Field | Type | Description |
|---|---|---|
eventId |
string | Stable id of this delivery; identical across retries (use it to deduplicate). |
requestId |
string | Id of the individual delivery attempt; changes on every retry. |
type |
string | Always "org.status.changed.v1". |
orgId |
string | The id of the organization whose status changed. |
status |
string | The new status (see below). |
previousStatus |
string | null | The status before the change, or null for the org's first status. |
occurredAt |
string | ISO-8601 timestamp of when the change occurred. |
status and previousStatus are one of:
| Status | Meaning |
|---|---|
Onboarding |
The organization is being onboarded and is not yet fully active. |
Healthy |
The organization is active and in good standing. |
Unhealthy |
The organization is active but in a degraded or at-risk state. |
Suspended |
The organization has been suspended and cannot transact. |
Closed |
The organization has been permanently closed. |
Example payload:
{
"eventId": "WebhookRequest#2cVQF8s0u9c2bq5b3pTn1mY7kde",
"requestId": "2dWRg9t1v0d3cr6c4qUo2nZ8lef",
"type": "org.status.changed.v1",
"orgId": "2cVQF8s0u9c2bq5b3pTn1mY7kde",
"status": "Healthy",
"previousStatus": "Onboarding",
"occurredAt": "2026-06-25T17:42:03.118Z"
}payment.status.changed.v1
Sent when a payment's status changes. Unlike the application and organization events — which fan out only to the owning agency — this event is delivered to the webhooks of both the owning agency and the payment's organization, so the same payload reaches subscribers on either side.
| Field | Type | Description |
|---|---|---|
eventId |
string | Stable id of this delivery; identical across retries (use it to deduplicate). |
requestId |
string | Id of the individual delivery attempt; changes on every retry. |
type |
string | Always "payment.status.changed.v1". |
paymentId |
string | The id of the payment whose status changed. |
orgId |
string | null | The id of the payment's organization, or null when the payment is not yet linked to an org. |
status |
string | The new status (see below). |
previousStatus |
string | null | The status before the change, or null for the payment's first status. |
occurredAt |
string | ISO-8601 timestamp of when the change occurred. |
status and previousStatus are one of:
| Status | Meaning |
|---|---|
Pending |
The payment has been created but not yet completed. |
Completed |
The payment has been successfully completed. |
Finalized |
The payment has settled and is finalized. |
Canceled |
The payment was canceled. |
Example payload:
{
"eventId": "WebhookRequest#2cVQF8s0u9c2bq5b3pTn1mY7kde",
"requestId": "2dWRg9t1v0d3cr6c4qUo2nZ8lef",
"type": "payment.status.changed.v1",
"paymentId": "2cVQF8s0u9c2bq5b3pTn1mY7kde",
"orgId": "2eXSh0u2w1e4ds7d5rVp3oA9mfg",
"status": "Completed",
"previousStatus": "Pending",
"occurredAt": "2026-06-25T17:42:03.118Z"
}