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.
| Key | Filter by |
|---|---|
account.id | The Passport account ID |
account.externalId | Your external identifier for the account |
type | Entry direction — DEBIT or CREDIT |
lastUpdatedOn | Date the entry was recorded (use gte + lte for a range; MM/DD/YYYY) |
isRealTime | Restrict to real-time entries |
customView | Apply a configured custom view |
Supported operators: eq, ne, gt, gte, lt, lte, in, nin, like.
Filter by
account.externalIdwhen you track accounts by your own identifiers — you don't need to store Passport IDs to read a ledger.
Ledger entry fields
| Field | Description |
|---|---|
id | Unique ledger entry ID |
type | DEBIT (money out) or CREDIT (money in) |
amount | Entry amount |
currentBalance | Running balance on the account after this entry posted |
method | Rail or source of the movement (e.g., CARD, BOOK, MONEYGRAM) |
narration | Human-readable description of the entry |
ledgerDate | Date the entry posted (MM/DD/YYYY) |
ledgerType | Ledger classification (e.g., SETTLE) |
groupId | Groups related entries that belong to the same movement |
schedule | Link to the originating transaction (when the entry came from a transaction), including its id and externalId |
scheduleClass | Direction of the originating transaction (e.g., SEND) |
account | The account the entry belongs to, with id and resource url |
createdOn / lastUpdatedOn | Timestamps (MM/DD/YYYY HH:MM:SS) |
createdBy / lastUpdatedBy | Actor 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.
| Field | Purpose |
|---|---|
pageNumber | Page to return |
pageSize | Records per page (default 100) |
limit | Total records to return (1–100, default 100) |
getTotalCount | Set true to include totalCount in the response |
sortOptions.sortBy | Sort field — lastUpdatedOn |
sortOptions.sortOrder | ASC 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(oraccount.externalId) witheq. - Sort
lastUpdatedOndesc, set a modestpageSize, 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
lastUpdatedOngte(start) andlastUpdatedOnlte(end). - Add
getTotalCount: trueso 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
typefilter (eqCREDIToreqDEBIT) to the account filter.
Best practices
| Practice | Why |
|---|---|
Reconcile on currentBalance | Each entry carries the balance after it posted — reconcile against that rather than recomputing from amounts. |
Use groupId to relate entries | Movements that generate multiple entries share a groupId; group on it instead of guessing from amounts and timing. |
Follow schedule back to the transaction | When an entry has a schedule link, use its id/externalId to tie the ledger line to the transaction that caused it. |
| Page, don't pull | Use pageSize and offset for long histories instead of requesting everything at once. |
| Track by your own IDs | Filter on account.externalId so you don't have to store Passport account IDs. |
See also
- Account statements — a periodic summary of the same activity
- Account lifecycle — the balances an account exposes
- Transaction lifecycle — how a transaction becomes a ledger entry
Updated 1 day ago