Pave Bank
Transfer

Create Digital Asset Transfer

Admin Access Required

Use this API to create an outgoing Digital Asset Transfer intent. This API validates the transfer and holds it as an intent, returning a Transaction ID. No funds move until the intent is confirmed via the PUT endpoint.

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 Transfer Flow

Sending a digital asset out of a segregated wallet follows a two-step intent/confirm pattern:

  1. Create intent (POST /v1/transfer/segregated-wallet) — validates the transfer and holds it at intent_created. No funds move.
  2. Review intent (GET /v1/transactions/:transactionID) — retrieve the transaction to review the estimated fees before confirming.
  3. Confirm intent (PUT /v1/transfer/segregated-wallet) — triggers execution (approval → risk assessment → on-chain transfer).

The intent expires automatically if it is not confirmed within 10 minutes.

Example POST to create a Digital Asset Transfer intent

curl -X POST 'https://developer-api-staging.pavebank.dev/v1/transfer/segregated-wallet' \
  --header 'Content-Type: application/json' \
  --header 'Idempotency-Key: <YOUR_IDEMPOTENCY_KEY>' \
  --header 'Authorization: Bearer <YOUR_BEARER_TOKEN>' \
  --data '{
  "source_account_id": "account_<Example_Segregated_Wallet_Account>",
  "destination_address": "0x54138299990c0F2F44DD58808b69EcFfCfdba508",
  "amount": "1200000",
  "asset": "ETHEREUM-USDT",
  "fee_level": "MEDIUM",                                 // "LOW", "MEDIUM" or "HIGH"
  "additional_details": "invoice 123"
}'

This API will respond with a transaction_id

{
  "transaction_id": "transaction_viy22bn5gcdfqbkm9ghkaj8cv0"
}

Use this transaction_id to confirm the transfer via the Confirm Digital Asset Transfer endpoint, or to query the intent via the GET Transaction endpoint. This is an intent and not an executed transfer.

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.

The GET Transaction response holds the transfer at intent_created with the estimated service fee and network fee. The estimated_fee_* and estimated_network_fee_* fields let you review the cost before confirming.

// Example transaction response after using transaction_viy22bn5gcdfqbkm9ghkaj8cv0

{
  "transaction_id": "transaction_viy22bn5gcdfqbkm9ghkaj8cv0",
  "status": "intent_created",
  "timestamp": "2026-07-15T09:00:00.160371Z",
  "type": "SEGREGATED-WALLET-OUTGOING",
  "customer_type": "Digital asset transfer (Segregated wallet)",
  "segregated_wallet_outgoing": {
    "asset": "ETHEREUM-USDT",
    "amount": "1200000",
    "amount_usd": "0",
    "description": "invoice 123",
    "document_ids": [],
    "initiated_by": {
      "id": "user_<YOUR_USER_ID>",
      "first_name": "Local",
      "last_name": ""
    },
    "checked_by": null,
    "checked_at": null,
    "from_account_name": "ETH USDT 02",
    "from_account_id": "account_<Example_Segregated_Wallet_Account>",
    "from_address": "0x54138299990c0F2F44DD58808b69EcFfCfdba508",
    "from_legal_entity_id": "legalentity_<LEGAL_ENTITY_ID>",
    "from_legal_entity_name": "Cute Cat Pte Ltd",
    "from_bank_name": "Pave Bank",
    "from_bank_bic": "PAVEGE22",
    "to_account_id": "",
    "to_account_name": "",
    "to_address": "0x54138299990c0F2F44DD58808b69EcFfCfdba508", // The destination_address
    "to_legal_entity_id": "",
    "to_legal_entity_name": "External Wallet",
    "tx_hash": "",                                       // Populated once the transfer is broadcast
    "network_fee": "0",
    "network_fee_asset": "",
    "network_fee_account_id": "account_<Network_Fee_Account>",
    "estimated_fee_asset": "USD",                        // Estimated service fee
    "estimated_fee_amount": "250",
    "estimated_network_fee_asset": "ETHEREUM-ETH",       // Estimated on-chain network fee
    "estimated_network_fee_amount": "861256215659520",
    "fee_amount": "0",
    "fee_asset": "USD",
    "fee_account_id": "account_<Fee_Account>",
    "intent_valid_until": "2026-07-15T09:10:00Z",        // Confirm before this time or the intent expires
    "initiated_at": "2026-07-15T09:00:00.210572Z",
    "processed_at": null,
    "executed_at": null
  }
}

Confirm the intent before intent_valid_until to execute the transfer — see Confirm Digital Asset Transfer.

POST
/v1/transfer/segregated-wallet

Authorization

AuthorizationRequiredBearer <token>

Enter your token in the format: Bearer {token}

In: header

Request Body

application/jsonOptional
source_account_idRequiredstring

The digital asset account the funds are sent from.

destination_addressRequiredstring

The external blockchain address to send the digital asset to. Validated against the asset's network.

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.

assetRequiredstring

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

fee_levelRequiredstring

Network fee level for the on-chain transfer: "LOW", "MEDIUM" or "HIGH".

Value in: "LOW" | "MEDIUM" | "HIGH"
additional_detailsstring

Header Parameters

Idempotency-KeyRequiredstring

Response Body

Success response

transaction_idRequiredstring
curl -X POST "https://developer-api-staging.pavebank.dev/v1/transfer/segregated-wallet" \
  -H "Idempotency-Key: string" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "source_account_id": "string",
    "destination_address": "string",
    "amount": "string",
    "asset": "string",
    "fee_level": "LOW",
    "additional_details": "string"
  }'
{
  "transaction_id": "string"
}