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 thesourceTenantKey (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 atenantKey that identifies which business it belongs to. Group by tenantKey to produce per-business reconciliation reports.
Scope to a Single Business
PassbusinessId=<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,DEPOSITis inbound;PAYROLL_TOTALandVENDORare outbound. Don’t assume a fixed direction for every type. userId/userNameare the counterparty (the other side of the transaction), not the scoped business itself — so an item is not necessarily “a payment the business sent touserId”.- By default the per-employee
PAYROLLlegs andPAYROLL_FEErows are collapsed into the singlePAYROLL_TOTALline; pass an explicittypeto get the raw rows. Business-relevant types includePAYROLL_TOTAL,PAYROLL,PAYROLL_FEE,PAYROLL_REVERSAL,DEPOSIT,DEPOSIT_REVERSAL,VENDOR,REVENUE_SHARE_PAYOUT,REIMBURSEMENT,SUBSCRIPTION_PAYMENT, andSTATUTORY_DEPOSIT.
Paging through a business’s disbursements
Pagination is the same as the unfiltered endpoint: readcursor.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”).
userId is absent here because the payment was delivered to an external bank account, not a wallet.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 typePAYOUT, 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.
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:
Payroll Fee & Invoice Details
When a business runs payroll, a separatePAYROLL_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 aninvoiceId 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. Thecursor object tells you whether more pages are available:
cursor.next— pass as thecursorquery parameter to fetch the next pagecursor.previous— pass to go back to the previous pagenull— no more pages in that direction
Reconciliation Walkthrough
Step 1: Fetch all successful transactions for the period
Paginate through all results using thecursor.next value until it returns null.
Step 2: Group by business
Group transactions bytenantKey to build per-business ledgers:
Step 3: For payroll, identify employees by personId
Filter fortype: "PAYROLL" and group by personId to see how much each employee was paid:
Step 4: Calculate revenue share
SumtotalRevenueShare across all transactions for your platform’s total earnings. Break down further with fxRevenueShare and feeRevenueShare.
Step 5: Get payroll fee details
For anyPAYROLL_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 theformat 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