GetClassificationLogs API¶
Returns the full classification history log for the specified document or folder path. Each log entry records a change to the security classification level, including the new level, who made the change, the reason, and any associated downgrade or declassify dates. Use this API to audit classification changes for compliance and governance reporting.
Endpoint¶
Methods¶
- GET
/srv.asmx/GetClassificationLogs?AuthenticationTicket=...&Path=... - POST
/srv.asmx/GetClassificationLogs(form data) - SOAP Action:
http://tempuri.org/GetClassificationLogs
Parameters¶
| Parameter | Type | Required | Description |
|---|---|---|---|
AuthenticationTicket |
string | Yes | Authentication ticket obtained from AuthenticateUser. |
Path |
string | Yes | Full infoRouter path to a document (e.g. \Finance\Reports\Q1-Report.pdf) or a folder (e.g. \Finance\Reports). Must resolve to an existing document or folder. The library is derived from the resolved object and determines the required permission scope — see Required Permissions. |
Required Permissions¶
The Path is resolved to a document or folder, and the caller passes when either holds:
- the library's read classification log policy grants them the item. By default that is the item's owner, the library's managers, and users with Full Control on it; each library can change this in its policies (SetDomainPolicies);
- they are an administrator, a member of [Audit Managers], or a manager of the item's library.
Up to 8.7 only the second was checked: the policy was ignored, so the owner and the users it named were refused. This is how GetSoxLogs and GetISOLogs already worked.
| Scenario | Result |
|---|---|
| Path does not resolve | 4041 - no permission check is performed |
Response¶
Success Response¶
Returns a <response> element with success="true" containing a <Value> element with zero or more <ClassificationLogEntry> child elements. Entries are ordered by ActionDate ascending (oldest first).
<response success="true" error="">
<Value>
<ClassificationLogEntry>
<ObjectTypeId>1</ObjectTypeId>
<ObjectType>DOCUMENT</ObjectType>
<ObjectId>9871</ObjectId>
<ObjectName>Q1-2024-Report.pdf</ObjectName>
<DomainId>5</DomainId>
<DomainName>Finance</DomainName>
<Path>/Finance/Reports/Q1-2024-Report.pdf</Path>
<BeforeClassificationLevelId>0</BeforeClassificationLevelId>
<BeforeClassificationLevel>NoMarkings</BeforeClassificationLevel>
<BeforeDowngradeOn>0001-01-01T00:00:00</BeforeDowngradeOn>
<BeforeDeclassifyOn>0001-01-01T00:00:00</BeforeDeclassifyOn>
<ClassificationLevelId>3</ClassificationLevelId>
<ClassificationLevel>Secret</ClassificationLevel>
<DowngradeOn>2026-01-01T00:00:00</DowngradeOn>
<DeclassifyOn>2028-06-01T00:00:00</DeclassifyOn>
<ReasonForAction>Classified for Q1 sensitivity review period.</ReasonForAction>
<ActionDate>2024-06-15T14:30:00</ActionDate>
<ActionbyId>12</ActionbyId>
<ActionByName>jsmith</ActionByName>
<FolderId>0</FolderId>
<Agency>Finance Division</Agency>
</ClassificationLogEntry>
</Value>
</response>
ClassificationLogEntry Field Reference¶
| Field | Type | Description |
|---|---|---|
ObjectTypeId |
int | Numeric object type: 1 = Document, 2 = Folder. |
ObjectType |
string | Object type label: DOCUMENT or FOLDER. |
ObjectId |
int | Internal ID of the document or folder. |
ObjectName |
string | Name of the document or folder. |
DomainId |
int | Internal ID of the library/domain. |
DomainName |
string | Name of the library/domain. |
Path |
string | Full infoRouter path of the item at the time of the classification change. |
BeforeClassificationLevelId |
int | Classification level ID before the change (0 if not recorded). |
BeforeClassificationLevel |
string | Classification level name before the change. |
BeforeDowngradeOn |
DateTime | Scheduled downgrade date before the change (0001-01-01 if not set). |
BeforeDeclassifyOn |
DateTime | Scheduled declassify date before the change (0001-01-01 if not set). |
ClassificationLevelId |
int | New classification level ID after the change. |
ClassificationLevel |
string | New classification level name after the change. |
DowngradeOn |
DateTime | New scheduled downgrade date (0001-01-01 if not set). |
DeclassifyOn |
DateTime | New scheduled declassify date (0001-01-01 if not set). |
ReasonForAction |
string | Reason entered by the user when making the classification change. |
ActionDate |
DateTime | Date and time the classification was changed. |
ActionbyId |
int | Internal user ID of the person who made the change. |
ActionByName |
string | Username of the person who made the change. |
FolderId |
int | Parent folder ID (0 for document-level entries). |
Agency |
string | Agency or organisational unit associated with the classification. |
ClassificationLevel Values¶
| ID | Name | Description |
|---|---|---|
0 |
NoMarkings |
No classification markings applied. |
1 |
Declassified |
Document has been formally declassified. |
2 |
Confidential |
Confidential classification. |
3 |
Secret |
Secret classification. |
4 |
TopSecret |
Top Secret classification. |
No Entries Response¶
Error Response¶
Example Requests¶
GET¶
GET /srv.asmx/GetClassificationLogs?AuthenticationTicket=3f2504e0-4f89-11d3-9a0c-0305e82c3301&Path=/Finance/Reports/Q1-2024-Report.pdf HTTP/1.1
Host: server.example.com
POST¶
POST /srv.asmx/GetClassificationLogs HTTP/1.1
Content-Type: application/x-www-form-urlencoded
AuthenticationTicket=3f2504e0-4f89-11d3-9a0c-0305e82c3301&Path=/Finance/Reports/Q1-2024-Report.pdf
SOAP 1.1¶
POST /srv.asmx HTTP/1.1
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://tempuri.org/GetClassificationLogs"
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<GetClassificationLogs xmlns="http://tempuri.org/">
<AuthenticationTicket>3f2504e0-4f89-11d3-9a0c-0305e82c3301</AuthenticationTicket>
<Path>/Finance/Reports/Q1-2024-Report.pdf</Path>
</GetClassificationLogs>
</soap:Body>
</soap:Envelope>
JavaScript¶
Every call answers XML with HTTP 200, success or not, so success is the thing to branch on and
errorCode is the number to report.
async function call(action, params) {
const response = await fetch(`/srv.asmx/${action}?${new URLSearchParams(params)}`);
const root = new DOMParser()
.parseFromString(await response.text(), 'text/xml')
.documentElement;
if (root.getAttribute('success') !== 'true') {
throw new Error(`${root.getAttribute('errorCode')}: ${root.getAttribute('error')}`);
}
return root;
}
Reports how a document’s classification has changed. Entries are under <Value>, and a document with none is a success with nothing in
it rather than an error.
const root = await call('GetClassificationLogs', {
authenticationTicket: ticket,
Path: '/Public/ApiTests/test-document.txt'
});
Notes¶
- Library-level permission only: because
Pathalways resolves to a specific object, the access check is always scoped to that object's library. System-wide admin rights are not required. - Documents and folders: the
Pathparameter accepts both document and folder paths. - Chronological order: entries are always returned in ascending
ActionDateorder (oldest first). - Before fields:
Before*fields reflect the state before the change. In older log entries these may be0/NoMarkings/0001-01-01if the previous state was not recorded at the time. - Date format:
ActionDate,DowngradeOn,DeclassifyOn, and theirBefore*counterparts are ISO 8601 date-time strings. A value of0001-01-01T00:00:00indicates that no date was set. - Path not found: if
Pathdoes not resolve to any existing document or folder, an error is returned. - No date or user filter: this API returns all classification events for the exact path specified. Use
Pathalone to scope the results.
Error Codes¶
The errorCode values this operation returns, checked against a running server:
errorCode |
When |
|---|---|
4010 |
the ticket is expired or unknown |
4030 |
the caller can see the item but neither the policy nor an audit role lets them read its log |
4041 |
no document at that path - including a path the caller cannot see, so an anonymous caller gets this rather than 4030 |
| Error | Description |
|---|---|
[900] Authentication failed |
Invalid or missing authentication ticket. |
[901] Session expired or Invalid ticket |
The ticket has expired or does not exist. |
Insufficient rights. |
The caller does not have ViewAuditLogs permission for the library containing the resolved object. |
| Path not found | The specified Path does not resolve to an existing document or folder. |
SystemError:... |
An unexpected server-side error occurred. |
Related APIs¶
- SetClassificationLevel - Set the classification level of a document or folder
- GetDeleteLog - Get the deletion log for documents and folders
- GetSecurityChangeLog - Get the security (access control) change log
- GetOwnershipChangeLog - Get the ownership change log