Archive Listing
Browse and search the company's GoBD archive, or list the archive rows of a single invoice. An invoice can have more than one archive row — a Peppol reception, for example, archives both the Access Point payload and the invoice document inside it.
List archive rows
Endpoint
| Property | Value |
|---|---|
| URL | GET /germany/archive/{companyId}/rows |
| 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}}/rows?direction=OUTGOING&page=0&size=50' \
--header 'R-Auth: {{companyJwt}}'
Path parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
companyId | UUID | Yes | Company UUID |
Query parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
periodFrom | date | No | — | Filter from this invoice issue date (yyyy-MM-dd); rows without an issue date are filtered by reception/archive date instead |
periodTo | date | No | — | Filter up to this invoice issue date (yyyy-MM-dd) |
direction | string | No | caller's visible directions | INCOMING or OUTGOING. Omit to see every direction the caller may view |
kind | string | No | — | Archived document kind. See Document kind values |
status | string | No | — | Archive status. See Status values |
copyQualifier | string | No | — | See Copy qualifier values |
invoiceNumber | string | No | — | Filter by invoice number |
expired | boolean | No | false | true to show only rows whose retention period has ended |
page | integer | No | 0 | Page number, 0-indexed |
size | integer | No | 50 | Results per page, maximum 200 |
Response
{
"content": [
{
"id": "7c3fbe0a-8a3a-4e4c-9a1a-1f1f2d3c4b5a",
"invoiceId": "f5e6d7c8-1234-5678-9abc-def012345678",
"invoiceNumber": "INV-2026-001",
"invoiceDirection": "OUTGOING",
"issueDate": "2026-06-01",
"documentKind": "TRANSMITTED_ORIGINAL",
"status": "ARCHIVED",
"sha256": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",
"archivedAt": "2026-06-01T10:05:00",
"retentionUntil": "2034-12-31T23:59:59",
"retentionBasisNote": null,
"legalHold": false,
"createdTime": "2026-06-01T10:00:00",
"copyQualifier": "ORIGINAL",
"unprocessable": false,
"validationNote": null
}
],
"totalElements": 1,
"totalPages": 1,
"number": 0,
"size": 50,
"numberOfElements": 1,
"first": true,
"last": true,
"empty": false
}
Response fields
| Field | Description |
|---|---|
content[].id | Archive row UUID |
content[].invoiceId | Invoice UUID |
content[].invoiceNumber | Invoice number |
content[].invoiceDirection | INCOMING or OUTGOING |
content[].issueDate | Invoice issue date |
content[].documentKind | What this row holds. See Document kind values |
content[].status | Archive status. See Status values |
content[].sha256 | SHA-256 checksum of the archived bytes |
content[].archivedAt | When the copy was written to the archive, if archived |
content[].retentionUntil | End of the statutory retention period |
content[].retentionBasisNote | Note when the retention end was derived without a plausible issue date |
content[].legalHold | true while a legal hold blocks the retention clock |
content[].createdTime | When the archive row was created |
content[].copyQualifier | What the copy is. See Copy qualifier values |
content[].unprocessable | true for a received file kept without an invoice record because it could not be processed |
content[].validationNote | Why the file is unprocessable, if applicable |
totalElements | Total number of matching rows across all pages |
totalPages | Total number of pages |
number | Current page number, 0-indexed |
size | Page size |
numberOfElements | Number of rows on this page |
first / last | Whether this is the first / last page |
empty | true if this page has no rows |
Error responses
| HTTP | errorType | Meaning |
|---|---|---|
400 | INVALID_ARGUMENT | periodTo is before periodFrom |
400 | GERMANY_ARCHIVE_NOT_AVAILABLE | The company is not archived under the German GoBD rules |
403 | AUTHORIZATION_FAILED | Caller has no view rights for either direction, or requested a direction it may not view |
403 | GERMANY_AUDITOR_ACCESS_EXPIRED | Caller's time-limited auditor access (Z1) has ended |
List archive rows of an invoice
Endpoint
| Property | Value |
|---|---|
| URL | GET /germany/archive/{companyId}/invoice/{invoiceId} |
| 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}}/invoice/{{invoiceId}}' \
--header 'R-Auth: {{companyJwt}}'
Path parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
companyId | UUID | Yes | Company UUID |
invoiceId | UUID | Yes | Invoice UUID |
Response
[
{
"id": "7c3fbe0a-8a3a-4e4c-9a1a-1f1f2d3c4b5a",
"invoiceId": "f5e6d7c8-1234-5678-9abc-def012345678",
"invoiceNumber": "INV-2026-001",
"invoiceDirection": "INCOMING",
"issueDate": "2026-06-01",
"documentKind": "RECEIVED_PEPPOL_PAYLOAD",
"status": "ARCHIVED",
"sha256": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",
"archivedAt": "2026-06-01T10:05:00",
"retentionUntil": "2034-12-31T23:59:59",
"retentionBasisNote": null,
"legalHold": false,
"createdTime": "2026-06-01T10:00:00",
"copyQualifier": "ORIGINAL",
"unprocessable": false,
"validationNote": null
},
{
"id": "a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d",
"invoiceId": "f5e6d7c8-1234-5678-9abc-def012345678",
"invoiceNumber": "INV-2026-001",
"invoiceDirection": "INCOMING",
"issueDate": "2026-06-01",
"documentKind": "RECEIVED_XML",
"status": "ARCHIVED",
"sha256": "1a79a4d60de6718e8e5b326e338ae533f8e8b1ff2b0b822cd15d6c15b0f00a08",
"archivedAt": "2026-06-01T10:05:01",
"retentionUntil": "2034-12-31T23:59:59",
"retentionBasisNote": null,
"legalHold": false,
"createdTime": "2026-06-01T10:00:00",
"copyQualifier": "ORIGINAL",
"unprocessable": false,
"validationNote": null
}
]
Response fields are the same as List archive rows above, returned as a plain array instead of a page. An invoiceId with no archive rows returns an empty array, not an error.
Error responses
| HTTP | errorType | Meaning |
|---|---|---|
400 | GERMANY_ARCHIVE_NOT_AVAILABLE | The company is not archived under the German GoBD rules |
403 | AUTHORIZATION_FAILED | Caller has no view rights for either invoice direction |
403 | GERMANY_AUDITOR_ACCESS_EXPIRED | Caller's time-limited auditor access (Z1) has ended |
Document kind values
| Value | Description |
|---|---|
RECEIVED_PEPPOL_PAYLOAD | The Access Point payload as received, the whole object |
RECEIVED_XML | The invoice document inside a received Peppol payload |
RECEIVED_ORIGINAL | A received file (e-mail, SFTP, portal upload) as it came in |
TRANSMITTED_ORIGINAL | An issued invoice exactly as it was handed to the recipient (Peppol, e-mail) |
ISSUED_ORIGINAL | An outgoing invoice issued outside Docnova, as handed over or generated at intake |
RECEIVED_UNPROCESSABLE | A received file that is an invoice but could not be processed, kept without an invoice record |
SIGNATURE | A signature file associated with the archived document |
Status values
| Value | Description |
|---|---|
PENDING | Enqueued for archiving |
ARCHIVED | Copied to the write-once-read-many archive bucket |
FAILED | Archiving failed and will be retried |
UNPROVABLE | The original bytes cannot be proven, so nothing was copied |
Copy qualifier values
| Value | Description |
|---|---|
ORIGINAL | The bytes exactly as received, transmitted, or handed over |
GENERATED_AT_INTAKE | The source system handed over data, not a document; this is the document Docnova generated from it at intake |
NON_ORIGINAL_COPY | No original was kept; this is the operational document Docnova stored, archived later |