Balance
Your balance is one number per currency — available plus pending — netted across every provider that processed your volume. This page explains what each bucket means, what moves money between them, and why the number can go negative.
Available vs pending
Every captured payment passes through two buckets on its way to your bank account:
| Bucket | Meaning | Enters when | Leaves when |
|---|---|---|---|
pending |
Captured funds the providers haven't settled to Finscale yet — a claim, not cash. | A payment is captured (gross amount). | The provider settles the line — net of fees, it moves to available. |
available |
Settled funds ready for payout. | A settlement batch lands (see reconciliation). | A payout sends it to your bank — or a refund / dispute debits it. |
The split already absorbs per-provider settlement timing. Cards from one provider may settle a day before direct debits from another — you never see four provider statements, just money that has settled and money that hasn't. How long each method sits in pending is a property of its rail: see the funding schedule.
GET /v1/balance
One read-only endpoint, no parameters. Amounts are integer minor units; one array entry per currency you've processed:
curl https://api.finscale.dev/v1/balance \
-H "Authorization: Bearer sk_test_51FinscaleDemo…"
{
"object": "balance",
"available": [
{ "amount": 1914190, "currency": "EUR" },
{ "amount": 402100, "currency": "USD" }
],
"pending": [
{ "amount": 68400, "currency": "EUR" }
],
"livemode": false
}
Reading this account: €19,141.90 has settled in EUR and will leave with the next payout; €684.00 more is captured but still with the providers; $4,021.00 is available in USD and pays out separately — payouts never mix currencies (unless you've opted into consolidation, per multicurrency). Test mode (sk_test_) has its own balance, marked "livemode": false, funded by test payments.
What moves the balance
| Movement | Bucket | Direction | Signal |
|---|---|---|---|
| Capture succeeds | pending | + gross | payment.succeeded |
| Provider settles a line | pending → available | net of fees | settlement.report.ready |
| Refund | available | − amount | refund.succeeded |
| Dispute opens | available | − disputed amount (held) | dispute.created |
| Dispute won | available | + held amount returned | dispute.closed |
| Reserve hold / release | outside available | see reserves | dashboard |
| Payout | available | − payout amount | GET /v1/payouts |
Two things are deliberately not in the balance: authorized-but-uncaptured amounts (an authorization hold is the issuer's earmark, not your money yet) and reserved funds (settled, but held under your reserve terms — they rejoin available when released).
Negative balances
available can go below zero. Refunds and dispute debits don't bounce — if you refund more than you've settled (a heavy refund day, a young account with most funds still pending), the debit lands and the bucket goes negative.
What happens then:
- Payouts pause. There is nothing to pay out; the next payout runs when
availableis positive again on a payout day. - Incoming settlements net against it. New captures settle into the negative bucket and pull it back up — no action needed in the common case.
- Refunds keep working. Finscale doesn't block refunds on a temporarily negative balance; sustained negative balances are a conversation with your Finscale representative, not an API error.
Error scenarios
GET /v1/balance itself can only fail in the standard ways — authentication_error (401) for a bad key, rate_limit_error (429) if you poll too hard. The interesting failures are downstream:
| Situation | What you observe | What to do |
|---|---|---|
| Payout fails (closed account, rejected transfer) | Payout status: failed; funds return to available — never lost in transit. |
Fix the bank details; the payout retries. See payouts. |
| Balance looks "wrong" intraday | pending and available move at settlement boundaries, not continuously. |
Reconcile against the day's settlement batch, not against a live snapshot. |
| Currency missing from an array | No activity in that currency yet — empty buckets are omitted, not zero-filled. | Treat absence as zero in your code. |
Related
- Settlement & payouts — the schedule that turns
availableinto a bank transfer. - Ledger — the postings both buckets are sums over.
- Reconciliation — proving the movements line by line.
- Refunds — the most common reason
availabledips.