Skip to main content
Version: 1.0.0

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.

Endpoint​

PropertyValue
URLPOST /germany/archive/{companyId}/legal-hold/{archiveId}
MethodPOST
AuthR-Auth: <company-jwt> (Administrator role required)
Content-Typeapplication/json
Base URLStage 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​

ParameterTypeRequiredDescription
companyIdUUIDYesCompany UUID
archiveIdUUIDYesArchive row UUID, from Archive listing

Request body​

FieldTypeRequiredDescription
reasonstringYesWhy 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​

HTTPerrorTypeMeaning
400GERMANY_ARCHIVE_NOT_AVAILABLEThe company is not archived under the German GoBD rules
400GERMANY_ARCHIVE_LEGAL_HOLD_REASON_REQUIREDreason is missing or blank
401AUTHORIZATION_FAILEDMissing/expired JWT, or caller is not an Administrator on this company
404—No archive row with this archiveId for this company

Endpoint​

PropertyValue
URLDELETE /germany/archive/{companyId}/legal-hold/{archiveId}
MethodDELETE
AuthR-Auth: <company-jwt> (Administrator role required)
Content-Typeapplication/json
Base URLStage 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​

ParameterTypeRequiredDescription
companyIdUUIDYesCompany UUID
archiveIdUUIDYesArchive row UUID, from Archive listing

Request body​

FieldTypeRequiredDescription
reasonstringYesWhy the hold is being released

Response​

Same shape as Set legal hold, with legalHold: false.

Error responses​

HTTPerrorTypeMeaning
400GERMANY_ARCHIVE_NOT_AVAILABLEThe company is not archived under the German GoBD rules
400GERMANY_ARCHIVE_LEGAL_HOLD_REASON_REQUIREDreason is missing or blank
401AUTHORIZATION_FAILEDMissing/expired JWT, or caller is not an Administrator on this company
404—No archive row with this archiveId for this company
Retention still applies

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).