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

# Redeem Bastion-issued stablecoins to USD

> End-to-end quickstart to redeem Bastion-issued stablecoins: register a bank account, create redemption instructions, send stablecoins, and track USD payout.

## Redeem Bastion-issued stablecoins

This guide walks you through the process of redeeming Bastion-issued stablecoins using Bastion's Issuance API. Redemption converts stablecoins back into fiat currency (USD) that is sent to a registered bank account via wire transfer.

### Overview

The redemption process involves several steps:

1. **Register a bank account** - Add the bank account where redeemed funds will be sent
2. **Create redemption instructions** - Set up the redemption configuration with bank account and blockchain details
3. **Send stablecoins to the redemption address** - Initiate redemption by transferring stablecoins
4. **Monitor the redemption** - Track the status of your redemption request

### Prerequisites

Before you begin, ensure you have:

* A valid API key with issuance permissions
* An approved **Business** identity created for the redeeming entity
  * Note that Issuance is not supported for **Individual** identities at this moment
* Bank account details for receiving USD wire transfers
* Stablecoins in a wallet on a supported chain

### Step 1: register a bank account

First, register the bank account where redeemed funds will be sent.

#### Request

<CodeGroup>
  ```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
  curl -X POST https://api.prod.bastion.com/v2/issuance/bank-account \
    -H "Authorization: Bearer YOUR_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "identity_id": "id_123456789",
      "bank_account_details": {
        "bank_name": "First National Bank",
        "account_holder_name": "Acme Corporation",
        "account_number": "9876543210",
        "routing_number": "021000021",
        "type": "checking",
        "address": {
          "street_line_1": "456 Business Ave",
          "street_line_2": "Suite 100",
          "city": "San Francisco",
          "postal_code": "94102",
          "country": "US",
          "region_code": "CA"
        }
      }
    }'
  ```
</CodeGroup>

#### Request parameters

| Parameter              | Type   | Required | Description                                 |
| ---------------------- | ------ | -------- | ------------------------------------------- |
| `identity_id`          | string | Yes      | The identity ID that owns this bank account |
| `bank_account_details` | object | Yes      | Bank account information (see below)        |

##### Bank account details object

| Field                 | Type   | Required | Description                                |
| --------------------- | ------ | -------- | ------------------------------------------ |
| `bank_name`           | string | Yes      | Name of the bank                           |
| `account_holder_name` | string | Yes      | Name on the account                        |
| `account_number`      | string | Yes      | Bank account number                        |
| `routing_number`      | string | Yes      | Bank routing number (ABA)                  |
| `type`                | string | Yes      | Account type (e.g., `checking`, `savings`) |
| `address`             | object | Yes      | Bank address (see below)                   |

##### Address object

| Field           | Type   | Required | Description                                             |
| --------------- | ------ | -------- | ------------------------------------------------------- |
| `street_line_1` | string | Yes      | Street address line 1 (3-100 characters)                |
| `street_line_2` | string | No       | Street address line 2                                   |
| `city`          | string | Yes      | City (3-50 characters)                                  |
| `postal_code`   | string | Yes      | Postal/ZIP code (max 20 characters)                     |
| `country`       | string | Yes      | ISO 3166-1 alpha-2 country code (e.g., `US`)            |
| `region_code`   | string | Yes      | ISO 3166-2 subdivision code (e.g., `CA` for California) |

#### Response

<CodeGroup>
  ```json theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
  {
    "id": "ba_def456ghi789",
    "identity_id": "id_123456789",
    "bank_account_details": {
      "bank_name": "First National Bank",
      "account_holder_name": "Acme Corporation",
      "account_number": "9876543210",
      "routing_number": "021000021",
      "type": "checking",
      "address": {
        "street_line_1": "456 Business Ave",
        "street_line_2": "Suite 100",
        "city": "San Francisco",
        "postal_code": "94102",
        "country": "US",
        "region_code": "CA"
      }
    }
  }
  ```
</CodeGroup>

### Step 2: create redemption instructions

Create redemption instructions that specify how redemptions should be processed, including the bank account and blockchain details.

#### Request

<CodeGroup>
  ```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
  curl -X POST https://api.prod.bastion.com/v2/issuance/redemption-instructions \
    -H "Authorization: Bearer YOUR_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "request_id": "770e8400-e29b-41d4-a716-446655440002",
      "bank_account_id": "ba_def456ghi789",
      "chain": "SOLANA_DEVNET",
      "label": "Primary Redemption",
      "payment_rail": "WIRE",
      "identity_id": "id_123456789",
      "stablecoin_symbol": "USDX"
    }'
  ```
</CodeGroup>

#### Request parameters

| Parameter           | Type          | Required | Description                                         |
| ------------------- | ------------- | -------- | --------------------------------------------------- |
| `request_id`        | string (UUID) | Yes      | Idempotency key in UUID format                      |
| `bank_account_id`   | string        | Yes      | ID of the bank account created in Step 1            |
| `chain`             | enum          | Yes      | Blockchain network: `SOLANA_DEVNET`                 |
| `label`             | string        | Yes      | A human-readable label for the instruction          |
| `payment_rail`      | enum          | Yes      | Payment method (currently only `WIRE` is supported) |
| `identity_id`       | string        | Yes      | The identity ID for this redemption instruction     |
| `stablecoin_symbol` | string        | Yes      | Symbol of the stablecoin to redeem (e.g., `USDX`)   |

#### Response

<CodeGroup>
  ```json theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
  {
    "id": "ri_pqr123stu456",
    "address": "9vMJfxuKxXBoEa7rM7gQEpNsEHvT3AxK...",
    "bank_account_id": "ba_def456ghi789",
    "chain": "SOLANA_DEVNET",
    "label": "Primary Redemption",
    "payment_rail": "WIRE",
    "identity_id": "id_123456789",
    "stablecoin_symbol": "USDX"
  }
  ```
</CodeGroup>

> **Important:** Save the `address` from the response. This is the blockchain address where you'll send stablecoins to initiate redemptions.

### Step 3: initiate the redemption (send stablecoins)

To redeem stablecoins, send them to the redemption address provided in the redemption instructions response.

**Critical requirements:**

* **Use the correct address**: Send stablecoins to the exact `address` returned in Step 2.
* **Correct chain**: Ensure you're sending on the same blockchain network specified in the redemption instructions.
* **Correct stablecoin**: Send the stablecoin type specified in `stablecoin_symbol`.

Once the stablecoin transfer is received and verified:

1. The stablecoins are burned
2. The equivalent USD amount is calculated
3. A wire transfer is initiated to your registered bank account

### Step 4: monitor redemption status

#### List all redemptions

<CodeGroup>
  ```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
  curl -X GET "https://api.prod.bastion.com/v2/issuance/redemptions?identity_id=id_123456789&limit=10" \
    -H "Authorization: Bearer YOUR_API_KEY"
  ```
</CodeGroup>

#### Query parameters

| Parameter     | Type    | Required | Description                                                                             |
| ------------- | ------- | -------- | --------------------------------------------------------------------------------------- |
| `status`      | enum    | No       | Filter by status: `ACCEPTED`, `SUBMITTED`, `COMPLETED`, `DENIED`, `FAILED`, `CANCELLED` |
| `limit`       | integer | No       | Max results per page (1-25, default: 10)                                                |
| `cursor`      | string  | No       | Pagination cursor for next page                                                         |
| `identity_id` | string  | No       | Filter by identity ID                                                                   |

#### Response

<CodeGroup>
  ```json theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
  {
    "redemptions": [
      {
        "id": "redeem_001xyz",
        "amount": "5000.00",
        "chain": "SOLANA_DEVNET",
        "redemption_address_id": "ri_pqr123stu456",
        "from_address": "7EcDhSYGxXyscszYEp35KHN8vvw3svAuLKTzXwCFLtV",
        "status": "COMPLETED",
        "deposit_external_tx_id": "3nKt9vRxQW8m...",
        "burn_external_tx_id": "4mLu0wSyRX9n...",
        "identity_id": "id_123456789",
        "stablecoin_symbol": "USDC"
      }
    ],
    "cursor": "eyJsYXN0X2lkIjoicmVkZWVtXzAwMXh5eiJ9"
  }
  ```
</CodeGroup>

#### Get a specific redemption

<CodeGroup>
  ```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
  curl -X GET https://api.prod.bastion.com/v2/issuance/redemptions/redeem_001xyz \
    -H "Authorization: Bearer YOUR_API_KEY"
  ```
</CodeGroup>

#### Response

<CodeGroup>
  ```json theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
  {
    "id": "redeem_001xyz",
    "amount": "5000.00",
    "chain": "SOLANA_DEVNET",
    "redemption_address_id": "ri_pqr123stu456",
    "from_address": "7EcDhSYGxXyscszYEp35KHN8vvw3svAuLKTzXwCFLtV",
    "status": "COMPLETED",
    "deposit_external_tx_id": "3nKt9vRxQW8m...",
    "burn_external_tx_id": "4mLu0wSyRX9n...",
    "identity_id": "id_123456789",
    "stablecoin_symbol": "USDC"
  }
  ```
</CodeGroup>

### Redemption status values

| Status      | Description                                                 |
| ----------- | ----------------------------------------------------------- |
| `ACCEPTED`  | Stablecoin deposit received and redemption request accepted |
| `SUBMITTED` | Burn transaction submitted and wire transfer initiated      |
| `COMPLETED` | Stablecoins burned and USD wire transfer completed          |
| `DENIED`    | Redemption request was denied (compliance or other reasons) |
| `FAILED`    | Redemption process failed                                   |
| `CANCELLED` | Redemption request was cancelled                            |

### Redemption response fields

| Field                    | Description                                         |
| ------------------------ | --------------------------------------------------- |
| `id`                     | Unique identifier for the redemption request        |
| `amount`                 | Amount of stablecoins being redeemed                |
| `chain`                  | Blockchain network for the redemption               |
| `redemption_address_id`  | ID of the redemption instruction used               |
| `from_address`           | Source wallet address that sent the stablecoins     |
| `status`                 | Current status of the redemption                    |
| `deposit_external_tx_id` | Blockchain transaction ID of the stablecoin deposit |
| `burn_external_tx_id`    | Blockchain transaction ID of the burn               |
| `identity_id`            | Identity that owns this redemption                  |
| `stablecoin_symbol`      | Symbol of the stablecoin being redeemed             |

### Additional endpoints

#### List bank accounts

<CodeGroup>
  ```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
  curl -X GET https://api.prod.bastion.com/v2/issuance/bank-accounts \
    -H "Authorization: Bearer YOUR_API_KEY"
  ```
</CodeGroup>

#### Get bank account

<CodeGroup>
  ```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
  curl -X GET https://api.prod.bastion.com/v2/issuance/bank-account/ba_def456ghi789 \
    -H "Authorization: Bearer YOUR_API_KEY"
  ```
</CodeGroup>

#### List redemption instructions

<CodeGroup>
  ```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
  curl -X GET "https://api.prod.bastion.com/v2/issuance/redemption-instructions?identity_id=id_123456789" \
    -H "Authorization: Bearer YOUR_API_KEY"
  ```
</CodeGroup>

#### Get redemption instructions

<CodeGroup>
  ```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
  curl -X GET https://api.prod.bastion.com/v2/issuance/redemption-instructions/ri_pqr123stu456 \
    -H "Authorization: Bearer YOUR_API_KEY"
  ```
</CodeGroup>

### Supported chains

| Chain                                  | Enum Value      |
| -------------------------------------- | --------------- |
| Solana Devnet                          | `SOLANA_DEVNET` |
| Base Sepolia (Currently not supported) | `BASE_SEPOLIA`  |

### Error handling

| HTTP Status | Description                                                |
| ----------- | ---------------------------------------------------------- |
| `400`       | Bad request - Check request parameters                     |
| `401`       | Unauthorized - Invalid or missing API key                  |
| `404`       | Resource not found                                         |
| `409`       | Conflict - Resource already exists (check idempotency key) |
| `500`       | Internal server error                                      |

### Webhooks

Configure webhooks to receive real-time notifications when redemption status changes. See the [Webhooks documentation](/v2/api-reference/webhooks/overview) for setup instructions.

### Best practices

1. **Use unique request IDs**: Generate a new UUID for each new logical request, and reuse the same `request_id` when retrying that request so it stays idempotent.
2. **Verify bank details**: Double-check bank account information before creating bank accounts.
3. **Correct address**: Always verify you're sending to the correct redemption address on the correct chain.
4. **Test small amounts**: For initial testing, start with small redemption amounts.
5. **Monitor status**: Use webhooks or polling to track redemption progress.
6. **Test on Devnet**: Use Solana Devnet for testing before moving to production.

### Processing timeline

Redemption processing times depend on several factors:

* **Blockchain confirmation**: Typically minutes, depending on the chain
* **Wire transfer**: 1-3 business days for domestic US wires

### Security considerations

* Bank account details are stored securely and cannot be modified after creation
* Each redemption instruction generates a unique blockchain address
* All transactions are logged and auditable
* Compliance checks are performed on all redemption requests


## Related topics

- [Redeem Bastion-issued stablecoins from the Dashboard](/guides/dashboard/redeem-bastion-stablecoin.md)
- [Mint Bastion-issued stablecoins from the Dashboard](/guides/dashboard/mint-bastion-stablecoin.md)
- [Mint Bastion-issued stablecoins with the Issuance API](/guides/quickstarts/mint-bastion-issued-stablecoins.md)
- [Stablecoin issuance concepts](/guides/concepts/stablecoin-issuance.md)
- [Issuance API overview](/v2/api-reference/issuance/overview.md)
