# Transactions

This page describes the use of the Ripple Mint API operations for transactions.

**Base URL:** `https://api.ripple.com`

## API operations

| Method | Path | Scope Required | Description (link to reference) |
|  --- | --- | --- | --- |
| `GET` | `/v1/stablecoin/transactions` | `rlusd_customers:read` | [List transactions](/pt-br/products/stablecoin/api/reference/rlusd-openapi#operation/listTransactions) (paginated) |
| `GET` | `/v1/stablecoin/transactions/{id}` | `rlusd_customers:read` | [Get a transaction](/pt-br/products/stablecoin/api/reference/rlusd-openapi#operation/getTransaction) |
| `PUT` | `/v1/stablecoin/transactions/{id}/destination` | `rlusd_customers:write` | Approve pending redemption |


## List transactions

To obtain a list of transactions, use the [List transactions](/pt-br/products/stablecoin/api/reference/rlusd-openapi#operation/listTransactions) API operation as follows:

```
GET /v1/stablecoin/transactions
```

### Query parameters

| Parameter | Type | Required | Description |
|  --- | --- | --- | --- |
| `types` | string (repeatable) | No | Filter by type. Values: `ISSUANCE`, `REDEMPTION`, `BRIDGE` |
| `transactionTypes` | string (repeatable) | No | **Deprecated.** Use `types`; ignored when `types` is provided |
| `statuses` | string (repeatable) | No | Filter by status. Values: `PROCESSING`, `PENDING`, `COMPLETED`, `FAILED`, `CANCELED` |
| `page` | integer | No | Page number, 0-indexed (default: `0`) |
| `size` | integer | No | Page size (default: `20`) |
| `sort` | string | No | Sort field and direction (default: `updatedAt,desc`). Supported fields: `updatedAt`, `createdAt`, `type`, `status`, `amount` |


You can also filter by endpoint attributes. The following match on **either** the `source` or the `destination` leg:

| Parameter | Type | Description |
|  --- | --- | --- |
| `walletRipId` | string | Wallet ripId on either leg |
| `address` | string | On-chain address on either leg |
| `chain` | string | Chain on either leg |
| `transactionHash` | string | On-chain hash on either leg |
| `counterpartyAddress` | string | Ripple-side counterparty address on either leg |
| `memo` | string | Memo on either leg |
| `fiatInstructionId` | UUID | Fiat instruction id on either leg |


To match a **specific** leg, use the `source*` or `destination*` form — `sourceType`, `sourceWalletRipId`, `sourceAddress`, `sourceChain`, `sourceTransactionHash`, `sourceCounterpartyAddress`, `sourceMemo`, and the matching `destination*` parameters.

### Example request

```http
GET /v1/stablecoin/transactions?types=REDEMPTION&statuses=COMPLETED&page=0&size=20
Authorization: Bearer <access_token>
```

### Example response

```json
{
  "content": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "type": "REDEMPTION",
      "status": "COMPLETED",
      "amount": "10000.00",
      "token": "RLUSD",
      "source": {
        "type": "CRYPTO",
        "walletRipId": "RIP0000001",
        "address": "0x1234abcd5678ef90...",
        "chain": "ETH",
        "transactionHash": "ABC123DEF456..."
      },
      "destination": {
        "type": "FIAT"
      },
      "createdAt": "2026-03-17T10:00:00Z",
      "updatedAt": "2026-03-17T10:05:00Z"
    }
  ],
  "totalElements": 50,
  "totalPages": 3,
  "size": 20,
  "number": 0
}
```

## Get transaction

To get a specific transaction by ID, use the [Get a transaction](/pt-br/products/stablecoin/api/reference/rlusd-openapi#operation/getTransaction) API operation as follows:

```
GET /v1/stablecoin/transactions/{id}
```

### Path parameters

| Parameter | Type | Description |
|  --- | --- | --- |
| `id` | string (UUID) | Transaction ID |


### Example request

```http
GET /v1/stablecoin/transactions/550e8400-e29b-41d4-a716-446655440000
Authorization: Bearer <access_token>
```

### Example response

The response is a transaction object like the following:

```json
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "type": "ISSUANCE",
  "status": "COMPLETED",
  "amount": "10000.00",
  "token": "RLUSD",
  "source": {
    "type": "FIAT"
  },
  "destination": {
    "type": "CRYPTO",
    "walletRipId": "RIP0000001",
    "address": "rN7M2B4y3kuoEaQfYMJDPKgEbVh4K8xm3p",
    "chain": "XRPL",
    "transactionHash": "ABC123DEF456..."
  },
  "createdAt": "2026-03-17T10:00:00Z",
  "updatedAt": "2026-03-17T10:05:00Z"
}
```

| Field | Type | Description |
|  --- | --- | --- |
| `id` | string (UUID) | Unique transaction identifier |
| `type` | string | null | Transaction type: `ISSUANCE`, `REDEMPTION`, or `BRIDGE`. See [Transaction Types](#transaction-types) |
| `status` | string | Current status. See [Transaction Statuses](#transaction-statuses) |
| `amount` | string (decimal) | Transaction amount |
| `token` | string | Always `RLUSD` |
| `source` | object | Source endpoint of the transaction. See [Transaction endpoint](#transaction-endpoint) |
| `destination` | object | null | Destination endpoint. See [Transaction endpoint](#transaction-endpoint) |
| `createdAt` | string (ISO 8601) | Timestamp when the transaction was created |
| `updatedAt` | string (ISO 8601) | Timestamp when the transaction was last updated |
| `type` | string | null | Transaction type: `ISSUANCE`, `REDEMPTION`, or `BRIDGE`. Null for `PENDING` transactions before a destination is chosen. See [Transaction Types](#transaction-types) |
| `destination` | object | null | Destination endpoint. Null for `PENDING` transactions before a destination is chosen. See [Transaction endpoint](#transaction-endpoint) |


### Transaction endpoint

The `source` and `destination` fields of the response each contain a *transaction endpoint* object, which represents the source or destination of the transaction. This object is defined as follows:

| Field | Type | Description |
|  --- | --- | --- |
| `type` | string | `FIAT` or `CRYPTO` |
| `walletRipId` | string | null | Wallet identifier in `RIPxxxxxxx` format. Present when `type` is `CRYPTO` |
| `address` | string | null | On-chain address. Present when `type` is `CRYPTO` and the on-chain leg has been initiated |
| `chain` | string | null | Blockchain network name (e.g., `XRPL`, `ETH`). Present when `type` is `CRYPTO` |
| `transactionHash` | string | null | On-chain transaction hash. Present when `type` is `CRYPTO` and the on-chain leg has settled |
| `counterpartyAddress` | string | null | The Ripple-side internal account address that participated in this leg (the counterparty to your wallet on this on-chain transfer). Present when `type` is `CRYPTO` and the on-chain leg has been initiated. Useful for reconciling on-chain activity against your ledger. EVM addresses include the `0x` prefix |
| `fiatInstructionId` | string (UUID) | null | The fiat instruction this leg was matched to (buys) or generated for (redemptions). `FIAT` legs only. See [Fiat instructions](/pt-br/products/stablecoin/api/fiat-instructions) |
| `memo` | string | null | The memo carried in this leg's fiat payment reference field. `FIAT` legs only. See [Memo format](/pt-br/products/stablecoin/api/fiat-instructions#memo-format) |


On memo-correlated transactions, `fiatInstructionId` and `memo` appear on the `FIAT` leg only — the `source` of an `ISSUANCE` matched to a buy instruction, or the `destination` of a `REDEMPTION`. They are populated together or not at all, and are additive and optional, so existing parsers keep working.

#### Examples

**Crypto endpoint (settled):**

```json
{
  "type": "CRYPTO",
  "walletRipId": "RIP0000001",
  "address": "rN7M2B4y3kuoEaQfYMJDPKgEbVh4K8xm3p",
  "chain": "XRPL",
  "transactionHash": "ABC123DEF456...",
  "counterpartyAddress": "rKBYv89L5QwuWJFnd3px4ygVr5obQ4D6t3"
}
```

**Fiat endpoint:**

```json
{
  "type": "FIAT"
}
```

**Fiat endpoint with memo correlation:**

```json
{
  "type": "FIAT",
  "fiatInstructionId": "550e8400-e29b-41d4-a716-446655440000",
  "memo": "RL9CFXQSCMSP4K7T"
}
```

## Transaction types

| Type | Source | Destination | Description |
|  --- | --- | --- | --- |
| `ISSUANCE` | `FIAT` | `CRYPTO` | USD-to-RLUSD minting. Fiat is received and RLUSD is minted to your crypto wallet |
| `REDEMPTION` | `CRYPTO` | `FIAT` | RLUSD-to-USD redemption. RLUSD is burned and fiat is settled to your default bank account |
| `BRIDGE` | `CRYPTO` | `CRYPTO` | Cross-chain RLUSD transfer between two crypto wallets. See [Bridging](/pt-br/products/stablecoin/api/bridging) |


## Transaction statuses

| Value | Description |
|  --- | --- |
| `PROCESSING` | Transaction is actively being processed |
| `PENDING` | Awaiting your action (flexible redemption only — approval required). The `type` and `destination` are null until you approve |
| `COMPLETED` | Transaction completed successfully |
| `FAILED` | Transaction failed |
| `CANCELED` | Transaction was canceled before settlement and will not complete (terminal). Currently applies to `ISSUANCE` transactions whose fiat receipt was reversed or withdrawn. Treat it separately from `FAILED` |


## Flexible redemption

*Flexible redemption* causes inbound RLUSD to be held in `PENDING` status for up to 3 hours until explicitly approved and directed. You can enable or disable this feature.

### Enable flexible redemption

To enable flexible redemption, use the Ripple Mint UI:

1. Log in to the Ripple Mint UI as an Admin user.
2. Click the **Settings** gear icon in the top-right corner of the page.
3. Under **Stablecoin**, click **Manage settings**.
4. Toggle **Enable flexible redeem** to On.


Once enabled, inbound RLUSD will be held in `PENDING` status until you approve each transaction using the API below.

### Approve pending redemptions

If you have opted into flexible redemption, inbound RLUSD is held in `PENDING` status for up to 3 hours until explicitly approved.

To approve these redemptions, use the [Approve a pending redemption](/pt-br/products/stablecoin/api/reference/rlusd-openapi#operation/updateTransactionDestination) API operation.

The `type` field in the request body is required and must be set to either `FIAT` or `CRYPTO`. Based on this value, the system determines the transaction type: `FIAT` results in a `REDEMPTION`, while `CRYPTO` results in a `BRIDGE`.

```
PUT /v1/stablecoin/transactions/{id}/destination
```

**Required Scope:** `rlusd_customers:write`

#### Path parameters

| Parameter | Type | Description |
|  --- | --- | --- |
| `id` | string (UUID) | Transaction ID (received in the `PENDING` webhook or from the list API) |


#### Request body — fiat payout

Note
Fiat payouts are settled to your default bank account as configured in the Ripple Mint UI.

```json
{
  "type": "FIAT"
}
```

#### Request Body — crypto (bridge) payout

```json
{
  "type": "CRYPTO",
  "walletRipId": "RIP0000001"
}
```

| Field | Type | Required | Description |
|  --- | --- | --- | --- |
| `type` | string | Yes | `FIAT` or `CRYPTO`. `FIAT` creates a redemption; `CRYPTO` creates a bridge transfer |
| `walletRipId` | string | Required when `type` is `CRYPTO` | Target wallet identifier in `RIP` followed by digits format (e.g., `RIP0000001`). Must not be present when `type` is `FIAT` |


#### Response

The updated transaction with status transitioned to `PROCESSING`, and the `type` and `destination` now populated.

#### Behavior

- Only transactions in `PENDING` status can be updated; attempting to update a `PROCESSING` or `COMPLETED` transaction returns `409 Conflict`.
- Once the destination `type` is set, it cannot be changed.
- The transaction `id` in the response is used for all subsequent tracking and reconciliation.