Spidr Webhooks
Spidr Webhooks
This document provides comprehensive information about all webhook types in the Spidr Unified API. Each webhook is triggered when specific actions are successfully completed via the Unified API, SST (Spidr Service Tool), or underlying provider.
To see a complete list of all Spidr webhook fields and their descriptions, please reference: Webhook Field Index
Table of Contents
- User Webhooks
- Account Webhooks
- ACH Account Webhooks
- Card Webhooks
- Authorization Webhooks
- Transaction Webhooks
- Bill Pay Webhooks
- Round-Up Webhooks
- ZTM Webhooks
- Common Webhook Fields
- Webhook Delivery
- Best Practices
- Support
User Webhooks
user.edit
Description: The user.edit webhook contains details about changes that were made to a user or entity. It will provide both the new and old values for any fields that were changed. User details can be updated via API or SST. When customData is supplied to an edit request, it is also included as a top-level webhook field; a null value indicates that the field was cleared.
Triggers:
- Successful API call to the Edit User endpoint (
PATCH /v1/user/{id}) - Successful API call to the Edit Entity endpoint (
PATCH /v1/entity/{id}) - Successful API call to the Edit ID Number endpoint (
PATCH /v1/user/{id}/editIdNumber) - Successful API call to the Update User CIP Status endpoint (
PATCH /v1/user/{id}/cipStatus) - User details updated via the appropriate SST role. If updated via SST, the
sstRequestorUserIdandsstRequestorUserEmailof the user who performed the update will be included in theactionRequestorobject.
Example Payload:
{
"uuid": "af21333c-b08d-4f1c-881a-df24707ab0e8",
"companyId": "6823a83c643d753f0f79a7ec",
"requestId": "d082ef13f90e844780de5c2c66d6403b",
"responseBody": {
"updated": true,
"spidrActionId": "68950786e754b589d01d1339"
},
"spidrActionId": "68950786e754b589d01d1339",
"userId": "68950761e754b589d02d133c",
"webhookType": "user.edit",
"customData": "customer-reference-123",
"actionRequestor": {
"source": "api"
},
"changes": [
{
"field": "firstName",
"oldValue": "John",
"newValue": "Jane"
},
{
"field": "dateOfBirth",
"oldValue": "1992-03-25T00:00:00.000Z",
"newValue": "1991-03-25T00:00:00.000Z"
},
{
"field": "email",
"oldValue": "[email protected]",
"newValue": "[email protected]"
},
{
"field": "address.address1",
"oldValue": "123 Evergreen St",
"newValue": "100 Test St"
},
{
"field": "customData",
"oldValue": "previous-reference",
"newValue": "customer-reference-123"
}
]
}user.create
Description: The user.create webhook is sent when a new user is successfully created in the system. It includes the user ID, product ID, CIP status, optional ZTM (Zero Touch Monitoring) data if applicable, and customData when it was supplied in the create request.
Triggers:
- Successful API call to the Create User endpoint (
POST /v1/user/create)
Example Payload:
{
"uuid": "b1c2d3e4-f5a6-4b7c-8d9e-0f1a2b3c4d5e",
"companyId": "6823a83c643d753f0f79a7ec",
"requestId": "e193fg24g01f955891ef6d3d77e7514c",
"responseBody": {
"id": "68950761e754b589d02d133c",
"cip": {
"status": "pass",
"details": {}
},
"spidrActionId": "68950786e754b589d01d1339"
},
"spidrActionId": "68950786e754b589d01d1339",
"userId": "68950761e754b589d02d133c",
"productId": "67f2a93d743e864g1g80b8fd",
"webhookType": "user.create",
"customData": "customer-reference-123",
"actionRequestor": {
"source": "api"
}
}entity.create
Description: The entity.create webhook is sent when a new entity is successfully created in the system. It includes the entity ID, entity name, product ID, CIP status, optional ZTM data if applicable, and customData when it was supplied in the create request.
Triggers:
- Successful API call to the Create Entity endpoint (
POST /v1/entity/create)
Example Payload:
{
"uuid": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"companyId": "6823a83c643d753f0f79a7ec",
"requestId": "f284gh35h12g066902fg7e4e88f8625d",
"responseBody": {
"id": "68950761e754b589d02d144d",
"cip": {
"status": "pass",
"details": {}
},
"spidrActionId": "68950786e754b589d01d144a"
},
"spidrActionId": "68950786e754b589d01d144a",
"userId": "68950761e754b589d02d144d",
"productId": "67f2a93d743e864g1g80b8fd",
"webhookType": "entity.create",
"customData": "customer-reference-123",
"actionRequestor": {
"source": "api"
},
"entityName": "Test Corporation LLC"
}user.archive
Description: The user.archive webhook is sent when a user is successfully archived. It includes details about the changes made (such as the archive status and date) and the reason for archiving.
Triggers:
- Successful API call to the Archive User endpoint (
PATCH /v1/user/{id}/archiveUser) - User archived via the appropriate SST role
Example Payload:
{
"uuid": "c2d3e4f5-g6h7-4i8j-9k0l-1m2n3o4p5q6r",
"companyId": "6823a83c643d753f0f79a7ec",
"requestId": "f204gh35h12g066902fg7e4e88f8625d",
"responseBody": {
"updated": true,
"spidrActionId": "68950786e754b589d01d1339"
},
"spidrActionId": "68950786e754b589d01d1339",
"userId": "68950761e754b589d02d133c",
"webhookType": "user.archive",
"actionRequestor": {
"source": "api"
},
"archiveReason": "Account closure requested by user",
"changes": [
{
"field": "isArchived",
"oldValue": false,
"newValue": true
},
{
"field": "dateArchived",
"oldValue": null,
"newValue": "2025-10-23T15:30:00.000Z"
}
]
}user.retrieveId
Description: The user.retrieveId webhook is sent when a user's ID number is retrieved. This is an audit trail webhook that tracks when sensitive user information is accessed.
Triggers:
- Successful API call to the Retrieve ID Number endpoint (
GET /v1/user/{id}/retrieveIdNumber) - ID number retrieved via the appropriate SST role
Example Payload:
{
"uuid": "d3e4f5g6-h7i8-4j9k-0l1m-2n3o4p5q6r7s",
"companyId": "6823a83c643d753f0f79a7ec",
"requestId": "g315hi46i23h177013gh8f5f99g9736e",
"spidrActionId": "68950786e754b589d01d1339",
"userId": "68950761e754b589d02d133c",
"webhookType": "user.retrieveId",
"actionRequestor": {
"source": "api"
}
}user.retrieveIdHistory
Description: The user.retrieveIdHistory webhook is sent when a user's ID update history is retrieved. This is an audit trail webhook that tracks when sensitive user information history is accessed.
Triggers:
- Successful API call to the Retrieve ID Number History endpoint (
GET /v1/user/{id}/retrieveIdUpdateHistory) - ID update history retrieved via the appropriate SST role
Example Payload:
{
"uuid": "e4f5g6h7-i8j9-4k0l-1m2n-3o4p5q6r7s8t",
"companyId": "6823a83c643d753f0f79a7ec",
"requestId": "h426ij57j34i288124hi9g6g00h0847f",
"spidrActionId": "68950786e754b589d01d1339",
"userId": "68950761e754b589d02d133c",
"webhookType": "user.retrieveIdHistory",
"actionRequestor": {
"source": "api"
}
}Account Webhooks
account.create
Description: The account.create webhook is sent when a new account is successfully created for a user. It includes the account ID, user ID, product ID, and optional ZTM data.
Triggers:
- Successful API call to the Create Account endpoint (
POST /v1/account/create)
Example Payload:
{
"uuid": "f5g6h7i8-j9k0-4l1m-2n3o-4p5q6r7s8t9u",
"companyId": "6823a83c643d753f0f79a7ec",
"requestId": "i537jk68k45j399235ij0h7h11i1958g",
"responseBody": {
"accountId": "68950897f865c690e12e244a",
"accountNumber": "123456789",
"spidrActionId": "68950786e754b589d01d1339"
},
"spidrActionId": "68950786e754b589d01d1339",
"accountId": "68950897f865c690e12e244a",
"userId": "68950761e754b589d02d133c",
"productId": "67f2a93d743e864g1g80b8fd",
"webhookType": "account.create",
"actionRequestor": {
"source": "api"
}
}account.shippingAddressUpdate
Description: The account.shippingAddressUpdate webhook is sent when an account's shipping address is updated. It provides both the old and new values for any address fields that were changed.
Triggers:
- Successful API call to the Edit Account endpoint (
PATCH /v1/account/{id}) with shipping address data - Account shipping address updated via the appropriate SST role
Example Payload:
{
"uuid": "g6h7i8j9-k0l1-4m2n-3o4p-5q6r7s8t9u0v",
"companyId": "6823a83c643d753f0f79a7ec",
"requestId": "j648kl79l56k400346jk1i8i22j2069h",
"responseBody": {
"spidrActionId": "68950786e754b589d01d1339"
},
"spidrActionId": "68950786e754b589d01d1339",
"accountId": "68950897f865c690e12e244a",
"userId": "68950761e754b589d02d133c",
"productId": "67f2a93d743e864g1g80b8fd",
"webhookType": "account.shippingAddressUpdate",
"actionRequestor": {
"source": "api"
},
"changes": [
{
"field": "shippingAddress.address1",
"oldValue": "123 Main St",
"newValue": "456 Oak Ave"
},
{
"field": "shippingAddress.city",
"oldValue": "San Francisco",
"newValue": "Los Angeles"
},
{
"field": "shippingAddress.state",
"oldValue": "CA",
"newValue": "CA"
},
{
"field": "shippingAddress.postalCode",
"oldValue": "94102",
"newValue": "90001"
}
]
}account.statusUpdate
Description: The account.statusUpdate webhook is sent when an account's status is updated (e.g., from active to closed). It includes the old and new status values and optional status reason.
Triggers:
- Successful API call to the Edit Account endpoint (
PATCH /v1/account/{id}) with status data - Account status updated via the appropriate SST role
Example Payload:
{
"uuid": "h7i8j9k0-l1m2-4n3o-4p5q-6r7s8t9u0v1w",
"companyId": "6823a83c643d753f0f79a7ec",
"requestId": "k759lm80m67l511457kl2j9j33k3170i",
"responseBody": {
"newStatus": "closed",
"statusReason": "customer_request",
"spidrActionId": "68950786e754b589d01d1339"
},
"spidrActionId": "68950786e754b589d01d1339",
"accountId": "68950897f865c690e12e244a",
"userId": "68950761e754b589d02d133c",
"productId": "67f2a93d743e864g1g80b8fd",
"webhookType": "account.statusUpdate",
"actionRequestor": {
"source": "sst",
"sstRequestorUserId": "admin123",
"sstRequestorUserEmail": "[email protected]"
},
"changes": [
{
"field": "status",
"oldValue": "active",
"newValue": "closed"
},
{
"field": "statusReason",
"oldValue": null,
"newValue": "customer_request"
}
]
}account.featureUpdate
Description: The account.featureUpdate webhook is sent when an account feature is enabled or disabled (e.g., international transactions, overdraft). It includes the change history showing which features were modified.
Triggers:
- Successful API call to the Edit Account Features endpoint (
PATCH /v1/account/{id}/editAccountFeatures) - Account features updated via the appropriate SST role
Example Payload:
{
"uuid": "i8j9k0l1-m2n3-4o4p-5q6r-7s8t9u0v1w2x",
"companyId": "6823a83c643d753f0f79a7ec",
"requestId": "l860mn91n78m622568lm3k0k44l4281j",
"responseBody": {
"updated": true,
"accountId": "68950897f865c690e12e244a",
"spidrActionId": "68950786e754b589d01d1339"
},
"spidrActionId": "68950786e754b589d01d1339",
"accountId": "68950897f865c690e12e244a",
"userId": "68950761e754b589d02d133c",
"productId": "67f2a93d743e864g1g80b8fd",
"webhookType": "account.featureUpdate",
"actionRequestor": {
"source": "api"
},
"changes": [
{
"field": "features.allow_international_transactions",
"oldValue": true,
"newValue": false
}
]
}account.pinChangeStageSuccess
Description: The account.pinChangeStageSuccess webhook is sent when a PIN change has been successfully staged with the processor. This occurs after the user submits their new PIN via the processor's PIN change URL but before the PIN change is committed via the API.
Triggers:
- Processor (e.g., Galileo) sends an
agserv_PIN_change_successevent when the user successfully sets their PIN via the processor's PIN URL
Example Payload:
{
"uuid": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"webhookType": "account.pinChangeStageSuccess",
"data": {
"accountId": "68950897f865c690e12e244a",
"productId": "67f2a93d743e864g1g80b8fd",
"userId": "68950761e754b589d02d133c",
"providerDetails": {
"provider": "galileo",
"pmt_ref_no": "594100012345",
"prod_id": "1234",
"timestamp": "2025-10-23 10:15:00 MST",
"type": "agserv_PIN_change_success",
"balance_id": "5678",
"msg_event_id": "98765",
"eventType": "AccountEvent"
},
"accountNumber": "594100012345",
"timestamp": "2025-10-23T17:15:00.000Z"
}
}account.pinChangeStageFail
Description: The account.pinChangeStageFail webhook is sent when a PIN change staging attempt fails at the processor. This uses the same payload shape as account.pinChangeStageSuccess — the webhookType string and the type field in providerDetails are the only differences.
Triggers:
- Processor (e.g., Galileo) sends an
agserv_PIN_change_failevent when the user's PIN change attempt fails (e.g., mismatched PINs, expired token, inactive account)
Example Payload:
{
"uuid": "c3d4e5f6-a7b8-4c9d-0e1f-2a3b4c5d6e7f",
"webhookType": "account.pinChangeStageFail",
"data": {
"accountId": "68950897f865c690e12e244a",
"productId": "67f2a93d743e864g1g80b8fd",
"userId": "68950761e754b589d02d133c",
"providerDetails": {
"provider": "galileo",
"pmt_ref_no": "594100012345",
"prod_id": "1234",
"timestamp": "2025-10-23 10:15:00 MST",
"type": "agserv_PIN_change_fail",
"balance_id": "5678",
"msg_event_id": "98766",
"eventType": "AccountEvent"
},
"accountNumber": "594100012345",
"timestamp": "2025-10-23T17:15:00.000Z"
}
}account.pinChange
Description: The account.pinChange webhook is sent when a PIN change is confirmed by the underlying processor. This is an asynchronous confirmation from the processor that the PIN has been successfully changed in their system.
Triggers:
- Processor (e.g., Galileo) sends a
system_pin_changeevent after a PIN change is finalized
Example Payload:
{
"uuid": "b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e",
"webhookType": "account.pinChange",
"data": {
"accountId": "68950897f865c690e12e244a",
"productId": "67f2a93d743e864g1g80b8fd",
"userId": "68950761e754b589d02d133c",
"providerDetails": {
"provider": "galileo",
"pmt_ref_no": "594100012345",
"prod_id": "1234",
"timestamp": "2025-10-23 10:20:00 MST",
"type": "system_pin_change",
"balance_id": "5678",
"cad": "9876",
"eventType": "AccountEvent"
},
"accountNumber": "594100012345",
"cardId": "68950ab9h087e812g34g466c",
"timestamp": "2025-10-23T17:20:00.000Z"
}
}
Note: This webhook is different fromcard.pinChanged. Thecard.pinChangedwebhook is sent immediately when you call the/commitPinChangeendpoint, whileaccount.pinChangeis an asynchronous confirmation from the processor.
account.disputeCreated
Description: The account.disputeCreated webhook is sent when a dispute is created at the provider level. It includes the dispute ID, case number, dispute amount, and provider details.
Triggers:
- Provider (e.g., Galileo) sends a
dispute_createdevent when a new dispute is filed
Example Payload:
{
"uuid": "d4e5f6g7-h8i9-4j0k-1l2m-3n4o5p6q7r8s",
"webhookType": "account.disputeCreated",
"data": {
"accountId": "68950897f865c690e12e244a",
"productId": "67f2a93d743e864g1g80b8fd",
"userId": "68950761e754b589d02d133c",
"accountNumber": "594100012345",
"caseNo": "CASE-2026-001234",
"disputeId": "DSP-56789",
"disputeAmount": "150.00",
"providerDetails": {
"provider": "galileo",
"pmt_ref_no": "594100012345",
"prod_id": "3391",
"timestamp": "2026-01-15 09:30:00 MST",
"type": "dispute_created",
"case_no": "CASE-2026-001234",
"dispute_id": "DSP-56789",
"dispute_amount": "150.00",
"balance_id": "5678",
"eventType": "AccountEvent"
},
"timestamp": "2026-01-15T16:30:00.000Z"
}
}account.balanceInquiry
Description: The account.balanceInquiry webhook is a provider-originated event sent when the processor reports a balance inquiry on an account (for example, an ATM or network balance check). It carries the current balance and the raw provider event in data.providerDetails.
Triggers:
- Processor (e.g., Galileo) sends a
balevent
Example Payload:
{
"uuid": "b1c2d3e4-f5a6-4b7c-8d9e-0f1a2b3c4d5e",
"webhookType": "account.balanceInquiry",
"data": {
"accountId": "68950897f865c690e12e244a",
"productId": "67f2a93d743e864g1g80b8fd",
"userId": "68950761e754b589d02d133c",
"providerDetails": {
"provider": "galileo",
"pmt_ref_no": "594100012345",
"prod_id": "3391",
"timestamp": "2026-01-15 03:23:10 MST",
"type": "bal",
"balance_id": "5678",
"cad": "9876",
"msg_event_id": "733151",
"open_to_buy": "100.00",
"eventType": "AccountEvent"
},
"accountNumber": "594100012345",
"cardId": "68950ab9h087e812g34g466c",
"balance": "100.00",
"timestamp": "2026-01-15T10:23:10.000Z"
}
}account.statusChange
Description: The account.statusChange webhook is a provider-originated account status change reported by the processor. This is distinct from account.statusUpdate, which is generated when an account status is changed via the Unified API or SST. data.oldStatus and data.newStatus carry the processor status codes, and data.affectedAccountIds lists every account updated as a result of the change (for secured-credit account groups, a status change can cascade to related accounts).
Triggers:
- Processor (e.g., Galileo) sends an
account_status_changeevent
Example Payload:
{
"uuid": "c2d3e4f5-a6b7-4c8d-9e0f-1a2b3c4d5e6f",
"webhookType": "account.statusChange",
"data": {
"accountId": "68950897f865c690e12e244a",
"accountNumber": "594100012345",
"productId": "67f2a93d743e864g1g80b8fd",
"userId": "68950761e754b589d02d133c",
"oldStatus": "N",
"newStatus": "C",
"affectedAccountIds": ["68950897f865c690e12e244a"],
"providerDetails": {
"provider": "galileo",
"pmt_ref_no": "594100012345",
"prod_id": "3391",
"timestamp": "2026-01-15 10:15:00 MST",
"type": "account_status_change",
"old_status": "N",
"new_status": "C",
"balance_id": "5678",
"eventType": "AccountEvent"
}
}
}When the account belongs to a secured-credit group,
data.securedCreditis included withrole,groupAnchorAccountId,collateralAccountId, anddirectParentAccountId(when applicable).
account.paymentReminder
Description: The account.paymentReminder webhook is a provider-originated secured-credit event sent when the processor generates an upcoming-payment reminder for a secured-credit account. When the account belongs to a secured-credit group, data.securedCredit describes the relationship: role (collateral, primary_cardholder_credit, or authorized_user_credit), groupAnchorAccountId, collateralAccountId, and directParentAccountId (when applicable). The same shape applies to the other secured-credit events below.
Triggers:
- Processor (e.g., Galileo) sends a
payment_reminder_event
Example Payload:
{
"uuid": "d3e4f5a6-b7c8-4d9e-0f1a-2b3c4d5e6f7a",
"webhookType": "account.paymentReminder",
"data": {
"accountId": "68950897f865c690e12e244a",
"accountNumber": "594100012345",
"productId": "67f2a93d743e864g1g80b8fd",
"userId": "68950761e754b589d02d133c",
"securedCredit": {
"role": "primary_cardholder_credit",
"groupAnchorAccountId": "68950897f865c690e12e244a",
"collateralAccountId": "689518b9m643l478n01n266j"
},
"providerDetails": {
"provider": "galileo",
"pmt_ref_no": "594100012345",
"prod_id": "3391",
"timestamp": "2026-01-15 09:00:00 MST",
"type": "payment_reminder_event",
"balance_id": "5678",
"eventType": "AccountEvent"
}
}
}account.pastDuePaymentStatus
Description: The account.pastDuePaymentStatus webhook is a provider-originated secured-credit event sent when the processor reports a change in the past-due status of a secured-credit account's payment. When the account is a secured-credit account, data.securedCredit describes the linked secured-credit relationship.
Triggers:
- Processor (e.g., Galileo) sends a
past_due_payment_status_event
Example Payload:
{
"uuid": "e4f5a6b7-c8d9-4e0f-1a2b-3c4d5e6f7a8b",
"webhookType": "account.pastDuePaymentStatus",
"data": {
"accountId": "68950897f865c690e12e244a",
"accountNumber": "594100012345",
"productId": "67f2a93d743e864g1g80b8fd",
"userId": "68950761e754b589d02d133c",
"providerDetails": {
"provider": "galileo",
"pmt_ref_no": "594100012345",
"prod_id": "3391",
"timestamp": "2026-01-15 09:00:00 MST",
"type": "past_due_payment_status_event",
"balance_id": "5678",
"eventType": "AccountEvent"
}
}
}account.autopayStatusChange
Description: The account.autopayStatusChange webhook is a provider-originated secured-credit event sent when the autopay configuration status changes on a secured-credit account (for example, autopay enabled or disabled). When the account is a secured-credit account, data.securedCredit describes the linked secured-credit relationship.
Triggers:
- Processor (e.g., Galileo) sends an
autopay_status_change_event
Example Payload:
{
"uuid": "f5a6b7c8-d9e0-4f1a-2b3c-4d5e6f7a8b9c",
"webhookType": "account.autopayStatusChange",
"data": {
"accountId": "68950897f865c690e12e244a",
"accountNumber": "594100012345",
"productId": "67f2a93d743e864g1g80b8fd",
"userId": "68950761e754b589d02d133c",
"providerDetails": {
"provider": "galileo",
"pmt_ref_no": "594100012345",
"prod_id": "3391",
"timestamp": "2026-01-15 09:00:00 MST",
"type": "autopay_status_change_event",
"balance_id": "5678",
"eventType": "AccountEvent"
}
}
}account.autopaySuccess
Description: The account.autopaySuccess webhook is a provider-originated secured-credit event sent when an autopay payment succeeds on a secured-credit account. When the account is a secured-credit account, data.securedCredit describes the linked secured-credit relationship.
Triggers:
- Processor (e.g., Galileo) sends an
autopay_success_event
Example Payload:
{
"uuid": "a6b7c8d9-e0f1-4a2b-3c4d-5e6f7a8b9c0d",
"webhookType": "account.autopaySuccess",
"data": {
"accountId": "68950897f865c690e12e244a",
"accountNumber": "594100012345",
"productId": "67f2a93d743e864g1g80b8fd",
"userId": "68950761e754b589d02d133c",
"providerDetails": {
"provider": "galileo",
"pmt_ref_no": "594100012345",
"prod_id": "3391",
"timestamp": "2026-01-15 09:00:00 MST",
"type": "autopay_success_event",
"balance_id": "5678",
"eventType": "AccountEvent"
}
}
}ACH Account Webhooks
achAccount.create
Description: The achAccount.create webhook is sent when a new ACH account is successfully linked to a user's account. It includes the ACH account ID and optional ZTM data.
Triggers:
- Successful API call to the Create ACH Account endpoint (
POST /v1/achaccount/create)
Example Payload:
{
"uuid": "j9k0l1m2-n3o4-4p5q-6r7s-8t9u0v1w2x3y",
"companyId": "6823a83c643d753f0f79a7ec",
"requestId": "m971no02o89n733679mn4l1l55m5392k",
"responseBody": {
"achAccountId": "689509a8g976d701f23f355b",
"spidrActionId": "68950786e754b589d01d1339"
},
"spidrActionId": "68950786e754b589d01d1339",
"accountId": "68950897f865c690e12e244a",
"userId": "68950761e754b589d02d133c",
"achAccountId": "689509a8g976d701f23f355b",
"productId": "67f2a93d743e864g1g80b8fd",
"webhookType": "achAccount.create",
"actionRequestor": {
"source": "api"
}
}achAccount.remove
Description: The achAccount.remove webhook is sent when an ACH account is successfully removed (unlinked) from a user's account.
Triggers:
- Successful API call to the Remove ACH Account endpoint (
DELETE /v1/achaccount/{id}) - ACH account removed via the appropriate SST role
Example Payload:
{
"uuid": "k0l1m2n3-o4p5-4q6r-7s8t-9u0v1w2x3y4z",
"companyId": "6823a83c643d753f0f79a7ec",
"requestId": "n082op13p90o844780no5m2m66n6403l",
"responseBody": {
"removed": true,
"spidrActionId": "68950786e754b589d01d1339"
},
"spidrActionId": "68950786e754b589d01d1339",
"accountId": "68950897f865c690e12e244a",
"userId": "68950761e754b589d02d133c",
"achAccountId": "689509a8g976d701f23f355b",
"productId": "67f2a93d743e864g1g80b8fd",
"webhookType": "achAccount.remove",
"actionRequestor": {
"source": "api"
}
}Card Webhooks
card.activate
Description: The card.activate webhook is sent when a card is successfully activated. It includes the card details and the change history showing the status change from inactive to active.
Triggers:
- Successful API call to the Activate Card endpoint (
POST /v1/card/{cardId}/activate)
Example Payload:
{
"uuid": "l1m2n3o4-p5q6-4r7s-8t9u-0v1w2x3y4z5a",
"companyId": "6823a83c643d753f0f79a7ec",
"requestId": "o193pq24q01p955891pq6n3n77p7514m",
"responseBody": {
"cardId": "68950ab9h087e812g34g466c",
"status": "active",
"spidrActionId": "68950786e754b589d01d1339"
},
"spidrActionId": "68950786e754b589d01d1339",
"accountId": "68950897f865c690e12e244a",
"userId": "68950761e754b589d02d133c",
"cardId": "68950ab9h087e812g34g466c",
"productId": "67f2a93d743e864g1g80b8fd",
"webhookType": "card.activate",
"actionRequestor": {
"source": "api"
},
"changes": [
{
"field": "status",
"oldValue": "unactivated",
"newValue": "active"
}
]
}card.frozen
Description: The card.frozen webhook is sent when a card is successfully frozen (temporarily disabled). The card can be unfrozen later.
Triggers:
- Successful API call to the Update Card Status endpoint (
PATCH /v1/card/{cardId}/modifyStatus) with freeze action - Card frozen via the appropriate SST role
Example Payload:
{
"uuid": "m2n3o4p5-q6r7-4s8t-9u0v-1w2x3y4z5a6b",
"companyId": "6823a83c643d753f0f79a7ec",
"requestId": "p204qr35r12q066902qr7o4o88q8625n",
"responseBody": {
"newStatus": "frozen",
"spidrActionId": "68950786e754b589d01d1339"
},
"spidrActionId": "68950786e754b589d01d1339",
"accountId": "68950897f865c690e12e244a",
"userId": "68950761e754b589d02d133c",
"cardId": "68950ab9h087e812g34g466c",
"productId": "67f2a93d743e864g1g80b8fd",
"webhookType": "card.frozen",
"actionRequestor": {
"source": "api"
}
}card.unfrozen
Description: The card.unfrozen webhook is sent when a previously frozen card is successfully unfrozen (re-enabled).
Triggers:
- Successful API call to the Update Card Status endpoint (
PATCH /v1/card/{cardId}/modifyStatus) with unfreeze action - Card unfrozen via the appropriate SST role
Example Payload:
{
"uuid": "n3o4p5q6-r7s8-4t9u-0v1w-2x3y4z5a6b7c",
"companyId": "6823a83c643d753f0f79a7ec",
"requestId": "q315rs46s23r177013rs8p5p99r9736o",
"responseBody": {
"newStatus": "active",
"spidrActionId": "68950786e754b589d01d1339"
},
"spidrActionId": "68950786e754b589d01d1339",
"accountId": "68950897f865c690e12e244a",
"userId": "68950761e754b589d02d133c",
"cardId": "68950ab9h087e812g34g466c",
"productId": "67f2a93d743e864g1g80b8fd",
"webhookType": "card.unfrozen",
"actionRequestor": {
"source": "api"
}
}card.replaced
Description: The card.replaced webhook is sent when a card is successfully replaced (e.g., due to loss or theft). A new card is issued and the old card is archived.
Triggers:
- Successful API call to the Replace Card endpoint (
POST /v1/card/{cardId}/replace) - Card replaced via the appropriate SST role
Example Payload:
{
"uuid": "o4p5q6r7-s8t9-4u0v-1w2x-3y4z5a6b7c8d",
"companyId": "6823a83c643d753f0f79a7ec",
"requestId": "r426st57t34s288124st9q6q00s0847p",
"responseBody": {
"card": {
"cardId": "68950bcan198f923h45h577d",
"cardNumber": "487093XXXXXX2308",
"status": "unactivated"
},
"spidrActionId": "68950786e754b589d01d1339"
},
"spidrActionId": "68950786e754b589d01d1339",
"accountId": "68950897f865c690e12e244a",
"userId": "68950761e754b589d02d133c",
"cardId": "68950ab9h087e812g34g466c",
"productId": "67f2a93d743e864g1g80b8fd",
"webhookType": "card.replaced",
"actionRequestor": {
"source": "api"
},
"changes": [
{
"field": "isArchived",
"oldValue": false,
"newValue": true
},
{
"field": "status",
"oldValue": "active",
"newValue": "closed_lost_stolen"
}
]
}card.reissued
Description: The card.reissued webhook is sent when a card is successfully reissued (typically due to expiration). The existing card remains active until the new card is activated.
Triggers:
- Successful API call to the Reissue Card endpoint (
POST /v1/card/{cardId}/reissue) - Card reissued via the appropriate SST role
Example Payload:
{
"uuid": "p5q6r7s8-t9u0-4v1w-2x3y-4z5a6b7c8d9e",
"companyId": "6823a83c643d753f0f79a7ec",
"requestId": "s537tu68u45t399235tu0r7r11t1958q",
"responseBody": {
"cardNumber": "487093XXXXXX2307",
"cardExpiryDate": "12/27",
"spidrActionId": "68950786e754b589d01d1339"
},
"spidrActionId": "68950786e754b589d01d1339",
"accountId": "68950897f865c690e12e244a",
"userId": "68950761e754b589d02d133c",
"cardId": "68950ab9h087e812g34g466c",
"productId": "67f2a93d743e864g1g80b8fd",
"webhookType": "card.reissued",
"actionRequestor": {
"source": "api"
}
}card.resetPin
Description: The card.resetPin webhook is sent when a card's PIN fail count is successfully reset. This is typically done after multiple failed PIN attempts have locked the card.
Triggers:
- Successful API call to the Reset Card PIN Fail Count endpoint (
POST /v1/card/{cardId}/resetPinFailCount) - PIN fail count reset via the appropriate SST role
Example Payload:
{
"uuid": "q6r7s8t9-u0v1-4w2x-3y4z-5a6b7c8d9e0f",
"companyId": "6823a83c643d753f0f79a7ec",
"requestId": "t648uv79v56u400346uv1s8s22u2069r",
"responseBody": {
"cardId": "68950ab9h087e812g34g466c",
"status": "active",
"spidrActionId": "68950786e754b589d01d1339"
},
"spidrActionId": "68950786e754b589d01d1339",
"accountId": "68950897f865c690e12e244a",
"userId": "68950761e754b589d02d133c",
"cardId": "68950ab9h087e812g34g466c",
"productId": "67f2a93d743e864g1g80b8fd",
"webhookType": "card.resetPin",
"actionRequestor": {
"source": "sst",
"sstRequestorUserId": "support456",
"sstRequestorUserEmail": "[email protected]"
}
}card.mobileWalletProvision
Description: The card.mobileWalletProvision webhook is sent when a card is successfully provisioned to a mobile wallet (e.g., Apple Pay, Google Pay).
Triggers:
- Successful API call to the Provision Mobile Wallet endpoint (
POST /v1/card/{cardId}/mobileWalletProvision)
Example Payload:
{
"uuid": "r7s8t9u0-v1w2-4x3y-4z5a-6b7c8d9e0f1g",
"companyId": "6823a83c643d753f0f79a7ec",
"requestId": "u759vw80w67v511457vw2t9t33v3170s",
"responseBody": {
"encryptedCardData": "eyJhbGciOiJSU0EtT0FFUC0yNTYi...",
"spidrActionId": "68950786e754b589d01d1339"
},
"spidrActionId": "68950786e754b589d01d1339",
"accountId": "68950897f865c690e12e244a",
"userId": "68950761e754b589d02d133c",
"cardId": "68950ab9h087e812g34g466c",
"productId": "67f2a93d743e864g1g80b8fd",
"webhookType": "card.mobileWalletProvision",
"actionRequestor": {
"source": "api"
}
}card.fetchImageUrl
Description: The card.fetchImageUrl webhook is sent when a card's display image URL is successfully retrieved. This is typically used to display a virtual card image to the user.
Triggers:
- Successful API call to the Get Card Image URL endpoint (
GET /v1/card/{cardId}/displayUrl)
Example Payload:
{
"uuid": "s8t9u0v1-w2x3-4y4z-5a6b-7c8d9e0f1g2h",
"companyId": "6823a83c643d753f0f79a7ec",
"requestId": "v860wx91x78w622568wx3u0u44w4281t",
"responseBody": {
"cardId": "68950ab9h087e812g34g466c",
"url": "https://cardimages.example.com/display/abc123xyz",
"expires": "2025-10-23T16:30:00.000Z",
"spidrActionId": "68950786e754b589d01d1339"
},
"spidrActionId": "68950786e754b589d01d1339",
"accountId": "68950897f865c690e12e244a",
"userId": "68950761e754b589d02d133c",
"cardId": "68950ab9h087e812g34g466c",
"productId": "67f2a93d743e864g1g80b8fd",
"webhookType": "card.fetchImageUrl",
"actionRequestor": {
"source": "api"
}
}card.pinToken
Description: The card.pinToken webhook is sent when a PIN change token is successfully generated for a card. This token is used to securely change the card's PIN.
Triggers:
- Successful API call to the Get PIN Change Token endpoint (
GET /v1/card/{cardId}/pinChangeToken)
Example Payload:
{
"uuid": "t9u0v1w2-x3y4-4z5a-6b7c-8d9e0f1g2h3i",
"companyId": "6823a83c643d753f0f79a7ec",
"requestId": "w971xy02y89x733679xy4v1v55x5392u",
"responseBody": {
"cardId": "68950ab9h087e812g34g466c",
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"spidrActionId": "68950786e754b589d01d1339"
},
"spidrActionId": "68950786e754b589d01d1339",
"accountId": "68950897f865c690e12e244a",
"userId": "68950761e754b589d02d133c",
"cardId": "68950ab9h087e812g34g466c",
"productId": "67f2a93d743e864g1g80b8fd",
"webhookType": "card.pinToken",
"actionRequestor": {
"source": "api"
}
}card.pinChanged
Description: The card.pinChanged webhook is sent when a card's PIN is successfully changed. This confirms that the PIN change operation completed successfully.
Triggers:
- Successful API call to the Change PIN endpoint (
POST /v1/card/{cardId}/commitPinChange)
Example Payload:
{
"uuid": "c3d4e5f6-a7b8-4c9d-0e1f-2a3b4c5d6e7f",
"accountId": "68950897f865c690e12e244a",
"actionRequestor": {
"source": "api"
},
"changes": [
{
"field": "lastUpdatedAt",
"oldValue": "2025-10-23T17:10:00.000Z",
"newValue": "2025-10-23T17:18:00.000Z"
}
],
"companyId": "6823a83c643d753f0f79a7ec",
"requestId": "x082yz13z90y844780yz5w2w66y6403v",
"responseBody": {
"spidrActionId": "68950786e754b589d01d1339"
},
"spidrActionId": "68950786e754b589d01d1339",
"userId": "68950761e754b589d02d133c",
"cardId": "68950ab9h087e812g34g466c",
"productId": "67f2a93d743e864g1g80b8fd",
"webhookType": "card.pinChanged"
}card.statusUpdate
Description: The card.statusUpdate webhook is sent when a card's status is automatically updated due to an account status change (e.g., when an account is closed, all associated cards are also closed).
Triggers:
- Automatic status update when the parent account's status is changed to closed
Example Payload:
{
"uuid": "v1w2x3y4-z5a6-4b7c-8d9e-0f1g2h3i4j5k",
"companyId": "6823a83c643d753f0f79a7ec",
"requestId": "y193za24a01z955891za6x3x77z7514w",
"responseBody": {
"newStatus": "closed",
"spidrActionId": "68950786e754b589d01d1339"
},
"spidrActionId": "68950786e754b589d01d1339",
"accountId": "68950897f865c690e12e244a",
"userId": "68950761e754b589d02d133c",
"cardId": "68950ab9h087e812g34g466c",
"productId": "67f2a93d743e864g1g80b8fd",
"webhookType": "card.statusUpdate",
"actionRequestor": {
"source": "api"
}
}card.shipped
Description: The card.shipped webhook is sent when an emboss record has been created for a card. It includes shipping details such as the ship type, shipping address, and whether the card is an emboss reissue. The emboss record will be sent to the embosser in the next file delivery.
Triggers:
- Provider (e.g., Galileo) generates an emboss record for a card.
Example Payload:
{
"uuid": "w2x3y4z5-a6b7-4c8d-9e0f-1g2h3i4j5k6l",
"webhookType": "card.shipped",
"data": {
"accountId": "69b44154054fb3d1cbc3439c",
"productId": "68caf52136a4cd9dcfea7e18",
"userId": "69b4414a054fb3d1cbc3438b",
"providerDetails": {
"provider": "galileo",
"pmt_ref_no": "594101049718",
"prod_id": "3391",
"timestamp": "2026-03-13 10:23:33 MST",
"type": "card_shipped",
"addr1": "",
"addr2": "",
"balance_id": "4772",
"cad": "4921",
"city": "Woodbridge",
"emboss_uuid": "",
"is_emboss_reissue": "N",
"msg_event_id": "66612",
"open_to_buy": "0.00",
"ship_type": "First Class Mail",
"eventType": "AccountEvent"
},
"accountNumber": "594101049718",
"address1": "123 Evergreen Ave",
"address2": null,
"balance": "0.00",
"cardId": "69b44158054fb3d1cbc343aa",
"city": "Woodbridge",
"embossUUID": "",
"isEmbossReissue": false,
"shipType": "First Class Mail",
"timestamp": "2026-03-13T17:23:33.000Z"
}
}Authorization Webhooks
auth.authApproved
Description: The auth.authApproved webhook is sent when a card authorization is approved. It includes detailed transaction data, provider information, merchant details, and optional ZTM (Zero Touch Monitoring) risk assessment data.
Triggers:
- Card authorization approved by the payment processor
Example Payload:
{
"uuid": "7f6c95d3-e169-40e7-8b27-4e713723295b",
"webhookType": "auth.authApproved",
"data": {
"accountId": "69725ec0185ef9a6206c1a51",
"productId": "6823a83e59a0f48f78787c28",
"userId": "696951abcfca4cd4f1010f23",
"providerDetails": {
"provider": "galileo-webhook",
"vendor": "galileo",
"source_id": "4179",
"trans_code": "VIA",
"calculated_balance": 900,
"type": "A",
"act_type": "VI",
"auth_ts": "2026-01-22T19:21:59.000Z",
"amt": -100,
"settle_amt": 0,
"settle_curr_code": "",
"card_id": "3324",
"auth_id": "4179",
"formatted_merchant_desc": "test merchant",
"merchant_id": "DBdWE8dnFQBYaqv",
"mcc_code": "4480",
"network_code": "V",
"de022": "9000",
"pmt_ref_no": "594101034322",
"prog_id": "8594",
"prod_id": "3391",
"additionalFields": {
"type": "auth",
"balance_id": "3091",
"card_not_present": "N",
"currency": "840",
"domestic": "Y",
"merchant_location": "LT LAKE CITY, UTUS",
"original_auth_id": "0",
"response_code": "00",
"response_reasons": "",
"rules_results": "",
"eventType": "Authorization",
"provider": "galileo-webhook-transaction"
}
},
"ztmData": {
"riskLevel": "high",
"providerSummary": {
"riskConfigurationId": "cafUCmi4eLhMtLH6",
"riskLevel": "high",
"providerLevels": [
{
"provider": "hawk",
"riskLevel": "high"
}
]
},
"providerResponses": [
{
"provider": "hawk",
"level": "high",
"providerData": {
"caseId": "02c76c7c-1849-40b0-a076-c92aa58a4fbd",
"proceed": false,
"tenantTransactionId": "eba61e556bac5bf1d98f8e44"
}
}
],
"providerErrors": [],
"isTrainingMode": true
},
"txnType": "purchase.authorization",
"postedDate": null,
"authDate": "2026-01-22T19:21:59.000Z",
"amount": -100,
"cardId": "69725ec2185ef9a6206c1a5a",
"status": "pending",
"txnRequestId": null,
"mccCode": "4480",
"balanceAfterTransaction": 900,
"calculatedBalance": 900,
"description": "test merchant",
"txnKey": "gal_8594_vi_4179_v",
"vendor": "galileo",
"transactionId": "eba61e556bac5bf1d98f8e44"
}
}deniedAuth
Description: The deniedAuth webhook is sent when a card authorization is denied. It includes details about why the authorization was declined, including the response code and response reasons from the payment processor.
Please note that deniedAuth webhooks may map to one of the following subtypes:
deniedAuth.gas- Gas station partial-auth denialdeniedAuth.inactiveCard- Card not activedeniedAuth.invalidPin- Wrong PINdeniedAuth.nsf- Insufficient funds
Triggers:
- Card authorization denied by the payment processor
Example Payload:
{
"uuid": "b10cc77d-7a78-4657-817a-547678fd25a3",
"webhookType": "deniedAuth",
"data": {
"accountId": "69725ec0185ef9a6206c1a51",
"productId": "6823a83e59a0f48f78787c28",
"userId": "696951abcfca4cd4f1010f23",
"providerDetails": {
"provider": "galileo-webhook",
"vendor": "galileo",
"source_id": "4178",
"trans_code": "",
"calculated_balance": 1000,
"type": "",
"act_type": "",
"auth_ts": "2026-01-22T19:21:47.000Z",
"amt": 100,
"settle_amt": 0,
"settle_curr_code": "",
"card_id": "3324",
"auth_id": "4178",
"formatted_merchant_desc": "test merchant",
"merchant_id": "gYck82zgjb8dlzU",
"mcc_code": "4120",
"network_code": "V",
"de022": "9000",
"pmt_ref_no": "594101034322",
"prog_id": "8594",
"prod_id": "3391",
"additionalFields": {
"type": "denied_auth",
"balance_id": "3091",
"currency": "840",
"domestic": "Y",
"merchant_location": "LT LAKE CITY, UTUS",
"response_code": "5C",
"response_reasons": "Token not present when required for Card Present transactions",
"rules_results": "",
"eventType": "Authorization",
"provider": "galileo-webhook-transaction"
}
},
"txnType": "other.denied_auth",
"postedDate": null,
"authDate": "2026-01-22T19:21:47.000Z",
"amount": 100,
"cardId": "69725ec2185ef9a6206c1a5a",
"status": "settled",
"txnRequestId": null,
"mccCode": "4120",
"balanceAfterTransaction": 1000,
"calculatedBalance": 1000,
"description": "test merchant",
"txnKey": "gal_8594_da_4178_v",
"vendor": "galileo",
"transactionId": "85edd5a0113a084619769937"
}
}auth.expiration
Description: The auth.expiration webhook is sent when a card authorization hold expires without being settled. This typically occurs when a merchant authorizes a transaction but never submits it for settlement within the network's time window. When the authorization is strictly matched in Spidr, data.transactionId, data.txnKey, and data.originalTransactionId identify that existing authorization. These fields are omitted when no persisted transaction is matched.
Triggers:
- Processor (e.g., Galileo) sends an
auth_expevent when an authorization hold expires
Example Payload:
{
"uuid": "c3d4e5f6-a7b8-4c9d-0e1f-2a3b4c5d6e7f",
"webhookType": "auth.expiration",
"data": {
"accountId": "69ab2c20baeae551080cd4c2",
"productId": "6823a83e59a0f48f78787c29",
"userId": "69ab2c1ebaeae551080cd4b2",
"providerDetails": {
"provider": "galileo-webhook",
"vendor": "galileo",
"source_id": "7910",
"trans_code": "VXA",
"calculated_balance": 4950,
"type": "A",
"act_type": "VX",
"auth_ts": "2026-03-06T19:39:30.000Z",
"amt": -25,
"card_id": "4867",
"auth_id": "7910",
"formatted_merchant_desc": "TEST MERCHANT",
"merchant_id": "v2Me7RjU5UNQdZB",
"mcc_code": "5411",
"network_code": "V",
"pmt_ref_no": "594101049171",
"prog_id": "8594",
"prod_id": "3391",
"additionalFields": {
"type": "auth_exp",
"balance_id": "4714",
"merchant_location": "LT LAKE CITY, UTUS",
"eventType": "Authorization",
"provider": "galileo-webhook-transaction"
}
},
"txnType": "purchase.expiration",
"postedDate": null,
"authDate": "2026-03-06T19:39:30.000Z",
"amount": -25,
"cardId": "69ab2c25baeae551080cd4ce",
"status": "expired",
"txnRequestId": null,
"mccCode": "5411",
"balanceAfterTransaction": 4950,
"calculatedBalance": 4950,
"description": "TEST MERCHANT",
"txnKey": "gal_8594_vi_7910_v",
"vendor": "galileo",
"transactionId": "64f8f0c2b1a2d3e4f5a60718",
"originalTransactionId": "64f8f0c2b1a2d3e4f5a60718"
}
}auth.expirationReversal
Description: The auth.expirationReversal webhook is sent when a previously expired authorization is reversed. This uses the same payload shape as auth.expiration. When reconciliation succeeds, data.transactionId and data.txnKey identify the existing reversal row updated by the event. When its original authorization is also matched, data.originalTransactionId identifies that authorization. Transaction identity is omitted when the reversal is not strictly matched, and data.originalTransactionId is omitted when its parent is not matched.
Triggers:
- Processor (e.g., Galileo) sends an
auth_exp_reversalevent when an expired authorization is reversed
Example Payload:
{
"uuid": "d4e5f6g7-b8c9-4d0e-1f2g-3h4i5j6k7l8m",
"webhookType": "auth.expirationReversal",
"data": {
"accountId": "69ab2c20baeae551080cd4c2",
"productId": "6823a83e59a0f48f78787c29",
"userId": "69ab2c1ebaeae551080cd4b2",
"providerDetails": {
"provider": "galileo-webhook",
"vendor": "galileo",
"source_id": "7911",
"trans_code": "VXR",
"calculated_balance": 4975,
"type": "A",
"act_type": "VX",
"auth_ts": "2026-03-06T19:40:00.000Z",
"amt": 25,
"card_id": "4867",
"auth_id": "7911",
"formatted_merchant_desc": "TEST MERCHANT",
"merchant_id": "v2Me7RjU5UNQdZB",
"mcc_code": "5411",
"network_code": "V",
"pmt_ref_no": "594101049171",
"prog_id": "8594",
"prod_id": "3391",
"additionalFields": {
"type": "auth_exp_reversal",
"balance_id": "4714",
"merchant_location": "LT LAKE CITY, UTUS",
"eventType": "Authorization",
"provider": "galileo-webhook-transaction"
}
},
"txnType": "purchase.expirationReversal",
"postedDate": null,
"authDate": "2026-03-06T19:40:00.000Z",
"amount": 25,
"cardId": "69ab2c25baeae551080cd4ce",
"status": "expired",
"txnRequestId": null,
"mccCode": "5411",
"balanceAfterTransaction": 4975,
"calculatedBalance": 4975,
"description": "TEST MERCHANT",
"txnKey": "gal_8594_vr_7911_v",
"vendor": "galileo",
"transactionId": "267c8g929b304b4517c3df9b",
"originalTransactionId": "64f8f0c2b1a2d3e4f5a60718"
}
}auth.authPayment
Description: The auth.authPayment webhook is sent when an incoming Original Credit Transaction (OCT) is authorized — i.e., a card load from an external source such as Visa, Maestro, or an Allpoint ATM. The auth.authPayment acts as the authorization hold; the subsequent transaction.payment event is the actual credit posting.
Triggers:
- Processor (e.g., Galileo) sends an
auth_paymentevent when an incoming OCT authorization is received
Example Payload:
{
"uuid": "e5f6g7h8-c9d0-4e1f-2g3h-4i5j6k7l8m9n",
"webhookType": "auth.authPayment",
"data": {
"accountId": "68950897f865c690e12e244a",
"productId": "67f2a93d743e864g1g80b8fd",
"userId": "68950761e754b589d02d133c",
"providerDetails": {
"provider": "galileo-webhook",
"vendor": "galileo",
"source_id": "8100",
"trans_code": "MCA",
"calculated_balance": 1100,
"type": "A",
"act_type": "MC",
"auth_ts": "2026-01-15T14:00:00.000Z",
"amt": 100,
"settle_amt": 0,
"settle_curr_code": "",
"card_id": "3035",
"auth_id": "8100",
"formatted_merchant_desc": "CARD LOAD",
"merchant_id": "oCTLoadMerchant1",
"mcc_code": "6012",
"network_code": "M",
"pmt_ref_no": "594100012345",
"prog_id": "8594",
"prod_id": "3391",
"additionalFields": {
"type": "auth_payment",
"balance_id": "5678",
"eventType": "Authorization",
"provider": "galileo-webhook-transaction"
}
},
"txnType": "purchase.authorization",
"postedDate": null,
"authDate": "2026-01-15T14:00:00.000Z",
"amount": 100,
"cardId": "68950ab9h087e812g34g466c",
"status": "pending",
"txnRequestId": null,
"mccCode": "6012",
"balanceAfterTransaction": 1100,
"calculatedBalance": 1100,
"description": "CARD LOAD",
"txnKey": "gal_8594_mc_8100_m",
"vendor": "galileo",
"transactionId": "a1b2c3d4e5f6g7h8i9j0k1l2"
}
}Transaction Webhooks
transaction.createAch
Description: The transaction.createAch webhook is sent when an ACH transaction (credit or debit) is successfully initiated. It includes the transaction details such as amount, direction (debit/credit), and description.
Triggers:
- Successful API call to the Create ACH Transfer endpoint (
POST /v1/transaction/createAchTransfer)
Example Payload:
{
"uuid": "w2x3y4z5-a6b7-4c8d-9e0f-1g2h3i4j5k6l",
"companyId": "6823a83c643d753f0f79a7ec",
"requestId": "ACH_TRANSFER_z204ab35b12a066902ab7y4y88a8625x",
"responseBody": {
"achRequestId": "ACH_TRANSFER_z204ab35b12a066902ab7y4y88a8625x",
"spidrActionId": "68950786e754b589d01d1339"
},
"spidrActionId": "68950786e754b589d01d1339",
"accountId": "68950897f865c690e12e244a",
"userId": "68950761e754b589d02d133c",
"achAccountId": "689509a8g976d701f23f355b",
"amount": 250.0,
"debitCreditIndicator": "debit",
"description": "Rent payment",
"productId": "67f2a93d743e864g1g80b8fd",
"webhookType": "transaction.createAch",
"actionRequestor": {
"source": "api"
}
}transaction.createFee
Description: The transaction.createFee webhook is sent when a fee is successfully applied to an account. It includes the fee type, amount, and resulting account balances.
Triggers:
- Successful API call to the Create Fee endpoint (
POST /v1/transaction/createFee) - Fee applied via the appropriate SST role
Example Payload:
{
"uuid": "x3y4z5a6-b7c8-4d9e-0f1g-2h3i4j5k6l7m",
"companyId": "6823a83c643d753f0f79a7ec",
"requestId": "FEE_a315bc46c23b177013bc8z5z99b9736y",
"responseBody": {
"status": "success",
"oldBalance": 1000.0,
"newBalance": 990.0,
"feeTransactionId": "FEE_a315bc46c23b177013bc8z5z99b9736y",
"spidrActionId": "68950786e754b589d01d1339"
},
"spidrActionId": "68950786e754b589d01d1339",
"accountId": "68950897f865c690e12e244a",
"userId": "68950761e754b589d02d133c",
"productId": "67f2a93d743e864g1g80b8fd",
"webhookType": "transaction.createFee",
"feeType": "monthly_maintenance",
"amount": 10.0,
"actionRequestor": {
"source": "api"
}
}transaction.reverseFee
Description: The transaction.reverseFee webhook is sent when a previously applied fee is successfully reversed (refunded). It includes the original fee transaction ID and the reversal details.
Triggers:
- Successful API call to the Reverse Fee endpoint (
POST /v1/transaction/reverseFee) - Fee reversed via the appropriate SST role
Example Payload:
{
"uuid": "y4z5a6b7-c8d9-4e0f-1g2h-3i4j5k6l7m8n",
"companyId": "6823a83c643d753f0f79a7ec",
"requestId": "FEE_b426cd57d34c288124cd9a6a00c0847z",
"responseBody": {
"status": "success",
"oldBalance": 990.0,
"newBalance": 1000.0,
"reversalTransactionId": "FEE_b426cd57d34c288124cd9a6a00c0847z",
"spidrActionId": "68950786e754b589d01d1339"
},
"spidrActionId": "68950786e754b589d01d1339",
"accountId": "68950897f865c690e12e244a",
"userId": "68950761e754b589d02d133c",
"productId": "67f2a93d743e864g1g80b8fd",
"webhookType": "transaction.reverseFee",
"originalFeeTransactionId": "FEE_a315bc46c23b177013bc8z5z99b9736y",
"actionRequestor": {
"source": "sst",
"sstRequestorUserId": "support789",
"sstRequestorUserEmail": "[email protected]"
}
}transaction.adjustment
Description: The transaction.adjustment webhook is sent when an adjustment transaction (credit or debit) is successfully applied to an account. Adjustments are typically used for corrections, manual balance modifications, adjustment-path card load reversals, or incoming ACH adjustments from external sources. For incoming ACH adjustments, the webhook includes originator details (sender's bank information). For adjustment-path card load reversals, the webhook includes data.relatedTransactionId when the original load transaction is already matched in Spidr.
Triggers:
- Successful API call to the Create Adjustment endpoint (
POST /v1/transaction/createAdjustment) - Adjustment created via the appropriate SST role
- Incoming ACH adjustment received from an external source (provider-originated)
- Provider-originated adjustment-path card load reversal
Example Payload (Incoming ACH Adjustment):
{
"uuid": "z5a6b7c8-d9e0-4f1g-2h3i-4j5k6l7m8n9o",
"webhookType": "transaction.adjustment",
"data": {
"accountId": "68950897f865c690e12e244a",
"productId": "67f2a93d743e864g1g80b8fd",
"userId": "68950761e754b589d02d133c",
"providerDetails": {
"provider": "galileo-webhook",
"vendor": "galileo",
"source_id": "2350",
"trans_code": "ADJC",
"calculated_balance": 1050.0,
"type": "CR",
"act_type": "AD",
"auth_ts": "2026-01-06T14:30:00.000Z",
"amt": 50.0,
"card_id": "3035",
"ach_trans_id": "5045983826",
"orig_name": "ABC Bank",
"orig_acct_number": "265493042",
"odfi_routing_number": "325491456",
"details": "ACH Credit Adjustment",
"prog_id": "8594",
"prod_id": "3391"
},
"txnType": "other.custom",
"txnSubType": "CR",
"postedDate": "2026-01-06T14:30:00.000Z",
"authDate": "2026-01-06T14:30:00.000Z",
"amount": 50.0,
"cardId": "68950ab9h087e812g34g466c",
"status": "settled",
"balanceAfterTransaction": 1050.0,
"calculatedBalance": 1050.0,
"description": "ACH Credit Adjustment",
"txnKey": "gal_8594_ad_2350",
"vendor": "galileo",
"transactionId": "f186e89d958925c8g1e4fd9f"
}
}ACH Originator Fields (in providerDetails):
| Field | Type | Description |
|---|---|---|
orig_name | string | Originator name - the name of the sending institution or entity |
orig_acct_number | string | Originator account number - the source account for the incoming ACH |
odfi_routing_number | string | ODFI routing number - Originating Depository Financial Institution routing number |
transaction.reverseAdjustment
Description: The transaction.reverseAdjustment webhook is sent when a previously applied adjustment is successfully reversed. It includes the original adjustment transaction ID and the reversal details.
Triggers:
- Successful API call to the Reverse Adjustment endpoint (
POST /v1/transaction/reverseAdjustment) - Adjustment reversed via the appropriate SST role
Example Payload:
{
"uuid": "d8e9f0a1-b2c3-4d4e-5f6g-7h8i9j0k1l2m",
"companyId": "6823a83c643d753f0f79a7ec",
"requestId": "ADJ_c537de68e45d399235de0b7b11d1958a",
"responseBody": {
"status": "success",
"oldBalance": 950.0,
"newBalance": 1000.0,
"adjustmentTransactionId": "ADJ_b426cd57d34c288124cd9a6a00c0847z",
"reversalAdjustmentTransactionId": "ADJ_c537de68e45d399235de0b7b11d1958a",
"spidrActionId": "68950786e754b589d01d1339"
},
"spidrActionId": "68950786e754b589d01d1339",
"accountId": "68950897f865c690e12e244a",
"userId": "68950761e754b589d02d133c",
"productId": "67f2a93d743e864g1g80b8fd",
"webhookType": "transaction.reverseAdjustment",
"originalAdjustmentTransactionId": "ADJ_b426cd57d34c288124cd9a6a00c0847z",
"reversalTransactionId": "68f1b2c3d4e5f6a7b8c9d0e1",
"actionRequestor": {
"source": "api"
}
}transaction.payment
Description: The transaction.payment webhook is sent when a payment transaction is successfully processed. This includes both API-initiated payments and incoming ACH payments from external sources. For incoming ACH payments, the webhook includes originator details (sender's bank information).
Triggers:
- Successful API call to the Create Payment endpoint (
POST /v1/transaction/createPayment) - Payment created via the appropriate SST role
- Incoming ACH payment received from an external source (provider-originated)
Example Payload (Incoming ACH Payment):
{
"uuid": "6abf3b44-efb9-4315-b6a3-8b6b74eb864a",
"webhookType": "transaction.payment",
"data": {
"accountId": "68950897f865c690e12e244a",
"productId": "67f2a93d743e864g1g80b8fd",
"userId": "68950761e754b589d02d133c",
"providerDetails": {
"provider": "galileo-webhook",
"vendor": "galileo",
"source_id": "1450",
"trans_code": "PMDD",
"calculated_balance": 1892.34,
"type": "DD",
"act_type": "PM",
"auth_ts": "2026-01-06T22:17:24.000Z",
"amt": 12.34,
"card_id": "3035",
"pmt_ref_no": "594101032359",
"ach_trans_id": "5045983825",
"orig_name": "ABC Bank",
"orig_acct_number": "265493042",
"odfi_routing_number": "031101169",
"details": "ABC Company, Subscribe, #789654",
"prog_id": "8594",
"prod_id": "3391"
},
"txnType": "other.custom",
"txnSubType": "DD",
"postedDate": "2026-01-06T22:17:24.000Z",
"authDate": "2026-01-06T22:17:24.000Z",
"amount": 12.34,
"cardId": "68950ab9h087e812g34g466c",
"status": "settled",
"balanceAfterTransaction": 1892.34,
"calculatedBalance": 1892.34,
"description": "ABC Company, Subscribe, #789654",
"txnKey": "gal_8594_pm_1450",
"vendor": "galileo",
"transactionId": "e075d78c847814b7f0d3ec8e"
}
}ACH Originator Fields (in providerDetails):
| Field | Type | Description |
|---|---|---|
orig_name | string | Originator name - the name of the sending institution or entity |
orig_acct_number | string | Originator account number - the source account for the incoming ACH |
odfi_routing_number | string | ODFI routing number - Originating Depository Financial Institution routing number |
transaction.a2a
Description: The transaction.a2a webhook is sent when an account-to-account (A2A) transfer is successfully initiated between two accounts within the same system.
Triggers:
- Successful API call to the Create A2A Transfer endpoint (
POST /v1/transaction/createA2ATransfer)
Example Payload:
{
"uuid": "b7c8d9e0-f1g2-4h3i-4j5k-6l7m8n9o0p1q",
"companyId": "6823a83c643d753f0f79a7ec",
"requestId": "ACCOUNT_TO_ACCOUNT_e759fg80g67f511457fg2d9d33f3170c",
"responseBody": {
"oldBalance": 1000.0,
"newBalance": 900.0,
"spidrActionId": "68950786e754b589d01d1339"
},
"spidrActionId": "68950786e754b589d01d1339",
"accountId": "68950897f865c690e12e244a",
"userId": "68950761e754b589d02d133c",
"productId": "67f2a93d743e864g1g80b8fd",
"webhookType": "transaction.a2a",
"transferToAccountId": "68950bc0i209g034j56j688e",
"amount": 100.0,
"message": "Payment for dinner",
"senderMessage": "Payment for dinner",
"actionRequestor": {
"source": "api"
}
}transaction.cancelAch
Description: The transaction.cancelAch webhook is sent when a pending ACH transaction is successfully canceled. Only ACH transactions in certain statuses can be canceled.
Triggers:
- Successful API call to the Cancel ACH Transfer endpoint (
POST /v1/transaction/cancelAchTransfer) - ACH transaction canceled via the appropriate SST role
Example Payload:
{
"uuid": "c8d9e0f1-g2h3-4i4j-5k6l-7m8n9o0p1q2r",
"companyId": "6823a83c643d753f0f79a7ec",
"requestId": "ACH_TRANSFER_f860gh91h78g622568gh3e0e44g4281d",
"responseBody": {
"status": "canceled",
"spidrActionId": "68950786e754b589d01d1339"
},
"spidrActionId": "68950786e754b589d01d1339",
"accountId": "68950897f865c690e12e244a",
"userId": "68950761e754b589d02d133c",
"achRequestId": "ACH_TRANSFER_z204ab35b12a066902ab7y4y88a8625x",
"productId": "67f2a93d743e864g1g80b8fd",
"webhookType": "transaction.cancelAch",
"actionRequestor": {
"source": "api"
}
}transaction.settle
Description: The transaction.settle webhook is sent when a card transaction is settled. Settlement occurs when a previously authorized transaction is finalized and the funds are actually transferred. It includes detailed transaction and merchant information from the payment processor. When the parent authorization or completion is already matched in Spidr, data.relatedTransactionId contains that Spidr transaction ID. Refunds and inbound card load reversals are excluded from this event; they are delivered as the dedicated transaction.refund and transaction.loadReversal events instead.
Triggers:
- Card transaction settlement received from the payment processor
Example Payload:
{
"uuid": "b7fd4a7c-8924-4eea-8118-e02d0072e08f",
"webhookType": "transaction.settle",
"data": {
"accountId": "69725ec0185ef9a6206c1a51",
"productId": "6823a83e59a0f48f78787c28",
"userId": "696951abcfca4cd4f1010f23",
"providerDetails": {
"provider": "galileo-webhook",
"vendor": "galileo",
"source_id": "4179",
"trans_code": "VSA",
"calculated_balance": 900,
"type": "A",
"act_type": "VS",
"auth_ts": "2026-01-22T19:23:22.000Z",
"amt": -100,
"settle_amt": 0,
"settle_curr_code": "",
"card_id": "3324",
"auth_id": "4179",
"formatted_merchant_desc": "test merchant",
"merchant_id": "DBdWE8dnFQBYaqv",
"mcc_code": "4480",
"network_code": "V",
"pmt_ref_no": "594101034322",
"prog_id": "8594",
"prod_id": "3391",
"additionalFields": {
"type": "setl",
"balance_id": "3091",
"currency": "840",
"expired_auth_id": "0",
"merchant_location": "LT LAKE CITY, UTUS",
"response_code": "",
"settle_detail_id": "8210",
"eventType": "Settlement",
"provider": "galileo"
}
},
"txnType": "purchase.settlement",
"postedDate": "2026-01-22T19:23:23.424Z",
"authDate": "",
"amount": -100,
"cardId": "69725ec2185ef9a6206c1a5a",
"status": "settled",
"txnRequestId": "4179",
"balanceAfterTransaction": 900,
"calculatedBalance": 900,
"mccCode": "4480",
"description": "No description available",
"txnKey": "gal_8594_vs_4179",
"parentAuthId": "4179",
"vendor": "galileo",
"transactionId": "e37cbe6298747cf35d48b1e8",
"relatedTransactionId": "64f8f0c2b1a2d3e4f5a60719"
}
}transaction.loadReversal
Description: The transaction.loadReversal webhook is sent when a Galileo settlement event reverses a prior inbound card load. These events use data.txnType: "other.card_load_reversal". When the original card-load transaction is already matched in Spidr, data.relatedTransactionId contains that Spidr transaction ID.
Triggers:
- Processor sends a Galileo settlement event with a load-reversal transaction type, such as
U,V,K,q,y,yt,RW,vd, orao
Example Payload:
{
"uuid": "c24f8d2e-7b11-4d24-9dd9-3f8af35fb482",
"webhookType": "transaction.loadReversal",
"data": {
"accountId": "69725ec0185ef9a6206c1a51",
"productId": "6823a83e59a0f48f78787c28",
"userId": "696951abcfca4cd4f1010f23",
"txnType": "other.card_load_reversal",
"amount": -50,
"status": "settled",
"transactionId": "e37cbe6298747cf35d48b1ea",
"txnRequestId": "4179",
"parentAuthId": "4179",
"relatedTransactionId": "64f8f0c2b1a2d3e4f5a60721",
"providerDetails": {
"provider": "galileo-webhook",
"vendor": "galileo",
"type": "U",
"act_type": "SE",
"auth_id": "4179",
"pmt_ref_no": "594101034322",
"additionalFields": {
"type": "setl",
"settle_detail_id": "8210"
}
},
"vendor": "galileo"
}
}transaction.refund
Description: The transaction.refund webhook is sent when a Galileo settlement refund or merchant credit returns funds after the original purchase. When the original purchase transaction is already matched in Spidr, data.relatedTransactionId contains that Spidr transaction ID.
Triggers:
- Processor (e.g., Galileo) sends a settlement event that maps to a refund or merchant credit
Example Payload:
{
"uuid": "a11f4d7c-8924-4eea-8118-e02d0072e08f",
"webhookType": "transaction.refund",
"data": {
"accountId": "69725ec0185ef9a6206c1a51",
"productId": "6823a83e59a0f48f78787c28",
"userId": "696951abcfca4cd4f1010f23",
"txnType": "purchase.refund",
"amount": 25.33,
"status": "settled",
"transactionId": "e37cbe6298747cf35d48b1e9",
"relatedTransactionId": "64f8f0c2b1a2d3e4f5a60720",
"providerDetails": {
"provider": "galileo-webhook",
"vendor": "galileo"
}
}
}transaction.paymentDelayed
Description: The transaction.paymentDelayed webhook is sent when a payment posting is delayed. This occurs when an incoming payment cannot be posted immediately and is queued for later processing.
Triggers:
- Processor (e.g., Galileo) sends a
pmt_delayedevent when a payment is delayed
Example Payload:
{
"uuid": "f6g7h8i9-d0e1-4f2g-3h4i-5j6k7l8m9n0o",
"webhookType": "transaction.paymentDelayed",
"data": {
"accountId": "68950897f865c690e12e244a",
"productId": "67f2a93d743e864g1g80b8fd",
"userId": "68950761e754b589d02d133c",
"providerDetails": {
"provider": "galileo-webhook",
"vendor": "galileo",
"source_id": "3200",
"trans_code": "PMDD",
"calculated_balance": 950,
"type": "DD",
"act_type": "PM",
"auth_ts": "2026-01-20T10:00:00.000Z",
"amt": 50,
"card_id": "3035",
"pmt_ref_no": "594100012345",
"prog_id": "8594",
"prod_id": "3391",
"additionalFields": {
"type": "pmt_delayed",
"balance_id": "5678",
"eventType": "Transaction",
"provider": "galileo-webhook-transaction"
}
},
"txnType": "other.custom",
"postedDate": "2026-01-20T10:00:00.000Z",
"authDate": "2026-01-20T10:00:00.000Z",
"amount": 50,
"cardId": "68950ab9h087e812g34g466c",
"status": "settled",
"txnRequestId": null,
"balanceAfterTransaction": 950,
"calculatedBalance": 950,
"description": "Delayed Payment",
"txnKey": "gal_8594_pm_3200",
"vendor": "galileo",
"transactionId": "b2c3d4e5f6g7h8i9j0k1l2m3",
"achAccountId": "689509a8g976d701f23f355b"
}
}transaction.paymentSplit
Description: The transaction.paymentSplit webhook is sent when a payment is split into multiple postings. This can occur when a single payment is distributed across multiple accounts or posting periods.
Triggers:
- Processor (e.g., Galileo) sends a
pmt_splitevent when a payment is split
Example Payload:
{
"uuid": "g7h8i9j0-e1f2-4g3h-4i5j-6k7l8m9n0o1p",
"webhookType": "transaction.paymentSplit",
"data": {
"accountId": "68950897f865c690e12e244a",
"productId": "67f2a93d743e864g1g80b8fd",
"userId": "68950761e754b589d02d133c",
"providerDetails": {
"provider": "galileo-webhook",
"vendor": "galileo",
"source_id": "3201",
"trans_code": "PMSP",
"calculated_balance": 975,
"type": "SP",
"act_type": "PM",
"auth_ts": "2026-01-20T11:00:00.000Z",
"amt": 25,
"card_id": "3035",
"pmt_ref_no": "594100012345",
"prog_id": "8594",
"prod_id": "3391",
"additionalFields": {
"type": "pmt_split",
"balance_id": "5678",
"eventType": "Transaction",
"provider": "galileo-webhook-transaction"
}
},
"txnType": "other.custom",
"postedDate": "2026-01-20T11:00:00.000Z",
"authDate": "2026-01-20T11:00:00.000Z",
"amount": 25,
"cardId": "68950ab9h087e812g34g466c",
"status": "settled",
"txnRequestId": null,
"balanceAfterTransaction": 975,
"calculatedBalance": 975,
"description": "Split Payment",
"txnKey": "gal_8594_pm_3201",
"vendor": "galileo",
"transactionId": "c3d4e5f6g7h8i9j0k1l2m3n4"
}
}transaction.incomingAchCreditFail
Description: The transaction.incomingAchCreditFail webhook is sent when an incoming ACH credit transaction fails. This can occur due to invalid account information, compliance holds, or processing errors.
Triggers:
- Processor (e.g., Galileo) sends an
ach_credit_failevent when an incoming ACH credit fails
Example Payload:
{
"uuid": "h8i9j0k1-f2g3-4h4i-5j6k-7l8m9n0o1p2q",
"webhookType": "transaction.incomingAchCreditFail",
"data": {
"accountId": "68950897f865c690e12e244a",
"productId": "67f2a93d743e864g1g80b8fd",
"userId": "68950761e754b589d02d133c",
"providerDetails": {
"provider": "galileo-webhook",
"vendor": "galileo",
"source_id": "3300",
"trans_code": "ACFR",
"calculated_balance": 1000,
"type": "CR",
"act_type": "AC",
"auth_ts": "2026-01-21T09:00:00.000Z",
"amt": 200,
"pmt_ref_no": "594100012345",
"prog_id": "8594",
"prod_id": "3391",
"additionalFields": {
"type": "ach_credit_fail",
"balance_id": "5678",
"eventType": "Transaction",
"provider": "galileo-webhook-transaction"
}
},
"txnType": "other.custom",
"postedDate": "2026-01-21T09:00:00.000Z",
"authDate": "2026-01-21T09:00:00.000Z",
"amount": 200,
"cardId": null,
"status": "settled",
"txnRequestId": null,
"balanceAfterTransaction": 1000,
"calculatedBalance": 1000,
"description": "ACH Credit Failed",
"txnKey": "gal_8594_ac_3300",
"vendor": "galileo",
"transactionId": "d4e5f6g7h8i9j0k1l2m3n4o5"
}
}transaction.incomingAchDebitFail
Description: The transaction.incomingAchDebitFail webhook is sent when an incoming ACH debit transaction fails. This can occur when the originating institution reverses or rejects the debit request.
Triggers:
- Processor (e.g., Galileo) sends an
ach_debit_failevent when an incoming ACH debit fails
Example Payload:
{
"uuid": "i9j0k1l2-g3h4-4i5j-6k7l-8m9n0o1p2q3r",
"webhookType": "transaction.incomingAchDebitFail",
"data": {
"accountId": "68950897f865c690e12e244a",
"productId": "67f2a93d743e864g1g80b8fd",
"userId": "68950761e754b589d02d133c",
"providerDetails": {
"provider": "galileo-webhook",
"vendor": "galileo",
"source_id": "3301",
"trans_code": "ADFR",
"calculated_balance": 1000,
"type": "DB",
"act_type": "AD",
"auth_ts": "2026-01-21T10:00:00.000Z",
"amt": -150,
"pmt_ref_no": "594100012345",
"prog_id": "8594",
"prod_id": "3391",
"additionalFields": {
"type": "ach_debit_fail",
"balance_id": "5678",
"eventType": "Transaction",
"provider": "galileo-webhook-transaction"
}
},
"txnType": "other.custom",
"postedDate": "2026-01-21T10:00:00.000Z",
"authDate": "2026-01-21T10:00:00.000Z",
"amount": -150,
"cardId": null,
"status": "settled",
"txnRequestId": null,
"balanceAfterTransaction": 1000,
"calculatedBalance": 1000,
"description": "ACH Debit Failed",
"txnKey": "gal_8594_ad_3301",
"vendor": "galileo",
"transactionId": "e5f6g7h8i9j0k1l2m3n4o5p6"
}
}transaction.achReturn
Description: The transaction.achReturn webhook is sent when an ACH return is received. ACH returns occur when a previously processed ACH transaction is returned by the receiving bank (e.g., insufficient funds, account closed, unauthorized transaction). The debCredInd field indicates the direction of the return — if the original transaction was a debit, the return is a credit, and vice versa.
Triggers:
- Processor (e.g., Galileo) sends an
ach_returnevent when an ACH return is received
Example Payload:
{
"uuid": "j0k1l2m3-h4i5-4j6k-7l8m-9n0o1p2q3r4s",
"webhookType": "transaction.achReturn",
"data": {
"accountId": "68950897f865c690e12e244a",
"productId": "67f2a93d743e864g1g80b8fd",
"userId": "68950761e754b589d02d133c",
"providerDetails": {
"provider": "galileo-webhook",
"vendor": "galileo",
"source_id": "3400",
"trans_code": "ARDD",
"calculated_balance": 750,
"type": "DD",
"act_type": "AR",
"auth_ts": "2026-01-22T08:00:00.000Z",
"amt": -250,
"pmt_ref_no": "594100012345",
"ach_acct_id": "12345",
"deb_cred_ind": "D",
"return_code": "R01",
"prog_id": "8594",
"prod_id": "3391",
"additionalFields": {
"type": "ach_return",
"balance_id": "5678",
"eventType": "Transaction",
"provider": "galileo-webhook-transaction"
}
},
"txnType": "other.custom",
"postedDate": "2026-01-22T08:00:00.000Z",
"authDate": "2026-01-22T08:00:00.000Z",
"amount": -250,
"cardId": null,
"status": "settled",
"txnRequestId": null,
"balanceAfterTransaction": 750,
"calculatedBalance": 750,
"description": "ACH Return - R01",
"txnKey": "gal_8594_ar_3400",
"vendor": "galileo",
"transactionId": "f6g7h8i9j0k1l2m3n4o5p6q7",
"debCredInd": "C",
"achAccountId": "689509a8g976d701f23f355b"
}
}ACH Return Fields:
| Field | Type | Description |
|---|---|---|
debCredInd | string | Direction of the return (C for credit return, D for debit return) — inverted from the original transaction |
achAccountId | string | The Spidr ACH account ID associated with the return, if available |
providerDetails.return_code | string | NACHA return reason code (e.g., R01 = Insufficient Funds, R02 = Account Closed, R03 = No Account) |
Bill Pay Webhooks
Bill Pay webhooks cover biller management (adding and modifying billers) and the lifecycle of bill payments processed through the underlying processor. Biller-management events use the standard API/SST structure with actionRequestor and changes. Bill-payment transaction events are provider-originated and use the data wrapper with data.providerDetails.
biller.addElectronic
Description: The biller.addElectronic webhook is sent when an electronic biller is successfully added to an account for bill pay. The changes array reflects the fields set on the new biller.
Triggers:
- Successful API call to add an electronic biller (Bill Pay)
- Electronic biller added via the appropriate SST role
Example Payload:
{
"uuid": "b7c8d9e0-f1a2-4b3c-4d5e-6f7a8b9c0d1e",
"companyId": "6823a83c643d753f0f79a7ec",
"requestId": "64cad31f0ad07044e33c29600569b547",
"accountId": "68950897f865c690e12e244a",
"userId": "68950761e754b589d02d133c",
"billerId": "689510a1f976e701g34g599c",
"spidrActionId": "68950786e754b589d01d1339",
"webhookType": "biller.addElectronic",
"actionRequestor": {
"source": "api"
},
"changes": [
{ "field": "accountNumber", "oldValue": null, "newValue": "12345678901" },
{ "field": "frequencyType", "oldValue": null, "newValue": "one_time" }
]
}biller.addPaper
Description: The biller.addPaper webhook is sent when a paper (check) biller is successfully added to an account for bill pay. A paper biller is paid by a mailed check, so the biller record includes the payee's mailing details. The changes array reflects the fields set on the new biller.
Triggers:
- Successful API call to add a paper biller (Bill Pay)
- Paper biller added via the appropriate SST role
Example Payload:
{
"uuid": "c8d9e0f1-a2b3-4c4d-5e6f-7a8b9c0d1e2f",
"companyId": "6823a83c643d753f0f79a7ec",
"requestId": "75dbe42g1be18155f44d3a711680c658",
"accountId": "68950897f865c690e12e244a",
"userId": "68950761e754b589d02d133c",
"billerId": "689510a1f976e701g34g599c",
"spidrActionId": "68950786e754b589d01d1339",
"webhookType": "biller.addPaper",
"actionRequestor": {
"source": "api"
},
"changes": [
{ "field": "name", "oldValue": null, "newValue": "Example Paper Biller" },
{ "field": "accountNumber", "oldValue": null, "newValue": "123456789" },
{ "field": "address1", "oldValue": null, "newValue": "123 Main St" },
{ "field": "city", "oldValue": null, "newValue": "Austin" },
{ "field": "state", "oldValue": null, "newValue": "TX" },
{ "field": "postalCode", "oldValue": null, "newValue": "78701" },
{ "field": "frequencyType", "oldValue": null, "newValue": "one_time" }
]
}biller.modifyElectronic
Description: The biller.modifyElectronic webhook is sent when an existing electronic biller is successfully modified. The changes array lists the fields that changed with their old and new values.
Triggers:
- Successful API call to modify an electronic biller (Bill Pay)
- Electronic biller modified via the appropriate SST role
Example Payload:
{
"uuid": "d9e0f1a2-b3c4-4d5e-6f7a-8b9c0d1e2f3a",
"companyId": "6823a83c643d753f0f79a7ec",
"requestId": "f3345e4e814f1b2fa708004993ce7f07",
"accountId": "68950897f865c690e12e244a",
"userId": "68950761e754b589d02d133c",
"billerId": "689510a1f976e701g34g599c",
"spidrActionId": "68950786e754b589d01d1339",
"webhookType": "biller.modifyElectronic",
"actionRequestor": {
"source": "api"
},
"changes": [
{ "field": "frequencyType", "oldValue": "one_time", "newValue": "monthly" },
{ "field": "nextDate", "oldValue": null, "newValue": "2026-02-15T00:00:00.000Z" },
{ "field": "endDate", "oldValue": null, "newValue": "2026-08-15T00:00:00.000Z" },
{ "field": "amount", "oldValue": null, "newValue": 100 }
]
}biller.modifyPaper
Description: The biller.modifyPaper webhook is sent when an existing paper (check) biller is successfully modified. The changes array lists the fields that changed with their old and new values.
Triggers:
- Successful API call to modify a paper biller (Bill Pay)
- Paper biller modified via the appropriate SST role
Example Payload:
{
"uuid": "e0f1a2b3-c4d5-4e6f-7a8b-9c0d1e2f3a4b",
"companyId": "6823a83c643d753f0f79a7ec",
"requestId": "a4456f5f925g2c3gb819115aa4df8g18",
"accountId": "68950897f865c690e12e244a",
"userId": "68950761e754b589d02d133c",
"billerId": "689510a1f976e701g34g599c",
"spidrActionId": "68950786e754b589d01d1339",
"webhookType": "biller.modifyPaper",
"actionRequestor": {
"source": "api"
},
"changes": [
{ "field": "frequencyType", "oldValue": "one_time", "newValue": "monthly" },
{ "field": "amount", "oldValue": 50, "newValue": 100 }
]
}Bill Payment Transaction Events
Bill-payment transaction events are provider-originated and report the lifecycle of a bill payment at the processor. They share the provider data wrapper: data.providerDetails carries the raw processor event, and when the payment was initiated via the Unified API, data.responseBody, data.actionRequestor, and data.spidrActionId are also included.
webhookType | Galileo type | Description |
|---|---|---|
transaction.billpay | billpay | A bill payment debit has posted to the account |
transaction.billpayRequestMade | billpay_request_made | A bill payment request was submitted to the processor |
transaction.billpayCheckMailed | billpay_check_mailed | A paper check for the bill payment was mailed |
transaction.billpayCheckCleared | billpay_check_cleared | A mailed paper check has cleared |
transaction.billpayCancelled | billpay_cancelled | A bill payment was cancelled |
transaction.billpayExpired | billpay_expired | A bill payment expired before completing |
transaction.billpayRejected | billpay_rejected | A bill payment was rejected |
transaction.billpayLimitViolation | billpay_limit_violation | A bill payment violated a configured limit |
transaction.billpayRequestReturned | billpay_request_returned | A submitted bill payment request was returned |
transaction.billpayRetry | billpay_retry | A bill payment is being retried |
transaction.schedBillpayFail | sched_billpay_fail | A scheduled bill payment failed |
Example Payload (transaction.billpay):
{
"uuid": "f1a2b3c4-d5e6-4f7a-8b9c-0d1e2f3a4b5c",
"webhookType": "transaction.billpay",
"data": {
"accountId": "68950897f865c690e12e244a",
"productId": "67f2a93d743e864g1g80b8fd",
"userId": "68950761e754b589d02d133c",
"providerDetails": {
"provider": "galileo",
"pmt_ref_no": "594100012345",
"prod_id": "3391",
"prog_id": "8594",
"timestamp": "2026-01-15 14:59:18 MST",
"type": "billpay",
"adj_id": "12912",
"amount": "25.00",
"balance_id": "5678",
"billername": "Verizon Communications",
"billpay_id": "18",
"open_to_buy": "50.00",
"eventType": "Transaction"
},
"responseBody": {
"status": "processing",
"oldBalance": 100,
"newBalance": 75,
"billPayRequestId": "BLP_fa41926563341061d14d1a4d7147635a",
"spidrActionId": "68950786e754b589d01d1339"
},
"actionRequestor": {
"source": "api"
},
"spidrActionId": "68950786e754b589d01d1339"
}
}Example Payload (transaction.billpayRequestMade):
{
"uuid": "a2b3c4d5-e6f7-4a8b-9c0d-1e2f3a4b5c6d",
"webhookType": "transaction.billpayRequestMade",
"data": {
"accountId": "68950897f865c690e12e244a",
"productId": "67f2a93d743e864g1g80b8fd",
"userId": "68950761e754b589d02d133c",
"providerDetails": {
"provider": "galileo",
"pmt_ref_no": "594100012345",
"prod_id": "3391",
"prog_id": "8594",
"timestamp": "2026-01-15 13:24:29 MST",
"type": "billpay_request_made",
"amount": "1.00",
"balance_id": "6612",
"billername": "Verizon Communications",
"billpay_id": "106",
"open_to_buy": "500.00",
"eventType": "Transaction"
},
"responseBody": {
"status": "pending",
"oldBalance": 500,
"newBalance": 499,
"billPayRequestId": "BLP_6790113bdca89f1fc500a032e909f768",
"spidrActionId": "68950786e754b589d01d1339"
},
"actionRequestor": {
"source": "api"
},
"spidrActionId": "68950786e754b589d01d1339"
}
}Round-Up Webhooks
Round-Up webhooks report the lifecycle of a Round-Up enrollment and the status of each Round-Up sweep transfer. These are Spidr-generated events. The body carries a top-level envelope (companyId, userId, webhookType, requestorSource, requestorId, spidrActionId, requestId) and a nested payload object with the event-specific data.
roundup.created
Description: The roundup.created webhook is sent when a Round-Up enrollment is successfully created for a user. The payload contains the full enrollment configuration.
Triggers:
- Successful API call to create a Round-Up enrollment
Example Payload:
{
"companyId": "6823a83c643d753f0f79a7ec",
"userId": "68950761e754b589d02d133c",
"webhookType": "roundup.created",
"requestorSource": "api",
"requestorId": "system",
"spidrActionId": "68950786e754b589d01d1339",
"requestId": "c6b9e3172957e86759dbe712284a162e",
"payload": {
"id": "689511b2g087f812h45h600d",
"companyId": "6823a83c643d753f0f79a7ec",
"userId": "68950761e754b589d02d133c",
"status": "active",
"calculationMode": "round_to_nearest_dollar",
"currencyCode": "USD",
"cadence": "weekly",
"cadenceKey": 5,
"cadenceMaxAmount": 50,
"minimumSweepAmount": 1,
"trackingAccounts": [
{ "type": "linked_institution_account", "trackingAccountId": "689512c3h198g923i56i711e" }
],
"fundingAccounts": [
{ "type": "ach_account", "fundingAccountId": "689513d4i209h034j67j822f", "fundingPercentage": 100 }
],
"receivingAccounts": [
{ "type": "spidr", "receivingAccountId": "689514e5j310i145k78k933g", "allocationPercentage": 100 }
],
"createdAt": "2026-01-15T19:55:49.339Z",
"updatedAt": "2026-01-15T19:55:49.339Z"
}
}roundup.updated
Description: The roundup.updated webhook is sent when a Round-Up enrollment's configuration is updated. The payload mirrors the enrollment object shown in roundup.created, reflecting the updated configuration.
Triggers:
- Successful API call to update a Round-Up enrollment's configuration
roundup.paused
Description: The roundup.paused webhook is sent when a Round-Up enrollment is paused. While paused, no sweeps run for the enrollment. The payload contains the enrollment object with status set to paused, plus priorStatus (the status before the change) and pausedAt. Lifecycle events (paused, resumed, closed) all include priorStatus.
Triggers:
- Round-Up enrollment status changed to paused (via API or SST)
roundup.resumed
Description: The roundup.resumed webhook is sent when a previously paused Round-Up enrollment is resumed. The payload contains the enrollment object with status set to active.
Triggers:
- Round-Up enrollment status changed from paused back to active (via API or SST)
roundup.closed
Description: The roundup.closed webhook is sent when a Round-Up enrollment is closed. Once closed, the enrollment no longer runs sweeps. The payload contains the enrollment object with status set to closed.
Triggers:
- Round-Up enrollment status changed to closed (via API or SST)
Round-Up Transfer Events
The roundup.transfer.* webhooks report the status of a Round-Up sweep transfer. Each sweep aggregates eligible round-ups over a period and transfers the total from the funding account(s) to the receiving account(s). The payload.calculation object shows how the sweep amount was derived, payload.includedRoundUps lists the contributing transactions, and payload.fundingAccountTransfers / payload.receivingAccountTransfers show the movement legs.
webhookType | payload.status | Meaning |
|---|---|---|
roundup.transfer.submitted | funding_submitted | The funding transfer has been submitted; receiving legs may still be pending |
roundup.transfer.complete | success | The sweep transfer completed successfully |
roundup.transfer.failed | failed | The sweep transfer failed; see failureReason and the transfer legs |
roundup.transfer.skipped | skipped | The sweep was skipped; see skipReason (e.g. below_minimum_sweep_amount) |
Example Payload (roundup.transfer.complete):
{
"companyId": "6823a83c643d753f0f79a7ec",
"userId": "68950761e754b589d02d133c",
"webhookType": "roundup.transfer.complete",
"requestorSource": "api",
"requestorId": "system",
"spidrActionId": "68950786e754b589d01d1339",
"requestId": "roundup-sweep:689511b2g087f812h45h600d:weekly:2026-01-12T00:00:00.000Z",
"payload": {
"roundUpSweepId": "689515f6k421j256l89l044h",
"roundUpEnrollmentId": "689511b2g087f812h45h600d",
"sweepKey": "roundup:6823a83c643d753f0f79a7ec:689511b2g087f812h45h600d:weekly:2026-01-12",
"status": "success",
"currencyCode": "USD",
"period": {
"cadence": "weekly",
"startDate": "2026-01-12T00:00:00.000Z",
"endDate": "2026-01-18T23:59:59.999Z"
},
"calculation": {
"eligibleTransactionCount": 12,
"eligibleTransactionAmount": 348.87,
"calculatedRoundUpAmount": 5.13,
"cadenceMaxAmount": 50,
"finalAmount": 5.13,
"calculationMode": "round_to_nearest_dollar"
},
"includedRoundUps": [
{ "transactionId": "689516a7l532k367m90m155i", "transactionCollection": "linked_institution_account_transaction", "roundUpAmount": 0.35 },
{ "transactionId": "689516a7l532k367m90m155j", "transactionCollection": "linked_institution_account_transaction", "roundUpAmount": 0.66 }
],
"fundingAccountTransfers": [
{
"type": "spidr",
"fundingAccountId": "689513d4i209h034j67j822f",
"amount": 5.13,
"fundingPercentage": 100,
"status": "success",
"transferId": "A2A_RUS_4d7f2a91c3b5e8d0a6f1b4c7e2d9a3f8b5c0e6d1",
"a2aRequestId": "689517b8m643l478n01n266k",
"submittedAt": "2026-01-19T06:00:09.557Z",
"completedAt": "2026-01-19T06:00:09.855Z"
}
],
"receivingAccountTransfers": [
{
"type": "spidr",
"receivingAccountId": "689514e5j310i145k78k933g",
"amount": 5.13,
"allocationPercentage": 100,
"status": "success",
"transferId": "A2A_RUS_4d7f2a91c3b5e8d0a6f1b4c7e2d9a3f8b5c0e6d1",
"a2aRequestId": "689517b8m643l478n01n266k",
"submittedAt": "2026-01-19T06:00:09.557Z",
"completedAt": "2026-01-19T06:00:09.855Z"
}
],
"fundingCompletedAt": "2026-01-19T06:00:09.855Z",
"receivingCompletedAt": "2026-01-19T06:00:09.855Z"
}
}Each transfer leg carries a
status(pending,submitted,success, orfailed) plus atransferIdand the underlying request ID (achRequestIdfor ACH-funded legs,a2aRequestIdfor internal transfers), withsubmittedAt/completedAttimestamps as the leg progresses. Forroundup.transfer.failed, a top-levelpayload.failureReasonis included and the affected legs carrystatus: "failed"with a per-legfailureReason. Forroundup.transfer.skipped,payload.skipReasonexplains why the sweep did not run (for example,below_minimum_sweep_amount), and the transfer arrays are empty.
ZTM Webhooks
ZTM (Zero Touch Monitoring) webhooks are generated by the Spidr ZTM service to provide updates on linked institutions, identity verification sessions, watchlist screening statuses, business (KYB) verification sessions, and gated-action decisioning. These webhooks are delivered automatically when relevant state transitions occur in linked-institution, identity-verification, AML-screening, KYB, or manual-review decisioning workflows.
linkedInstitution.statusUpdate
Description: The linkedInstitution.statusUpdate webhook reports a Plaid linked institution that needs user action, is approaching a state that may need user action, or has been restored. These notifications describe the linked institution's Plaid Item state; they do not represent an exhaustive audit of every transaction-sync attempt.
Triggers:
| Plaid condition | payload.state | payload.status | payload.actionRequired |
|---|---|---|---|
ITEM_LOGIN_REQUIRED | action_required | error | update_mode |
ACCESS_NOT_GRANTED | action_required | error | update_mode |
ITEM_NOT_FOUND | action_required | error | new_link |
USER_PERMISSION_REVOKED | action_required | error | new_link |
PENDING_DISCONNECT | warning | success | update_mode |
PENDING_EXPIRATION | warning | success | update_mode |
| Successful Item restoration | restored | success | null |
Remediation:
- For
ITEM_LOGIN_REQUIRED, launch update mode to repair authentication. - For
ACCESS_NOT_GRANTED, launch update mode configured to request or restore the required Plaid product permission. An authentication-only update may not repair the missing permission. - For
ITEM_NOT_FOUNDorUSER_PERMISSION_REVOKED, start a new-link flow.
ACCESS_NOT_GRANTED and warning states do not make the overall linked institution unusable. payload.status describes the reported Plaid Item transition and does not mirror the health of every service on the LinkedInstitution; use payload.state and payload.actionRequired to select remediation. A restored event is emitted after a previously action-required Item is repaired or a warning is cleared, either through Plaid's LOGIN_REPAIRED webhook or successful update mode completion.
Example Payload:
{
"uuid": "3bc3c8a7-93a0-4f36-a0a1-06c7e10ab44e",
"companyId": "6823a83c643d753f0f79a7ec",
"userId": "68950761e754b589d02d133c",
"webhookType": "linkedInstitution.statusUpdate",
"requestorSource": "api",
"requestorId": "system",
"spidrActionId": "68950786e754b589d01d1339",
"requestId": "d082ef13f90e844780de5c2c66d6403b",
"payload": {
"linkedInstitutionId": "68fd8e78a3f4e73a4ad66b61",
"userId": "68950761e754b589d02d133c",
"provider": "plaid",
"status": "error",
"state": "action_required",
"errorCode": "ITEM_LOGIN_REQUIRED",
"actionRequired": "update_mode"
}
}Payload Fields:
| Field | Type | Description |
|---|---|---|
linkedInstitutionId | string | The linked institution whose Plaid Item state changed. |
userId | string | The user who owns the linked institution. |
provider | string | The linked institution provider. This event currently uses plaid. |
status | success | error | Status of the reported Plaid Item transition; not a complete assessment of LinkedInstitution health. |
state | string | One of action_required, warning, or restored. |
errorCode | string (optional) | The Plaid condition that caused an action-required or warning transition. Omitted for restored. |
actionRequired | string | null | update_mode, new_link, or null when the linked institution has been restored. |
ZTM submits this webhook once per observed state transition on a best-effort basis. Duplicate provider deliveries for the same active state are suppressed. Once accepted by the webhook service, normal webhook delivery retries apply; ZTM does not maintain a durable outbox for submission failures.
idvSession.manualReviewRequired
Description: The idvSession.manualReviewRequired webhook is sent when an identity verification session requires manual review by your compliance team. This typically occurs when automated verification cannot conclusively verify the user's identity.
Triggers:
- Identity verification session flagged for manual review by the IDV provider (e.g., Plaid)
Example Payload:
{
"uuid": "d8e9f0g1-h2i3-4j5k-6l7m-8n9o0p1q2r3s",
"companyId": "6823a83c643d753f0f79a7ec",
"userId": "68950761e754b589d02d133c",
"webhookType": "idvSession.manualReviewRequired",
"idvSessionId": "689507c1f976e701g34g577e",
"idvSessionStatus": "manual_review",
"plaidIdvSessionId": "idv_session_abc123xyz",
"requiresAction": "manual_review",
"spidrActionId": "68950786e754b589d01d1339"
}idvSession.needsDecision
Description: The idvSession.needsDecision webhook is sent when an identity verification session is awaiting a decision from your system after manual review.
Triggers:
- Manual review completed and awaiting final decision
Example Payload:
{
"uuid": "e9f0g1h2-i3j4-4k5l-6m7n-8o9p0q1r2s3t",
"companyId": "6823a83c643d753f0f79a7ec",
"userId": "68950761e754b589d02d133c",
"webhookType": "idvSession.needsDecision",
"idvSessionId": "689507c1f976e701g34g577e",
"idvSessionStatus": "needs_decision",
"plaidIdvSessionId": "idv_session_def456uvw",
"requiresAction": "decision",
"spidrActionId": "68950786e754b589d01d1339"
}idvSession.retry
Description: The idvSession.retry webhook is sent when a user needs to retry their identity verification session, typically due to incomplete or failed verification attempts.
Triggers:
- User instructed to retry identity verification
Example Payload:
{
"uuid": "f0g1h2i3-j4k5-4l6m-7n8o-9p0q1r2s3t4u",
"companyId": "6823a83c643d753f0f79a7ec",
"userId": "68950761e754b589d02d133c",
"webhookType": "idvSession.retry",
"idvSessionId": "689507c1f976e701g34g577e",
"idvSessionStatus": "retry",
"plaidIdvSessionId": "idv_session_ghi789rst",
"spidrActionId": "68950786e754b589d01d1339"
}idvSession.rerun
Description: The idvSession.rerun webhook is sent when an identity verification session needs to be completely rerun with new parameters or criteria.
Triggers:
- System or admin triggers rerun of identity verification
Example Payload:
{
"uuid": "g1h2i3j4-k5l6-4m7n-8o9p-0q1r2s3t4u5v",
"companyId": "6823a83c643d753f0f79a7ec",
"userId": "68950761e754b589d02d133c",
"webhookType": "idvSession.rerun",
"idvSessionId": "689507c1f976e701g34g577e",
"idvSessionStatus": "rerun",
"plaidIdvSessionId": "idv_session_jkl012mno",
"spidrActionId": "68950786e754b589d01d1339"
}idvSession.stale
Description: The idvSession.stale webhook is sent when an identity verification session has expired or become stale without completion.
Triggers:
- Identity verification session exceeds time limit without completion
Example Payload:
{
"uuid": "h2i3j4k5-l6m7-4n8o-9p0q-1r2s3t4u5v6w",
"companyId": "6823a83c643d753f0f79a7ec",
"userId": "68950761e754b589d02d133c",
"webhookType": "idvSession.stale",
"idvSessionId": "689507c1f976e701g34g577e",
"idvSessionStatus": "stale",
"plaidIdvSessionId": "idv_session_pqr345stu",
"spidrActionId": "68950786e754b589d01d1339"
}watchlistScreening.statusUpdate
Description: The watchlistScreening.statusUpdate webhook is sent when a user's watchlist screening status changes (e.g., from pending to clear, or when a potential match is found).
Triggers:
- Watchlist screening provider (e.g., Plaid) updates the screening status
- Periodic re-screening detects status change
Example Payload:
{
"uuid": "i3j4k5l6-m7n8-4o9p-0q1r-2s3t4u5v6w7x",
"companyId": "6823a83c643d753f0f79a7ec",
"userId": "68950761e754b589d02d133c",
"webhookType": "watchlistScreening.statusUpdate",
"watchlistScreeningId": "689507d2g087f812h45h688f",
"watchlistScreeningStatus": "clear",
"spidrActionId": "68950786e754b589d01d1339"
}watchlistScreening.hitUpdate
Description: The watchlistScreening.hitUpdate webhook is sent when there's an update to a watchlist hit (potential match) for a user, such as when additional information becomes available or the hit is reviewed.
Triggers:
- New information available about a watchlist hit
- Hit status changed (e.g., false positive confirmed)
Example Payload:
{
"uuid": "j4k5l6m7-n8o9-4p0q-1r2s-3t4u5v6w7x8y",
"companyId": "6823a83c643d753f0f79a7ec",
"userId": "68950761e754b589d02d133c",
"webhookType": "watchlistScreening.hitUpdate",
"watchlistScreeningId": "689507d2g087f812h45h688f",
"watchlistHitId": "689507e3h198g923i56i799g",
"watchlistScreeningStatus": "review",
"spidrActionId": "68950786e754b589d01d1339"
}user.cipStatusUpdate
Description: The user.cipStatusUpdate webhook is sent when a user's Customer Identification Program (CIP) status changes, indicating progression through the identity verification and compliance workflow.
Triggers:
- User CIP status transitions (e.g., from pending to pass, pending to manual review, etc.)
- Updates to CIP-related data
Example Payload:
{
"uuid": "k5l6m7n8-o9p0-4q1r-2s3t-4u5v6w7x8y9z",
"companyId": "6823a83c643d753f0f79a7ec",
"requestId": "68950786e754b589d01d1338",
"responseBody": {
"cipStatus": "pass",
"updated": true,
"spidrActionId": "68950786e754b589d01d1339"
},
"spidrActionId": "68950786e754b589d01d1339",
"userId": "68950761e754b589d02d133c",
"webhookType": "user.cipStatusUpdate",
"actionRequestor": {
"source": "user",
"userId": "68950761e754b589d02d133d",
"userEmail": "[email protected]",
"userIdSource": "internal"
},
"changes": [
{
"field": "cip.status",
"oldValue": "pending",
"newValue": "pass"
}
]
}Note: Automatic and manual CIP status decisions use this same delivered payload structure. The webhook processor adds the uuid to the emitted event.
spidrAction.needsDecision
Description: The spidrAction.needsDecision webhook is sent when a gated action requires a manual decision from your system (approve or decline) before it can proceed. This is the mechanism behind ZTM manual review: when an action such as user creation or card activation is held for review, this webhook notifies you that a decision is needed. payload.actionType identifies the held action. When the action relates to an account or card, top-level accountId and cardId fields are also included in the envelope (this applies to all spidrAction.* events).
Triggers:
- A gated action enters the awaiting-decision state (for example, ZTM flags it for manual review)
Example Payload:
{
"companyId": "6823a83c643d753f0f79a7ec",
"userId": "68950761e754b589d02d133c",
"webhookType": "spidrAction.needsDecision",
"requestorSource": "api",
"requestorId": "system",
"spidrActionId": "68950786e754b589d01d1339",
"requestId": "638a6c1df629d620c9a8f23192f29a19",
"payload": {
"actionType": "user_create",
"status": "awaiting_decision",
"changes": { "field": "status", "oldValue": "pending", "newValue": "awaiting_decision" }
}
}spidrAction.approved
Description: The spidrAction.approved webhook is sent when a gated action is approved (automatically or via a manual decision) and is allowed to proceed. payload.decision and payload.decisionDetails describe who made the decision and how.
Triggers:
- A gated action is approved (auto-decisioned or manually approved)
Example Payload:
{
"companyId": "6823a83c643d753f0f79a7ec",
"userId": "68950761e754b589d02d133c",
"webhookType": "spidrAction.approved",
"requestorSource": "user",
"requestorId": "68950fa1b2c3d4e5f6a7b8c9",
"spidrActionId": "68950786e754b589d01d1339",
"requestId": "638a6c1df629d620c9a8f23192f29a19",
"payload": {
"actionType": "user_create",
"status": "success",
"changes": { "field": "status", "oldValue": "awaiting_decision", "newValue": "success" },
"decision": "approved",
"decisionDetails": {
"source": "user",
"autoDecisioned": false,
"userId": "68950fa1b2c3d4e5f6a7b8c9",
"userIdSource": "internal",
"reason": "Approved after manual review",
"decisionDate": "2026-01-15T20:19:22.657Z"
}
}
}spidrAction.declined
Description: The spidrAction.declined webhook is sent when a gated action is declined (manually or automatically). The action does not proceed. It shares the envelope shown above; payload.status is blocked, payload.decision is declined, and payload.decisionDetails describes the decision. For automatic expiry declines, decisionDetails.source is system with autoDecisioned: true, and payload.expiresAt carries the expiry deadline that passed.
Triggers:
- A gated action is declined (auto-declined or manually declined), including automatic expiry of an action left undecided past its window
Example Payload:
{
"companyId": "6823a83c643d753f0f79a7ec",
"userId": "68950761e754b589d02d133c",
"webhookType": "spidrAction.declined",
"requestorSource": "user",
"requestorId": "68950fa1b2c3d4e5f6a7b8c9",
"spidrActionId": "68950786e754b589d01d1339",
"requestId": "638a6c1df629d620c9a8f23192f29a19",
"payload": {
"actionType": "user_create",
"status": "blocked",
"changes": { "field": "status", "oldValue": "awaiting_decision", "newValue": "blocked" },
"decision": "declined",
"decisionDetails": {
"source": "user",
"autoDecisioned": false,
"userId": "68950fa1b2c3d4e5f6a7b8c9",
"userIdSource": "internal",
"reason": "Declined after manual review",
"decisionDate": "2026-01-15T20:19:22.657Z"
}
}
}spidrAction.failed
Description: The spidrAction.failed webhook is sent when a gated action fails during processing and cannot complete. This includes the case where the action was approved but the downstream execution then failed; in that case payload.decision and payload.decisionDetails reflect the approval that preceded the failure. payload.error contains a message and, when available, a code describing the failure.
Triggers:
- A gated action fails while being processed (for example, a downstream provider error during execution after approval)
Example Payload:
{
"companyId": "6823a83c643d753f0f79a7ec",
"userId": "68950761e754b589d02d133c",
"webhookType": "spidrAction.failed",
"requestorSource": "user",
"requestorId": "68950fa1b2c3d4e5f6a7b8c9",
"spidrActionId": "68950786e754b589d01d1339",
"requestId": "638a6c1df629d620c9a8f23192f29a19",
"accountId": "68950897f865c690e12e244a",
"cardId": "68950ab9h087e812g34g466c",
"payload": {
"actionType": "card_update.reissue",
"status": "failed",
"changes": { "field": "status", "oldValue": "awaiting_decision", "newValue": "failed" },
"decision": "approved",
"decisionDetails": {
"source": "user",
"autoDecisioned": false,
"userId": "68950fa1b2c3d4e5f6a7b8c9",
"userIdSource": "internal",
"reason": "Approved after manual review",
"decisionDate": "2026-01-15T17:40:29.316Z"
},
"error": {
"message": "Active card not found."
}
}
}kybSession.manualReviewRequired
Description: The kybSession.manualReviewRequired webhook is sent when a business (KYB) verification session is flagged for manual review by the KYB provider. It includes the kybSessionId and passes the full provider KYB result through data.providerDetails. The changes object reflects the transition into manual review.
Triggers:
- The KYB provider (e.g., Sardine) returns an in-review / manual-review result for a business verification
Example Payload:
{
"companyId": "6823a83c643d753f0f79a7ec",
"userId": "68950761e754b589d02d133c",
"webhookType": "kybSession.manualReviewRequired",
"requestorSource": "api",
"requestorId": "system",
"spidrActionId": "68950786e754b589d01d1339",
"requestId": "cdbc5f737c95844c49c18726823dd224",
"kybSessionId": "689513d4i209h034j67j822f",
"providerDetails": {
"id": "87b6c1fe-2774-4e23-88e9-e04b330f6696",
"type": "business_update.kyb",
"provider": "sardine",
"webhook_data": {
"id": 750172,
"trackingId": "68950761e754b589d02d133c",
"status": "in_review",
"name": "Example Business LLC",
"kyb": { "status": "success" }
}
},
"changes": { "field": "requiresManualReview", "oldValue": false, "newValue": true }
}
providerDetailspasses through the full provider KYB result (business details, verification tasks, watchlist screening, SOS registrations, and industry classification). It is trimmed above for brevity.
kybSession.needsDecision
Description: The kybSession.needsDecision webhook is sent when a KYB session is awaiting a decision from your system after manual review. It is the business (KYB) counterpart to idvSession.needsDecision. The kybSessionId identifies the session awaiting the decision.
Triggers:
- KYB manual review completed and awaiting a final decision
Example Payload:
{
"companyId": "6823a83c643d753f0f79a7ec",
"userId": "68950761e754b589d02d133c",
"webhookType": "kybSession.needsDecision",
"requestorSource": "user",
"requestorId": "68950fa1b2c3d4e5f6a7b8c9",
"spidrActionId": "68950786e754b589d01d1339",
"requestId": "df46g848g06955d5ad29837934ee335",
"kybSessionId": "689513d4i209h034j67j822f"
}Note: These ZTM webhooks may have different payload structures than standard Unified API webhooks, as they originate from the ZTM service. Refer to the ZTM service documentation for detailed payload specifications.
Common Webhook Fields
Please note that provider-originated webhooks wrap their payload in a
dataobject and includeproviderDetailswhile API/SST initiated webhooks use a flat structure with responseBody, actionRequestor, and changes.
All webhooks share the following common fields:
| Field | Type | Description |
|---|---|---|
uuid | string | Unique identifier for the webhook event |
companyId | string | The company ID associated with the action |
requestId | string | The request ID that triggered this webhook |
responseBody | object | The response body from the original API call |
spidrActionId | string | The ID of the SpidrAction that triggered this webhook |
userId | string | The ID of the user associated with the action |
webhookType | string | The type of webhook (e.g., "user.edit", "account.create") |
actionRequestor | object | Information about who/what initiated the action |
ActionRequestor Object
The actionRequestor object contains information about the source of the action:
| Field | Type | Description |
|---|---|---|
source | string | Either "api" or "sst" indicating the source of the request |
sstRequestorUserId | string (optional) | If source is "sst", the user ID of the SST user who made the request |
sstRequestorUserEmail | string (optional) | If source is "sst", the email of the SST user who made the request |
Webhook Delivery
Webhooks are delivered via HTTP POST requests to the configured webhook URL for your company. The webhook service will:
- Send the webhook payload as JSON in the request body
- Include a
Content-Type: application/jsonheader - Retry failed deliveries with exponential backoff
- Sign the request for verification
Best Practices
- Idempotency: Always check the
uuidfield to ensure you don't process the same webhook twice - Validation: Verify the webhook signature to ensure it came from Spidr
- Async Processing: Return a 200 OK response quickly and process the webhook asynchronously
- Error Handling: Implement proper error handling and logging for webhook processing
- Monitoring: Monitor webhook delivery success rates and processing times
Support
For questions or issues related to webhooks, please contact Spidr support or refer to the main API documentation.
Updated about 3 hours ago