Bank reconciliation (transfer report entries)
List Transfers, Get Transfer, and Transfer Events return the aggregate payout only — amount, status, destination bank, and settlement dates. ERP bank reconciliation usually needs the payments and fees inside that payout so deposits and fee withdrawals can be matched in the ERP.
That line-item detail is available on the Transfer Report Entries endpoint:
GET /transfers/{transferId}/report/entries
Authorization: Bearer {access_token}
X-CUSTOMER-ID: {merchant_customer_id}
See List Transfer Report Entries and Get Transfer Report.
Prerequisites
- Merchant API credentials (same OAuth client credentials +
X-CUSTOMER-IDused for other Transfer calls). - Transfer reports enabled for the merchant (
settings.transfers.report.enabled). If the feature is off, report endpoints return401 insufficientFeatureAccess. - A transfer that has reached
postedorpaid, with a transfer report incompleted(orreversed) status.
End-to-end connector pattern
Transfer webhook (flat amount)
→ when resource.status is posted or paid
→ GET /transfers/{id}/report (retry until status is completed)
→ GET /transfers/{id}/report/entries
→ map each entry into the ERP bank feed / cash management records
1. Detect the payout
Subscribe to Transfer Events, or poll List Transfers / List Transfers (filtered). Use resource.id (the transfer ID) as your idempotency key for the settlement batch.
The webhook / transfer object does not include the constituent payments — that is expected.
2. Wait for the transfer report
Call Get Transfer Report:
GET /transfers/{transferId}/report
The report can lag the Transfer webhook. Retry until status is completed (or reversed). Calling report entries too early returns 404 with an explanation that the transfer report is not available yet.
3. Fetch line items
GET /transfers/{transferId}/report/entries
Example response shape:
{
"results": [
{
"resourceType": "fee",
"resourceId": "0t5y7jvdrji3mhf01viihbjf",
"resourceAmount": "1.00",
"relatedId": "fupdrurfdwz3pua0l1eoy49s",
"relatedType": "payment",
"transferAmount": "-1.00",
"currency": "USD",
"payerId": "fsivwpg417h2ivc5oi8h6gbi",
"payerName": "Christina C"
},
{
"resourceType": "payment",
"resourceId": "fupdrurfdwz3pua0l1eoy49s",
"resourceAmount": "5000.00",
"transferAmount": "195.48",
"currency": "USD",
"payerId": "fsivwpg417h2ivc5oi8h6gbi",
"payerName": "Christina C"
}
],
"count": 2,
"settings": {
"limit": 999999,
"offset": 0
}
}
4. Map entries in the ERP
| Field | Typical ERP use |
|---|---|
resourceType | Document type — payment ≈ bank deposit / credit; fee ≈ bank withdrawal / debit |
resourceId | Document number (DOCNO) — Paystand payment or fee ID for auto-match against GL / AR cash application |
transferAmount | Signed amount — positive for payment deposits, negative for fees |
currency | Currency of the bank entry |
dateUTC / entryDate | Bank feed posting date |
payerId / payerName / payerEmail | Optional enrichment for X3 / Sage 100 cash receipts |
relatedId / relatedType | On fee rows, links the fee back to its payment |
Summing transferAmount across entries should reconcile to the parent transfer's aggregate amount (within rounding for multi-currency edge cases).
Optional CSV export of the same rows: GET /transfers/{transferId}/report/csv.
How this relates to List / Get Transfer
| Surface | Aggregate payout? | Payment/fee line items? |
|---|---|---|
GET /transfers/all, GET /transfers/{id} | Yes | No |
| Transfer webhooks | Yes | No |
GET /transfers/{id}/report | Summary / readiness | No |
GET /transfers/{id}/report/entries | — | Yes |
No new Paystand X API surface is required beyond these classic Transfer report routes — they use the same /v3 base URL and merchant credentials.