Skip to main content
The Platform Disbursements endpoint gives platform partners a unified view of all transactions across every business under your platform — payroll payments, payouts, and other financial operations — in a single query. Use it to build reconciliation reports, track revenue share, drill into payroll fee breakdowns via invoices, and reconcile your books.

Prerequisites

1

API key from Dashboard

Get your API key from the Cadana Dashboard. See Authentication for details.
2

Platform integration

You must be set up as a platform partner managing multiple businesses. See Platform Overview.
3

Businesses with transactions

At least one business under your platform must have completed payroll runs or wallet transactions.

Platform Disbursements

Fetch all transactions across every business on your platform. Results are filtered by date range and paginated automatically.

Query Parameters

Response Structure

Transaction Object Fields

All amount fields follow this structure:

Transaction Types


Internal Transfers

Move money between your own business accounts — your main business and any of its child businesses — with the Create Transfer endpoint. Transfers are internal, same-currency only, and settle immediately with no fee. Name the sourceTenantKey (optional — omit to send from your main business) and destinationTenantKey in the request body; allowed movements are main → child, child → child, and child → main. Create Transfer returns only the transfer id — there’s no GET for it. Find a transfer here by filtering to type=TRANSFER (or scope to one account with businessId), then match the returned id or your reference. It appears under the source business as an outgoing transaction.

Identifying Businesses with tenantKey

Every transaction includes a tenantKey that identifies which business it belongs to. Group by tenantKey to produce per-business reconciliation reports.

Scope to a Single Business

Pass businessId=<uuid> to narrow the list to one business’s account. This returns every disbursement where that business’s account is the sender or recipient — both money it sent (payroll, vendor payments, payouts) and money it received (deposits, refunds/reversals). It is bidirectional. This is distinct from tenantKey: tenantKey returns everything under a tenant, while businessId returns only the rows touching that one business’s account — a narrower set. The response shape, fields, and ordering (newest-first by createdTimestamp) are identical to the unfiltered call. A few things to keep in mind when reading the items:
  • Direction comes from type, not a dedicated field. For example, DEPOSIT is inbound; PAYROLL_TOTAL and VENDOR are outbound. Don’t assume a fixed direction for every type.
  • userId / userName are the counterparty (the other side of the transaction), not the scoped business itself — so an item is not necessarily “a payment the business sent to userId”.
  • By default the per-employee PAYROLL legs and PAYROLL_FEE rows are collapsed into the single PAYROLL_TOTAL line; pass an explicit type to get the raw rows. Business-relevant types include PAYROLL_TOTAL, PAYROLL, PAYROLL_FEE, PAYROLL_REVERSAL, DEPOSIT, DEPOSIT_REVERSAL, VENDOR, REVENUE_SHARE_PAYOUT, REIMBURSEMENT, SUBSCRIPTION_PAYMENT, and STATUTORY_DEPOSIT.

Paging through a business’s disbursements

Pagination is the same as the unfiltered endpoint: read cursor.next from each response and send it back to fetch the next page, repeating until it comes back null (default limit 50, max 100). The cursor is opaque — don’t parse it.

Payroll Transactions

Payroll transactions (type: "PAYROLL") represent individual payments to employees or contractors. Key identifiers:
  • personId — the employee or contractor being paid. Always present on payroll transactions and is the primary identifier for reconciliation.
  • userId — only present when payment is delivered to a wallet. Not present for external payments (bank, mobile money, etc.).
  • referenceId — shared across all payments in the same payroll run, so you can group them.
  • description — contains the name of the payroll run (e.g. “January 2026 Payment Dundies”).
Example — cross-currency payroll payment to a bank account:
userId is absent here because the payment was delivered to an external bank account, not a wallet.
Example — same-currency payroll payment via wallet:
Here userId is present because the payment went to the employee’s wallet. Same-currency payroll has no fxRate or FX revenue share, and may not have fee fields since fees are captured in the payroll fee transaction instead.

Wallet Transactions

Transactions of type PAYOUT, CARD_MAINTENANCE_FEE, CARD_CREATION_FEE, STOCK_BUY, STOCK_SELL, and INTEREST are wallet-level operations. They are associated with a user via the userId field.
These transactions may include revenue share fields depending on your platform agreement.
Example — cross-currency payout to a bank account in Brazil:

Understanding Amounts

Each transaction has four amount fields that tell you the full financial picture:

Cross-Currency Example

When a user sends USD and the recipient receives BRL:

Same-Currency Example

When both sides are in the same currency, no FX conversion applies:

Revenue Share

If your platform has a revenue share agreement with Cadana, eligible transactions include revenue share fields showing your earnings. These fields are only present when applicable — they are omitted when no revenue share applies. Example — transaction with both FX and fee revenue share:
In this case, the platform earned $0.41 from the FX spread and $10.07 from fees, totaling $10.48 in revenue share.
Sum totalRevenueShare across all transactions to determine your platform’s total earnings for a period. Break it down further with fxRevenueShare and feeRevenueShare to understand the source of revenue.

Payroll Fee & Invoice Details

When a business runs payroll, a separate PAYROLL_FEE transaction appears representing the processing fee for the entire run. To see the detailed breakdown of how the fee was calculated (per-employee line items), you need the invoice ID.

Getting the Invoice ID

After a payroll completes, the payroll response includes an invoiceId field. Fetch the payroll by its ID (you can find this via the referenceId on any PAYROLL transaction from the disbursements response): The response includes the invoiceId once the payroll is in completed status. Then use that ID to fetch the full invoice: The invoice provides a full breakdown of charges associated with a payroll run, including per-employee costs, FX markups, and fees. To download the invoice as a PDF: Response:
The fileUrl is short-lived. Fetch a new URL each time you need to download the PDF.

Pagination

Results are paginated. The cursor object tells you whether more pages are available:
  • cursor.next — pass as the cursor query parameter to fetch the next page
  • cursor.previous — pass to go back to the previous page
  • null — no more pages in that direction
Fetching the next page:

Reconciliation Walkthrough

Step 1: Fetch all successful transactions for the period

Paginate through all results using the cursor.next value until it returns null.

Step 2: Group by business

Group transactions by tenantKey to build per-business ledgers:

Step 3: For payroll, identify employees by personId

Filter for type: "PAYROLL" and group by personId to see how much each employee was paid:

Step 4: Calculate revenue share

Sum totalRevenueShare across all transactions for your platform’s total earnings. Break down further with fxRevenueShare and feeRevenueShare.

Step 5: Get payroll fee details

For any PAYROLL_FEE transactions, use the Get Invoice endpoint to retrieve the detailed breakdown, including per-employee line items.

Account Statements

Download a formatted account statement for a business over a date range with the Get Statement endpoint. The statement bundles the opening and closing balance, period totals, and every transaction line into a single document — ready to hand to accounting or reconcile against your books. Pick the output with the format query parameter:

Next Steps

Pay Workers via Payroll

Run payroll to generate the transactions you’ll reconcile

Payroll Lifecycle

Understand payroll statuses and when invoices become available

Fund Your Account

Ensure your business accounts are funded before running payroll

Webhooks

Get real-time notifications for transaction events