Legal Hold
Set or release a legal hold on an archive row. A row under legal hold is retained beyond its normal retention end, and the hold is additionally applied to the archived object in storage. Administrator access only — this is the one archive endpoint pair that is not available to users with only invoice display rights.
A reason is required for both setting and releasing a hold; it is written to the row's audit trail.
Set legal hold
Endpoint
| Property | Value |
|---|---|
| URL | POST /germany/archive/{companyId}/legal-hold/{archiveId} |
| Method | POST |
| Auth | R-Auth: <company-jwt> (Administrator role required) |
| Content-Type | application/json |
| Base URL | Stage Environment https://api-stage.docnova.ai/ Production Environment https://api.docnova.ai/ |
Example Request
curl --location '{{baseUrl}}/germany/archive/{{companyId}}/legal-hold/{{archiveId}}' \
--header 'Content-Type: application/json' \
--header 'R-Auth: {{companyJwt}}' \
--data-raw '{
"reason": "Tax audit 2026 — Finanzamt Berlin"
}'
Path parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
companyId | UUID | Yes | Company UUID |
archiveId | UUID | Yes | Archive row UUID, from Archive listing |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
reason | string | Yes | Why the hold is being set |
Response
{
"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": true,
"createdTime": "2026-06-01T10:00:00",
"copyQualifier": "ORIGINAL",
"unprocessable": false,
"validationNote": null
}
The updated archive row. See Archive listing for the full field reference.
Error responses
| HTTP | errorType | Meaning |
|---|---|---|
400 | GERMANY_ARCHIVE_NOT_AVAILABLE | The company is not archived under the German GoBD rules |
400 | GERMANY_ARCHIVE_LEGAL_HOLD_REASON_REQUIRED | reason is missing or blank |
401 | AUTHORIZATION_FAILED | Missing/expired JWT, or caller is not an Administrator on this company |
404 | — | No archive row with this archiveId for this company |
Release legal hold
Endpoint
| Property | Value |
|---|---|
| URL | DELETE /germany/archive/{companyId}/legal-hold/{archiveId} |
| Method | DELETE |
| Auth | R-Auth: <company-jwt> (Administrator role required) |
| Content-Type | application/json |
| Base URL | Stage Environment https://api-stage.docnova.ai/ Production Environment https://api.docnova.ai/ |
Example Request
curl --location --request DELETE '{{baseUrl}}/germany/archive/{{companyId}}/legal-hold/{{archiveId}}' \
--header 'Content-Type: application/json' \
--header 'R-Auth: {{companyJwt}}' \
--data-raw '{
"reason": "Tax audit 2026 closed — Finanzamt Berlin"
}'
Path parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
companyId | UUID | Yes | Company UUID |
archiveId | UUID | Yes | Archive row UUID, from Archive listing |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
reason | string | Yes | Why the hold is being released |
Response
Same shape as Set legal hold, with legalHold: false.
Error responses
| HTTP | errorType | Meaning |
|---|---|---|
400 | GERMANY_ARCHIVE_NOT_AVAILABLE | The company is not archived under the German GoBD rules |
400 | GERMANY_ARCHIVE_LEGAL_HOLD_REASON_REQUIRED | reason is missing or blank |
401 | AUTHORIZATION_FAILED | Missing/expired JWT, or caller is not an Administrator on this company |
404 | — | No archive row with this archiveId for this company |
Releasing a legal hold does not delete anything. The row remains archived until its normal retentionUntil date, and expired rows still require an administrator to approve deletion (see Export & Audit Packages).