Skip to main content
Wallet credentials can accept deposits in a currency that differs from the walletโ€™s own โ€” every arriving deposit is automatically converted into the walletโ€™s currency at the FX rate live at deposit time. Two directions:
  • Auto-onramp โ€” a fiat credential on a crypto wallet. The payer sends fiat; the wallet is credited in crypto.
  • Auto-offramp โ€” a crypto credential on a fiat wallet. The payer sends crypto; the wallet is credited in fiat.
Same-currency credentials โ€” where the credential currency matches the walletโ€™s currency โ€” remain the default and credit the wallet balance directly, with no conversion.

Create a cross-currency credential

Pass an explicit currency on POST /v1/wallets/:id/credentials that is different from the walletโ€™s currency. Currency codes are uppercase (NGN, USDC, GHS, USDT, KES, โ€ฆ).
network is validated against the credentialโ€™s own currency, not the walletโ€™s. So an NGN credential uses bank; a USDC credential uses base / ethereum / solana.

Eligibility

Cross-currency is admitted only when every condition below holds. Any failure returns a 400 with invalid_input.
  • The pair must be crypto โ†” fiat. Crypto โ†” crypto and fiat โ†” fiat are rejected.
  • Both currencies must advertise the matching direction capability:
    • Auto-onramp requires canOnramp on the credential currency AND on the wallet currency.
    • Auto-offramp requires canOfframp on both.
  • The credential currency must resolve to a supported currency row. An unknown code returns 404 not_found.
The set of currencies that support canOnramp / canOfframp is fixed by GlobalStack. If your walletโ€™s currency isnโ€™t eligible for a given direction, cross-currency provisioning will fail โ€” reach out to support to confirm coverage.

Deposit lifecycle

Cross-currency deposits skip the deposit.* topics entirely. The first webhook you receive is conversion.created (or conversion.funds_received โ€” whichever the FX pipeline emits first for the run); the deposit terminals via the conversion.* topics: Same-currency credentials keep the original lifecycle across the deposit.* topics โ€” deposit.received on arrival, then deposit.held if a tier gate applies, then deposit.confirmed when the credit settles (or deposit.failed if it doesnโ€™t). Cross-currency credentials never fire any deposit.* topic.
Rate is locked at deposit time. The destination_amount you see on conversion.success reflects the rate as of the depositโ€™s arrival, not the rate as of the auto-conversion attempt.

Fees

Auto-conversion fees follow the FX conversion contract: the destination amount is net of fees, and the fee breakdown is on the conversion.* webhook payloads. See failure reasons for the codes surfaced on a failed conversion.

Recovery on failure

If conversion.failed (or conversion.returned) fires, funds stay on the credentialโ€™s own balance โ€” no auto-retry (FX failures are typically structural, not transient). Contact GlobalStack support to drain the parked funds; ops will run a fresh conversion at the then-current rate. Once the drain lands, the wallet balance is credited and the credential balance clears.
There is no merchant-facing โ€œretryโ€ or โ€œrefundโ€ endpoint in v1. Recovery goes through GlobalStack support.

When to use auto-conversion

Reach for auto-conversion when your payers want to pay in a familiar local currency but your treasury runs in a different one โ€” the classic example is accepting NGN bank deposits into a USDC treasury without a manual conversion step per deposit. If your payers already hold funds in the same currency as your wallet, stick with same-currency credentials: they credit the wallet directly with no FX exposure.