A read-only ledger of every balance-affecting event across your accounts. Use the transaction ledger for reconciliation, audit trails, and financial reporting.
Draft API (v0.3.0-draft) — The transaction ledger surface is currently in draft. Schemas
and behavior may change before the stable release.
The transaction ledger is a read-only record of every balance-affecting event on your OpenFX accounts. Every payment, conversion, transfer, inbound deposit, fee, and adjustment creates one or more transaction entries. You cannot create, update, or delete transactions directly — they are generated by the system as a side effect of other operations.The ledger provides a complete, auditable trail of how every account balance changed over time.
Groups all entries from a single operation. For example, an FX conversion creates two entries (a debit in the sell currency and a credit in the buy currency) that share the same transactionGroupId. A transfer creates a debit on the source account and a credit on the destination account with the same group ID.
Use the customerId filter to see transactions across all of a customer’s accounts in one query. This is useful for generating cross-account statements.
Pull all transactions for an account within a date range and verify that the running balances are consistent:
Copy
import requestsresponse = requests.get( "https://sandbox.api.openfx.com/v1/transactions", headers={...}, params={ "accountId": "acc_01953e1a5f4b7002", "createdAt[gte]": "2026-02-25T00:00:00Z", "createdAt[lte]": "2026-02-25T23:59:59Z", "limit": 200, },)transactions = response.json()["items"]# Sum debits and credits for the daytotal_debits = sum( float(t["amount"]) for t in transactions if t["direction"] == "debit")total_credits = sum( float(t["amount"]) for t in transactions if t["direction"] == "credit")net_change = total_credits - total_debitsprint(f"Total debits: {total_debits:.2f}")print(f"Total credits: {total_credits:.2f}")print(f"Net change: {net_change:.2f}")
Use transactionGroupId to find all entries from a single operation:
Copy
# Find the matching credit for a conversion debitconversion_debit = txn # A transaction with type "conversion_debit"group_id = conversion_debit["transactionGroupId"]# Query for all transactions in the same groupall_transactions = requests.get( "https://sandbox.api.openfx.com/v1/transactions", headers={...}, params={"accountId": "acc_01953e1a5f4b7002"}, # May need to check other accounts).json()["items"]related = [t for t in all_transactions if t["transactionGroupId"] == group_id]for t in related: print(f"{t['type']}: {t['direction']} {t['amount']} {t['currency']}")
A new transaction entry has been created on an account.
The transaction.created event fires for every ledger entry. If you need real-time balance
tracking, subscribe to this event rather than polling the transactions endpoint.