---
title: "GET /ledger-transactions — List Transactions"
url: https://lumean.app/de/developers/docs/api/get-ledger-transactions
locale: de
description: "List Transactions"
generated: 2026-10-18
operationId: billing.ledgerTransactions
method: GET
path: /ledger-transactions
scopes: [billing.read]
spec_version: 1.0.0
---

# GET /ledger-transactions

**List Transactions**

The key owner's money movements: top-ups, charges for completed orders, refunds and
referral rewards. Newest first, paginated.

Amounts are in the asset's minor units (see `asset.precision`); the sign follows the
direction of the entry; `amount_formatted` is the same amount, ready to display. The
public payload omits the full wallet object and keeps `wallet_id`.

This endpoint exists only while the wallet feature is enabled; otherwise `404`.

**Required key permission:** `billing.read`.

- Benötigtes Recht: `billing.read`

## Anfrage

```bash
curl -X GET 'https://api.lumean.app/api/public/ledger-transactions' \
  -H 'Accept: application/json' \
  -H 'X-API-KEY: YOUR_API_KEY'
```

## Parameter

| Feld | In | Typ | Pflicht | Beschreibung |
| --- | --- | --- | --- | --- |
| `page` | query | `integer` — ≥ 1 | — | Page number, starting at `1`. |
| `per_page` | query | `integer` — 1..100 | — | Records per page, `1..100`. Defaults to 15. |
| `wallet_id` | query | `integer` | — | Show movements for a single wallet only. Ids come from `GET /wallets`. |
| `type` | query | `LedgerTransactionType` — `referral_reward` · `initial_deposit` · `deposit` · `unlock_balance` · `lock_balance` · `admin_adjustment` · `transfer` · `transfer_fee` · `subscription_refund` · `admin_subscription_grant` · `deposit_refund` · `admin_charge` · `admin_credit` · `migration_credit` · `order_completion` · `order_refund` · `subscription_direct_payment` · `token_consumption_charge` · `deposit_bonus` · `referral_reward_usd` · `referral_reward_reversal` · `subscription_renewal` · `subscription_token_consumed` · `subscription_token_refund` · `subscription_token_forfeited` · `subscription_token_credit` · `legacy_balance_migration` · `policy_block_fee` · `ai_gateway_usage` · `gift_code_purchase` · `gift_code_issue` · `gift_code_cancel` · `gift_code_redemption` · `gift_code_self_redemption` · `gift_code_discount` · `gift_code_refund` · `reseller_top_up` · `reseller_top_up_refund` · `reseller_debt_repayment` · `reseller_revoke_transfer` | — | Filter by movement type. The full set of accepted values ships in the `LedgerTransactionType` schema; the common ones are `deposit` (top-up), `order_completion` (charge for a finished order), `order_refund` (refund) and `referral_reward`. An unknown value returns `422`. |
| `sort_by` | query | `string` — ≤ 32 Zeichen | — | Sort field. Defaults to the operation date. An unknown value is not an error: the list simply falls back to date ordering, newest first. |
| `sort_order` | query | `string` — `asc` · `desc` — ≤ 4 Zeichen | — | Sort direction. Defaults to `desc` — newest operations first. |
| `X-Locale` | header | `string` | — | Language of the localised texts in the response (`message`, labels, failure reasons), an ISO-639-1 code. Optional; without it — the key owner’s account language, then `Accept-Language`, then the default language. An unknown or unsupported code is skipped as if it were absent. |
| `X-Timezone` | header | `string` | — | IANA time zone (`Europe/Moscow`) in which the response shows moments in time — ISO-8601 with an offset. Optional; without it dates come in UTC. An invalid zone is ignored. The server returns the applied zone in the response header of the same name. |

## Request-Body

Kein Body.

## Antworten

### 200 — Success. The payload is in `data`.

**Antwortfelder**

| Feld | Typ | Pflicht | Beschreibung |
| --- | --- | --- | --- |
| `success` | `boolean` | Pflicht | Success flag. Branch on the HTTP status code instead: any 2xx response carries `true` here, while an error comes back in a different shape that need not contain this field at all. |
| `message` | `string` | Pflicht | A human-readable note in the account language. Fine to show to a user; do not parse it — the wording changes without notice and is not an error code. |
| `data` | `LedgerTransactionList` | Pflicht | The response payload. |
| `data.items` | `array<LedgerTransaction>` | Pflicht | Records on the current page, in the list’s sort order. |
| `data.items[].id` | `integer` | Pflicht | ID of the money movement. |
| `data.items[].type` | `LedgerTransactionType` — `referral_reward` · `initial_deposit` · `deposit` · `unlock_balance` · `lock_balance` · `admin_adjustment` · `transfer` · `transfer_fee` · `subscription_refund` · `admin_subscription_grant` · `deposit_refund` · `admin_charge` · `admin_credit` · `migration_credit` · `order_completion` · `order_refund` · `subscription_direct_payment` · `token_consumption_charge` · `deposit_bonus` · `referral_reward_usd` · `referral_reward_reversal` · `subscription_renewal` · `subscription_token_consumed` · `subscription_token_refund` · `subscription_token_forfeited` · `subscription_token_credit` · `legacy_balance_migration` · `policy_block_fee` · `ai_gateway_usage` · `gift_code_purchase` · `gift_code_issue` · `gift_code_cancel` · `gift_code_redemption` · `gift_code_self_redemption` · `gift_code_discount` · `gift_code_refund` · `reseller_top_up` · `reseller_top_up_refund` · `reseller_debt_repayment` · `reseller_revoke_transfer` | Pflicht | Movement type — a `LedgerTransactionType` value: `deposit` (top-up), `order_completion` (charge for an order), `order_refund` (refund), `policy_block_fee` (fee for an attempt rejected by the content policy), and others. |
| `data.items[].status` | `string` — `pending` · `posted` · `void` | Pflicht | Movement state: `posted` — booked, `pending` — awaiting booking, `void` — cancelled, with no effect on the balance. |
| `data.items[].description` | `string` — nullable | Pflicht | A description of the movement in words, for display. `null` when there is none. |
| `data.items[].amount` | `integer` | — | Movement amount as an integer in the asset’s minor units (`asset.precision`), unsigned — the direction is in `direction`. Absent when the amount cannot be determined. |
| `data.items[].amount_formatted` | `number` | — | The same amount in whole asset units, ready to display. Present when the asset of the amount is known: always for wallet movements, and for a movement that bypasses a wallet when its asset is recorded. |
| `data.items[].asset` | `Asset` | — | The asset of the amount; its `precision` is the divisor for `amount`. Present under the same conditions as `amount_formatted`. |
| `data.items[].asset.id` | `integer` | Pflicht | Internal identifier of the asset. |
| `data.items[].asset.code` | `string` | Pflicht | Asset code: `LUMC` is the internal currency, `TOKEN` the generation tokens. |
| `data.items[].asset.kind` | `AssetKind` — `money` · `unit` | Pflicht | Kind of asset: money or consumable units. It decides whether an amount counts as a payment or as quota consumption. |
| `data.items[].asset.precision` | `integer` | Pflicht | Number of decimal places. **The load-bearing field:** every integer amount in this asset is divided by `10^precision` to obtain the real value. Do not assume the divisor is 100. |
| `data.items[].asset.name` | `string` | Pflicht | Display name of the asset, in the account language. |
| `data.items[].asset.deleted_at` | `string` — date-time — nullable | Pflicht | When the asset was retired, ISO 8601. `null` while it is in use. |
| `data.items[].asset.created_at` | `string` — date-time — nullable | Pflicht | When the asset was created, ISO 8601. |
| `data.items[].asset.updated_at` | `string` — date-time — nullable | Pflicht | When the asset last changed, ISO 8601. |
| `data.items[].direction` | `string` — `debit` · `credit` | — | `credit` — money in, `debit` — money out. Locking and unlocking for an order (`type`: `lock_balance`, `unlock_balance`) keep the money in the wallet, so the direction is that of the available balance (`balance` in `GET /wallets`): a lock is `debit`, an unlock is `credit`. |
| `data.items[].created_at` | `string` | Pflicht | When the movement was created, ISO 8601. |
| `data.items[].entries` | `array<LedgerEntry>` | Pflicht | Postings to your wallets. A movement that bypasses a wallet (such as a direct subscription payment) has an empty list; the amount is then on the transaction itself. |
| `data.items[].entries[].id` | `integer` | Pflicht | Posting ID. |
| `data.items[].entries[].wallet_id` | `integer` | Pflicht | The posting’s wallet — an `id` from `GET /wallets`. |
| `data.items[].entries[].amount` | `integer` | Pflicht | Posting amount as an integer in the wallet asset’s minor units (the divisor is `asset.precision`), signed: negative means out; the direction is also in `entry_type`. |
| `data.items[].entries[].amount_formatted` | `number` | — | The same signed amount in whole asset units, ready to display. |
| `data.items[].entries[].asset` | `Asset` | — | The asset of the posting’s wallet; its `precision` is the divisor for `amount`. |
| `data.items[].entries[].asset.id` | `integer` | Pflicht | Internal identifier of the asset. |
| `data.items[].entries[].asset.code` | `string` | Pflicht | Asset code: `LUMC` is the internal currency, `TOKEN` the generation tokens. |
| `data.items[].entries[].asset.kind` | `AssetKind` — `money` · `unit` | Pflicht | Kind of asset: money or consumable units. It decides whether an amount counts as a payment or as quota consumption. |
| `data.items[].entries[].asset.precision` | `integer` | Pflicht | Number of decimal places. **The load-bearing field:** every integer amount in this asset is divided by `10^precision` to obtain the real value. Do not assume the divisor is 100. |
| `data.items[].entries[].asset.name` | `string` | Pflicht | Display name of the asset, in the account language. |
| `data.items[].entries[].asset.deleted_at` | `string` — date-time — nullable | Pflicht | When the asset was retired, ISO 8601. `null` while it is in use. |
| `data.items[].entries[].asset.created_at` | `string` — date-time — nullable | Pflicht | When the asset was created, ISO 8601. |
| `data.items[].entries[].asset.updated_at` | `string` — date-time — nullable | Pflicht | When the asset last changed, ISO 8601. |
| `data.items[].entries[].entry_type` | `string` — `credit` · `debit` | Pflicht | `credit` — into the wallet, `debit` — out of it. |
| `data.items[].entries[].created_at` | `string` | Pflicht | When the posting was created, ISO 8601. |
| `data.current_page` | `integer` | Pflicht | Current page number, starting from one. |
| `data.last_page` | `integer` | Pflicht | Number of the last page. The walk is over once `current_page` equals `last_page`. |
| `data.per_page` | `integer` | Pflicht | Page size the server applied. |
| `data.total` | `integer` | Pflicht | Total number of records matching the filter. |

**Beispiel**

```json
{
  "success": true,
  "message": "string",
  "data": {
    "items": [
      {
        "id": "string",
        "type": "string",
        "status": "string",
        "description": "string",
        "amount": "string",
        "amount_formatted": 1,
        "asset": {
          "id": 1,
          "code": "string",
          "kind": null,
          "precision": 1,
          "name": null,
          "is_active": true,
          "is_default": true,
          "default_balance": 1,
          "deleted_at": "2026-07-17T12:34:56+00:00",
          "created_at": "2026-07-17T12:34:56+00:00",
          "updated_at": "2026-07-17T12:34:56+00:00"
        },
        "direction": "string",
        "created_at": "string",
        "entries": [
          {
            "id": null,
            "wallet_id": null,
            "amount": null,
            "amount_formatted": null,
            "asset": null,
            "entry_type": null,
            "metadata": null,
            "created_at": null,
            "wallet": null
          }
        ],
        "actor_user_id": "string",
        "metadata": "string"
      }
    ],
    "current_page": 1,
    "last_page": 1,
    "per_page": 1,
    "total": 1
  }
}
```

### 401 — The key is missing, unknown, disabled or expired.

**Antwortfelder**

| Feld | Typ | Pflicht | Beschreibung |
| --- | --- | --- | --- |
| `success` | `boolean` | Pflicht | Always `false` in error responses. |
| `message` | `string` | Pflicht | Error text in the key's language (set through the `X-Locale` header). |
| `data` | `null` — nullable | Pflicht | Always `null` when the request is rejected before processing. |

**Beispiel**

```json
{
  "success": false,
  "message": "API key is missing. Provide it in the X-API-KEY header.",
  "data": null
}
```

### 403 — The key lacks the required permission, or the object belongs to another user.

**Antwortfelder**

| Feld | Typ | Pflicht | Beschreibung |
| --- | --- | --- | --- |
| `success` | `boolean` | Pflicht | Always `false` in error responses. |
| `message` | `string` | Pflicht | Error text in the key's language (set through the `X-Locale` header). |

**Beispiel**

```json
{
  "success": false,
  "message": "This API key does not have permission to perform this action."
}
```

### 422 — Validation error. Offending fields are listed in `errors`.

**Antwortfelder**

| Feld | Typ | Pflicht | Beschreibung |
| --- | --- | --- | --- |
| `success` | `boolean` | Pflicht | Always `false` in error responses. |
| `message` | `string` | Pflicht | A summary of the validation errors in words, in the response language (`X-Locale`). |
| `errors` | `object` | Pflicht | A per-field breakdown: the key names a request field, the value lists the complaints about it. |
| `errors.*` | `array<string>` — beliebige Schlüssel | — |  |

**Beispiel**

```json
{
  "success": true,
  "message": "string",
  "errors": {}
}
```

---

- Diese Seite im Browser: https://lumean.app/de/developers/docs/api/get-ledger-transactions
- Vollständige maschinenlesbare Referenz: https://api.lumean.app/docs/llm.md
