Audit and evidence
For compliance, audit and operations teams who need a record of who did what, and exportable evidence.
Answer who acted and what happened
An investigation may need to establish who requested a token movement, who approved it, whether it settled and how the bank recorded the result. These questions use different evidence: activity events, approval decisions, the token outcome and the bank's own records.
The activity log helps explain actions and changes. A successful activity entry alone does not prove settlement. Use the confirmed token outcome for that, and reconcile it with the bank posting.
Agree evidence access and retention with the deployment owner before an incident or offboarding. Export the records required by your bank into a controlled store. The record types, search options and technical fields below explain how the implementation team obtains that evidence.
The three records
| Record | What it holds | How you reach it |
|---|---|---|
| Activity log | Events about your organisation: who acted, what they did, to which resource, and the outcome, with before and after values of changed fields | The API: search, read one event, export to CSV |
| Audit history | Every change to the platform's persistent data: what changed, when, and in which revision. Append-only and held separately from the operational logs. | In a client-hosted deployment, in the bank's own database under the bank's controls. For Quant-hosted infrastructure, agree the extract and evidence-delivery process with your platform contact; the public activity-log API is not a database audit-history export. |
| Operational logs | Structured JSON from every service, with the request identifier and the authenticated caller on each entry | In a client-hosted deployment, directed to the bank's own log platform and security monitoring. For Quant-hosted infrastructure, agree any SIEM forwarding and the fields it will include before designing that connection. |
Other records support these: approval decisions record who acted and any reassignment (GET /api/approvals/requests), and automation status changes are recorded in GET /api/automations/{automationId}/history.
Build evidence around one business instruction
Keep the bank's business reference as the starting point of an evidence record, followed by the idempotency key and platform transaction ID. Add the approval request and task decisions when applicable, the ledger hash and block when reported, and the webhook receipts used to update your application. These identifiers describe different records; do not assume one API returns the whole chain.
Use audit search to locate recorded activity, then read the full event for before-and-after values. Use the transaction resource to establish settlement and approval resources to establish sign-off. An activity outcome of SUCCESS means the recorded action succeeded; it does not, on its own, prove a related token movement settled.
Export the evidence your bank needs to a controlled store and agree retention during onboarding. The public audit API is an activity-log interface, not a general export of internal databases or every on-chain record.
Assemble evidence for one instruction
Start with the bank's business reference and use the stored identifiers to find the relevant records. These checks help operations and audit teams distinguish an action, a decision and a settled movement.
%%{init: {"theme": "neutral"}}%%
flowchart TB
Reference["Bank business reference"] --> Activity["Match the recorded activity"]
Activity --> Approval["Add approval evidence, if required"]
Approval --> Outcome["Establish the token settlement outcome"]
Outcome --> Cash["Reconcile with the bank posting"]
Cash --> Retain["Retain evidence under bank controls"]
The bank assembles the evidence from separate resources. A successful activity entry or approval alone cannot prove settlement, and the activity log does not guarantee an event for every write. Agree retention and any operator-provided extracts for your deployment.
View in API Reference
The activity log
Search
GET /api/audit/events returns one page of your organisation's events, newest first. page defaults to 0 and size to 20, capped at 100.
Filters are optional and combine with AND:
| Filter | Matches |
|---|---|
occurredFrom, occurredTo | A time range |
actorIds | Any of the listed actors. Repeat it or separate values with commas. |
requestId | Every event produced by one request |
action, source, resourceType, resourceId | Exact values |
query | A case-insensitive prefix search across identifier fields. It never searches the event payload. |
Rows carry changedFields (names only, no values) and actor.displayName, resolved at read time.
Read one event in full
GET /api/audit/events/{eventId} returns the whole stored event, including the before and after values of every changed field. This is the only place those values are served. A value its producer withheld reads masked: true with ***. The event shows occurredAt, createdAt (when it was recorded) and recordedAt (when it was archived, null until then).
Export for evidence
GET /api/audit/events/export streams every event matching the current filter as UTF-8 CSV, with this header row:
eventId,occurredAt,action,category,source,actorType,actorId,requestId,resourceType,resourceId,outcome,summary,changedFieldsThe export is not paged. Cells that start with =, +, - or @ are prefixed with an apostrophe so spreadsheet software treats them as text.
Categories and outcomes
The example events in the API Reference use the categories DATA_CHANGE, SECURITY and BUSINESS_ACTION. Outcomes are SUCCESS, FAILURE and DENIED, so refused attempts are recorded as well as completed actions.
Use the action and resource values returned by the activity log and supported by its filters. The contract does not guarantee an event for every API write, so reconcile activity events with transaction and approval evidence.
The operational logs
Agree the fields and controls with your hosting owner before building log-based monitoring. Verify request/correlation IDs, caller attribution, timestamps and whether identifiers persist through asynchronous work. Confirm redaction of credentials, tokens, cookies and sensitive bodies, and the masking policy for customer/account references.
Operational logs help diagnose a workflow; they do not replace transaction reads, approval evidence or ledger reconciliation. Retain access/retention controls in the deployment assurance record rather than assuming every service produces the same log fields.
Retention and integrity
- Retention. In a client-hosted deployment, the bank applies its own retention to the logs and holds the audit history in its own database. For Quant-hosted infrastructure, agree retention and archived-event access in the operating model. Export required evidence to your bank-controlled store rather than assuming indefinite API availability.
- Integrity. The audit history is append-only. Hash-chained, tamper-evident storage of the audit history, and replication to a bank-owned write-once store, are not yet available. See Limitations.
Prepare evidence before an incident or retirement
Define what the bank must retain for each enabled workflow: business intent, original key, operation ID/state, ledger evidence, policy/approval decisions, and delivery receipt/processing records. The bank owns its evidence store and retention requirements; platform activity queries are one input, not proof that every instruction settled.
Verify export permissions and arrange access to any operator-held audit or infrastructure evidence before it is needed. Keep sensitive payloads and credentials out of general incident tickets. Preserve the relevant records before retiring identities, destinations or resources, and use Access changes and offboarding for the handover.
Worked example
List a week of events, then read one in full. There is no outcome filter; to find refused attempts, look for outcome: DENIED in the results or the export.
GET /api/audit/events?occurredFrom=2026-08-18T00:00:00Z&occurredTo=2026-08-25T00:00:00Z&size=50 HTTP/1.1
Host: api.qfp.quantnetwork.net
Authorization: Bearer <access token>
API-Version: 1.0.0Illustrative example built from the schema. The source value names the platform component that produced the event.
HTTP/1.1 200 OK
Content-Type: application/json
{
"data": [
{
"eventId": "2c7a5e91-8d43-4b6f-a012-5e8c1d9f7b34",
"action": "APPROVED",
"category": "BUSINESS_ACTION",
"occurredAt": "2026-08-25T10:00:00.000Z",
"source": "<producing component>",
"actor": {
"type": "USER",
"id": "e47864d8-e0b1-70a7-59e9-50a309c66adb",
"displayName": "Alice Whitfield"
},
"resource": {
"type": "payment",
"id": "pay_77"
},
"requestId": "req-5f0c-0011",
"outcome": "SUCCESS",
"summary": "APPROVED payment pay_77",
"changedFields": []
}
],
"page": 0,
"size": 50,
"totalItems": 1,
"totalPages": 1
}Read it in full:
GET /api/audit/events/2c7a5e91-8d43-4b6f-a012-5e8c1d9f7b34 HTTP/1.1
Host: api.qfp.quantnetwork.net
Authorization: Bearer <access token>
API-Version: 1.0.0Illustrative example built from the schema.
HTTP/1.1 200 OK
Content-Type: application/json
{
"eventId": "2c7a5e91-8d43-4b6f-a012-5e8c1d9f7b34",
"action": "APPROVED",
"category": "BUSINESS_ACTION",
"occurredAt": "2026-08-25T10:00:00.000Z",
"createdAt": "2026-08-25T10:00:00.642Z",
"recordedAt": "2026-08-26T01:00:04.310Z",
"source": "<producing component>",
"actor": {
"type": "USER",
"id": "e47864d8-e0b1-70a7-59e9-50a309c66adb",
"displayName": "Alice Whitfield"
},
"resource": {
"type": "payment",
"id": "pay_77"
},
"requestId": "req-5f0c-0011",
"outcome": "SUCCESS",
"summary": "APPROVED payment pay_77",
"changes": [],
"data": {
"reason": "month-end close"
}
}To hand the same set to an auditor, call GET /api/audit/events/export with the same filters.
View in API Reference
Errors and edge cases
| Situation | Response | What to do |
|---|---|---|
| An event in another organisation, or an unknown id | 404, deliberately the same for both | Check the id. |
| An invalid filter or page size | 400 | Fix the parameter. size is capped at 100. |
| Missing or invalid token | 401 | Refresh the token, then sign in again. |
actor.displayName is null | The actor lookup did not resolve at read time | Use actor.id. |
| A large export | One unpaged CSV stream | Narrow the time range if the file is too large to handle. |
API Reference
Open an endpoint for request fields, response examples and the interactive API console.
Related pages
- Policy, approvals and audit
- Roles and access
- Security and key management
- Reconcile against your core banking
- Limitations
Implementation resources
Use Implement a backend client for request handling, durable idempotency and outcome tracking. The developer integration coverage map links every public operation to its API Reference and contract-derived code recipe. Replace example identifiers with values from your assigned environment.
Updated 2 days ago

