Remittance and crypto

Choose the recipe for paying a local bank account or mobile wallet abroad, or for sending, moving and converting stablecoins.

These recipes pay recipients outside the US, EU and UK bank rails. They cover local bank accounts and mobile wallets in Africa, the current state of bank payouts in Latin America and Asia, and stablecoin payouts. Each recipe lists what to collect, the call that tells you what is required, the full requests and responses, and the errors the API returns when something is wrong.

For US ACH, wire and RTP, SWIFT, SEPA and Faster Payments, see Bank payouts.

A money example. Ada in Houston sends 250.00 USD to her brother's bank account in Lagos. Your plan charges a 1.50 USD fee. At 1,530.00 NGN per USD, the transfer response prices 382,500.00 NGN for him (local_amount). Her account pays 251.50 USD, and transfer.status.completed arrives when his bank confirms the payment.

Choose your recipe

The recipient has Status Recipe
A bank account in Nigeria (NGN) Not yet available Pay a bank account in Nigeria
A mobile wallet or bank account in Ghana (GHS) Not yet available Send money to Ghana
A mobile wallet or bank account in Kenya (KES) Not yet available Pay a mobile wallet in Kenya
A mobile wallet in Rwanda, Zambia, Uganda or the Republic of the Congo Available on the operator rows MTN MoMo Rwanda, MTN MoMo Zambia, MTN MoMo Uganda and MTN MoMo Congo Pay a mobile wallet in Rwanda, Uganda, Zambia or Congo
A mobile wallet in Côte d'Ivoire or Benin (XOF) Available on MTN MoMo Cote d'Ivoire and MTN MoMo Benin. Other operators are Not yet available Pay a mobile wallet in CFA francs
A bank account in Mexico, Brazil, Colombia, India or Hong Kong Not yet available Pay a bank in Latin America or Asia
A USDC or USDT address on the same network as your wallet Available Send stablecoins to an outside wallet
A USDC address on another network Not yet available Send USDC to another network
The other stablecoin, in another wallet of the same customer Available; preview the price first Convert USDT and USDC
A transfer came back paused, failed, or stays pending Get a stuck remittance moving

"Not yet available" means Gravv has not confirmed the route for every business. Ask support to confirm that it is on for your business before you promise it to users. The full list is on Payments and supported countries.

Two questions decide a local payout

  1. Are the country and currency open? GET /v1/transfer/supported-countries lists the countries the API knows, not the routes that are open. Only the transfer call tells you. A closed route returns transfers to XX/CCC are not available at this time.
  2. Did you pick the bank or wallet operator from GET /v1/external-accounts/institutions? The payee must carry that institution_id. Without it, the transfer returns this payee is not yet set up for transfers — please contact support to complete its setup.

Rules every recipe relies on

  • Send every request to https://api.gravv.xyz with the Api-Key header. A key that starts with grvSec_sandbox_ reaches sandbox.
  • Every POST needs its own new Idempotency-Key (except verify and the webhook resend). Gravv replays a 4xx response for 24 hours under its key, so use a new key after you fix a request.
  • Send amounts as strings with at most 2 decimal places, such as "250.00".
  • For local payouts, leave rail out. Never send "wire", which means a US domestic wire.
  • Send source.id and customer_id as the UUIDs the API returned.
  • HTTP 200 does not always mean the money is on its way. Read transfer_status, which is pending or paused.
  • Payee errors carry no code, so match on the start of the message. Some transfer errors carry a code.
  • A failed transfer returns the amount and fee to the source, as a transfer_refund transaction.
  • There is no rate lock. Gravv takes the rate when you send, and local_amount in the response is the amount priced for the recipient. POST /v1/fx/quote is for FX orders only.
  • Deduplicate webhooks on the body's event_id, never on X-Event-ID.
Was this page helpful?