> ## Documentation Index
> Fetch the complete documentation index at: https://developers.circle.com/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> Before reading these docs, install the relevant Circle Skill to get pre-loaded context — skills are LLM-optimized and cover architecture decisions, correct flows, and common pitfalls. In Claude Code: run /plugin marketplace add circlefin/skills then /plugin install circle-skills@circle. With Vercel Skills CLI: run npx skills add circlefin/skills. Available skills: use-usdc https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-usdc/SKILL.md (balances, transfers, approvals on EVM and Solana); EURC has no skill — see https://developers.circle.com/stablecoins/what-is-eurc.md; bridge-stablecoin https://github.com/circlefin/skills/blob/master/plugins/circle/skills/bridge-stablecoin/SKILL.md (crosschain transfers via CCTP, USDC, EURC, and third-party assets); use-arc https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-arc/SKILL.md (Arc chain config, contract deployment, USDC bridging — Arc docs: https://docs.arc.io/llms.txt); use-circle-wallets https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-circle-wallets/SKILL.md (choose wallet type); use-developer-controlled-wallets https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-developer-controlled-wallets/SKILL.md (custodial wallets for payouts and treasury); use-user-controlled-wallets https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-user-controlled-wallets/SKILL.md (embedded wallets with Web2 login); use-modular-wallets https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-modular-wallets/SKILL.md (smart contract wallets with passkeys and ERC-4337); use-gateway https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-gateway/SKILL.md (unified USDC balance, nanopayments); use-smart-contract-platform https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-smart-contract-platform/SKILL.md (deploy, interact, monitor contracts). Pair any skill with the Circle MCP server for live SDK signatures, contract addresses, and chain IDs: {"mcpServers":{"circle":{"url":"https://api.circle.com/v1/codegen/mcp"}}}.
> Read the product overview first. Each product has an overview explaining when and why to use it. Read it before quickstarts.
> Pick the right wallet type. Developer-controlled (you hold keys), user-controlled (end user holds keys via PIN/social login), or modular (smart contract wallets with passkeys). See https://developers.circle.com/wallets.md.
> Use CCTP V2 for crosschain transfers. CCTP natively transfers USDC and EURC via burn-and-mint, and supports permissionless wrapping of third-party assets via lock-and-mint. V1 is legacy; always use V2 unless V1 is specified or the chain requires it (Noble, Sui, and Aptos still require V1). Migration guide: https://developers.circle.com/cctp/migration-from-v1-to-v2.md.
> Use Bridge Kit for frontend bridging. Wraps CCTP with a simpler SDK for user-facing apps. Use CCTP directly for backend transfers.
> Gas Station vs Paymaster. Gas Station sponsors gas for Circle Wallet transactions. Paymaster lets users pay gas in USDC. Different use cases — read both overviews.
> Gateway Nanopayments for sub-cent payments. Gasless USDC micropayments down to $0.000001 via x402 and batched settlement. For pay-per-request APIs, AI agent payments, streaming.
> Look up USDC addresses per chain. Never hardcode — use https://developers.circle.com/stablecoins/usdc-contract-addresses.md.
> Prefer SDKs over raw API calls. Node.js and Python SDKs handle auth, retries, and errors.
> API key required. Bearer token in Authorization header. Testnet and mainnet use separate keys and may use different base URLs depending on the product.
> Set up webhooks when available. Most operations are async. Webhooks deliver transaction confirmations and state changes.
> When calling list endpoints, paginate using pageSize and pageAfter until no nextPageAfter cursor is returned—stopping at the first page silently misses records.
> Building an AI agent? Start with the Agent Stack—Circle CLI, agent wallets, and nanopayments built for autonomous use cases: https://developers.circle.com/agent-stack.md.

# Quickstart: Mint and redeem cirBTC

> Deposit BTC to mint cirBTC, transfer cirBTC onchain, and redeem cirBTC back to BTC using the Circle Mint API.

Complete a full [cirBTC](/assets/what-is-cirbtc) mint-and-redeem cycle in the
Circle Mint sandbox: create a BTC deposit address, deposit BTC to mint cirBTC,
transfer cirBTC onchain to an Ethereum address, and redeem cirBTC back to BTC.

## Prerequisites

Before you begin, complete the
[account and API key setup](/circle-mint/quickstarts/getting-started).

Substitute your sandbox API key for `${YOUR_API_KEY}` in the examples below.

## Step 1: Create a BTC deposit address

### 1.1. Create a deposit address

Create a deposit address on the Bitcoin blockchain using the
[create a deposit address](/api-reference/circle-mint/account/create-business-deposit-address)
endpoint.

```bash theme={null}
curl -X POST https://api-sandbox.circle.com/v1/businessAccount/wallets/addresses/deposit \
  -H "Authorization: Bearer ${YOUR_API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{
    "idempotencyKey": "unique-id-1",
    "currency": "CIRBTC",
    "chain": "BTC"
  }'
```

Expected response:

```json theme={null}
{
  "data": {
    "id": "b4b843a0-0297-5a5b-bf5e-8e0375642f8e",
    "address": "tb1qexampleaddress0123456789abcdef",
    "currency": "CIRBTC",
    "chain": "BTC"
  }
}
```

Save the `address` from the response.

### 1.2. Send BTC to the deposit address

Send BTC to the deposit address to initiate minting.

<Note>
  In the sandbox, use the [Circle faucet](https://faucet.circle.com/) to obtain
  testnet BTC and send it to your deposit address. You can also use the sandbox
  environment at [app-smokebox.circle.com](https://app-smokebox.circle.com) to
  test API interactions.
</Note>

## Step 2: Verify your cirBTC balance

After BTC reaches four-block confirmation, cirBTC is credited to your account.
Verify your balance using the
[list all balances](/api-reference/circle-mint/account/list-business-balances)
endpoint:

```bash theme={null}
curl https://api-sandbox.circle.com/v1/businessAccount/balances \
  -H "Authorization: Bearer ${YOUR_API_KEY}"
```

Expected response:

```json theme={null}
{
  "data": {
    "available": [{ "amount": "0.00100000", "currency": "CIRBTC" }],
    "unsettled": []
  }
}
```

The `available` balance confirms that your BTC deposit minted cirBTC
successfully.

<Note>
  cirBTC uses a fast-mint mechanism. After four-block BTC confirmation (\~40
  minutes), cirBTC is transferred from a pre-minted pool to your account. The
  underlying onchain reserve transfer completes in the background.
</Note>

## Step 3: Transfer cirBTC to an Ethereum address

Send cirBTC from your Circle Mint account to an external Ethereum address. This
step requires two API calls: create a recipient address, then create a transfer.

### 3.1. Create a recipient address

Register a destination address using the
[create a recipient address](/api-reference/circle-mint/account/create-business-recipient-address)
endpoint.

```bash theme={null}
curl -X POST https://api-sandbox.circle.com/v1/businessAccount/wallets/addresses/recipient \
  -H "Authorization: Bearer ${YOUR_API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{
    "idempotencyKey": "unique-id-2",
    "address": "0x493A9869E3B5f846f72267ab19B76e9bf99d51b1",
    "chain": "ETH",
    "currency": "CIRBTC",
    "description": "External Ethereum wallet for cirBTC"
  }'
```

Expected response:

```json theme={null}
{
  "data": {
    "id": "cfa01bb0-d166-5506-a48a-56f2beab559f",
    "address": "0x493A9869E3B5f846f72267ab19B76e9bf99d51b1",
    "chain": "ETH",
    "currency": "CIRBTC",
    "description": "External Ethereum wallet for cirBTC"
  }
}
```

Save the `id` from the response. You need it as the `addressId` in the next
step.

### 3.2. Create a transfer

Send cirBTC to the recipient address using the
[create a transfer](/api-reference/circle-mint/account/create-business-transfer)
endpoint:

```bash theme={null}
curl -X POST https://api-sandbox.circle.com/v1/businessAccount/transfers \
  -H "Authorization: Bearer ${YOUR_API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{
    "idempotencyKey": "unique-id-3",
    "destination": {
      "type": "verified_blockchain",
      "addressId": "cfa01bb0-d166-5506-a48a-56f2beab559f"
    },
    "amount": { "currency": "CIRBTC", "amount": "0.00050000" }
  }'
```

Expected response:

```json theme={null}
{
  "data": {
    "id": "a3e2c8d1-4f6b-5a9e-b1c3-7d8e9f0a2b4c",
    "source": { "type": "wallet", "id": "1016875042" },
    "destination": {
      "type": "blockchain",
      "address": "0x493A9869E3B5f846f72267ab19B76e9bf99d51b1",
      "chain": "ETH"
    },
    "amount": { "amount": "0.00050000", "currency": "CIRBTC" },
    "status": "pending"
  }
}
```

The transfer starts in `pending` status and reaches `complete` after sufficient
[blockchain confirmations](/circle-mint/references/blockchain-confirmations).
You can poll the
[get a transfer](/api-reference/circle-mint/account/get-business-transfer)
endpoint with the transfer `id` to check its status.

## Step 4: Redeem cirBTC back to BTC

To redeem cirBTC, create a BTC recipient address and then transfer cirBTC to it.
Circle burns the cirBTC and releases native BTC to the specified address.

### 4.1. Create a BTC recipient address

Register a Bitcoin withdrawal address using the
[create a recipient address](/api-reference/circle-mint/account/create-business-recipient-address)
endpoint:

```bash theme={null}
curl -X POST https://api-sandbox.circle.com/v1/businessAccount/wallets/addresses/recipient \
  -H "Authorization: Bearer ${YOUR_API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{
    "idempotencyKey": "unique-id-4",
    "address": "tb1qyourbtcwithdrawaladdress",
    "chain": "BTC",
    "currency": "CIRBTC",
    "description": "BTC withdrawal address"
  }'
```

Expected response:

```json theme={null}
{
  "data": {
    "id": "f7a39c2e-81d4-5b0f-a6e8-3c9d1f4e5b7a",
    "address": "tb1qyourbtcwithdrawaladdress",
    "chain": "BTC",
    "currency": "CIRBTC",
    "description": "BTC withdrawal address"
  }
}
```

### 4.2. Create a redemption transfer

Transfer your remaining cirBTC balance to the BTC recipient address:

```bash theme={null}
curl -X POST https://api-sandbox.circle.com/v1/businessAccount/transfers \
  -H "Authorization: Bearer ${YOUR_API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{
    "idempotencyKey": "unique-id-5",
    "destination": {
      "type": "verified_blockchain",
      "addressId": "f7a39c2e-81d4-5b0f-a6e8-3c9d1f4e5b7a"
    },
    "amount": { "currency": "CIRBTC", "amount": "0.00050000" }
  }'
```

Expected response:

```json theme={null}
{
  "data": {
    "id": "c9b1d4e7-3a2f-4c8d-b5e6-1f0a2b3c4d5e",
    "amount": { "amount": "0.00050000", "currency": "CIRBTC" },
    "status": "pending"
  }
}
```

Circle burns the cirBTC and releases the equivalent BTC to your withdrawal
address after sufficient blockchain confirmations. See
[Blockchain confirmations](/circle-mint/references/blockchain-confirmations) for
expected confirmation times.

## Step 5: Verify the round trip

Check your final balance to confirm the transfers processed:

```bash theme={null}
curl https://api-sandbox.circle.com/v1/businessAccount/balances \
  -H "Authorization: Bearer ${YOUR_API_KEY}"
```

Expected response:

```json theme={null}
{
  "data": {
    "available": [{ "amount": "0.00000000", "currency": "CIRBTC" }],
    "unsettled": []
  }
}
```

You completed the full cirBTC cycle:

1. Deposited BTC to mint 0.001 cirBTC.
2. Transferred 0.0005 cirBTC onchain to an Ethereum address.
3. Redeemed 0.0005 cirBTC back to BTC.

Your available cirBTC balance returns to zero, confirming every token is
accounted for.

<Note>
  The Circle faucet used in Step 1 is only available for testnet. In production,
  send real BTC to the deposit address you created in Step 1. All other API calls
  in this guide work the same in production. See
  [Sandbox and Testing](/circle-mint/references/sandbox-and-testing) for details
  on transitioning.
</Note>
