Pave Bank
Crypto

Create Digital Asset Exchange

Admin Access Required

Use this API to create a Digital Asset Exchange. This API will respond with a Transaction ID, use this Transaction ID in the GET Transaction endpoint to get the crypto quote (e.g. rate and amounts). No funds move until the order is confirmed.

Availability: This API is currently available in sandbox and is targeted for production on 10 August 2026. Reach out to us to have it enabled for your account.

Digital Asset Exchange Flow

A Digital Asset Exchange follows a two-step quote/confirm pattern:

  1. Create order (POST /v1/crypto/order) — returns a live, time-boxed quote (rate and amounts). No funds move.
  2. Review quote (GET /v1/transactions/:transactionID) — retrieve the order to review the quote before confirming.
  3. Confirm order (PUT /v1/crypto/order) — confirms the quote and triggers execution and settlement.

The quote expires automatically if it is not confirmed before quote_valid_until.

Example POST to create a Digital Asset Exchange (quote)

curl -X POST 'https://developer-api-staging.pavebank.dev/v1/crypto/order' \
  --header 'Content-Type: application/json' \
  --header 'Idempotency-Key: <YOUR_IDEMPOTENCY_KEY>' \
  --header 'Authorization: Bearer <YOUR_BEARER_TOKEN>' \
  --data '{
  "side": "sell",                                        // "buy" or "sell", from the customer perspective
  "priority": "instant",                                 // "instant"
  "rail": "rfq",                                         // "rfq"
  "symbol": "USDT-USD",
  "base_asset": "ETHEREUM-USDT",
  "quote_asset": "USD",
  "requested_asset": "ETHEREUM-USDT",                    // The asset the requested_amount is denominated in
  "requested_amount": "100000000",
  "customer_pays_account_id": "account_<Example_USDT_Account>",
  "customer_receives_account_id": "account_<Example_USD_Account>",
  "description": "Sell 100 USDT",
  "additional_details": ""
}'

This API will respond with a transaction_id

{
  "transaction_id": "transaction_tvc28vj7eul6gtymqcl9nm6xhl"
}

Use this transaction_id in the GET Transaction endpoint to get the Digital Asset Exchange. This is a quote and not an executed trade. If you would like to execute the trade, use the Digital Asset Exchange PUT API before the quote expires.

It might take several seconds for the Transaction to be able to be retrieved by this API. If you get a 404 error, please try again in 5-15 seconds.

// Example transaction response after using transaction_tvc28vj7eul6gtymqcl9nm6xhl

{
  "transaction_id": "transaction_tvc28vj7eul6gtymqcl9nm6xhl",
  "status": "in_progress",
  "timestamp": "2026-07-13T07:19:31.969776Z",
  "type": "CRYPTO-TRADE-V2",
  "customer_type": "Exchange (Digital asset)",
  "crypto_trade_v2": {
    "transaction_id": "transaction_tvc28vj7eul6gtymqcl9nm6xhl",
    "customer_legal_entity_id": "legalentity_<LEGAL_ENTITY_ID>",
    "initiated_by": {
      "id": "user_<YOUR_USER_ID>",
      "first_name": "Local",
      "last_name": ""
    },
    "checked_by": null,
    "checked_at": null,
    "priority": "instant",
    "side": "sell",
    "rail": "rfq",
    "symbol": "USDT-USD",
    "base_asset": "ETHEREUM-USDT",
    "quote_asset": "USD",
    "customer_pays_account_id": "account_<Example_USDT_Account>",
    "customer_pays_account_name": "ETH USDT 02",
    "customer_pays_account_iban": "",
    "customer_pays_account_wallet_address": "0x54138299990c0F2F44DD58808b69EcFfCfdba508",
    "customer_receives_account_id": "account_<Example_USD_Account>",
    "customer_receives_account_name": "First USD",
    "customer_receives_account_iban": "<RECEIVES_ACCOUNT_IBAN>",
    "customer_receives_account_wallet_address": "",
    "customer_requested_asset": "ETHEREUM-USDT",
    "customer_requested_amount": "100000000",
    "customer_pays_asset": "ETHEREUM-USDT",     // What the customer pays on confirmation
    "customer_pays_amount": "100000000",
    "customer_receives_asset": "USD",           // What the customer receives
    "customer_receives_amount": "9957",
    "customer_rate": "0.9957155299663593",      // Quoted rate, expressed as Base/Quote
    "quote_valid_until": "2026-07-13T07:24:31.928134Z", // Confirm before this time or the quote expires
    "quote_confirmed_at": null,
    "description": "Sell 100 USDT",
    "additional_details": "",
    "document_ids": [],
    "transaction_hash": "",
    "customer_pays_network_fee_asset": "",
    "customer_pays_network_fee_amount": null,
    "customer_pays_network_fee_account_id": "",
    "created_at": "2026-07-13T07:19:31.928134Z",
    "updated_at": "2026-07-13T07:19:31.928134Z"
  }
}

The quote will automatically expire if the order is not confirmed before quote_valid_until.

POST
/v1/crypto/order

Authorization

AuthorizationRequiredBearer <token>

Enter your token in the format: Bearer {token}

In: header

Request Body

application/jsonOptional
sideRequiredstring

Trade direction from the customer perspective: "buy" or "sell".

Value in: "buy" | "sell"
priorityRequiredstring

Supported values are "instant" only. Drives how quickly settlement is dispatched.

Value in: "instant"
railRequiredstring

The rail the trade flows through: "rfq".

Value in: "rfq"
symbolRequiredstring

The trading pair symbol, e.g. "USDT-USD".

base_assetRequiredstring

The currency in which the amount is made (e.g. USD, EUR, SGD)

quote_assetRequiredstring

The currency in which the amount is made (e.g. USD, EUR, SGD)

requested_assetRequiredstring

The currency in which the amount is made (e.g. USD, EUR, SGD)

requested_amountRequiredstring

The amount of money. Our API expect amount values to be in minor units - the smallest unit of a currency depending on the number of decimals. For example, USD has two decimals. So $10 is represented by 1000. JPY has no decimals, so ¥10 is 10.

customer_pays_account_idRequiredstring

Account the customer pays from. Must be owned by your legal entity.

customer_receives_account_idRequiredstring

Account the proceeds are delivered to. Must be owned by your legal entity.

descriptionstring
additional_detailsstring

Header Parameters

Idempotency-KeyRequiredstring

Response Body

Success response

transaction_idRequiredstring
curl -X POST "https://developer-api-staging.pavebank.dev/v1/crypto/order" \
  -H "Idempotency-Key: string" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "side": "buy",
    "priority": "instant",
    "rail": "rfq",
    "symbol": "string",
    "base_asset": "string",
    "quote_asset": "string",
    "requested_asset": "string",
    "requested_amount": "string",
    "customer_pays_account_id": "string",
    "customer_receives_account_id": "string",
    "description": "string",
    "additional_details": "string"
  }'
{
  "transaction_id": "string"
}