Account ledger & activity

List and filter every debit and credit against an account — each entry carries the running balance after it posted.

An account's ledger is the authoritative record of money movement: one entry for every debit and credit that posts, in the order it happened, each stamped with the running balance after that entry. When you need to reconcile activity, build a transaction history, or show a customer what happened on their account, you read the ledger.

Each entry ties back to what caused it — a card settlement, a BOOK transfer, an inbound credit — so the ledger is where money movement and the account balance reconcile.

Ledger vs. balance

The account object exposes point-in-time balances (availableBalance, currentBalance). The ledger explains how the balance got there — every entry that changed it, with the resulting balance on each line.


List ledger entries

Retrieve ledger entries with the List Ledgers API. It's a filtered, paginated search: you pass filter criteria (which account, which dates, which type) and PCE returns matching entries newest-first.

Make a POST request to /ledger/list.

Request

POST /ledger/list

{
  "pageNumber": 1,
  "pageSize": 25,
  "sortOptions": {
    "sortOrder": "desc",
    "sortBy": "lastUpdatedOn"
  },
  "criteria": {
    "filters": [
      { "operator": "eq",  "key": "account.id",     "values": [9914118] },
      { "operator": "gte", "key": "lastUpdatedOn",   "values": ["03/10/2026"] },
      { "operator": "lte", "key": "lastUpdatedOn",   "values": ["03/15/2026"] }
    ]
  }
}

Response

{
  "totalCount": 25,
  "returnedCount": 3,
  "pageNumber": 1,
  "offset": 29149,
  "resources": [
    {
      "id": 3081,
      "type": "DEBIT",
      "amount": "30.01",
      "ledgerDate": "03/13/2026",
      "method": "CARD",
      "currentBalance": "29969.99",
      "narration": "*2059 - Widgets Incorporated NEW YORK, NY",
      "ledgerType": "SETTLE",
      "groupId": "61CET",
      "createdOn": "03/13/2026 11:58:58",
      "lastUpdatedOn": "03/13/2026 11:58:58",
      "createdBy": { "username": "SYSTEM", "status": "ACTIVE", "userType": "SYSTEM" },
      "account": {
        "resourceName": "account",
        "url": "/v1/customer/id/4223433/account/id/9914118",
        "id": 9914118
      }
    },
    {
      "id": 3375824,
      "type": "CREDIT",
      "amount": "10000.00",
      "ledgerDate": "03/13/2026",
      "method": "BOOK",
      "scheduleClass": "SEND",
      "currentBalance": "21414.56",
      "narration": "Transfer from James Checking *9535",
      "groupId": "230489806T",
      "createdOn": "03/13/2026 12:53:07",
      "lastUpdatedOn": "03/13/2026 12:53:07",
      "schedule": {
        "resourceName": "transaction",
        "url": "/v1/transaction/id/230489806",
        "id": 230489806,
        "externalId": "CONACH141832"
      },
      "account": {
        "resourceName": "account",
        "url": "/v1/customer/id/4223433/account/id/9914118",
        "id": 9914118
      }
    }
  ]
}

Filters

Pass one or more filter conditions in criteria.filters[]. Each condition is a key, an operator, and one or more values.

KeyFilter by
account.idThe Passport account ID
account.externalIdYour external identifier for the account
typeEntry direction — DEBIT or CREDIT
lastUpdatedOnDate the entry was recorded (use gte + lte for a range; MM/DD/YYYY)
isRealTimeRestrict to real-time entries
customViewApply a configured custom view

Supported operators: eq, ne, gt, gte, lt, lte, in, nin, like.

Filter by account.externalId when you track accounts by your own identifiers — you don't need to store Passport IDs to read a ledger.


Ledger entry fields

FieldDescription
idUnique ledger entry ID
typeDEBIT (money out) or CREDIT (money in)
amountEntry amount
currentBalanceRunning balance on the account after this entry posted
methodRail or source of the movement (e.g., CARD, BOOK, MONEYGRAM)
narrationHuman-readable description of the entry
ledgerDateDate the entry posted (MM/DD/YYYY)
ledgerTypeLedger classification (e.g., SETTLE)
groupIdGroups related entries that belong to the same movement
scheduleLink to the originating transaction (when the entry came from a transaction), including its id and externalId
scheduleClassDirection of the originating transaction (e.g., SEND)
accountThe account the entry belongs to, with id and resource url
createdOn / lastUpdatedOnTimestamps (MM/DD/YYYY HH:MM:SS)
createdBy / lastUpdatedByActor that recorded the entry (SYSTEM for platform-generated entries)

Pagination & sorting

Ledger history can be long — page through it rather than pulling everything at once.

FieldPurpose
pageNumberPage to return
pageSizeRecords per page (default 100)
limitTotal records to return (1–100, default 100)
getTotalCountSet true to include totalCount in the response
sortOptions.sortBySort field — lastUpdatedOn
sortOptions.sortOrderASC or DESC

The response echoes totalCount, returnedCount, pageNumber, and an offset (the ID of the last record returned) so you can request the next page.


Scenarios

List recent activity for an account

Read the latest entries for one account, newest-first — the backbone of an activity feed.

  • Filter on account.id (or account.externalId) with eq.
  • Sort lastUpdatedOn desc, set a modest pageSize, and page as the customer scrolls.

Reconcile a date range

Pull everything that posted in a billing window to reconcile against your own records.

  • Combine lastUpdatedOn gte (start) and lastUpdatedOn lte (end).
  • Add getTotalCount: true so you know how many entries to expect across pages.

Separate money in from money out

Show credits and debits separately, or total each side.

  • Add a type filter (eq CREDIT or eq DEBIT) to the account filter.

Best practices

PracticeWhy
Reconcile on currentBalanceEach entry carries the balance after it posted — reconcile against that rather than recomputing from amounts.
Use groupId to relate entriesMovements that generate multiple entries share a groupId; group on it instead of guessing from amounts and timing.
Follow schedule back to the transactionWhen an entry has a schedule link, use its id/externalId to tie the ledger line to the transaction that caused it.
Page, don't pullUse pageSize and offset for long histories instead of requesting everything at once.
Track by your own IDsFilter on account.externalId so you don't have to store Passport account IDs.

See also


Did this page help you?
.readme-logo { display: none !important; }