# Get redemption transaction detail

Read one redemption order in your community by its order ID, with its status, the trader's details and their order-form answers.

- Endpoint: `GET https://api.returning.ai/v2/redemption-transactions/{redemptionID}`
- Section: Store and rewards / Redemption transactions
- Authentication: `Authorization: Bearer <API_KEY>` (Community API key)
- Permission: `customerSuccess` (Shown in the dashboard as "Customer Success")
- Retries: Read-only; exact retries are safe
- Guide: hand-written
- Verified: live, 2026-09-27
- Last updated: 26 Sep 2026
- Web page: https://docs.returning.ai/api-reference/store-redemption-transaction/get-redemption-transaction-detail

## When to use this

- A trader quotes an order ID (`ORD...`) and you need the order's current status and details.
- Confirm an order after you change its status, voucher or customer details.
- Show one order's details in your own support tool without paging through a list.

**Instead:** Use [List redemption orders by user email](https://docs.returning.ai/api-reference/rewards-and-redemptions/list-redemption-orders-by-user-email.md) instead when you don't have the order ID yet.

## Authentication

- Header: `Authorization: Bearer <API_KEY>`
- Permission: `customerSuccess`

Send a Community API key with the `customerSuccess` permission. The key decides the community, so you can only read orders in that community. Keep the key on your server.

## Request

### Path parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `redemptionID` | `string` | Yes | The order ID (`ORD...`), the `redemptionId` in the order lists. The internal `_id` isn't accepted. (Starts with `ORD`) |

### Headers

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `Authorization` | `string` | Yes | Community API key with `customerSuccess`. (`Bearer <API_KEY>`) |

### Example request

```bash
curl --request GET \
  --url https://api.returning.ai/v2/redemption-transactions/ORD20269268300418273 \
  --header 'Authorization: Bearer <API_KEY>'
```

## Response

A `200` returns the order in `data`. `status` is the status name and `statusID` its ID; match the ID against List redemption statuses. Fields such as `rewardId`, `productName`, `userInfo`, `redemptionMethodName` and `customFieldValues` are left out, not sent as `null`, when there is nothing to show. An order for a product that was later deleted still returns, without `rewardId` and `productName`.

Unlike the order lists, `customFieldValues` here is keyed by the form field's name, not its ID. Branch on the HTTP status and `meta.code`, never on `message`.

### Response fields

| Field | Type | Presence | Description |
| --- | --- | --- | --- |
| `meta` | `object` | always | Status details. |
| `meta.status` | `string` | always | Result of the request. (`success`) |
| `meta.statusCode` | `integer` | always | The HTTP status, repeated. |
| `meta.code` | `string` | always | Machine-readable result code. (`REDEMPTION_TRANSACTION_RETRIEVED`) |
| `message` | `string` | always | Human-readable summary. Do not branch on it. |
| `data` | `object` | always | The order. |
| `data._id` | `string` | always | Internal record ID of the order. Other redemption endpoints take `redemptionId`. |
| `data.redemptionId` | `string` | always | The order ID (`ORD...`). Send it as `transactionId` to update the order's status or read its history. |
| `data.serverId` | `string` | always | Your community ID. |
| `data.userId` | `string` | always | The trader's internal record ID. This is not the platform user ID. |
| `data.rewardId` | `string` | when found | ID of the store product that was redeemed. Left out when the product can't be found, for example after it was deleted. |
| `data.voucherId` | `string` | when set | ID of the voucher assigned to the order. |
| `data.price` | `integer` | always | Coins the trader paid for the order. A coin refund returns this amount. |
| `data.quantity` | `integer` | always | Units in the order. |
| `data.status` | `string` | always | The order's current status name, such as `New Purchase` or `Refunded`. |
| `data.statusID` | `string` | when set | ID of the order's current status. Present when the order has one. |
| `data.type` | `string` | always | The reward type. (`voucher`) |
| `data.userInfo` | `object` | when set | Contact and delivery details saved on the order. Left out when there are none. |
| `data.userInfo.username` | `string` | when set | The trader's username. |
| `data.userInfo.name` | `string` | when set | The trader's display name. |
| `data.userInfo.email` | `string` | when set | The trader's email. |
| `data.userInfo.profile` | `string` | when set | The trader's avatar URL. |
| `data.userInfo.firstName` | `string` | when set | First name, when the trader entered one or you set it. |
| `data.userInfo.lastName` | `string` | when set | Last name, when the trader entered one or you set it. |
| `data.redemptionMethodName` | `string` | when set | How the trader chose to receive the reward. Older orders show `Custom Instructions` or `Physical Delivery`. Left out when the order has none. |
| `data.customFieldValues` | `object` | when set | Answers to the product's order form, keyed by field name, such as `{"Account number": "<brokerCustomerId>"}`. A repeated name gets a suffix, such as `Account number (2)`. Left out when the order has no answers. |
| `data.purchasedDate` | `string` | always | When the trader redeemed, ISO 8601 UTC. |
| `data.createdAt` | `string` | always | When the order was created, ISO 8601 UTC. |
| `data.updatedAt` | `string` | always | When the order last changed, ISO 8601 UTC. |
| `data.productName` | `string` | when found | The product's name. Left out when the product can't be found, for example after it was deleted. |
| `data.userData` | `object` | always | The trader's account details. |
| `data.userData.email` | `string` | always | The trader's email. |
| `data.userData.userName` | `string` | always | The trader's username. |
| `data.userData.roles` | `string[]` | always | Names of the trader's roles in your community. |

### Example response (200)

```json
{
  "meta": {
    "status": "success",
    "statusCode": 200,
    "code": "REDEMPTION_TRANSACTION_RETRIEVED"
  },
  "message": "Redemption transaction fetched successfully",
  "data": {
    "_id": "66f000000000000000000401",
    "redemptionId": "ORD20269268300418273",
    "serverId": "66f000000000000000000010",
    "userId": "<userObjectId>",
    "rewardId": "66f000000000000000000101",
    "voucherId": "66f000000000000000000502",
    "price": 500,
    "quantity": 1,
    "status": "Completed",
    "statusID": "66f000000000000000000405",
    "type": "voucher",
    "userInfo": {
      "username": "sample_trader",
      "name": "Sample Trader",
      "email": "trader@example.com"
    },
    "redemptionMethodName": "Custom Instructions",
    "customFieldValues": {
      "Account number": "<brokerCustomerId>"
    },
    "purchasedDate": "2026-09-26T08:30:00.000Z",
    "createdAt": "2026-09-26T08:30:00.000Z",
    "updatedAt": "2026-09-26T09:15:00.000Z",
    "productName": "$25 Trading Credit",
    "userData": {
      "email": "trader@example.com",
      "userName": "sample_trader",
      "roles": ["@all"]
    }
  }
}
```

## Errors

Every error carries its code in `meta.code`, with the reason in `detail`. An order in another community returns `404`, the same as a missing one. The `message` on a `400` doesn't describe this endpoint, so don't read it.

### Fix the request

| Status | Code | What to do |
| --- | --- | --- |
| 400 | `VALIDATION_FAILED` | `redemptionID` doesn't start with `ORD`. Send the order ID from `redemptionId`, not the internal `_id`. |
| 401 | `AUTH_API_KEY_REQUIRED` | No key was sent. Send `Authorization: Bearer <API_KEY>`. |
| 401 | `AUTH_API_KEY_INVALID` | The key is unknown, expired or malformed. Use a current Community API key. |
| 403 | `AUTH_PERMISSION_REQUIRED` | The key lacks `customerSuccess`. Add the permission in Settings > Integration > API Keys. |

### Fix the data

| Status | Code | What to do |
| --- | --- | --- |
| 404 | `REDEMPTION_TRANSACTION_NOT_FOUND` | No order with this ID in your community. Check the ID against the order lists; order IDs are matched exactly. |

### Retry with backoff

| Status | Code | What to do |
| --- | --- | --- |
| 502 | `REDEMPTION_DEPENDENCY_UNAVAILABLE` | Orders are briefly unavailable. Retry the same request with exponential backoff. |
| 500 | `INTERNAL_ERROR` | Retry the same request with exponential backoff. If it keeps failing, contact Returning.AI with the time of the request. |
| 401 | `AUTH_API_KEY_VALIDATION_FAILED` | The key could not be checked just now. Retry with backoff; the key itself may be fine. |

**Retries:** This endpoint is read-only, so retrying the exact same request is safe after a network error, a `500` or a `502`. Use bounded exponential backoff. Over the [rate limit](https://docs.returning.ai/how-it-works.md#rate-limits), requests return `429`; wait for the window to reset, then retry.

## Next step

- [Get redemption order status history](https://docs.returning.ai/api-reference/rewards-and-redemptions/get-redemption-order-status-history.md): `POST /v1/redemption-transactions/transaction-history`. See how the order reached its current status, with each change and its remark.
- [Move it on with Update redemption order status](https://docs.returning.ai/api-reference/rewards-and-redemptions/update-redemption-order-status.md): `PUT /v1/redemption-transactions/status`.
