# Bank Ramp: List Customer Transactions

Retrieve the bank ramp transactions — conversions, on-chain deliveries, payouts and reversals — Aurea has recorded for the user, with the deposit that paid for them.

## Overview

Transactions are recorded from the bank ramp's `Transaction` webhooks, so they appear here only after the bank ramp has reported them. The endpoint reads Aurea's records and doesn't call the bank ramp. Pagination uses `limit` and `offset`.

- **A bank transfer is two transactions** of one `ruleExecutionId`: the conversion (`direction` `In`, `network` `OffNetwork`, with `fiatAmount`, `fiatFeeAmount` and `fiatRate`) and the on-chain delivery (`direction` `Out` on the chain, with `blockchainTxHash` once broadcast). Both carry `depositId`, the `id` [Get Deposits](https://docs.aureahub.com/docs/payin-deposits.md) returns: The bank ramp names the deposit only on the conversion (`noahDepositId`), and Aurea gives the delivery the deposit of its rule execution.
- `transactionType` is `purchase` for `In` and `withdrawal` for `Out`, the on-chain delivery included. `status` is Aurea's word (`pending`, `completed`, `failed`), `noahStatus` the bank ramp's; `noahSubStatus` and `requestForInformation` as on a deposit.
- `refunds` (`status` `Pending`, `Settled` or `Failed`), `reversesTransactionId` (the bank ramp's id of the transaction given back) and `adjustment` (`ExchangeRateCorrection` or `Refund`) say what a transaction gives back or corrects.
- `breakdown` is how the bank ramp computed the amount: `ChannelFee`, `BusinessFee`, `NetworkFee` and `Remaining` lines in the transaction's asset. For a purchase `cryptoAmount = (fiatAmount - fiatFeeAmount) / fiatRate`.
- `fiatAmount` and `cryptoAmount` are JSON numbers; `networkFee`, `fiatFeeAmount`, `fiatRate` and the amounts in `breakdown` and `refunds` are exact decimal text. `exchangeRate` is not filled from the bank ramp's events: use `fiatRate`. An empty text field comes as `""`.
- The filters accept `type=refund` and `status=cancelled` but no transaction ever has them.

Transactions belong to the user's profile in one environment. Pass `isTestnet=true` for the sandbox transactions; without it you get the production ones, and `404` when the user has no profile in that environment.

## Endpoint

### `GET /v1/ramp/bank/payin/transactions`

Authentication: bearer token required.

Returns the bank ramp transactions of the authenticated user's profile in one environment, with optional filters.

**Query parameters**

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `type` | string | no | purchase \| withdrawal (refund is accepted and never matches) |
| `status` | string | no | pending \| completed \| failed (cancelled is accepted and never matches) |
| `limit` | integer | no | Page size (default 20) |
| `offset` | integer | no | Number of transactions to skip (default 0) |
| `isTestnet` | boolean | no | `true` for the sandbox profile; `false` or omitted for production. Any other value returns `400`. |

**Responses**

`200` OK

```json
{
  "transactions": [
    {
      "id": "0d2f4b6a-8c1e-4a3b-9d5f-7e9a1c3b5d70",
      "noahTransactionId": "fee2b2a6-0da2-5473-a6a8-eac39cb279d9",
      "transactionType": "withdrawal",
      "fiatCurrency": "",
      "cryptoAmount": 107.683104,
      "cryptoCurrency": "USDC",
      "network": "Ethereum",
      "destinationAddress": "",
      "blockchainTxHash": "0x6b1f3c9e2a4d8b7c5e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d",
      "status": "completed",
      "transactionDate": "2026-09-17T08:14:04.000Z",
      "completedAt": "2026-09-17T08:32:10.000Z",
      "createdAt": "2026-09-17T08:14:05.000Z",
      "depositId": "b1e4c7a2-3d5f-4a8b-9c6e-0f2d4b6a8c13",
      "noahDepositId": null,
      "direction": "Out",
      "noahStatus": "Settled",
      "noahSubStatus": null,
      "requestForInformation": null,
      "refunds": [],
      "ruleId": "a23ed0ca-a205-5325-89b4-d2ac46e0b26b",
      "ruleExecutionId": "36c54907-fadd-5a48-91f5-1632253f9a08",
      "reversesTransactionId": null,
      "adjustment": null,
      "breakdown": [
        { "type": "NetworkFee", "amount": "4.296693", "fixedAmount": null, "variableAmount": null },
        { "type": "Remaining", "amount": "107.683104", "fixedAmount": null, "variableAmount": null }
      ],
      "networkFee": null,
      "fiatFeeAmount": null,
      "fiatRate": null,
      "paymentSystemId": null,
      "updatedAt": "2026-09-17T08:32:10.000Z"
    },
    {
      "id": "4a6c8e0b-2d4f-4b6a-8c0e-2f4a6c8e0b1d",
      "noahTransactionId": "4068d70e-c31d-5e3b-959a-f27ea3cc5e1e",
      "transactionType": "purchase",
      "fiatAmount": 100,
      "fiatCurrency": "EUR",
      "cryptoAmount": 111.979797,
      "cryptoCurrency": "USDC",
      "network": "OffNetwork",
      "destinationAddress": "",
      "blockchainTxHash": "",
      "status": "completed",
      "transactionDate": "2026-09-17T08:14:02.000Z",
      "completedAt": "2026-09-17T08:14:20.000Z",
      "createdAt": "2026-09-17T08:14:03.000Z",
      "depositId": "b1e4c7a2-3d5f-4a8b-9c6e-0f2d4b6a8c13",
      "noahDepositId": "96369c50-7fd3-4222-a76d-1c054e6ea9de",
      "direction": "In",
      "noahStatus": "Settled",
      "noahSubStatus": null,
      "requestForInformation": null,
      "refunds": [],
      "ruleId": "a23ed0ca-a205-5325-89b4-d2ac46e0b26b",
      "ruleExecutionId": "36c54907-fadd-5a48-91f5-1632253f9a08",
      "reversesTransactionId": null,
      "adjustment": null,
      "breakdown": [
        { "type": "ChannelFee", "amount": "1.13111", "fixedAmount": null, "variableAmount": null },
        { "type": "Remaining", "amount": "111.979797", "fixedAmount": null, "variableAmount": null }
      ],
      "networkFee": null,
      "fiatFeeAmount": "1",
      "fiatRate": "0.8840880389680685",
      "paymentSystemId": "SEPA-20260917-998877",
      "updatedAt": "2026-09-17T08:14:20.000Z"
    }
  ],
  "total": 2,
  "limit": 20,
  "offset": 0
}
```

`404` Not onboarded

```json
{ "statusCode": 404, "error": "NotFoundError", "message": "Customer not found" }
```

---

Web version: https://docs.aureahub.com/#payin-transactions
