Fiserv APEX XP2
Category: Core Connectors
Market: US
Overview
The Fiserv APEX XP2 connector exposes a REST API (/apex/v1/...) that translates inbound JSON requests from Data Core into SOAP operations against APEX XP2 Member, Financial, and Lending services.
The connector provides:
- Member and individual operations (lookup, retrieval, updates, membership management)
- Account operations (creation, update, history summary, overdraft protection)
- ACH operations (allocations, payees, pending transactions)
- Card operations (assign, update, lookup)
- Alerts and stops management
- System details retrieval
- Financial transaction submission with multiple transaction unit types
The connector handles SOAP routing and WS-Security authentication using Vault-provided configuration.
Vault Configuration
| Key | Description |
|---|---|
memberServicesUrl
|
Base URL for the APEX Member SOAP service endpoint. |
financialServicesUrl
|
Base URL for the APEX Financial SOAP service endpoint. |
lendingServicesUrl
|
Base URL for the APEX Lending SOAP service endpoint. |
securityConfig
|
WS-Security credentials for SOAP UsernameToken authentication. |
Example Vault Configuration
{
"memberServicesUrl": "https://<host>/<member-path>",
"financialServicesUrl": "https://<host>/<financial-path>",
"lendingServicesUrl": "https://<host>/<lending-path>",
"securityConfig": {
"licenseKey": "string",
"creditUnionId": "string",
"operatorId": "string",
"password": "string",
"workstation": "string"
}
}
The SOAP username is built as: licenseKey.creditUnionId.operatorId.workstation.
Member Services
Member services allow you to look up and manage individuals and memberships, create and update accounts, manage overdraft protection, issue and update plastic cards, manage ACH payees and allocations, and create alerts and stops.
Individuals and Membership
| Endpoint | Method | Description |
|---|---|---|
/apex/v1/individuals/lookup
|
POST | Search individuals. |
/apex/v1/individuals/{individualId}
|
GET | Retrieve individual details, optionally for an effective date. |
/apex/v1/individuals
|
POST | Update individual details. |
/apex/v1/individuals/{individualId}/members
|
GET | List memberships by individual. |
/apex/v1/members/{memberId}
|
GET | Retrieve membership details. |
/apex/v1/members/{memberId}/individual
|
GET | Retrieve primary individual for a member. |
/apex/v1/members
|
POST | Create member (assign membership and apply ownership details). |
/apex/v1/members/{memberId}
|
PUT | Full update of member details. |
/apex/v1/members/{memberId}
|
PATCH | Partial member update. |
Individual Lookup
POST /apex/v1/individuals/lookup
{
"lookupFields": {}
}
Sample response:
{
"individualLookupData1": {
"individualId": 281528,
"individualType": "Individual"
},
"totalRecords": 1
}
Get Individual
GET /apex/v1/individuals/{individualId}
| Parameter | Type | Required | Description |
|---|---|---|---|
individualId
|
integer | Yes | APEX individual identifier (path parameter) |
effectiveDate
|
string (yyyy-MM-dd) |
No | Effective date for historical snapshot (query parameter) |
Sample response:
{
"individualDetail5": {
"individualId": 281528,
"lastName": "Smith",
"firstName": "John"
}
}
Create Member
POST /apex/v1/members
{
"assignMembership": {
"primaryIndividualId": 12345
},
"overrideData": {}
}
Sample response:
{
"transactionResult": {},
"errorMessage": null
}
Update Member
PUT /apex/v1/members/{memberId}
{
"memberId": 13245
}
PATCH /apex/v1/members/{memberId} (partial update)
{
"memberId": 13245,
"affiliation": "Primary",
"pin": "1234"
}
Validation: The memberId in the URL must match the memberId in the request body.
Accounts and Overdraft Protection
| Endpoint | Method | Description |
|---|---|---|
/apex/v1/accounts
|
POST | Create account records. |
/apex/v1/accounts/{accountId}
|
PUT | Update account details. |
/apex/v1/members/{memberId}/accounts/{accountId}
|
GET | Retrieve account details for a member. |
/apex/v1/members/{memberId}/accounts/{accountId}/history/summary
|
POST | Return account history summary for a period. |
/apex/v1/members/{memberId}/accounts/{accountId}/odp
|
POST | Add or update overdraft protection. |
/apex/v1/members/{memberId}/accounts/{accountId}/odp
|
DELETE | Remove overdraft protection entries. |
/apex/v1/members/{memberId}/accounts/{accountId}/odp
|
GET | List overdraft protection settings. |
Create Account
POST /apex/v1/accounts
{
"effectiveDate": "2026-06-16T00:00:00Z",
"accountCreationDetail3": [{}],
"overrideData": {}
}
Sample response:
{
"transactionResult": {},
"accountDetail3": {
"accountId": 54321,
"accountType": "CHECKING"
}
}
Update Account
PUT /apex/v1/accounts/{accountId}
{
"accountId": 54321,
"memberId": 67890
}
Validation: The accountId in the URL must match the accountId in the request body.
Account History Summary
POST /apex/v1/members/{memberId}/accounts/{accountId}/history/summary
{
"individualId": 16,
"fromDate": "2024-01-01T00:00:00Z",
"toDate": "2024-12-31T00:00:00Z",
"pageNumber": 1,
"itemCount": 10,
"order": "Ascending | Descending"
}
Validation:
fromDateandtoDateare required.pageNumbermust be at least 1.itemCountmust be between 1 and 100.
Overdraft Protection
POST /apex/v1/members/{memberId}/accounts/{accountId}/odp
{
"odpSourceUpdate": [],
"overdraftDrainMethodType": "DRAIN_IN_ORDER",
"overrideData": {}
}
DELETE /apex/v1/members/{memberId}/accounts/{accountId}/odp
{
"odpSourceUpdate": [],
"overrideData": {}
}
Cards
| Endpoint | Method | Description |
|---|---|---|
/apex/v1/members/{memberId}/cards
|
POST | Assign a plastic card to a member. |
/apex/v1/members/{memberId}/cards/update
|
POST | Update card details. |
/apex/v1/members/{memberId}/cards/lookup
|
GET | Look up cards by member, with optional BIN/customer filters. |
Assign Card
POST /apex/v1/members/{memberId}/cards
{
"cardBin": "string",
"binExtension": "string",
"cardCust": "string",
"plasticFamilyClass": "CREDIT | DEBIT",
"purchaseAccount": 1,
"creditDebitDetail": {},
"cardHolder1": {},
"cardDetail": {},
"overrideData": {}
}
Validation: plasticFamilyClass and purchaseAccount are required.
Update Card
POST /apex/v1/members/{memberId}/cards/update
{
"cardBin": "string",
"cardCust": "string",
"purchaseAccount": 1,
"cardDetail": {},
"cardHolder": {},
"atmAccess": [],
"debitCardPeriodicFees": {},
"overrideData": {}
}
Validation: purchaseAccount is required.
Lookup Cards
GET /apex/v1/members/{memberId}/cards/lookup
| Parameter | Type | Required | Description |
|---|---|---|---|
cardBin
|
string (max 9) | No | Card BIN filter |
cardCust
|
string (max 13) | No | Card customer filter |
ACH
| Endpoint | Method | Description |
|---|---|---|
/apex/v1/ach/allocation
|
POST | Add ACH allocation details. |
/apex/v1/ach/payees
|
POST | Add ACH payee. |
/apex/v1/ach/payees/{payeeNumber}
|
GET | Retrieve payee by number. |
/apex/v1/ach/payees
|
GET | Retrieve all payees. |
/apex/v1/members/{memberId}/ach/pending-transactions
|
GET | Retrieve ACH pending transactions for a member. |
Add Allocation
POST /apex/v1/ach/allocation
{
"allocationData": {}
}
Sample response:
{
"memberNumber": 1234
}
Add Payee
POST /apex/v1/ach/payees
{
"payeeData": {}
}
Sample response:
{
"payeeNumber": 123
}
Get Pending Transactions
GET /apex/v1/members/{memberId}/ach/pending-transactions
| Parameter | Type | Required | Description |
|---|---|---|---|
pageNumber
|
integer (0-10) | Yes | Result page index |
itemCount
|
integer (0-10) | Yes | Page size |
Validation: pageNumber and itemCount must not exceed 10.
Alerts
| Endpoint | Method | Description |
|---|---|---|
/apex/v1/alerts
|
GET | Retrieve stops/alerts by alert type and target. |
/apex/v1/alerts
|
POST | Create or update an alert. |
/apex/v1/alerts
|
DELETE | Remove an alert. |
Get Alerts
GET /apex/v1/alerts
| Parameter | Type | Required | Description |
|---|---|---|---|
alertType
|
string | Yes | One of: None, Membership, Individual, Business, Account, Loan, RP |
accountId
|
short | No | Account identifier |
memberId
|
long | No | Membership identifier |
individualId
|
long | No | Individual identifier |
Validation: memberId and individualId are mutually exclusive. Providing both returns a 400 error.
Create/Delete Alert
POST / DELETE /apex/v1/alerts
{
"stopAlertType": "Membership",
"memberId": 67890
}
System Details
Exposes a single endpoint that routes to the selected APEX SOAP service and returns system metadata.
GET /apex/v1/system-details
| Parameter | Type | Required | Description |
|---|---|---|---|
service
|
string | Yes | One of: Member, Financial, Lending |
Financial Services
Submit financial transactions containing one or more transaction units (deposits, withdrawals, fees, loan operations, GL transactions, payroll groups).
POST /apex/v1/financial/transaction
{
"effectiveDate": "2026-06-16T00:00:00Z",
"printReceipt": false,
"forcePost": false,
"isTotalFeeRequired": false,
"customerName": "string",
"postInSuppliedOrder": false,
"timeStamp": "string",
"transactionUnits": [
{
"accountDeposit": {},
"accountFee": {},
"accountFeeReversal": {},
"accountWithdrawal": {},
"fundsDisbursed": {},
"fundsReceived": {},
"loanAddon": {},
"loanPayment": {},
"loanPayoff": {},
"couplet": {},
"merchandiseReturn": {},
"merchandiseSell": {},
"miscellaneousFee": {},
"generalLedger": {},
"externalMortgagePayment": {},
"loanAdjustment": {},
"payrollGroup": {}
}
],
"overrideData": {}
}
Sample response:
{
"totalFee": 1234
}
Error Handling
Errors follow the platform-standard problem JSON format. The connector handles request validation errors locally. The Data Core platform classifies transport, timeout, and dependency failures.
Error Response Format
{
"status": 502,
"title": "Bad Gateway",
"detail": "Dependency failure",
"code": "Server",
"instance": "/apex/v1/members/67890",
"timestamp": "2026-06-17T09:10:00Z",
"dependency": {
"status": 500,
"title": "Server was unable to process request.",
"detail": "..."
}
}
codecarries the upstream SOAP fault code when present (for example,Server); otherwise it contains the mapped HTTP status.dependencyis present only for upstream/transport failures, not for client validation or500errors.
HTTP Status Codes
| Status | Meaning | Triggered By |
|---|---|---|
200
|
Success | Successful call; body contains the mapped SOAP response DTO. |
400
|
Bad Request (validation) | Invalid or missing fields, malformed JSON, bean-validation failure. |
400
|
Bad Request (business) | Connector checks such as URL/body ID mismatch or mutually exclusive query parameters. |
403
|
Forbidden | Access denied. |
4xx
|
Passthrough | Upstream returned a 4xx (preserved as-is). Upstream 401/403 are remapped to 502. |
500
|
Internal Server Error | Unexpected runtime error not otherwise classified. |
502
|
Bad Gateway | Upstream 5xx (other than 503/504), upstream 401/403, SOAP system faults. |
503
|
Service Unavailable | Connection refused, DNS failure, no route to host, TLS/SSL failure. |
504
|
Gateway Timeout | Connect/read/request timeout reaching the upstream SOAP endpoint. |
Dependency Status Mapping
| Upstream Status | Returned Status |
|---|---|
401, 403 |
502
|
Other 4xx |
Same status (passthrough) |
503
|
503
|
504
|
504
|
Other 5xx |
502
|
Connector-Level Validation
The following scenarios return a 400 Bad Request:
- Path/body identity mismatch:
PUT /apex/v1/members/{memberId},PATCH /apex/v1/members/{memberId}, andPUT /apex/v1/accounts/{accountId}require the ID in the URL to match the ID in the request body. - Invalid effective date format: The
effectiveDateparameter must followyyyy-MM-ddformat. - Mutually exclusive query parameters: On
/apex/v1/alerts, providing bothmemberIdandindividualIdreturns an error. - Out-of-range constrained fields: ACH paging limits and account-history constraints.