You can use the Audit trail API to find out what happened in the archive: who moved a package to the trash, which ingest failed, when someone placed a legal hold. You can search all the records of your tenant, export them as a CSV file, or read the audit trail of one package.
Every call needs the archive-content-manager role, and only returns records of the tenant that you call. Every call also needs the headers in Common headers. To handle errors that any call can return, go to Errors.
Search the audit trail
Returns the audit trail records that match your filters, most recent first. All filters are optional, and you can combine them.
GET /v2/audittrail
Required role: archive-content-manager
|
Name |
Type |
Required |
Description |
|---|---|---|---|
|
|
integer, query |
No |
The page to return, starting at |
|
|
integer, query |
No |
The number of records per page. Default: |
|
|
string, query |
No |
|
|
|
string, query |
No |
|
|
|
string, query |
No |
Returns the records of this package. Also works for a package whose ingest failed. |
|
|
string, query |
No |
Returns the records of this event, for example |
|
|
string, query |
No |
Returns the records of this user name. Exact match. |
|
|
string, query |
No |
|
|
|
string, query |
No |
Returns events on or after this moment, as an ISO 8601 date and time with an offset, for example |
|
|
string, query |
No |
Returns events on or before this moment, in the same format, for example |
curl -G https://archive.example.com/v2/audittrail \
-H "Authorization: Bearer $TOKEN" \
-H "tenant: acme-archive" \
--data-urlencode "packageId=HR-2019-0042" \
--data-urlencode "severity=WARNING,ERROR" \
--data-urlencode "from=2026-09-01T00:00:00Z"
Response: 200 OK with an AuditTrailList object.
{
"totalResults": 1,
"page": 0,
"pageSize": 100,
"items": [
{
"eventId": "48213",
"name": "plugin_failed",
"severity": "WARNING",
"message": "Plugin pdfa-validation failed: report.pdf is not valid PDF/A",
"packageId": "HR-2019-0042",
"user": "jdoe",
"time": "2026-09-14T13:02:11Z",
"logDate": "2026-09-14T13:02:12Z",
"repository": "acme-archive",
"extendedInfo": {
"packageId": "HR-2019-0042",
"severity": "Moderate",
"message": "Plugin pdfa-validation failed: report.pdf is not valid PDF/A"
}
}
]
}
-
400withINVALID_DATE:fromortoisn't an ISO 8601 date and time with an offset. -
400withUNSUPPORTED_VALUE:severityholds a value other thanINFO,WARNING, orERROR.
Export the audit trail as CSV
Creates a CSV file with the records that match your filters, and returns a link to download it. You can use the filters of Search the audit trail: packageId, eventName, user, severity, from, and to. Paging and sorting don't apply.
GET /v2/audittrail/export
Required role: archive-content-manager
The call returns when the file is ready. The file holds at most 10,000 records, the most recent first. To export more, split the export into shorter date ranges with from and to.
The CSV file has a header row and these columns: eventId, name, severity, user, time, packageId, packageType, repository, and message.
Response: 200 OK with an ExportResult object.
{
"downloadUrl": "https://downloads.example.com/exports/audittrail/2b7f0c9e.csv?X-Amz-Expires=3600"
}
-
400withINVALID_DATE:fromortoisn't an ISO 8601 date and time with an offset. -
400withUNSUPPORTED_VALUE:severityholds a value other thanINFO,WARNING, orERROR.
Get a package's audit trail
Returns the audit trail records of one package, most recent first.
GET /v2/archive/{packageId}/audittrail
Required role: archive-content-manager
|
Name |
Type |
Required |
Description |
|---|---|---|---|
|
|
string, path |
Yes |
The package ID. |
|
|
integer, query |
No |
The page to return, starting at |
|
|
integer, query |
No |
The number of records per page. Default: |
Response: 200 OK with an AuditTrailList object.
-
404withPACKAGE_NOT_FOUND: no package that you can see has this ID. To find the records of a package whose ingest failed, use Search the audit trail with thepackageIdfilter.
Get one audit trail record
Returns one record of a package's audit trail.
GET /v2/archive/{packageId}/audittrail/{eventId}
Required role: archive-content-manager
|
Name |
Type |
Required |
Description |
|---|---|---|---|
|
|
string, path |
Yes |
The package ID. |
|
|
string, path |
Yes |
The record's |
Response: 200 OK with an AuditTrailRecord object.
-
404withAUDIT_EVENT_NOT_FOUND: this package has no record with thiseventId.
Events that you can filter on
Use these names in the eventName filter. Some of them also carry a severity.
|
Event |
When it's recorded |
Severity |
|---|---|---|
|
|
An ingest failed. |
|
|
|
The archive couldn't create or read a SIP, for example because it isn't valid. |
|
|
|
The archive couldn't create or find the package for a SIP. |
|
|
|
The virus scan found a virus. |
|
|
|
A preservation action failed. |
|
|
|
A preservation action finished with a warning. |
|
|
|
Someone updated a package's metadata, and the archive created an update SIP. |
None |
|
|
Someone deleted a package's renditions. |
None |
|
|
Someone moved a package to the trash. |
None |
|
|
Someone restored a package from the trash. |
None |
|
|
Someone deleted a package permanently. |
None |
|
|
Someone transferred a package to another tenant. The target tenant is in |
None |
|
|
Someone placed a legal hold. |
None |
|
|
Someone lifted a legal hold. |
None |
|
|
A package's retention date was set. |
None |
|
|
A package's retention date was extended. |
None |
|
|
A package was added to a deletion list after its retention period ended. |
None |
|
|
A package was removed from a deletion list, for example because its retention was extended or it was placed on legal hold. |
None |
|
|
Someone started the review of a deletion list. |
None |
|
|
A reviewer approved a deletion list. |
None |
|
|
A reviewer rejected a deletion list. |
None |
|
|
All the reviewers approved a deletion list. |
None |
|
|
The archive ran the end action of an approved deletion list on its packages. |
None |
|
|
The end action of an approved deletion list couldn't run on a package, because the action failed on that package. |
|
The events from deletionListReviewInitiated to deletionListRemoved are recorded on the deletion list, not on a package. You find them in a search without the packageId filter, but not in a package's audit trail.
Schemas
AuditTrailList
|
Field |
Type |
Description |
|---|---|---|
|
|
number |
The number of records that match, on all pages. |
|
|
number |
The page in this response. |
|
|
number |
The page size in this response. |
|
|
array of AuditTrailRecord |
The records on this page. |
AuditTrailRecord
|
Field |
Type |
Description |
|---|---|---|
|
|
string |
The record's ID. Use it to get one audit trail record. |
|
|
string |
The event name, for example |
|
|
string |
The event category. |
|
|
string |
|
|
|
string |
A readable description of what happened. When the event has no message of its own, it holds the event's comment. |
|
|
string |
The package that the event is about. When the event doesn't record one, it's the package ID in your request, or it's missing. |
|
|
string |
The type of package, for example |
|
|
string |
The user who triggered the event. |
|
|
string (date-time) |
When the event happened. |
|
|
string (date-time) |
When the archive recorded the event. |
|
|
string |
The tenant where the event happened. |
|
|
string |
The path of the package, SIP, or deletion list that the event is about, at the time of the event. |
|
|
string |
The type of what the event is about, for example |
|
|
string |
Its lifecycle state at the time of the event, for example |
|
|
string |
A comment on the event, when there is one. |
|
|
object |
More details as key and value pairs, for example |
ExportResult
|
Field |
Type |
Description |
|---|---|---|
|
|
string |
The link to download the CSV file. By default, it's valid for 60 minutes. |