<!-- tempo-docs-context -->
> Source: [/docs/routes/transfers](https://tempo.xyz/developers/docs/routes/transfers.md)
> Section: [Routes](https://tempo.xyz/developers/docs/routes.md). Accept cross-network deposits, quote transfers, and track delivery. Routes is in beta; see the introduction for access.
> [Documentation index](https://tempo.xyz/developers/llms.txt) · [Docs skill](https://tempo.xyz/developers/SKILL.md)

> Tempo MCP: Use `search`, `find_pages`, `read_page`, and `code` at `https://mcp.tempo.xyz` for Tempo and related documentation.
> If an indexed page is missing or reflects an older site, read this site’s [documentation index](https://tempo.xyz/developers/llms.txt) and Markdown pages directly.

# Make a transfer

Move stablecoins when your application can authorize the source transaction through a wallet or its own signer. Routes prepares the source calls; your application signs them and tracks delivery.

## Set up Routes API access

Create a key with `routes:read` and `routes:write` using [API setup](https://tempo.xyz/developers/docs/routes/api-setup). Choose the networks and tokens from [Supported routes](https://tempo.xyz/developers/docs/routes/networks). The request builders below expose the API fields and copyable code samples.

The example fixes the source amount with `exactSource`. Check that the selected route supports it. The [complete cURL example](https://tempo.xyz/developers/docs/routes/examples/transfers) shows every input and request in one place.

<span id="submit-and-track-a-transfer" />

## Transfer funds

:::steps
### Get a quote

<span id="quote-the-transfer" />

`GET /v1/routes/transfers/quote`

Quote transfer

[API reference](https://tempo.xyz/developers/docs/api/routes/transfers#quoteroutestransfer) — request parameters, authentication, and response schema. The examples below use editable sample values.

Requires a [Tempo API key](https://tempo.xyz/developers/docs/api/console/api-keys). Replace `YOUR_API_KEY` before running this request.

**cURL**

```bash
curl 'https://api.tempo.xyz/v1/routes/transfers/quote?amount=1000000&destinationChain=base&destinationToken=usdc&mode=exactSource&recipient=0x1111111111111111111111111111111111111111&sender=0x2222222222222222222222222222222222222222&sourceChain=tempo&sourceToken=usdce' \
  --header 'tempo-api-key: YOUR_API_KEY'
```

**TypeScript**

```ts
fetch('https://api.tempo.xyz/v1/routes/transfers/quote?amount=1000000&destinationChain=base&destinationToken=usdc&mode=exactSource&recipient=0x1111111111111111111111111111111111111111&sender=0x2222222222222222222222222222222222222222&sourceChain=tempo&sourceToken=usdce', {
  headers: {
    'tempo-api-key': 'YOUR_API_KEY'
  }
})
```

A quote prices the request; it does not reserve or create a transfer.

### Review fees

Show the source amount, expected destination amount, minimum destination amount, and fees. `destinationAmount` includes route deductions; an empty `fees` array does not mean the route is free. Check `quote.expiresAt` and refresh expired terms.

### Create the transfer

Set a unique `idempotency-key` for this operation. Reuse it when retrying the create request with unchanged inputs.

`POST /v1/routes/transfers`

Create transfer

[API reference](https://tempo.xyz/developers/docs/api/routes/transfers#createroutestransfer) — request parameters, authentication, and response schema. The examples below use editable sample values.

Requires a [Tempo API key](https://tempo.xyz/developers/docs/api/console/api-keys). Replace `YOUR_API_KEY` before running this request.

**cURL**

```bash
curl https://api.tempo.xyz/v1/routes/transfers \
  --request POST \
  --header 'idempotency-key: routes_01k1c5j8q8p0be6j5v9m6d1e4r' \
  --header 'tempo-api-key: YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "amount": "1000000",
  "destinationToken": "usdc",
  "mode": "exactSource",
  "recipient": "0x1111111111111111111111111111111111111111",
  "sender": "0x2222222222222222222222222222222222222222",
  "sourceToken": "usdce"
}'
```

**TypeScript**

```ts
fetch('https://api.tempo.xyz/v1/routes/transfers', {
  method: 'POST',
  headers: {
    'idempotency-key': 'routes_01k1c5j8q8p0be6j5v9m6d1e4r',
    'tempo-api-key': 'YOUR_API_KEY',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    amount: '1000000',
    destinationToken: 'usdc',
    mode: 'exactSource',
    recipient: '0x1111111111111111111111111111111111111111',
    sender: '0x2222222222222222222222222222222222222222',
    sourceToken: 'usdce'
  })
})
```

Save the returned transfer `id` and retain its unsigned `action`. Review the returned terms before requesting a signature. Transfer reads do not return the executable action.

<span id="sign-and-submit-the-source-calls" />

### Sign and submit

Use the source account's signer to submit the returned calls in order. Calls can include approvals and may require separate transactions. Handle the returned `action.type` using the [EVM or Tron action format](https://tempo.xyz/developers/docs/api/routes/transfers).

For an `evm:calls` action, pass each call's `to`, `data`, and `value` to your source-chain wallet client. Wait for successful execution before the next call, and retain all hashes as `transactionHashes`. If submission stops partway through, inspect the transactions already sent before resuming. The Routes API key does not authorize the source account.

On Tempo, [Tempo Wallet](https://tempo.xyz/developers/docs/accounts/integrate) submits every call as one atomic transaction, so the sender signs once. Try both paths in the [Routes API demo](https://tempo.xyz/developers/docs/routes/test).

### Register the source transactions

Enter the transfer `id` from creation and the actual `transactionHashes` produced by your signer. Use `transactionHash` instead when there is only one source transaction.

`POST /v1/routes/transfers/{id}/source-transactions`

Register source transaction

[API reference](https://tempo.xyz/developers/docs/api/routes/transfers#registerroutestransfersourcetransaction) — request parameters, authentication, and response schema. The examples below use editable sample values.

Requires a [Tempo API key](https://tempo.xyz/developers/docs/api/console/api-keys). Replace `YOUR_API_KEY` before running this request.

**cURL**

```bash
curl https://api.tempo.xyz/v1/routes/transfers/rtr_001785729600000_2ZPE2gvateYEQ0dQslgvkhjx/source-transactions \
  --request POST \
  --header 'tempo-api-key: YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "transactionHash": "0x5151515151515151515151515151515151515151515151515151515151515151"
}'
```

**TypeScript**

```ts
fetch('https://api.tempo.xyz/v1/routes/transfers/rtr_001785729600000_2ZPE2gvateYEQ0dQslgvkhjx/source-transactions', {
  method: 'POST',
  headers: {
    'tempo-api-key': 'YOUR_API_KEY',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    transactionHash: '0x5151515151515151515151515151515151515151515151515151515151515151'
  })
})
```

The API verifies and associates the hashes with the transfer.

<span id="track-destination-delivery" />

### Confirm the transfer

`GET /v1/routes/transfers/{id}`

Get transfer

[API reference](https://tempo.xyz/developers/docs/api/routes/transfers#getroutestransfer) — request parameters, authentication, and response schema. The examples below use editable sample values.

Requires a [Tempo API key](https://tempo.xyz/developers/docs/api/console/api-keys). Replace `YOUR_API_KEY` before running this request.

**cURL**

```bash
curl https://api.tempo.xyz/v1/routes/transfers/rtr_001785729600000_2ZPE2gvateYEQ0dQslgvkhjx \
  --header 'tempo-api-key: YOUR_API_KEY'
```

**TypeScript**

```ts
fetch('https://api.tempo.xyz/v1/routes/transfers/rtr_001785729600000_2ZPE2gvateYEQ0dQslgvkhjx', {
  headers: {
    'tempo-api-key': 'YOUR_API_KEY'
  }
})
```

Keep the payment pending until `status` is `completed`. Reconcile the delivered amount and destination transaction references. Follow [Track delivery](https://tempo.xyz/developers/docs/routes/delivery) for failures and refunds.
:::
