Audit Trail
Retrieve the full activity history of one archive row: every capture, view, download, legal hold, integrity check, and retention event, each entry linked to the previous one by a hash chain so a gap or an edit is detectable.
Endpoint
| Property | Value |
|---|---|
| URL | GET /germany/archive/{companyId}/audit/{archiveId} |
| Method | GET |
| Auth | R-Auth: <company-jwt> |
| Base URL | Stage Environment https://api-stage.docnova.ai/ Production Environment https://api.docnova.ai/ |
Example Request
curl --location '{{baseUrl}}/germany/archive/{{companyId}}/audit/{{archiveId}}' \
--header 'R-Auth: {{companyJwt}}'
Path parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
companyId | UUID | Yes | Company UUID |
archiveId | UUID | Yes | Archive row UUID, from Archive listing |
Response
{
"archiveId": "7c3fbe0a-8a3a-4e4c-9a1a-1f1f2d3c4b5a",
"chainValid": true,
"events": [
{
"seq": 1,
"eventType": "ENQUEUED",
"eventAt": "2026-06-01T10:00:00",
"actor": "SYSTEM",
"detail": "sha256=9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",
"entryHash": "b2f5c1a9..."
},
{
"seq": 2,
"eventType": "ARCHIVED",
"eventAt": "2026-06-01T10:05:00",
"actor": "SYSTEM",
"detail": null,
"entryHash": "4ad9e3f0..."
},
{
"seq": 3,
"eventType": "ACCESS_VIEW",
"eventAt": "2026-06-02T09:12:00",
"actor": "a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d",
"detail": "GET /germany/archive/.../audit/...",
"entryHash": "7f10a8e2..."
}
]
}
Response fields
| Field | Description |
|---|---|
archiveId | Archive row UUID |
chainValid | true if the hash chain of every event below is intact |
events[].seq | Sequence number of the event within the row, starting at 1 |
events[].eventType | What happened. See Event type values |
events[].eventAt | When the event occurred |
events[].actor | User ID, or SYSTEM for an automated event |
events[].detail | Free-text detail, when available |
events[].entryHash | Hash of this entry, chained to the previous one |
Error responses
| HTTP | errorType | Meaning |
|---|---|---|
400 | GERMANY_ARCHIVE_NOT_AVAILABLE | The company is not archived under the German GoBD rules |
403 | AUTHORIZATION_FAILED | Caller may not view this row's invoice direction, or has no view rights at all |
403 | GERMANY_AUDITOR_ACCESS_EXPIRED | Caller's time-limited auditor access (Z1) has ended |
404 | — | No archive row with this archiveId for this company |
Event type values
| Value | Description |
|---|---|
ENQUEUED | The document was queued for archiving |
ARCHIVED | The copy was written to the archive bucket |
ARCHIVE_FAILED | Archiving failed and will be retried |
ACCESS_VIEW | The row was shown to a user |
ACCESS_DOWNLOAD | The archived file was downloaded |
PACKAGE_INCLUDED | The archived copy was included in an audit package |
LEGAL_HOLD_SET | A legal hold was set on the row |
LEGAL_HOLD_RELEASED | A legal hold was released from the row |
LEGAL_HOLD_SYNCED | The row's legal hold state was applied to or released from the archived object in the storage bucket |
INTEGRITY_VERIFIED | A verification re-hash matched the recorded checksum |
INTEGRITY_VIOLATION | A verification re-hash did not match the recorded checksum |
ARCHIVE_FILE_MISSING | The archived copy could not be read from the archive bucket |
EDIT_BLOCKED | A refused attempt to change the archived document |
DELETE_BLOCKED | A refused attempt to delete the archived document |
RETENTION_EXPIRED | The row's retention period ended without a legal hold |
DELETION_APPROVED | An administrator approved deletion of an expired row; nothing is deleted by this event alone |
SAME_CONTENT_RECAPTURED | The same bytes were received or sent again for an already-archived original |
ORIGINAL_UNPROVABLE | The row was sealed as UNPROVABLE because its original bytes could not be proven |
CAPTURED_UNPROCESSABLE | A received file that could not be processed was archived as received |
BASELINE_MIGRATED | Genesis event appended to a row that existed before the audit trail feature; events before this one are not covered by the hash chain |