---
title: "Build one unsigned Solana transaction"
method: POST
path: "/svm/swap"
---

# Build one unsigned Solana transaction

`POST /svm/swap`

## Request

- Base URL: `https://swap.vurto.cc/v1`
- URL: `https://swap.vurto.cc/v1/svm/swap`
- Auth: none required

There is no approve on Solana and therefore no steps[] array: the response carries a single base64 v0 transaction. simulation.status is "passed" only after the build was run against the network and the output was proven to reach the destination account, so anything else is a refusal to proceed, not a warning. Omit "provider" and the best route is chosen here, which costs one fan-out before the build; pass one from a prior quote and that wait disappears.

## Request body

- object
  - `chainId` 'solana-mainnet', required: Solana names its network, it does not number it.
  - `tokenIn` string, required: Mint address, or the symbol of a VERIFIED token. Symbols resolve only against the verified list on purpose: on Solana anyone can mint a token carrying another one's symbol, name and icon, and the mint is the only real identity. CASE-SENSITIVE.
  - `tokenOut` string, required: Mint address, or the symbol of a VERIFIED token. Symbols resolve only against the verified list on purpose: on Solana anyone can mint a token carrying another one's symbol, name and icon, and the mint is the only real identity. CASE-SENSITIVE.
  - `wallet` string, required: The signing wallet, base58. CASE-SENSITIVE.
  - `amount` string: Human decimal. Use this OR amountIn.
  - `amountIn` string: Raw integer string.
  - `tokenInDecimals` integer: Optional.
  - `tokenOutDecimals` integer: Optional.
  - `slippageBps` integer: Optional.
  - `provider` string: Optional: jupiter_router, raydium, orca or meteora. Omitted means "pick the best". jupiter_meta is no longer compared: it charges its own fee, cannot deliver to a receiver other than the signer, and each Jupiter call queues behind a shared rate budget.
  - `receiver` string: Optional: deliver the output to this address instead of the signing wallet. Only providers that can honour it are considered.

## Response `200`

{build: {quote, transaction, buildId, lastValidBlockHeight, simulation, executionRef?}}. executionRef present or absent decides how you send it, see POST /svm/execute.

## Other responses

- `400`: invalid_chain_id | invalid_wallet | invalid_provider | invalid_amount
- `404`: token_not_found
- `409`: ambiguous_token | slippage_exceeded: the Jupiter Router route was too large for one transaction and the simpler route that fits pays less than slippageBps allows; quote again
- `422`: simulation_failed | output_check_failed — the route did not prove the output reaches the destination, nothing was signed
- `502`: no_routes | rpc_failed | transaction_too_large: the route does not fit in 1232 bytes even after asking for simpler routes

---

[API](https://skmtc.dev/vurto/apis/vurto-swap-public-api.md) · [All operations](https://skmtc.dev/vurto/apis/vurto-swap-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/vurto/apis/vurto-swap-public-api/revisions/423be3a193b5?raw)
