---
title: "List the family's personal bank rows with categories, notes, transfer matches and moves"
method: GET
path: "/families/{id}/personal/transactions"
tags: ["Families"]
---

# List the family's personal bank rows with categories, notes, transfer matches and moves

`GET /families/{id}/personal/transactions`

## Request

- Base URL: `https://ledgerhq.pro/api/v1`
- URL: `https://ledgerhq.pro/api/v1/families/{id}/personal/transactions`
- Auth: one of:
  - HTTP bearer and API key in header `x-organization-id`
  - HTTP bearer and API key in header `x-organization-id`

Firm-side family relationships only. Select the firm with x-organization-id. Owners, Admins and Staff Admins access all firm families; Staff Members need independent family assignment. Company access does not grant family access. OAuth requires the broad mcp grant, not a narrow banking scope; API keys retain ordinary agent permission scopes. No accounting organizations, portal grants, bank changes, invitations or charges are created. Writes require ordinary firm write entitlement. Cross-firm and inaccessible IDs return 404. Personal accounts never post journals; these operations read delivered bank rows and save household categories, notes and rules. Rows nobody categorized by hand are categorized automatically (rule, then the firm's earlier choice for the merchant, then Plaid, then AI); a person's choice always wins. Rules never hide rows.

## Path parameters

- `id` string, uuid, required

## Query parameters

- `from` string, date
- `to` string, date
- `categoryId` string, uuid
- `uncategorized` boolean
- `tab` 'pending' | 'ready' | 'ask_client' | 'posted' | 'excluded' | 'all'

## Response `200`

Success

- object
  - `from` string, date
  - `to` string, date
  - `transactions` object[]
    - `id` string: Bank feed row ID
    - `date` string, date
    - `description` string, nullable
    - `amountCents` integer: Positive is money in, negative is money out
    - `status` 'pending' | 'posted' | 'removed'
    - `removed` boolean: The bank withdrew this row; it stays listed
    - `accountId` string, uuid, nullable
    - `accountName` string, nullable
    - `institutionName` string, nullable
    - `categoryId` string, uuid, nullable
    - `categoryName` string, nullable
    - `categoryKind` string, nullable
    - `categorySource` 'person' | 'rule' | 'firm' | 'plaid' | 'ai' | 'null', nullable: Who set the category: a person, a family rule, the firm's earlier choice for this merchant, Plaid's confident category, or AI. Automation never replaces a person's choice
    - `confidence` number, nullable: AI confidence from 0 to 1 when AI set the category
    - `merchantKey` string: Grouping key for this row's merchant
    - `suggestedCategoryId` string, uuid, nullable: Category from the newest matching rule when no category is set yet
    - `suggestedCategoryName` string, nullable
    - `note` string, nullable
    - `transfer` object, nullable: Matching opposite row in another family account within five days
      - `eventId` string
      - `accountName` string
      - `side` 'personal' | 'company'
      - `companyName` string, nullable
    - `moved` object, nullable
      - `journalEntryId` string, uuid
      - `companyId` string, uuid, nullable
      - `companyName` string, nullable
      - `movedAt` string, date-time
    - `tab` 'pending' | 'ready' | 'ask_client' | 'posted' | 'excluded': Bank feed tab. Posted means cleared: the bookkeeper confirmed the category or moved the row into a company's books
    - `suggested` boolean: The category was set by automation and is waiting for the bookkeeper to post it
    - `posted` object, nullable
      - `postedAt` string, date-time
      - `postedBy` string, nullable
      - `auto` boolean: Posted by Tally AI from a family rule
    - `excluded` object, nullable
      - `excludedAt` string, date-time
    - `askClient` object, nullable
      - `askedAt` string, date-time
      - `question` string, nullable
      - `memberId` string, uuid, nullable
      - `memberName` string, nullable
      - `answer` string, nullable
      - `answeredAt` string, date-time, nullable
  - `total` integer
  - `truncated` boolean: Only the newest 1000 rows are returned
  - `personalAccountCount` integer
  - `categories` object[]
    - `id` string, uuid
    - `name` string
    - `kind` 'income' | 'spending' | 'saving' | 'transfer' | 'tax'
  - `companies` object[]
    - `id` string, uuid
    - `name` string
  - `tabCounts` object
    - `pending` integer
    - `ready` integer
    - `ask_client` integer
    - `posted` integer
    - `excluded` integer
    - `all` integer
  - `autoPostEnabled` boolean: Tally AI posts settled rule matches
  - `members` object[]
    - `id` string, uuid
    - `name` string
    - `email` string
  - `accounts` object[]
    - `accountId` string, uuid
    - `name` string
    - `institutionName` string, nullable
    - `mask` string, nullable
    - `balanceCents` integer, nullable
    - `unclearedCount` integer: Rows in the range not posted or excluded
    - `readyCount` integer: Settled rows in the range waiting to be posted
    - `pendingCount` integer: Rows in the range still pending at the bank
    - `lastTransactionDate` string, date, nullable: Newest transaction date in the range

## Other responses

- `403`: Firm staff or required permission missing
- `404`: Record not found or not accessible
- `409`: Archived family, last-member removal, identity conflict, already-linked member, explicit owner selection required, or redundant administrator assignment

## Changes

- **2026-10-20** `9a8269f0a586`: 10 info
  - added the new optional `query` request parameter `tab`
  - added the optional property `accounts` to the response with the `200` status
  - added the optional property `autoPostEnabled` to the response with the `200` status
  - added the optional property `members` to the response with the `200` status
  - …6 more
- **2026-10-20** `01c3e57d281f`: 3 info
  - added the optional property `transactions/items/categorySource` to the response with the `200` status
  - added the optional property `transactions/items/confidence` to the response with the `200` status
  - added the optional property `transactions/items/merchantKey` to the response with the `200` status

[Operation history](https://skmtc.dev/ledgerhq-pro/apis/ledgerhq-bookkeeping-api/changes/families/:id/personal/transactions/get.md)

---

[API](https://skmtc.dev/ledgerhq-pro/apis/ledgerhq-bookkeeping-api.md) · [All operations](https://skmtc.dev/ledgerhq-pro/apis/ledgerhq-bookkeeping-api/llms.txt) · [OpenAPI document](https://skmtc.dev/ledgerhq-pro/apis/ledgerhq-bookkeeping-api/revisions/9a8269f0a586?raw)
