Get External Transfers Report
This endpoint retrieves a list of external transfers between financial institutions or accounts, intended for use in generating the Daily Spending Report. Results can be filtered by date range or custom criteria and support cursor-based pagination for large datasets. Access to the Daily Spending Report feature is required to call this endpoint.
Endpoint
POST /Report/externalTransfers
Authentication
Bearer token required. Obtain via:
POST https://api.banking.netevia.dev/api/auth/v2
Include in header: Authorization: Bearer {token}
Token lifetime: 10 minutes. Refresh via POST /api/auth/refresh.
When to use
Use this endpoint when you need to produce a Daily Spending Report that includes ACH and other external transfer activity across customer accounts. It is suitable for reconciliation workflows, partner-level financial reporting, and compliance audits that require a full history of external account movement within a defined time window. Combine fromDate and toDate filters with cursor-based pagination to efficiently process large volumes of transfer records.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
| cardProductId | string | No | Identifier for the card product to scope the report. Pass null to include all card products. |
| take | integer (int32) | No | Number of external transfer records to return per request. Pass null to retrieve all results without a page limit. |
| afterCursor | string | No | Opaque cursor string returned by a previous response. Pass this value to fetch the next page of results. |
| fromDate | string (date-time) | No | ISO 8601 start timestamp. Only transfers on or after this date-time are included. |
| toDate | string (date-time) | No | ISO 8601 end timestamp. Only transfers on or before this date-time are included. |
| jsonFilter | string | No | JSON-formatted string for applying custom filters (e.g., transfer type, account identifiers, recipient details). |
{
"cardProductId": null,
"take": 50,
"afterCursor": null,
"fromDate": "2026-06-01T00:00:00Z",
"toDate": "2026-06-08T23:59:59Z",
"jsonFilter": null
}Response
200 OK
The response contains a data object with merged activity records and pagination info, plus a filter object describing available filter categories.
Top-level fields
| Field | Type | Description |
|---|---|---|
| data | object | Contains pagination info and the list of activity records. |
| data.transferPageInfo | array | Array of pagination info objects for transfer result sets. |
| data.transferPageInfo[].startCursor | string | Cursor pointing to the first record in this page. |
| data.transferPageInfo[].endCursor | string | Cursor pointing to the last record in this page. Use as afterCursor in the next request. |
| data.transferPageInfo[].hasNextPage | boolean | Indicates whether more records exist after this page. |
| data.transferPageInfo[].hasPreviousPage | boolean | Indicates whether records exist before this page. |
| data.transactionPageInfo | object | Pagination info object for the transaction result set (same structure as transferPageInfo items). |
| data.activity | array | List of external transfer activity records. |
| filter | object | Available filter categories with display metadata. |
| filter.all | object | Filter item representing all activity types. |
| filter.deposit | object | Filter item for deposit activity. |
| filter.withdraw | object | Filter item for withdrawal activity. |
| filter.transfers | object | Filter item for transfer activity. |
| filter.pos | object | Filter item for point-of-sale activity. |
| filter.transactionStatus | object | Filter item for transaction status groupings. |
| filter.others | object | Filter item for other activity types. |
Activity record fields (data.activity[])
| Field | Type | Description |
|---|---|---|
| id | string | Unique identifier of the transfer or transaction. |
| typename | string | Type name of the activity record (e.g., ACHTransfer). |
| name | string | Display name for the activity entry. |
| typeModel | string | Model type identifier for internal classification. |
| pendingAmount.value | integer (int64) | Pending amount in the smallest currency unit (e.g., cents). |
| pendingAmount.currencyCode | string | ISO 4217 currency code (e.g., USD). |
| amount.value | integer (int64) | Settled amount in the smallest currency unit. |
| amount.currencyCode | string | ISO 4217 currency code. |
| lastEventBalanceSnapshot.value | integer (int64) | Account balance snapshot after the last event, in smallest currency unit. |
| lastEventBalanceSnapshot.currencyCode | string | ISO 4217 currency code for the balance snapshot. |
| createdAt | string (date-time) | ISO 8601 timestamp when the transfer was created. |
| isComplete | boolean | true if the transfer has reached a terminal state. |
| transferStatus.status | string | Current transfer status (e.g., PENDING, COMPLETED, RETURNED). |
| transferStatus.statusReasonCode | string | Reason code associated with the transfer status. |
| companyName | string | Name of the company associated with the transfer. |
| descriptor.companyEntryDescription | string | ACH company entry description field. |
| descriptor.individualName | string | Name of the individual associated with the ACH entry. |
| descriptor.individualIdentificationNumber | string | Individual identification number from the ACH descriptor. |
| toFinancialAccount.id | string | Identifier of the destination financial account. |
| toFinancialAccount.name | string | Display name of the destination financial account. |
| toFinancialAccount.last4 | string | Last 4 digits of the destination account number. |
| toFinancialAccount.provider | string | Provider of the destination account (e.g., Finicity, Plaid). |
| fromFinancialAccount.id | string | Identifier of the source financial account. |
| fromFinancialAccount.name | string | Display name of the source financial account. |
| fromFinancialAccount.last4 | string | Last 4 digits of the source account number. |
| fromFinancialAccount.provider | string | Provider of the source account. |
| isBetweenOwnAccounts | boolean | true if the transfer is between accounts owned by the same customer. |
| purpose | string | Business purpose or memo provided by the initiator. |
| memo | string | Free-text memo attached to the transfer. |
| fromDBA | string | Doing-business-as name of the sending party. |
| toDBA | string | Doing-business-as name of the receiving party. |
| activityInfo.fromProfile.id | integer | Internal ID of the sending customer profile. |
| activityInfo.fromProfile.name | string | Name of the sending customer profile. |
| activityInfo.fromProfile.agentId | integer | Agent identifier associated with the sending profile. |
| activityInfo.toProfile.id | integer | Internal ID of the receiving customer profile. |
| activityInfo.toProfile.name | string | Name of the receiving customer profile. |
| activityInfo.toProfile.agentId | integer | Agent identifier associated with the receiving profile. |
| activityInfo.historyRecords | array | Chronological list of status history entries for this transfer. |
| activityInfo.historyRecords[].date | string (date-time) | Timestamp of this status change. |
| activityInfo.historyRecords[].status | string | Status value at this point in time. |
{
"data": {
"transferPageInfo": [
{
"startCursor": "cursor_abc123",
"endCursor": "cursor_xyz789",
"hasNextPage": true,
"hasPreviousPage": false
}
],
"transactionPageInfo": {
"startCursor": "cursor_abc123",
"endCursor": "cursor_xyz789",
"hasNextPage": true,
"hasPreviousPage": false
},
"activity": [
{
"id": "transfer_11223344",
"typename": "ACHTransfer",
"name": "ACH Transfer - Payroll",
"typeModel": "ExternalTransfer",
"pendingAmount": {
"value": 0,
"currencyCode": "USD"
},
"amount": {
"value": 250000,
"currencyCode": "USD"
},
"lastEventBalanceSnapshot": {
"value": 1500000,
"currencyCode": "USD"
},
"createdAt": "2026-06-05T14:32:00Z",
"isComplete": true,
"transferStatus": {
"status": "COMPLETED",
"statusReasonCode": null
},
"companyName": "Acme Corp",
"descriptor": {
"companyEntryDescription": "PAYROLL",
"individualName": "Jane Smith",
"individualIdentificationNumber": "EMP00456"
},
"toFinancialAccount": {
"id": "fa_9988776655",
"name": "Operating Account",
"last4": "4321",
"externalBankAccountDetails": {
"last4": "4321",
"type": "CHECKING",
"routingNumber": "021000021",
"createdAt": "2025-01-15T08:00:00Z",
"updatedAt": "2025-01-15T08:00:00Z",
"accountNumber": "XXXXXXXXXX"
},
"provider": "Finicity"
},
"fromFinancialAccount": {
"id": "fa_1122334455",
"name": "Payroll Source Account",
"last4": "8765",
"externalBankAccountDetails": null,
"provider": null
},
"isBetweenOwnAccounts": false,
"purpose": "Payroll disbursement",
"memo": "June 2026 payroll",
"fromDBA": "Acme Corp Payroll",
"toDBA": "Jane Smith",
"activityInfo": {
"fromProfile": {
"id": 1001,
"name": "Acme Corp",
"agentId": 200
},
"toProfile": {
"id": 1002,
"name": "Jane Smith",
"agentId": 201
},
"historyRecords": [
{
"date": "2026-06-05T14:32:00Z",
"status": "PENDING"
},
{
"date": "2026-06-06T09:15:00Z",
"status": "COMPLETED"
}
]
}
}
]
},
"filter": {
"all": { "displayName": "All", "value": true, "items": null },
"deposit": { "displayName": "Deposits", "value": false, "items": null },
"withdraw": { "displayName": "Withdrawals", "value": false, "items": null },
"transfers": { "displayName": "Transfers", "value": true, "items": null },
"pos": { "displayName": "Point of Sale", "value": false, "items": null },
"transactionStatus": { "displayName": "Status", "value": false, "items": null },
"others": { "displayName": "Others", "value": false, "items": null }
}
}Error Codes
| Code | When it happens |
|---|---|
| 400 | Missing required fields, malformed jsonFilter string, or invalid date format |
| 401 | Token missing, expired, or invalid |
| 403 | Caller does not have access to the Daily Spending Report feature |
| 404 | No report data found for the given parameters |
| 500 | Internal server error |
Common Mistakes
- Providing
fromDateortoDatein a non-ISO 8601 format — always use"YYYY-MM-DDTHH:MM:SSZ"format. - Passing a hardcoded cursor from a previous session — cursors are not stable across sessions; always use the
endCursorreturned in the most recent response. - Setting
taketo a very large value without pagination — use a reasonable page size (e.g., 50–200) and iterate usingafterCursorto avoid timeouts. - Supplying a malformed JSON string in
jsonFilter— ensure the value is a valid serialized JSON string, not a raw JSON object. - Calling this endpoint without Daily Spending Report access — confirm the partner account has this feature enabled before integrating.
Related Endpoints
POST /Report/transactions— Retrieve card transaction activity for the Daily Spending ReportPOST /Report/internalTransfers— Retrieve internal (between Netevia accounts) transfer activity for reportingGET /FinancialAccount/{financialAccountId}/activity— Retrieve activity for a specific financial accountPOST /api/auth/v2— Obtain a Bearer token for authentication
Example
curl -X POST https://api.banking.netevia.dev/Report/externalTransfers \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"cardProductId": null,
"take": 50,
"afterCursor": null,
"fromDate": "2026-06-01T00:00:00Z",
"toDate": "2026-06-08T23:59:59Z",
"jsonFilter": null
}'