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

# List Transactions

`GET /api/transactions`

## Query parameters

- `account_id` string, uuid, nullable
- `account_ids` string[], nullable
- `category_id` string, uuid, nullable
- `category_ids` string[], nullable
- `payee_id` string, uuid, nullable
- `from` string, date, nullable
- `to` string, date, nullable
- `bill_id` string, uuid, nullable — Filter by credit-card bill (issue #92); takes precedence over from/to
- `group_id` string, uuid, nullable — Filter to transactions split through this group; widens visibility for linked members
- `unbilled_only` boolean — Cycle-math fallback only: exclude txs already linked to any bill (used for in-progress CC cycles)
- `q` string, nullable
- `uncategorized` boolean
- `type` string, nullable
- `page` integer
- `limit` integer
- `include_opening_balance` boolean
- `exclude_transfers` boolean
- `user_pnl_only` boolean — Return only rows that count toward dashboard/user income/expense totals
- `tags` string[], nullable
- `min_amount` number, nullable — Filter to transactions with absolute amount >= this value (primary currency).
- `max_amount` number, nullable — Filter to transactions with absolute amount <= this value (primary currency).
- `sort_by` string, nullable — Column to sort by (date|amount|description|payee|category|account|type|status). Default: date desc.
- `sort_dir` string

## Headers

- `X-Workspace-Id` string, nullable

## Response `200`

Successful Response

- PaginatedTransactions
  - `items` TransactionRead[], required
    - `description` string, required
    - `amount` string, required
    - `date` string, date, required
    - `type` string, required
    - `external_id` string, nullable
    - `currency` string
    - `fx_rate` string, nullable
    - `payee_raw` string, nullable
    - `id` string, uuid, required
    - `user_id` string, uuid, required
    - `account_id` string, uuid, nullable
    - `category_id` string, uuid, nullable
    - `category` CategoryRead
      - `name` string, required
      - `icon` string
      - `color` string
      - `id` string, uuid, required
      - `user_id` string, uuid, required
      - `group_id` string, uuid, nullable
      - `is_system` boolean, required
      - `treat_as_transfer` boolean
      - `is_ignored` boolean
    - `source` string, required
    - `status` string
    - `payee` string, nullable
    - `payee_id` string, uuid, nullable
    - `payee_name` string, nullable
    - `notes` string, nullable
    - `transfer_pair_id` string, uuid, nullable
    - `amount_primary` number, nullable
    - `fx_rate_used` number, nullable
    - `fx_fallback` boolean
    - `attachment_count` integer
    - `installment_number` integer, nullable
    - `total_installments` integer, nullable
    - `installment_total_amount` number, nullable
    - `installment_purchase_date` string, date, nullable
    - `bill_id` string, uuid, nullable
    - `effective_bill_date` string, date, nullable
    - `recurring_transaction_id` string, uuid, nullable
    - `splits` TransactionSplitRead[]
      - `id` string, uuid, required
      - `transaction_id` string, uuid, required
      - `group_member_id` string, uuid, required
      - `share_amount` string, required
      - `share_type` string, required
      - `share_pct` string, nullable
      - `notes` string, nullable
      - `created_at` string, date-time, required
    - `is_shared` boolean
    - `viewer_share` string, nullable
    - `group_id` string, uuid, nullable
    - `parent_owner_name` string, nullable
    - `is_ignored` boolean
  - `total` integer, required
  - `page` integer, required
  - `limit` integer, required
  - `summary` TransactionsSummary — Income / expense / net totals across all rows matching the active filters (issue #185). Amounts are in the user's primary currency. Floats (not Decimal) so the JSON payload matches `amount_primary` and the frontend gets plain numbers. `excluded` (issue #242) is the absolute total of everything filtered out of income/expense for the same rows — paired transfers, `treat_as_transfer` categories (transfers, investments, custom) and ignored items — i.e. the complement of `counts_as_pnl()`.
    - `income` number, required
    - `expense` number, required
    - `net` number, required
    - `excluded` number, required
    - `currency` string, required

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.dev/usesecuro/apis/securo.md) · [All operations](https://skmtc.dev/usesecuro/apis/securo/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/usesecuro/securo/revisions/1df3dfa0c028/schema)
