All events are delivered in the standard webhook envelope. The payloads below show theDocumentation Index
Fetch the complete documentation index at: https://docs.cadanapay.com/llms.txt
Use this file to discover all available pages before exploring further.
data field contents for each event type.
Quick Reference
| Event | Description |
|---|---|
person.created | A person record was created |
person.updated | A person record was updated |
person.offboarding.scheduled | Offboarding was scheduled for a person |
person.offboarding.cancelled | A pending offboarding was cancelled |
person.offboarding.completed | A person transitioned to Former status |
person.reinstated | A former person was reinstated to Active status |
user.created | A user account was created |
user.updated | A user’s profile was updated |
user.profile.updated | A user completed a profile action (e.g., password set) |
user.kyc.updated | A user’s KYC status changed |
user.kyc.expiry | A user’s identity document is expiring or has expired |
payroll.created | A payroll was created |
payroll.status.updated | A payroll’s status changed |
transaction.initiated | A transaction was created for processing |
transaction.succeeded | A transaction completed successfully |
transaction.failed | A transaction failed or was returned |
instant-pay.succeeded | An instant pay request was completed |
contract.created | A contract was created |
contract.signed | A contract signature was recorded |
contract.status.updated | A contract’s status changed |
virtual-account.requested | A virtual account was requested |
virtual-account.submitted | A virtual account request was sent to the bank |
virtual-account.created | A virtual account is active with account details |
business.kyb.reviewed | A KYB submission was reviewed |
business.kyb.rejected | A KYB submission was rejected (terminal) |
business.kyb.completed | A business completed KYB verification |
business.basicinfo.updated | A business’s basic information was updated |
external-account.added | An external bank account was linked |
external-account.removed | An external bank account was removed |
filing.created | A statutory filing was created |
filing.blocked | A filing is blocked by missing requirements |
filing.pending | A blocked filing was unblocked and is pending again |
filing.in_review | A filing is validated and ready for approval |
filing.approved | A filing was approved for submission |
filing.submitted | A filing was submitted to the government authority |
filing.accepted | The government authority accepted the filing |
filing.rejected | The government authority rejected the filing |
filing.overdue | A filing is past its due date |
remittance.created | A government payment was initiated |
remittance.processing | A government payment is being processed |
remittance.completed | A government payment was completed |
remittance.failed | A government payment failed |
requirement.created | A compliance requirement was surfaced |
requirement.satisfied | A compliance requirement was resolved |
Persons
person.created
JSON
person.updated
JSON
Offboarding
Offboarding events track a person’s lifecycle from active employment through exit and potential reinstatement. See Offboard Workers for the full guide.person.offboarding.scheduled
JSON
person.offboarding.cancelled
JSON
person.offboarding.completed
JSON
person.reinstated
JSON
Users
user.created
JSON
user.updated
The payload includes atype field indicating what was updated.
| Type | Description |
|---|---|
basic_info | Name, email, phone number, or tag was updated. isNameUpdated indicates if the name changed. |
JSON
user.profile.updated
JSON
user.kyc.updated
Fired on every KYC status change. Thetype field indicates which verification component changed.
JSON
| Status | Description |
|---|---|
processing | KYC verification is in progress |
approved | Verification successful |
rejected | Verification failed — resubmission needed |
| Type | Description |
|---|---|
identity | Identity document verification |
address | Address verification |
user.kyc.expiry
Fired when a user’s identity document is approaching expiry or has expired.JSON
| Stage | Description |
|---|---|
about-to-expire | Document expires within 30 days |
in-grace-period | Expired but within 60-day grace period |
expired | Past grace period — user must re-verify |
Payroll
Thepayroll.status.updated event fires for the values below. See Payroll Lifecycle for the full lifecycle.
status value | Description |
|---|---|
saved | Entries added, ready for approval |
approved | Payroll approved |
scheduled | Funds collected, queued for the payroll date |
processing | Disbursements being sent to workers |
completed | All disbursements confirmed |
No webhook fires when a payroll enters
Awaiting Funds, Rejected, or Deleted. Poll GET /v1/payrolls/{id} if you need to detect those states.payroll.created
JSON
payroll.status.updated
JSON
Transactions
Everytransaction.* event carries a type field identifying the kind of transaction:
type | Description |
|---|---|
PAYROLL | A worker payment from a payroll run. |
DEPOSIT | Funds received into a business virtual account. |
PAYOUT | A direct user-initiated payout or a business payout. |
PAYROLL_FEE | A processing fee charged when a payroll runs, debited from the business wallet. |
recipientType field identifying what kind of entity recipientId refers to:
recipientType | When you’ll see it |
|---|---|
BUSINESS | Business payouts, business-account deposits, and payroll fee charges. |
USER | Worker wallet payments and direct user payouts. |
EMPLOYEE | Worker direct bank payments where the worker is classified as an employee. |
CONTRACTOR | Worker direct bank payments where the worker is classified as a contractor. |
| Event | Description |
|---|---|
transaction.initiated | A transaction was created for processing. |
transaction.succeeded | A transaction succeeded. |
transaction.failed | A transaction failed or was returned. Check message for details. If isReturned: true, the transaction was previously successful but returned by the recipient bank. |
transaction.initiated
JSON
transaction.succeeded
- PAYROLL
- DEPOSIT
- PAYROLL_FEE
JSON
transaction.failed
JSON
transaction.failed with isReturned: true:
JSON
The
type field tells you the kind of transaction. reference is a stable identifier from the source system: payrollId for PAYROLL, the deposit reference for DEPOSIT, the business payout reference for PAYOUT. recipientId is the ID of whoever is receiving funds — use recipientType to interpret it (a userId when recipientType: "USER", a businessId when BUSINESS, a personId when EMPLOYEE or CONTRACTOR).Instant Pay
instant-pay.succeeded
JSON
Contracts
contract.created
JSON
contract.signed
JSON
contract.status.updated
JSON
Virtual Accounts
A virtual account can belong to either a user or a business. Exactly one ofuserId or businessId will be present.
virtual-account.requested
JSON
virtual-account.submitted
JSON
virtual-account.created
JSON
Business
business.kyb.reviewed
Sent when a KYB submission has been reviewed. May indicate approval or that additional information is needed.JSON
needsAdditionalInformation responses.
business.kyb.rejected
Sent when a KYB submission has been permanently rejected. This is a terminal state — the business cannot resubmit.JSON
business.kyb.completed
JSON
business.basicinfo.updated
JSON
External Accounts
external-account.added
JSON
external-account.removed
JSON
Statutory Compliance
Filing, remittance, and requirement events share a common structure. TheresourceType and resourceId fields identify the affected resource.
filing.created
JSON
filing.blocked
JSON
filing.approved
JSON
filing.accepted
JSON
remittance.completed
JSON
requirement.satisfied
JSON