---
title: "List Transactions"
method: GET
path: "/transactions"
tags: ["Billing"]
---

# List Transactions

`GET /transactions`

## Request

- Base URL: `https://api.hedra.com/v3`
- URL: `https://api.hedra.com/v3/transactions`
- Auth: one of:
  - API key in header `Authorization`
  - HTTP bearer

Every movement of the API wallet's balance, newest first: funds added,
jobs charged, charges refunded, and corrections. Chat requests are summed
into one `llm_usage` row per model per UTC day. A GPU sandbox's charges
and refunds are summed into one `sandbox_usage` row. Scoped to the workspace the
credential bills, the same one `GET /v3/balance` reports, so an
`llm_usage` row sums every member's requests.

## Query parameters

- `limit` integer: Maximum items per page.
- `cursor` string, nullable: Opaque cursor from the previous page's `next_cursor`; omit for the first page.

## Response `200`

Successful Response

- TransactionListResponse
  - `data` TransactionRecord[], required: This page of items.
    - `id` string, required: The transaction's id. Stable, and the same id the V2 billing history reports for this transaction. An `llm_usage` transaction's id starts with `llm_usage:` and names its daily sum; a `sandbox_usage` transaction's id starts with `sandbox_usage:`.
    - `kind` string, required: What moved the balance: `purchase` when funds were bought, `grant` when they were granted by a plan entitlement, `usage` when a job was charged, `llm_usage` for a day's chat requests to one model, summed into one row, `sandbox_usage` for what one GPU sandbox was charged, summed into one row, `refund` when a charge was returned, `adjustment` when Hedra corrected the balance, and `other` for a movement this API version does not yet name. The list is open and may gain values, so switch on it with a default branch; `amount` is authoritative for a kind you do not recognize.
    - `amount` number, nullable, required: The change to the balance, signed: negative for a charge, positive for funds arriving. Null for a transaction from before the wallet recorded amounts, whose movement is unknown rather than zero. For `llm_usage`, the sum of the day's charges so far; for `sandbox_usage`, the net of the sandbox's charges and refunds so far.
    - `currency` string, nullable, required: ISO-4217 currency code for `amount`; null exactly when `amount` is.
    - `created_at` string, date-time, required: ISO-8601 instant the balance moved. For `llm_usage`, the start of the day it covers; for `sandbox_usage`, when the sandbox was created.
    - `llm_usage` TransactionLlmUsage: The chat requests an `llm_usage` transaction sums.
      - `model` string, required: The model the requests used.
      - `request_count` integer, required: How many requests the row sums.
      - `period_start` string, date-time, required: Start of the UTC day the row covers. A request counts toward the day it was created, even when it was charged after midnight. `GET /v3/models/{model}/jobs` lists the requests as jobs.
      - `period_end` string, date-time, required: End of the UTC day the row covers, exclusive: one day after `period_start`.
    - `sandbox_usage` TransactionSandboxUsage: The GPU sandbox a `sandbox_usage` transaction sums.
      - `accelerator` string, required: The GPU model and GPU count per instance, such as `h100:1`.
      - `replicas` integer, required: How many instances the sandbox ran.
      - `created_at` string, date-time, required: When the sandbox was created. The transaction's `created_at` is this instant.
      - `ended_at` string, date-time, nullable, required: When the sandbox's last instance stopped, or null while it runs.
    - `list_amount` number, nullable: What `amount` would have been at the model's list price, before the discount negotiated for the workspace, in `currency`; negative, like the debit it describes, even when a 100% discount made `amount` 0. Set only on a `usage` or `sandbox_usage` row a discount applied to; null on every other row.
    - `discount_percent` number, nullable: The negotiated percentage off the model's list price that `amount` reflects, e.g. 20 or 12.5. Set exactly when `list_amount` is; null otherwise.
  - `next_cursor` string, nullable, required: Opaque cursor for the next page, or null when this response completes the list. Always present. Endpoints that serve the whole collection at once always return null.

## Other responses

- `400`: Invalid or failed-validation request.
- `401`: Authentication failed: missing, malformed, or invalid credentials.
- `403`: Insufficient scope or plan.
- `404`: Resource not found.
- `429`: Rate limit exceeded.
- `500`: Internal error.

## Changes

- **2026-10-16** `06692d16e78a`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/hedra-labs/apis/hedra-api/changes/transactions/get.md)

---

[API](https://skmtc.dev/hedra-labs/apis/hedra-api.md) - [All operations](https://skmtc.dev/hedra-labs/apis/hedra-api/llms.txt) - [OpenAPI document](https://skmtc.dev/hedra-labs/apis/hedra-api/revisions/6ef35a11cefe?raw)
