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.
bash
curl -X GET 'https://api.cadanapay.com/v1/platform/disbursements' \
  -H 'Authorization: Bearer YOUR_API_KEY'

Query Parameters

ParameterTypeRequiredDescription
startDatestringNoStart of date range (ISO 8601, e.g. 2026-01-01). Defaults to 7 days ago.
endDatestringNoEnd of date range (ISO 8601, e.g. 2026-02-01). Defaults to now.
typestringNoComma-separated transaction types to include (see Transaction Types).
statusstringNoFilter by status: SUCCESS, FAILED, INITIATED, PROCESSING, ROUTED.

Response Structure

{
  "data": [ ... ],
  "cursor": {
    "previous": null,
    "next": "eyJsYXN0S2V5Ijp7InBrIjoiLi4uIn19"
  }
}

Transaction Object Fields

FieldTypeDescription
idstringUnique transaction identifier
tenantKeystringIdentifies which business this transaction belongs to. Use this to group transactions per business.
statusstringTransaction status: SUCCESS, FAILED, INITIATED, PROCESSING, ROUTED
referenceIdstringExternal reference. Payroll transactions from the same run share the same referenceId.
descriptionstringHuman-readable description (e.g. “January 2026 Payment Dundies”)
typestringTransaction type (see Transaction Types)
fxRatenumberFX rate applied. Present only for cross-currency transactions.
paymentMethodstringDelivery method: bank, momo, wallet, ach, card, proxy
paymentDetailsobjectFull payment method details (bank account, mobile money, wallet, ACH, card info)
personIdstringEmployee or contractor ID. Present only on payroll transactions.
userIdstringWallet/user account ID. Present on wallet-based transactions. For payroll, only present when payment is delivered to a wallet.
userNamestringRecipient name
amountobjectAmount the recipient receives, in the destination currency
sourceAmountobjectCost in the source currency, before fees
feeAmountobjectFees charged, in the source currency
totalAmountobjectTotal debited from sender: sourceAmount + feeAmount
fxRevenueShareobjectRevenue earned from FX spread (see Revenue Share)
feeRevenueShareobjectRevenue earned from fees (see Revenue Share)
totalRevenueShareobjectCombined total revenue share
createdTimestampstringWhen the transaction was created
lastUpdatedTimestampstringWhen the transaction was last updated
All amount fields follow this structure:
{
  "value": "100.00",
  "currency": "USD"
}

Transaction Types

TypeDescription
PAYROLLPayment from a business to an employee or contractor as part of a payroll run
PAYOUTOutbound transfer from a user’s wallet to an external bank, mobile money, card, or other destination
PAYROLL_FEEProcessing fee for a payroll run (see Payroll Fee & Invoice Details)
CARD_MAINTENANCE_FEERecurring maintenance fee for a virtual card
CARD_CREATION_FEEOne-time fee for creating a virtual card
STOCK_BUYStock purchase transaction
STOCK_SELLStock sale transaction
INTERESTInterest earned or charged

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.
[
  { "id": "...", "tenantKey": "tbl28153208", "type": "PAYROLL" },
  { "id": "...", "tenantKey": "tbl89195039", "type": "PAYROLL" },
  { "id": "...", "tenantKey": "cad35916961", "type": "PAYOUT" }
]

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:
{
  "id": "a2f47c91-3b8e-4d12-9c6a-7e5d1f8b2a40",
  "tenantKey": "tbl89195039",
  "status": "SUCCESS",
  "referenceId": "9c4829a8-0177-4dad-a0d8-e4f8fc42276a",
  "description": "January 2026 Payment Dundies",
  "type": "PAYROLL",
  "fxRate": 5.812,
  "paymentMethod": "bank",
  "personId": "0a938505-ae3f-44a2-9793-196a4a11e6f2",
  "userName": "Maria Santos",
  "amount": { "value": "5812.00", "currency": "BRL" },
  "sourceAmount": { "value": "1000.00", "currency": "USD" },
  "totalAmount": { "value": "1000.00", "currency": "USD" },
  "fxRevenueShare": { "amount": { "value": "10.00", "currency": "USD" }, "rate": 1 },
  "totalRevenueShare": { "value": "10.00", "currency": "USD" }
}
userId is absent here because the payment was delivered to an external bank account, not a wallet.
Example — same-currency payroll payment via wallet:
{
  "id": "c6250a16-eb63-41de-a952-8122d305ebbf",
  "tenantKey": "tbl12101631",
  "status": "SUCCESS",
  "referenceId": "7b82d74e-4ad5-4fbf-af9c-a0f11b224c7a",
  "description": "January 2026 Payment PS",
  "type": "PAYROLL",
  "paymentMethod": "wallet",
  "userId": "060e3aeb-4a9d-4a90-aff5-17f8d69635ce",
  "personId": "8ab2ba37-3c37-485d-9af9-122d11c96bf9",
  "userName": "Reed Maygone",
  "amount": { "value": "1000.00", "currency": "USD" },
  "sourceAmount": { "value": "1000.00", "currency": "USD" },
  "totalAmount": { "value": "1000.00", "currency": "USD" }
}
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:
{
  "id": "c5bcdbba-52a2-44a4-8dda-2b03d47a1af1",
  "tenantKey": "tbl28153208",
  "status": "SUCCESS",
  "type": "PAYOUT",
  "fxRate": 5.7896,
  "paymentMethod": "bank",
  "userId": "8cb1d569-5dfd-4b33-b25e-4fab0ee14251",
  "userName": "Paula Torres",
  "amount": { "value": "578.96", "currency": "BRL" },
  "sourceAmount": { "value": "100.00", "currency": "USD" },
  "feeAmount": { "value": "13.50", "currency": "USD" },
  "totalAmount": { "value": "113.50", "currency": "USD" },
  "fxRevenueShare": { "amount": { "value": "1.00", "currency": "USD" }, "rate": 1 },
  "feeRevenueShare": { "amount": { "value": "10.00", "currency": "USD" } },
  "totalRevenueShare": { "value": "11.00", "currency": "USD" }
}

Understanding Amounts

Each transaction has four amount fields that tell you the full financial picture:
FieldDescription
amountWhat the recipient receives, in the destination currency
sourceAmountCost in the sender’s currency, before fees
feeAmountFees charged, in the sender’s currency
totalAmountTotal debited from sender: sourceAmount + feeAmount

Cross-Currency Example

When a user sends USD and the recipient receives BRL:
sourceAmount:  100.00 USD   (cost before fees)
feeAmount:      13.50 USD   (fees)
totalAmount:   113.50 USD   (total debited = 100.00 + 13.50)
fxRate:        5.7896        (USD → BRL conversion rate)
amount:        578.96 BRL    (what the recipient gets: 100.00 × 5.7896)

Same-Currency Example

When both sides are in the same currency, no FX conversion applies:
sourceAmount:  1000.00 USD
feeAmount:        0.00 USD
totalAmount:   1000.00 USD
amount:        1000.00 USD   (same as source, no conversion)

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.
FieldDescription
fxRevenueShareRevenue earned from the FX spread. Contains amount (value + currency) and rate (share percentage).
feeRevenueShareRevenue earned from transaction fees. Contains amount (value + currency).
totalRevenueShareCombined total of FX and fee revenue share. Contains value and currency.
Example — transaction with both FX and fee revenue share:
{
  "fxRevenueShare": {
    "amount": { "value": "0.41", "currency": "USD" },
    "rate": 1
  },
  "feeRevenueShare": {
    "amount": { "value": "10.07", "currency": "USD" }
  },
  "totalRevenueShare": { "value": "10.48", "currency": "USD" }
}
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):
bash
curl -X GET 'https://api.cadanapay.com/v1/payrolls/9c4829a8-0177-4dad-a0d8-e4f8fc42276a' \
  -H 'Authorization: Bearer YOUR_API_KEY'
The response includes the invoiceId once the payroll is in completed status. Then use that ID to fetch the full invoice:
bash
curl -X GET 'https://api.cadanapay.com/v1/invoices/8dbaa174-b5a0-4396-8c87-77e746b50917' \
  -H 'Authorization: Bearer YOUR_API_KEY'
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:
bash
curl -X GET 'https://api.cadanapay.com/v1/invoices/8dbaa174-b5a0-4396-8c87-77e746b50917/url' \
  -H 'Authorization: Bearer YOUR_API_KEY'
Response:
{
  "fileUrl": "https://...",
  "expiresAt": 1710590400
}
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": {
    "previous": null,
    "next": "eyJsYXN0S2V5Ijp7InBrIjoiLi4uIn19"
  }
}
  • 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:
bash
curl -X GET 'https://api.cadanapay.com/v1/platform/disbursements' \
  -H 'Authorization: Bearer YOUR_API_KEY'

Reconciliation Walkthrough

Step 1: Fetch all successful transactions for the period

bash
curl -X GET 'https://api.cadanapay.com/v1/platform/disbursements' \
  -H 'Authorization: Bearer YOUR_API_KEY'
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:
tenantKeyTransaction CountTotal Debited
tbl2815320815$627.47 USD
tbl891950392$385.00 USD
tbl121016312$3,000.00 USD
cad359169616$103.55 USD

Step 3: For payroll, identify employees by personId

Filter for type: "PAYROLL" and group by personId to see how much each employee was paid:
personIdEmployee NameTotal Paid (destination)tenantKey
0a938505-...Elizabeth Wilson151.39 GHStbl89195039
00b39f7a-...Dwight Schrute5,677.18 GHStbl89195039
8ab2ba37-...Reed Maygone1,000.00 USDtbl12101631
ca49c55b-...Mahatra Ghandi2,000.00 USDtbl12101631

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.

Next Steps