Multi-currency ledgers
Updated 7 September 20263 min read
On this page
One ledger can hold accounts in several currencies. Ledgerline never mixes them in a single balance: each account has one currency and each transaction balances separately per currency. This keeps every number auditable and avoids hidden exchange-rate assumptions.
Supported currencies
| Code | Currency | Minor units |
|---|---|---|
USD |
US dollar | 2 |
EUR |
Euro | 2 |
GBP |
Pound sterling | 2 |
CAD |
Canadian dollar | 2 |
AUD |
Australian dollar | 2 |
SGD |
Singapore dollar | 2 |
CHF |
Swiss franc | 2 |
JPY |
Japanese yen | 0 |
Which currencies you can pay out in depends on the available rails. USD, EUR and GBP have both batch and instant rails. The other currencies can be held and converted on every plan, and paid out by international wire on Growth and Scale.
Amounts and minor units
Every amount in the API is an integer in the currency's minor unit. For two-decimal currencies, multiply by 100.
| Display | Currency | API amount |
|---|---|---|
| $1,250.00 | USD |
125000 |
| €42.50 | EUR |
4250 |
| ¥3,000 | JPY |
3000 |
The Japanese yen has no minor unit, so its amounts are whole yen. Never send decimals or strings. Passing 12.5 fails with parameter_invalid.
One currency per account
An account's currency is fixed when you create it and every entry against it must match, otherwise the request fails with currency_mismatch. To hold euros and dollars for the same customer, open two accounts.
curl https://api.ledgerline.dev/v1/accounts \
-H "Authorization: Bearer $LEDGERLINE_API_KEY" \
-H "Idempotency-Key: b7d1a4e6-92c3-4f15-8e0b-3a6c9d2f5e18" \
-d ledger_id=led_01J9QK3ZV8 \
-d name="Wallet: Acme Freight (EUR)" \
-d currency=EUR \
-d normal_balance=credit
Balancing per currency
A transaction balances when debits equal credits in every currency it touches. A transaction that moves only dollars is balanced in dollars. A transaction that touches dollars and euros must balance in both.
You cannot balance a dollar debit against a euro credit by putting an exchange rate on the entries. That is what a conversion is for.
Converting between currencies
A conversion is a transaction made of two balanced legs routed through a system FX clearing account:
- Debit your USD account and credit the clearing account in USD.
- Debit the clearing account in EUR and credit your EUR account.
Both legs are booked atomically, so a conversion either happens completely or not at all. You do not build these entries yourself. Request a quote and book the conversion; see FX quotes and conversions.
Reporting across currencies
There is no combined total. To show a company position in one currency, read the balances per currency and convert them with a rate of your choosing. Statements keep each currency separate and show conversions with the rate used. See Statements and exports.
Payouts in another currency
A payout is made in the currency of its source account. To pay a supplier in euros, hold euros first by converting, then send a payout from the euro account over sepa or sepa_instant. Ledgerline does not convert implicitly during a payout, since an unexpected rate is the kind of surprise a ledger exists to prevent.
Limits
Per-payout and daily limits are expressed in USD. For other currencies Ledgerline applies the equivalent at the rate of the previous 00:00 UTC. See Limits and quotas.
Common mistakes
Warning
Sending amount as a decimal string such as "12.50" is rejected. Always convert to an integer of minor units in your own code, and test the yen path, since it is the one place where * 100 is wrong.
- Creating one account and expecting it to hold several currencies.
- Posting two legs of a conversion by hand with mismatched amounts. Use a quote instead.
- Forgetting that a
GETbalance is per account, not per ledger.