---
title: "Get the best transfer route for a move"
method: POST
path: "/value-transfer/quotes"
tags: ["value-transfer"]
---

# Get the best transfer route for a move

`POST /value-transfer/quotes`

Quotes the move against LayerZero VT and returns ONE selected route (cheapest by total USD fee) in DRE dialect, plus the losing routes as `alternatives`. No VT chainKeys and no 0xEeee… native sentinel cross the wire: chains are viem chainIds and fees arrive decoded (amount, symbol, decimals, usd). Route selection, fee decoding and protocol labelling are server side so they can change without a client release. The delivery address is bound server side to the authenticated user’s DRE smart wallet; the body’s dstWalletAddress is ignored. `userSteps` calldata and EIP-712 typed data are passed through byte for byte for the wallet to sign. A null `quote` means no route exists for this pair.

## Request body

- QuoteRequestDto
  - `srcChainId` 1 | 143 | 8453 | 42161, required — Source chainId. Must be a supported chain.
  - `dstChainId` 1 | 143 | 8453 | 42161, required — Destination chainId. Must be a supported chain.
  - `srcTokenAddress` string, required — Source token address, or the zero address (0x0…0) for the native gas token.
  - `dstTokenAddress` string, required — Destination token address
  - `srcWalletAddress` string, required — Connected external wallet.
  - `dstWalletAddress` string, required — User's DRE wallet (destination). NOTE: ignored. The backend binds the delivery address to the authenticated user's smart wallet resolved from Privy. Kept for request shape compatibility.
  - `amount` string, required — Amount in the source token's native units

## Response `201`

Selected transfer route

- QuotesResponseDto
  - `quote` TransferQuoteDto, required
    - `quoteId` string, required — Transfer id — the id used for /status and /signatures. For a `transfer` quote this is a locally-minted id that /status does not know: a same-chain send is confirmed by its receipt, not by polling.
    - `action` 'transfer' | 'bridge' | 'convert', required — Matches the holding’s action. `transfer` is a same-chain send built locally — it has no upstream route and must NOT be polled via /status. `bridge` and `convert` are VT routes and are trackable.
    - `trackable` boolean, required — Whether /status can track this transfer. False for same-chain sends — wait on the receipt instead.
    - `expiresAt` object, nullable, required
    - `route` RouteDto, required
      - `label` string, required — Human label for the winning protocol. A proper noun — rendered as-is, never translated.
      - `srcChainId` number, required
      - `dstChainId` number, required
      - `steps` RouteStepDto[], required
        - `chainId` object, nullable, required — Chain this step executes on. Null if upstream routed through a chain we do not list — cosmetic here, unlike a userStep.
        - `description` string, required
    - `amounts` AmountsDto, required
      - `srcRaw` string, required — Source amount in the source token's native units.
      - `srcUsd` string, required — USD value of the source amount.
      - `dstRaw` string, required — Expected destination amount in the destination token's native units.
      - `dstUsd` string, required — USD value of the destination amount.
      - `dstMinRaw` string, required — Guaranteed minimum after slippage — what the UI shows as "minimum received".
      - `dstDecimals` number, required — Decimals of the destination token, so the client can format the raw amounts without its own token lookup.
      - `dstSymbol` string, required
    - `fees` FeesDto, required
      - `totalUsd` string, required — Total fees in USD.
      - `percent` string, required — Total fees as a percentage of the transfer. ALREADY a percentage — "9.0009" means 9%, do not multiply by 100.
      - `items` FeeItemDto[], required
        - `labelKey` 'MESSAGE' | 'GENERAL' | 'DST_NATIVE_DROP' | 'CCTP_RECEIVE', required — Stable key for the fee row; the client maps it to a translation.
        - `description` string, required — Upstream's own copy for this fee (e.g. 'Aori Fees'). May be empty, in which case the client falls back to a translated label for labelKey.
        - `chainId` object, nullable, required — Chain the fee is charged on. Null if VT quoted an unlisted chain.
        - `amount` string, required — Fee amount, already scaled by the fee token’s decimals.
        - `symbol` string, required
        - `decimals` number, required
        - `usd` object, nullable, required — USD value of the fee. Null when the fee token has no known price.
    - `durationMs` object, nullable, required — Estimated delivery time in milliseconds.
    - `userSteps` UserStepDto[], required — What the wallet signs, in order. Empty on alternatives — only the selected quote carries executable steps.
      - `type` 'TRANSACTION' | 'SIGNATURE', required
      - `description` string, required
      - `chainId` number, required — Chain the wallet must be on for this step.
      - `transaction` TxEncodedDto
        - `to` string, required
        - `data` string, required
        - `value` string — msg.value in wei, as a decimal string.
        - `chainId` number, required
        - `from` string
        - `gasLimit` string
      - `signature` object — Present when type is SIGNATURE (EIP-712 intent routes).
  - `alternatives` TransferQuoteDto[], required — The routes that lost, cheapest first, without userSteps. Nothing renders these yet; they are carried so a route-picker UI needs no contract change.
    - `quoteId` string, required — Transfer id — the id used for /status and /signatures. For a `transfer` quote this is a locally-minted id that /status does not know: a same-chain send is confirmed by its receipt, not by polling.
    - `action` 'transfer' | 'bridge' | 'convert', required — Matches the holding’s action. `transfer` is a same-chain send built locally — it has no upstream route and must NOT be polled via /status. `bridge` and `convert` are VT routes and are trackable.
    - `trackable` boolean, required — Whether /status can track this transfer. False for same-chain sends — wait on the receipt instead.
    - `expiresAt` object, nullable, required
    - `route` RouteDto, required
      - `label` string, required — Human label for the winning protocol. A proper noun — rendered as-is, never translated.
      - `srcChainId` number, required
      - `dstChainId` number, required
      - `steps` RouteStepDto[], required
        - `chainId` object, nullable, required — Chain this step executes on. Null if upstream routed through a chain we do not list — cosmetic here, unlike a userStep.
        - `description` string, required
    - `amounts` AmountsDto, required
      - `srcRaw` string, required — Source amount in the source token's native units.
      - `srcUsd` string, required — USD value of the source amount.
      - `dstRaw` string, required — Expected destination amount in the destination token's native units.
      - `dstUsd` string, required — USD value of the destination amount.
      - `dstMinRaw` string, required — Guaranteed minimum after slippage — what the UI shows as "minimum received".
      - `dstDecimals` number, required — Decimals of the destination token, so the client can format the raw amounts without its own token lookup.
      - `dstSymbol` string, required
    - `fees` FeesDto, required
      - `totalUsd` string, required — Total fees in USD.
      - `percent` string, required — Total fees as a percentage of the transfer. ALREADY a percentage — "9.0009" means 9%, do not multiply by 100.
      - `items` FeeItemDto[], required
        - `labelKey` 'MESSAGE' | 'GENERAL' | 'DST_NATIVE_DROP' | 'CCTP_RECEIVE', required — Stable key for the fee row; the client maps it to a translation.
        - `description` string, required — Upstream's own copy for this fee (e.g. 'Aori Fees'). May be empty, in which case the client falls back to a translated label for labelKey.
        - `chainId` object, nullable, required — Chain the fee is charged on. Null if VT quoted an unlisted chain.
        - `amount` string, required — Fee amount, already scaled by the fee token’s decimals.
        - `symbol` string, required
        - `decimals` number, required
        - `usd` object, nullable, required — USD value of the fee. Null when the fee token has no known price.
    - `durationMs` object, nullable, required — Estimated delivery time in milliseconds.
    - `userSteps` UserStepDto[], required — What the wallet signs, in order. Empty on alternatives — only the selected quote carries executable steps.
      - `type` 'TRANSACTION' | 'SIGNATURE', required
      - `description` string, required
      - `chainId` number, required — Chain the wallet must be on for this step.
      - `transaction` TxEncodedDto
        - `to` string, required
        - `data` string, required
        - `value` string — msg.value in wei, as a decimal string.
        - `chainId` number, required
        - `from` string
        - `gasLimit` string
      - `signature` object — Present when type is SIGNATURE (EIP-712 intent routes).

## Other responses

- `401` — Unauthorized
- `422` — No route available for this transfer

---

[API](https://skmtc.dev/dre/apis/dre-api.md) · [All operations](https://skmtc.dev/dre/apis/dre-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/dre/dre-api/revisions/5d14beb9482b/schema)
