All under /organizations/{orgId}/handbooks, access token. Handbooks themselves are authored in the AirMason editor; the API lets you distribute them and monitor completion.
List and get handbooks
GET /organizations/{orgId}/handbooks
and GET /organizations/{orgId}/handbooks/{handbookId}
{
"id": "167564",
"name": "Employee Handbook 2026",
"slug": "employee-handbook-2026",
"status": "published",
"currentVersion": 110,
"requiresSignature": true,
"requiresAcknowledgement": false,
"publishedAt": "2026-01-15T16:00:00.000Z",
"url": "https://books.airmason.com/acme-corp/employee-handbook-2026",
"assignedEmployeeCount": 412,
"signedCount": 388,
"createdAt": "2025-11-02T11:20:00.000Z",
"updatedAt": "2026-01-15T16:00:00.000Z"
}Handbook ids are numeric strings (
"167564");{handbookId}accepts numeric ids only.currentVersion, and every other version field in this article, is the raw stored version number:110is displayed as 1.1 and120as 1.2. Webhook payloads carry both the number and the display label; the REST resources carry only the number.statusis one ofdraft,published, orarchived. The list acceptsstatus=archived, but archived handbooks are list-only:GET /handbooks/{handbookId}and every sub-route return404for them.limitis capped at 100 on this list (500 elsewhere).
Get employees and groups assignments
GET /organizations/{orgId}/handbooks/{handbookId}/assignments
Returns the current assignments. The employees array contains bare employeeId values ("R-10482", not ext:R-10482).
Assign employees and groups
PUT /organizations/{orgId}/handbooks/{handbookId}/assignments
{
"groups": ["Sales", "Lisbon Office"],
"employees": ["ext:R-10482"]
}Replaces the handbook's full assignment set (at most 50 group names per request). Unknown employee references return 400 validation_error listing them, and nothing is written. Group names that do not exist yet are created as part of the assignment, the same way employee groups are. Newly assigned employees are notified only when the handbook is published and its configuration has welcome emails enabled; the notification is the email, or the employee.handbook_assigned webhook if you've disabled emails.
Signature and acknowledgement status
GET /organizations/{orgId}/handbooks/{handbookId}/signatures
One row per assigned employee.
Filter with status=pending|signed|acknowledged, version=<n> (the raw number, e.g. 110; defaults to the current version; an unknown version returns 404), or signedSince=<timestamp>.
{
"data": [
{
"employee": { "id": "e7c1…", "employeeId": "R-10482" },
"status": "signed",
"signedAt": "2026-01-16T09:14:37.000Z",
"acknowledgedAt": null,
"previouslySignedVersion": 100,
"firstViewedAt": "2026-01-16T09:02:11.000Z",
"remindersSent": 0
}
],
"summary": { "assigned": 412, "signed": 388, "acknowledged": 0, "pending": 24 },
"pagination": { "limit": 25, "offset": 0, "total": 412 }
}statusispending(assigned, not yet actioned),signed, oracknowledged, depending on what the handbook requires.status=signedalso includes acknowledged rows.summary.pendingisassignedminussigned. Rows carry no per-rowversion: the version is the one you filtered on (or the current one).firstViewedAtis best-effort and depends on view tracking being enabled for the handbook (time-view tracking on, with analytics set to time tracking or full tracking). It is off by default for a handbook launched through the normal flow, in which casefirstViewedAtstaysnulleven after the employee opens and signs.
Activity log
GET /organizations/{orgId}/handbooks/{handbookId}/activity
A chronological, paginated log of what happened to the handbook. Filter with type (repeatable: ?type=a&type=b) and since. limit is capped at 100.
{
"data": [
{
"type": "handbook.published",
"occurredAt": "2026-01-15T16:00:00.000Z",
"handbookId": "167564",
"actor": { "type": "collaborator", "email": "hr@acme.com" },
"employeeId": null,
"description": "Published version 1.1"
},
{
"type": "employee.signed",
"occurredAt": "2026-01-16T09:14:37.000Z",
"handbookId": "167564",
"actor": { "type": "employee", "employeeId": "R-10482" },
"employeeId": "R-10482",
"description": "Signed version 1.1"
}
],
"pagination": { "limit": 25, "offset": 0, "total": 1204 }
}Types: handbook.created, handbook.published, handbook.updated, handbook.assignment_changed, handbook.reminder_sent, employee.signed, employee.acknowledged. A launch is reported as handbook.published with the description Launched handbook. actor.type is collaborator (an admin, with email), employee (with employeeId) or system, which is what Partner API writes look like.
An organization-wide feed of the same handbook events, across all handbooks, is available at GET /organizations/{orgId}/activity. It takes the same filters plus handbookId.
Partner API documentation: