Skip to content
JuicePay

JuicePay documentation

Create account

Documentation

Assets and stablecoins

How assets are identified, priced, and converted at settlement.

An asset on JuicePay is an asset, not a contract address. You refer to USDC; we handle that it is a different contract on every network, in some cases several.

The asset namespace#

Assets use short tickers within your account namespace. The common set is standardised:

TickerNamePairs supported
USDCUSD CoinAll stablecoin pairs
USDTTether USDAll stablecoin pairs
DAIDaiAll stablecoin pairs
EURCEuro CoinEUR stable pairs
XSGDStraitsX SGDSGD stable pairs
NGNXNaira reference stablecoinNGN pairs
ETHEtherMajors
BTCBitcoinMajors
SOLSolanaMajors

Regional stablecoins are listed separately because their liquidity is thinner and their peg mechanics differ. JuicePay will quote them, but quotes on thin pairs are valid for shorter windows.

Decimals#

Send and receive decimal strings. Never floats.

json
{ "amount": "125.00" }

Inbound values are returned with six decimal places of precision regardless of the underlying token's precision, so your parser sees a consistent shape:

json
{ "settled_amount": "125.000000" }

Some assets have far fewer decimals onchain than six — spending those requires whole-unit amounts, and JuicePay will reject a fractional request rather than silently rounding it.

Conversion and pricing#

When an inbound payment arrives in an asset you do not want to hold, you can convert at settlement time:

json
{
  "amount": "125.00",
  "asset": "USDC",
  "settle_to": {
    "asset": "EURC",
    "quote_ttl": 30
  }
}

The conversion executes as a separate, visible step. You get a quote object attached to the payment intent with the rate and the venues that contributed to it, so the rate is never a mystery.

Pegs are not guarantees#

Every stablecoin in this namespace is an obligation of an issuer, and those obligations have failed before. JuicePay surfaces issuer health signals in the dashboard and lets you cap exposure per asset:

json
{
  "risk_limits": {
    "max_exposure_per_asset": "500000.00",
    "blocklist": ["NGNX"],
    "rebalance_to": "USDC"
  }
}

If an asset trips a configured limit, new conversions into it are refused while existing balances remain withdrawable.