Amounts & assets

How money is represented across the API: you price in USD, we settle in Bitcoin, and every amount is exact.

Settlement asset

The API settles in Bitcoin. Every money-bearing object includes an asset field, which is currently always BTC. It exists so your integration is ready for additional assets when they ship — always read the asset rather than assuming BTC.

Satoshis, not decimals

Bitcoin amounts are returned as integers in satoshis (the smallest unit — 1 BTC = 100,000,000 sats). Integers avoid floating-point rounding errors entirely. Convert only for display:

// amount_sats -> BTC for display
const btc = amount_sats / 100_000_000
// 132099 sats -> "0.00132099 BTC"
const label = btc.toFixed(8) + " BTC"

Pricing in USD

When you create an invoice or payment link, you specify the price in amount_usd. At creation, we fetch the live BTC rate, convert to satoshis, and lock that amount into the invoice. The USD figure used is returned as amount_usd_quote for your records.

  • The satoshi amount is what the customer pays — it's fixed once the invoice exists.
  • The amount_usd_quote reflects the rate at creation time and is informational.
  • Balances also carry a best-effort confirmed_usd valuation at the time of the request.

When the price feed is down

Creating an invoice requires a live BTC rate. If the price feed is momentarily unavailable, the request fails with 503 price_unavailable rather than guessing a rate. Retry shortly. See Errors.

USD values can be null

Any USD field — amount_usd_quote, confirmed_usd, amount_usd_at_receipt — may be nullif a valuation wasn't available at that moment. Always handle the null case; the satoshi amount is the source of truth.