Skip to main content
This guide shows you how to send money - converting stablecoins (like USDC) into fiat currency (like USD) and sending it to a user’s bank account. ⏱️ Time to complete: 5-10 minutes
Sandbox Environment: All examples in this guide use the sandbox environment (https://sandbox.hifibridge.com). Transactions are simulated - no real money moves. When you’re ready for production, replace the sandbox URL with the production endpoint.

Prerequisites

Before sending money, ensure you have:
  • User created with Terms of Service accepted
  • KYC completed and approved for the target rail
  • Offramp Account set up for receiving fiat
  • API keys from the Dashboard
If you haven’t set up users, KYC, or accounts yet, see the Quickstart Guide for step-by-step instructions.

How Sending Money Works

Sending money is a two-step process:
  1. Create offramp request - Get a quote for the conversion
  2. Accept the quote - Execute the offramp

Step 1: Create Offramp Request

Create an offramp request using the Create an offramp endpoint: Request:
curl --request POST \
     --url https://sandbox.hifibridge.com/v2/offramps \
     --header 'accept: application/json' \
     --header 'authorization: Bearer YOUR_API_KEY' \
     --header 'content-type: application/json' \
     --data '
{
  "source": {
    "currency": "usdc",
    "chain": "POLYGON",
    "userId": "32051b2f-0798-55a7-9c42-b08da4192c97",
    "amount": 1
  },
  "destination": {
    "currency": "usd",
    "accountId": "583eb259-e78b-4f0c-a4b5-a8957876fa6f",
    "userId": "32051b2f-0798-55a7-9c42-b08da4192c97"
  },
  "requestId": "b08e27be-c086-4b84-a321-307ed9f265e1"
}
'
Request Fields:
requestId
string
required
Unique identifier (UUID) for this offramp request.
source
object
required
Source of the offramp (crypto side).
destination
object
required
Destination of the offramp (fiat side).
Response:
{
  "transferType": "OFFRAMP",
  "transferDetails": {
    "id": "b838908b-95d0-4ebb-a2c6-8f0c142bcdd7",
    "requestId": "b08e27be-c086-4b84-a321-307ed9f265e1",
    "createdAt": "2025-09-26T03:15:57.766Z",
    "updatedAt": "2025-09-26T03:15:58.463Z",
    "status": "OPEN_QUOTE",
    "failedReason": null,
    "error": null,
    "errorDetails": null,
    "source": {
      "userId": "32051b2f-0798-55a7-9c42-b08da4192c97",
      "chain": "POLYGON",
      "currency": "usdc",
      "amount": 1,
      "walletAddress": "0x1b932E54e77Aeb698144550d5a493Ea99E20Daa7",
      "user": {
        "email": "[email protected]",
        "lastName": "Doe",
        "firstName": "John",
        "businessName": null
      }
    },
    "destination": {
      "userId": "32051b2f-0798-55a7-9c42-b08da4192c97",
      "amount": 1,
      "currency": "usd",
      "user": {
        "email": "[email protected]",
        "lastName": "Doe",
        "firstName": "John",
        "businessName": null
      },
      "accountId": "583eb259-e78b-4f0c-a4b5-a8957876fa6f"
    },
    "receipt": {
      "transactionHash": null
    },
    "developerFee": null,
    "quoteInformation": {
      "rate": "1.00",
      "sendNet": {
        "amount": "1.00",
        "currency": "usdc"
      },
      "sendGross": {
        "amount": "1.00",
        "currency": "usdc"
      },
      "receiveNet": {
        "amount": "1.00",
        "currency": "usd"
      },
      "receiveGross": {
        "amount": "1.00",
        "currency": "usd"
      },
      "expiresAt": "2025-09-27T03:15:58.112Z"
    },
    "depositInformation": []
  }
}
Response Fields:
transferDetails.id
string
Unique offramp transaction ID. Save this - you’ll need it to accept the quote and check status.
transferDetails.status
string
Current status: OPEN_QUOTE means you have an active quote that needs to be accepted.
transferDetails.quoteInformation
object
Critical: Contains the conversion rate and amounts. Review this before accepting.
Quote Expiration: Quotes typically expire after 15-30 minutes. If your quote expires before you accept it, you’ll need to create a new offramp request to get a fresh quote with updated rates.

Step 2: Accept the Quote

After reviewing the quote, accept it to start the offramp process using the Accept Quote endpoint: Request:
curl --request POST \
     --url https://sandbox.hifibridge.com/v2/offramps/b838908b-95d0-4ebb-a2c6-8f0c142bcdd7/quote/accept \
     --header 'accept: application/json' \
     --header 'authorization: Bearer YOUR_API_KEY'
Response:
{
  "transferType": "OFFRAMP",
  "transferDetails": {
    "id": "b838908b-95d0-4ebb-a2c6-8f0c142bcdd7",
    "status": "CRYPTO_INITIATED",
    "quoteInformation": {
      "rate": "1.00",
      "sendNet": {
        "amount": "1.00",
        "currency": "usdc"
      },
      "receiveNet": {
        "amount": "1.00",
        "currency": "usd"
      }
    }
  }
}
Quote accepted! The status has changed to CRYPTO_INITIATED.

Monitor Status

Status Progression:
  1. OPEN_QUOTE - Quote generated, waiting for acceptance
  2. CRYPTO_INITIATED - Processing crypto conversion
  3. CRYPTO_PENDING - Waiting for blockchain confirmation
  4. FIAT_PENDING - Converting to fiat
  5. COMPLETE - Fiat sent to bank account
Monitor via:
  • Polling: Call Retrieve an offramp with the transaction ID
  • Webhooks: Subscribe to OFFRAMP.UPDATE events for real-time notifications
In production, sending money may take 1-3 business days for the fiat to arrive in the user’s bank account. In sandbox, completion is typically instant.