Skip to content

PB transactions API returns incorrect postingDate for posted transaction #85

Open

Description

@theleejenkins

Level

High

Describe the bug

Summary

The Investec Private Banking transactions API is returning an incorrect postingDate for a posted transaction.

For the transaction below, both transactionDate and actionDate are 2026-05-04, but postingDate is returned as 2026-05-09, which is the date the API request was made.

Endpoint

GET /za/pb/v1/accounts/{accountId}/transactions

Steps To Reproduce

  1. Authenticate against the Investec OpenAPI Private Banking API.
  2. Call the Private Banking transactions endpoint for the affected account: GET /za/pb/v1/accounts/{accountId}/transactions.
  3. Use a date range that includes 2026-05-04, for example: GET /za/pb/v1/accounts/{accountId}/transactions?fromDate=2026-05-04&toDate=2026-05-09.
  4. Inspect the returned transaction matching amount = ***20.63, description = 1001280**** LE JENKINS, type = CREDIT, and status = POSTED.
  5. Observe that the returned date fields are transactionDate = 2026-05-04, actionDate = 2026-05-04, and postingDate = 2026-05-09.
  6. The postingDate value is 2026-05-09, which was the API request date, while both transactionDate and actionDate are 2026-05-04.
  7. Repeat the same request on a later date.
  8. Confirmed postingDate changes to the later API request date rather than remaining stable as the actual posting date for the transaction.

Raw API Response

{
  "accountId": "00238127**************",
  "actionDate": "2026-05-04",
  "amount": ***20.63,
  "cardNumber": "",
  "description": "1001280**** LE JENKINS",
  "postedOrder": 0,
  "postingDate": "2026-05-09",
  "runningBalance": -***11.59,
  "status": "POSTED",
  "transactionDate": "2026-05-04",
  "transactionType": null,
  "type": "CREDIT",
  "uuid": "",
  "valueDate": null
}

Expected behaviour

For a transaction with status = POSTED, the postingDate field should represent the actual ledger posting date of the transaction.

The postingDate should be stable across repeated API calls and should not change based on the date the API request is made.

For the transaction shown in the raw API response, both transactionDate and actionDate are 2026-05-04. Unless there is a documented reason for postingDate to differ, the expected postingDate should also be 2026-05-04.

The API should also provide clear documentation on the semantic difference between postingDate, transactionDate, and actionDate, including which field should be treated as the authoritative ledger date for posted transactions.

Actual behaviour

The API returned postingDate = 2026-05-09 for the transaction.

This differs from both transactionDate = 2026-05-04 and actionDate = 2026-05-04.

The postingDate value appears to match the date the API request was made, rather than the actual ledger posting date of the transaction.

Because the transaction has status = POSTED, this makes the returned postingDate misleading for downstream reconciliation and accounting systems.

Additional context

Impact

This breaks downstream accounting reconciliation.

Our sync process uses postingDate as the canonical ledger date. In this case, the API response caused the sync process to attempt to move an existing accounting transaction from 2026-05-04 to 2026-05-09.

That would incorrectly alter the ledger date for a posted transaction, affecting:

  • Account reconciliation
  • Duplicate detection
  • Historical reporting
  • Running balance validation
  • Auditability of imported bank transactions

Questions

  1. For posted transactions, which field should be treated as the authoritative ledger date?
  2. Is the empty uuid expected for this transaction type?
  3. Is this a known issue with the Private Banking transactions endpoint?

Activity

  1. theleejenkins commented on May 16, 2026

    @theleejenkins
    Author

    Ping...

  2. programmable-banking-community commented on May 18, 2026

    @programmable-banking-community
    Contributor

    Hi @theleejenkins , thanks again for posting this. Apologies for the delay. We're taking a look at this and trying to get more details from Private Banking on the API and to confirm the intended behaviour. Will revert shortly. Thanks again :)

  3. theleejenkins commented on Jul 26, 2026

    @theleejenkins
    Author

    Thanks, appreciate the follow-up.

    I re-tested this today, 2026-07-26, against the same affected posted transaction and the behaviour still appears to exist.

    For the transaction with:

    • amount = ***20.63
    • type = CREDIT
    • status = POSTED

    the API currently returns:

    • transactionDate = 2026-05-04
    • actionDate = 2026-05-04
    • postingDate = 2026-07-26
    • uuid = ""

    So postingDate now appears to have moved again and is returning today’s request date, rather than the actual transaction/posting date.

    I’ve worked around this on my side by treating transactionDate/actionDate as the stable ledger date where postingDate appears to drift, but it would still be very helpful to get confirmation of the intended semantics for postingDate, transactionDate, and actionDate.

    The main concern is that postingDate changes depending on when the API request is made, which makes it unsafe for reconciliation unless that behaviour is documented and expected.

    Thanks for checking with the Private Banking team.

  4. programmable-banking-community commented on Jul 27, 2026

    @programmable-banking-community
    Contributor

    Hey @theleejenkins, appreciate you re-testing and sharing the updated details.

    We’ve logged this with the relevant teams and need a bit of time to investigate properly. There was a fix that went in a while ago around postingDate for PB accounts, but we want to confirm a few things before giving you a definitive answer.

    One thing we’d like to check upfront: which account type is this transaction from? For example, is it a transactional/private bank account, Prime Saver, loan account, or another account type?

    I’m asking because there may be differences in how downstream account types return transaction fields, and we want to make sure we’re looking at the right path.

    We’ll come back with a clearer answer on the intended semantics for postingDate, transactionDate, and actionDate.

    Thanks again for the detailed testing. It helps a lot.

  5. theleejenkins commented on Jul 27, 2026

    @theleejenkins
    Author

    Thanks for responding.

    This is a transactional/private bank account.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions