<!-- tempo-docs-context -->
> Source: [/docs/routes/transfers](https://tempo.xyz/developers/docs/routes/transfers.md)
> Section: [Routes](https://tempo.xyz/developers/docs/routes.md). Move stablecoins between Tempo and other networks: try a route, set up API access, choose a supported route, quote it, accept deposits or make a transfer, 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.

<span id="set-up-routes-api-access" />

## Prepare a transfer route

Before the first step, have:

* A backend key with `routes:read` and `routes:write` from [Set up API access](https://tempo.xyz/developers/docs/routes/api-setup).
* A route with transfer support from [Supported routes](https://tempo.xyz/developers/docs/routes/networks). This guide fixes the source amount with `exactSource`, so check that the route lists that mode.
* A signer for the sender account on the source network, such as a connected wallet or your own signing service. The Routes API key does not authorize that account.

Each step below has a request builder that generates cURL and TypeScript. To see the flow first, [try a route](https://tempo.xyz/developers/docs/routes/test). The [cURL example](https://tempo.xyz/developers/docs/routes/examples/transfers) runs every step from a terminal.

<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.

<span id="review-fees" />

Show the source amount, destination amount, minimum destination amount, and fees as described in [Quotes and fees](https://tempo.xyz/developers/docs/routes/quotes). Refresh the quote when `quote.expiresAt` passes.

### Create the transfer

Send the [idempotency key](https://tempo.xyz/developers/docs/routes/api-setup#set-idempotency-keys) you stored for this payment.

`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.

On Tempo, [Tempo Wallet](https://tempo.xyz/developers/docs/accounts/wallets#connect-tempo-wallet) submits every call as one atomic transaction, so the sender signs once. [Try a route](https://tempo.xyz/developers/docs/routes/test) to compare both paths.

### 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.
:::

Continue with [Track delivery](https://tempo.xyz/developers/docs/routes/delivery) for every status, failures, and refunds.
