Skip to content
Ledgerline Help

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:

  1. Debit your USD account and credit the clearing account in USD.
  2. 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 GET balance is per account, not per ledger.