# Get Payment Methods

List the virtual IBANs assigned to the user, with the crypto route each one converts deposits into.

## Overview

Every call to [Initiate Deposit](https://docs.aureahub.com/docs/payin-initiate.md) gives the user a virtual IBAN bound to a route — crypto currency, network and destination address. Bank transfers to that IBAN are converted by the bank ramp and sent to the destination. This endpoint returns the payment methods Aurea has stored for the user; it doesn't call the bank ramp.

`status` is `active`, `inactive` or `expired`. Aurea treats each assignment as valid for about a day: when `isExpired` is `true` (see `expiresAt`), call Initiate Deposit again with the same route before showing the IBAN. When the bank ramp returns the same payment method, Aurea updates the existing record.

`expiresAt` is **Aurea's own refresh policy, not an expiry the bank ramp states**: the bank ramp's answer for a virtual account carries no expiry at all. Read it as «when Aurea will read this account from the bank ramp again».

**`destinationRevoked`** is `true` when the destination of this account is an address the user *proved and then revoked* ([Revoke an Address](https://docs.aureahub.com/docs/bank-address-revoke.md)). A new deposit to a revoked address is already refused, but **the IBAN the bank ramp issued stays open** — only the bank ramp can close a virtual account — so a transfer to it would still deliver to an address its owner has disowned. **Stop showing that IBAN** and ask the user for an address they still own. The Aurea operator is told as well, and can ask the bank ramp to close it. It goes back to `false` if the user proves that same address again.

Each payment method also carries what the bank ramp answered when it created the virtual account: `virtualAccountId`, the whole `bankAddress`, `reference`, `fee` and the account's other rails in `relatedPaymentMethods`, as in [Initiate Deposit](https://docs.aureahub.com/docs/payin-initiate.md). A payment method stored before Aurea kept them has `null` (and no rails) there, until Initiate Deposit is called again for its route.

IBANs belong to the user's profile in one environment: a test network route (such as `SolanaDevnet`) to the sandbox profile, a mainnet route to the production one. Pass `isTestnet=true` to list the sandbox IBANs; without it you get the production ones, and `404` when the user has no profile in that environment.

## Endpoint

### `GET /v1/ramp/bank/payin/payment-methods`

Authentication: bearer token required.

Returns the virtual IBAN payment methods of the authenticated user's profile in one environment.

**Query parameters**

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `isTestnet` | boolean | no | `true` for the sandbox profile; `false` or omitted for production. Any other value returns `400`. |

**Responses**

`200` OK

```json
{
  "paymentMethods": [
    {
      "id": "7a1d3c5e-9b2f-4e6a-8c0d-1f3b5d7e9a2c",
      "noahPaymentMethodId": "<bank payment method ID>",
      "paymentMethodType": "<bank payment method type>",
      "accountHolderName": "<account holder>",
      "iban": "<virtual IBAN>",
      "bic": "<BIC>",
      "bankName": "<bank name>",
      "bankAddress": { "street": "<street>", "street2": null, "city": "<city>", "postalCode": "<postal code>", "state": "<state>", "country": "<country>" },
      "virtualAccountId": "<the bank ramp virtual account ID>",
      "reference": null,
      "fee": { "currency": "EUR", "pct": "0", "base": "0", "min": "0" },
      "relatedPaymentMethods": [],
      "fiatCurrency": "EUR",
      "cryptoCurrency": "EURC_TEST",
      "network": "SolanaDevnet",
      "destinationAddress": "<Solana address>",
      "destinationRevoked": false,
      "status": "active",
      "isExpired": false,
      "lastRefreshedAt": "2026-09-11T09:30:00.000Z",
      "expiresAt": "2026-09-12T08:30:00.000Z",
      "createdAt": "2026-09-11T09:30:00.000Z"
    }
  ],
  "total": 1
}
```

`404` Not onboarded

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

## Implementation

```javascript
// Show the user's bank details for each active route, in one environment
async function getVirtualIbans(token, { sandbox = false } = {}) {
  const res = await fetch(`https://api.aureahub.com/v1/ramp/bank/payin/payment-methods?isTestnet=${sandbox}`, {
    headers: { Authorization: `Bearer ${token}` }
  });
  if (res.status === 404) return []; // user not onboarded yet
  if (!res.ok) throw new Error(`Payment methods failed: ${res.status}`);

  const { paymentMethods } = await res.json();
  return paymentMethods
    .filter(pm => pm.status === 'active')
    .map(pm => ({
      iban: pm.iban,
      bic: pm.bic,
      holder: pm.accountHolderName,
      bank: pm.bankName,
      route: `${pm.fiatCurrency} → ${pm.cryptoCurrency} on ${pm.network}`
    }));
}
```

---

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