Your Blissbook data is yours to work with, wherever you work. These docs are generated from the code that serves it, so what you read here is always accurate.
Pull your compliance data over HTTPS: the audit log, signatures and the PDFs behind them, your saved reports, and the published content a person can see. Every endpoint is a GET against your own subdomain.
API access is enabled per organization. If a request comes back 403, ask your Blissbook administrator to have it turned on for your account.
Every request is authenticated with HTTP Basic Auth: your API key’s Access Key ID is the username and its Secret Access Key is the password. To generate a key:
Requests are limited to 120 per minute, counted against your API key on the API and against the account you authorized on the MCP server. The exports cost more than the rest, so the signature PDFs and the event export share a tighter limit of 60 per minute out of that same allowance. Blissbook responds with a 429 Too Many Requests error if you exceed either.
An error answers with the HTTP status below and the same JSON body every time: message says what went wrong, statusCode and statusMessage repeat the status, and code names the specific failure when there is one to name.
{
"message": "Invalid API key",
"statusCode": 401,
"statusMessage": "Unauthorized",
"code": "INVALID_API_KEY"
}| Status | When |
|---|---|
400 Bad Request | A parameter or argument failed validation. The message names the field and what it expected. |
401 Unauthorized | Your credentials are missing, wrong, or no longer active. |
403 Forbidden | You are authenticated, but this is not yours to do: either the feature is not enabled for your organization, or your Blissbook permissions do not cover it. |
404 Not Found | Nothing exists by that id, or nothing you are allowed to see does. |
429 Too Many Requests | You are over the rate limit. Wait, then retry. |
500 Internal Server Error | Our fault, and we are looking into it. The message stays generic; retrying is safe. |
The live, personalized content an audience member can see.
Get the live, personalized Documents a person can see. Identify the person by email, employee ID, or Blissbook ID.
| Field | Type | Description |
|---|---|---|
email | stringoptional | The person’s email address |
employeeId | stringoptional | The person’s employee ID |
personId | integeroptional | The person’s Blissbook ID |
| Field | Type | Description |
|---|---|---|
object[] | Every published Document this person can see, in the order they appear in Blissbook | |
personId | number | The person the content was rendered for |
timestamp | string | When the content was rendered, ISO 8601 in UTC |
Signature Reports and Audit Logs for your organization.
List the Events recorded for your organization, newest first, filtered by time range, type, category, actor, or subject. Results are paginated: pass the returned nextCursor to continue where the last page left off.
| Field | Type | Description |
|---|---|---|
actorPersonId | integeroptional | Only events performed by this person |
categoryId | "accessControl" | "authentication" | "collaboration" | "dataExport" | "mcp" | "reporting" | ("accessControl" | "authentication" | "collaboration" | "dataExport" | "mcp" | "reporting")[]optional | Only events in these categories. Repeat the param for more than one |
cursor | stringoptional | The previous page's nextCursor, to continue where it left off |
limit | integeroptional | Events per page, up to 100 |
nameId | "apiKey.archived" | "apiKey.created" | "apiKey.deleted" | "apiKey.unarchived" | "apiRequestReceived" | "bulkExportCompleted" | … | ("apiKey.archived" | "apiKey.created" | "apiKey.deleted" | "apiKey.unarchived" | "apiRequestReceived" | "bulkExportCompleted" | …)[]optional | Only events going by these names, e.g. policy.created. Repeat the param for more than one |
order | "asc" | "desc"optional | Newest first (desc, the default) or oldest first (asc) |
since | stringoptional | Only events at or after this ISO 8601 timestamp |
until | stringoptional | Only events before this ISO 8601 timestamp |
| Field | Type | Description |
|---|---|---|
object[] | The page of events, ordered by the order param | |
hasMore | boolean | Whether this page was full, so another pull may return more |
nextCursor | string | null | Cursor to resume from on the next pull, null when no events matched |
Export a Saved Report as a CSV file, using the columns, filters, and sort order saved with the report. Find the report id in its URL in Blissbook.
| Field | Type | Description |
|---|---|---|
savedReportId | stringrequired | The Saved Report’s ID, from its URL in Blissbook |
The rows of the Saved Report, with the columns, filters, and sort order saved with it.
The same Signatures as the JSON endpoint, as a CSV file with one row per Signature.
| Field | Type | Description |
|---|---|---|
from | stringoptional | Only Signatures at or after this ISO 8601 timestamp. Omit for a full sync |
to | stringoptional | Only Signatures before this ISO 8601 timestamp. Defaults to now |
One row per Signature, with the employee, the Document and version they signed, when they signed, and links to the Signature and its PDFs.
List the Signatures on your Documents, oldest first, each with the Document and person who signed it and links to its PDFs. Filter by when they were signed to sync only what changed.
| Field | Type | Description |
|---|---|---|
from | stringoptional | Only Signatures at or after this ISO 8601 timestamp. Omit for a full sync |
to | stringoptional | Only Signatures before this ISO 8601 timestamp. Defaults to now |
| Field | Type | Description |
|---|---|---|
acknowledgementPdfUrl | string | Endpoint that returns a download link to the Acknowledgement PDF |
object | The Document that was signed | |
pdfUrl | string | Endpoint that returns a download link to the signed Document PDF |
object | The person who signed | |
signatureId | number | The Signature’s ID, to pass to the PDF endpoints |
signedAt | string | When the person signed, ISO 8601 in UTC |
url | string | Link to the Signature in Blissbook |
Render just the acknowledgement the person signed and return a temporary download link to the PDF. The link expires after seven days.
| Field | Type | Description |
|---|---|---|
signatureId | integerrequired | The Signature’s ID |
| Field | Type | Description |
|---|---|---|
pdfUrl | string | Temporary download link to the PDF, valid for seven days |
Render the Document as it was signed and return a temporary download link to the PDF. The link expires after seven days.
| Field | Type | Description |
|---|---|---|
signatureId | integerrequired | The Signature’s ID |
| Field | Type | Description |
|---|---|---|
pdfUrl | string | Temporary download link to the PDF, valid for seven days |
The MCP server speaks Streamable HTTP. Add the endpoint below to any MCP client and it will walk you through authorizing your Blissbook account.
Every tool the server can expose is listed below. The tools your client actually sees depend on your plan and your permissions in Blissbook, so a given connection may offer fewer than these.
The server authenticates with OAuth 2.1, so there is no key to copy anywhere: point your client at the endpoint above, it registers itself against the discovery metadata, and Blissbook asks you to sign in and authorize it. The connection then acts as you, so every tool sees exactly the data your own Blissbook permissions allow. Revoking your authorization cuts it off.
Requests are limited to 120 per minute, counted against your API key on the API and against the account you authorized on the MCP server. The exports cost more than the rest, so the signature PDFs and the event export share a tighter limit of 60 per minute out of that same allowance. Blissbook responds with a 429 Too Many Requests error if you exceed either.
An error answers with the HTTP status below and the same JSON body every time: message says what went wrong, statusCode and statusMessage repeat the status, and code names the specific failure when there is one to name.
{
"message": "Invalid API key",
"statusCode": 401,
"statusMessage": "Unauthorized",
"code": "INVALID_API_KEY"
}| Status | When |
|---|---|
400 Bad Request | A parameter or argument failed validation. The message names the field and what it expected. |
401 Unauthorized | Your credentials are missing, wrong, or no longer active. |
403 Forbidden | You are authenticated, but this is not yours to do: either the feature is not enabled for your organization, or your Blissbook permissions do not cover it. |
404 Not Found | Nothing exists by that id, or nothing you are allowed to see does. |
429 Too Many Requests | You are over the rate limit. Wait, then retry. |
500 Internal Server Error | Our fault, and we are looking into it. The message stays generic; retrying is safe. |
The MCP server speaks JSON-RPC, so what the transport itself rejects comes back in a JSON-RPC envelope rather than that body: an unauthorized request carries error code -32001 alongside a WWW-Authenticate header naming the discovery metadata, and arguments that fail a tool's schema come back as -32602 (Invalid params) naming the argument.
A tool that runs and then fails answers with an error result instead, carrying the same message. Your client hands that to the model, which can correct the call and try again.
To answer your employees’ questions from your chatbot, connect to Blissbook once and let the chatbot read as whoever is asking the question. Pass asPerson to any Audience Members tool and the answer comes back personalized to that person.
Reading as another person is a permission, and the connection has permissions of the Blissbook account that authorized it. A manager’s account can already read as anyone who reports to them; reading as anyone in your organization takes the Reporting Only team role (or Team Owner). So authorize the connection as an account that exists for the integration rather than as one of your people:
asPerson: exactly one of email, employeeId, or personId, whichever your chatbot already knows about them.Because the account isn’t a person, nobody’s departure breaks the integration and the email address behind it is a credential, so restrict it the way you would any shared admin account. To cut the connection off, remove the Reporting Only role: permissions are checked on every call, so the next request fails even if the chatbot still holds a token.
From there, there are two ways to get the content into your chatbot’s answer.
Let Blissbook do the work. Call search_live_content with the employee’s question and it returns the most relevant passages, already personalized to the person in asPerson. Each one carries a relevance score and the Document Section or Policy it came from, so your chatbot can cite where the answer lives. Chunking, embedding, and audience filtering stay on our side; your chatbot only writes the answer. This is the shorter path, and it needs the Audience Chatbot enabled for the organization, since that setting is what embeds your content in the first place. Without it the call comes back 403.
Fetch the content yourself. list_live_content returns the whole table of contents a person can access, and get_live_content reads the HTML content up to 20 of those ids per call. Use it to index the content in your own vector store, or to hand a model an entire policy rather than a passage of one. IMPORTANT: every tool answers as a specific person, not your organization at large. An index built from one person’s content is wrong for the next person.
The live, personalized content an audience member can see.
Read the live, personalized content for the current user OR the person identified in asPerson.
| Field | Type | Description |
|---|---|---|
objectoptional | Read as this person, named by exactly one of email, employeeId, or personId. If not specified, defaults to the caller. You must have explicit permission to read as this person. | |
itemIds | string[]required | The item ids from list_live_content, e.g. "handbookSection:12" / "policy:34". Max 20 per call; read larger sets in batches. |
| Field | Type | Description |
|---|---|---|
object[] | One per id that named content this person can read, in the order the ids were given. | |
notFoundIds | string[] | The ids naming nothing this person can read — either no such item, or not visible to them. |
List the live, personalized content for the current user OR the person identified in asPerson.
| Field | Type | Description |
|---|---|---|
objectoptional | Read as this person, named by exactly one of email, employeeId, or personId. If not specified, defaults to the caller. You must have explicit permission to read as this person. |
| Field | Type | Description |
|---|---|---|
object[] | All of the content this person can access. |
Similarity-search the live, personalized content for the current user OR the person identified in asPerson.
| Field | Type | Description |
|---|---|---|
objectoptional | Read as this person, named by exactly one of email, employeeId, or personId. If not specified, defaults to the caller. You must have explicit permission to read as this person. | |
query | stringrequired | What to search for. |
| Field | Type | Description |
|---|---|---|
object[] | Most relevant content first. |
Read and write the policies, documents, properties, and demographics of your organization.
Create draft policies for the organization, optionally setting property values. Always ask the user for HTML content before creating.
| Field | Type | Description |
|---|---|---|
object[]required | One entry per document to create, up to 10 per call. |
| Field | Type | Description |
|---|---|---|
object[] | The policies that were created, in the order given. |
Read the organization's demographics: how many people it has in each country, state, county, and city, with the synced count and the manually recorded count behind each number. These counts decide which jurisdictions its policies need to cover.
This tool takes no arguments.
| Field | Type | Description |
|---|---|---|
object[] | One entry per location the organization has people in, with its people counts. |
Read one Model Policy in full: its published HTML, the notes explaining what to decide before adopting it, and the jurisdiction and topic it is classified under. Find ids with list_model_policies.
| Field | Type | Description |
|---|---|---|
id | integerrequired | The Model Policy id (from list_model_policies). |
| Field | Type | Description |
|---|---|---|
object | The model policy, with its published content. |
Read policies in full: the draft and last published version of each one, the notes anchored in their content, and the property values set on them. Find ids with list_policies.
| Field | Type | Description |
|---|---|---|
ids | integer[]required | The Policy ids (from list_policies). Max 20 per call; fetch larger sets in batches. |
| Field | Type | Description |
|---|---|---|
object[] | The policies, in the order their ids were given. |
List the Model Policies available to the organization — Blissbook-maintained policy templates — each with the jurisdiction it applies to and how it is classified. Returns names and properties only; read one in full with get_model_policy.
| Field | Type | Description |
|---|---|---|
limit | integeroptional | Max model policies to return. Defaults to 100. |
offset | integeroptional | Number of model policies to skip. Defaults to 0. |
| Field | Type | Description |
|---|---|---|
object[] | The page of model policies, without their content. | |
total | integer | Total number of model policies matching the query (before pagination). |
Search the organization's policies by the location they apply to and the property values set on them. Returns a page of policies with their properties and publish state, but not their content — read that with get_policies.
| Field | Type | Description |
|---|---|---|
objectoptional | Only documents that apply to this location. Give as much of it as you want to match on. | |
limit | integeroptional | Max documents to return. Defaults to 100. |
offset | integeroptional | Number of documents to skip. Defaults to 0. |
propertyFilters | object[][]optional | Only documents matching these property values: the outer array is ANDed, each inner array is ORed. |
showArchived | booleanoptional | Include archived documents alongside the active ones. Defaults to false. |
| Field | Type | Description |
|---|---|---|
object[] | The page of policies, in the order they are sorted in Blissbook. | |
totalCount | integer | Total number of policies matching the query (before pagination). |
List the properties that can be set on the given target types (e.g. policies, law changes) — each with its id, label, type, the target types it applies to, and the options a select property offers. Pass the ids to the list, create, and set properties tools.
| Field | Type | Description |
|---|---|---|
targetTypes | ("lawChange" | "laborLawPage" | "policy" | "policySkill")[]required | The kinds of thing to list properties for, e.g. policy or lawChange. |
| Field | Type | Description |
|---|---|---|
object[] | Every property defined on any of the requested target types. |
Check a policy draft against the law where it applies and Blissbook's writing guidance, and return the edits the check recommends. By default the recommendations are applied to the draft as suggestions an author can accept or reject; pass skipApplyRecommendations: true to preview them without touching the policy.
| Field | Type | Description |
|---|---|---|
policyId | integerrequired | The id of the policy to check (from list_policies). |
skipApplyRecommendations | booleanoptional | When true, generate the recommendations without changing the policy (preview only). When false (the default), apply them to the policy draft as suggestions the author can accept or reject. |
| Field | Type | Description |
|---|---|---|
analysisId | string | The id of this policy check, which the recommendations belong to. |
policyId | integer | The policy that was checked. |
object[] | The edits the check recommends, in the order they appear in the policy. |
Similarity-search the draft (unpublished) content for the current user, the person identified in asPerson, or ALL of the content in the organization.
| Field | Type | Description |
|---|---|---|
objectoptional | Preview as this person: their draft content, personalized for them, named by exactly one of email, employeeId, or personId. Omit to search all of the organization content. | |
handbookId | integeroptional | Prefer citation links into this Document when content appears in several, and include it in the search even if unpublished. |
query | stringrequired | What to search for. |
| Field | Type | Description |
|---|---|---|
object[] | Most relevant content first. |
Set the same property values on one or more existing policies. Use list_policies to find policy ids and list_properties to find property ids. Existing values for the given properties are replaced, or pass unset: true on an entry to clear it.
| Field | Type | Description |
|---|---|---|
objectoptional | The location to set on each document. Omitted parts of the location are cleared. | |
ids | integer[]required | Ids of the policies to change. Every change below is applied to each of them. |
properties | object[]optional | Property values to set. Any existing value for a listed property is replaced; pass unset: true on an entry to clear it instead. |
| Field | Type | Description |
|---|---|---|
object[] | The policies as they stand after the change. |
Update the manual people counts on the organization's demographics. Locations not listed keep their counts, and a null count reverts that location to the count calculated from synced people. Pass removeExisting: true to clear every existing manual count before applying the inserts.
| Field | Type | Description |
|---|---|---|
object[]required | The locations to set manual people counts for; locations not listed keep their counts. | |
removeExisting | booleanoptional | Delete every existing manual people count before applying the inserts. |
| Field | Type | Description |
|---|---|---|
object[] | One entry per location the organization has people in, with its people counts. |
Update a policy or law change property: optionally set a new label, and add ($push) or remove ($pull) select options individually.
| Field | Type | Description |
|---|---|---|
label | stringoptional | The property's new label. |
objectoptional | Changes to the property's options. Only valid for 'select' properties. | |
propertyId | stringrequired | The property to update. Use list_properties to discover ids. |
| Field | Type | Description |
|---|---|---|
object | The property as it stands after the change. |
Signature Reports and Audit Logs for your organization.
List the organization's events — sign-ins, permission and account changes, data exports, and document activity — filtered by time range, event type, category, actor, or subject. Results are paginated: pass the returned nextCursor to continue.
| Field | Type | Description |
|---|---|---|
actorPersonId | integeroptional | Only events performed by this person |
categoryIds | ("accessControl" | "authentication" | "collaboration" | "dataExport" | "mcp" | "reporting")[]optional | Only events in these categories |
cursor | stringoptional | The previous page's nextCursor, to continue where it left off |
limit | integeroptional | Events per page, up to 100 |
nameIds | ("apiKey.archived" | "apiKey.created" | "apiKey.deleted" | "apiKey.unarchived" | "apiRequestReceived" | "bulkExportCompleted" | …)[]optional | Only events going by these names, e.g. policy.created or signedIn |
order | "asc" | "desc"optional | Newest first (desc, the default) or oldest first (asc) |
since | stringoptional | Only events at or after this ISO 8601 timestamp |
until | stringoptional | Only events before this ISO 8601 timestamp |
| Field | Type | Description |
|---|---|---|
object[] | The page of events, ordered by the order param | |
hasMore | boolean | Whether this page was full, so another pull may return more |
nextCursor | string | null | Cursor to resume from on the next pull, null when no events matched |
Blissbook records an event when somebody signs in, when somebody is granted a role, when content is published or signed, and for every call the API and the MCP server serve. Everything recorded is named below — if something isn’t here, no event is recorded for it. Read them with the List Events endpoint or the list_events tool.
An API key was archived, and every request that key makes is refused until the key is unarchived.
| Attribute | Type | Description |
|---|---|---|
apiKeyId | string | The Access Key ID of the API key this event is about |
An API key was generated.
| Attribute | Type | Description |
|---|---|---|
apiKeyId | string | The Access Key ID of the API key this event is about |
An API key was deleted for good. The requests that key already made stay in the log.
| Attribute | Type | Description |
|---|---|---|
apiKeyId | string | The Access Key ID of the API key this event is about |
An archived API key was put back into service.
| Attribute | Type | Description |
|---|---|---|
apiKeyId | string | The Access Key ID of the API key this event is about |
A request to the REST API was served.
| Attribute | Type | Description |
|---|---|---|
apiEndpointId | "exportEvents" | "getDocuments" | "exportSavedReportCsv" | "exportSignaturesCsv" | "exportSignaturesJson" | "getSignatureAcknowledgementPdf" | … | The ID of the endpoint that served the call |
url | string | The endpoint called, including the query string |
An export from the app finished.
| Attribute | Type | Description |
|---|---|---|
bulkExportTypeId | "accessControl" | "acknowledgments" | "handbookRecipients" | "lawChanges" | "people" | "policies" | The ID of what was exported |
documentId | integer | The ID of the Document the export covered, when the export covered just one |
A data lineage report was exported.
| Attribute | Type | Description |
|---|---|---|
policyIds | integer[] | The IDs of the policies the report covered |
A Document was created. A new Document has no published version and no audience.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Document |
A new version of the Document went live to its audience.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Document |
versionNumber | integer | The version that went live |
Somebody was granted a role on the Document, along with the permissions that role carries.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Document |
personId | integer | The ID of whoever was granted the role |
roleId | string | null | The ID of the role, or null when the assignment carries no role of its own |
Somebody’s role on the Document was taken away, along with the permissions that role carried.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Document |
personId | integer | The ID of whoever lost the role |
A signature round was opened, so the Document’s audience is asked to sign again.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Document |
signatureRoundId | integer | The ID of the signature round that was opened |
Somebody signed the Document.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Document |
signatureId | integer | The ID of the Signature, which the PDF endpoints take |
Somebody opened the Document.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Document |
viewingSessionId | integer | The ID of the visit this read belongs to |
Somebody authorized an MCP client to act as them.
| Attribute | Type | Description |
|---|---|---|
clientId | string | The ID of the OAuth client, which stays identifiable even after the client is renamed or removed |
clientName | string | What the client called itself |
An access token was issued to an MCP client.
| Attribute | Type | Description |
|---|---|---|
clientId | string | The ID of the OAuth client, which stays identifiable even after the client is renamed or removed |
clientName | string | What the client called itself |
grantTypeId | "authorization_code" | "client_credentials" | "refresh_token" | The ID of the grant the client presented, which separates a fresh authorization from a refresh |
An MCP client ran a tool. What the tool was called with is not recorded.
| Attribute | Type | Description |
|---|---|---|
clientId | string | The ID of the OAuth client, which stays identifiable even after the client is renamed or removed |
clientName | string | What the client called itself |
toolName | string | The tool that ran |
A new version of the Merge Field was published, replacing whatever was live before.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Merge Field |
versionNumber | integer | The version that was published |
A draft Merge Field changed.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Merge Field |
Somebody was granted a role on the Organization, along with the permissions that role carries.
| Attribute | Type | Description |
|---|---|---|
personId | integer | The ID of whoever was granted the role |
roleId | string | null | The ID of the role, or null when the assignment carries no role of its own |
Somebody’s role on the Organization was taken away, along with the permissions that role carried.
| Attribute | Type | Description |
|---|---|---|
personId | integer | The ID of whoever lost the role |
A sync with your HR system or directory finished. Each change the sync made shows up as its own person event.
A person came into a Document’s audience, so they can now read that Document and may be asked to sign.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the person |
documentId | integer | The ID of the Document |
A person was archived, which ends their access and takes them out of every audience.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the person |
A person was added to the organization — by hand, by import, or by a sync.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the person |
A notification was sent to somebody.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the person |
notificationId | integer | The ID of the message that was sent |
A person left a Document’s audience, and lost access to that Document.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the person |
documentId | integer | The ID of the Document |
An archived person was restored and can sign in again.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the person |
The Policy was added to a Document, whose audience now reads the Policy.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Policy |
documentId | integer | The ID of the Document |
An AI Check ran against the Policy and returned its findings.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Policy |
aiAnalysisId | string | The ID of the AI Check that ran |
The Policy was archived, and no longer appears in the library or in any Document.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Policy |
Somebody commented on the Policy. What they wrote is not recorded.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Policy |
commentId | string | The ID of the comment that was added |
commentThreadId | string | The ID of the thread the comment was added to |
commentThreadPersonIds | integer[] | The IDs of everybody taking part in that thread |
mentionedPersonIds | integer[] | The IDs of everybody the comment mentioned |
A draft Policy was created. Drafts stay invisible to an audience until publication.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Policy |
A new version of the Policy was published, replacing whatever was live before.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Policy |
versionNumber | integer | The version that was published |
The Policy was removed from a Document, whose audience no longer reads the Policy.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Policy |
documentId | integer | The ID of the Document |
The Policy was reviewed and left as written, which restarts the review cycle without publishing a new version.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Policy |
A review round was started on the Policy. The message to reviewers is not recorded.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Policy |
dueDate | any | When the round is due |
isFullApprovalRequired | boolean | Whether every reviewer has to approve, rather than any one of them |
name | string | null | What the round is called |
reviewRoundNumber | integer | Which round this is, counting from the first round on this record |
A review round on the Policy finished, and no longer collects feedback.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Policy |
reviewRoundNumber | integer | Which round ended |
A review round on the Policy changed: the round’s name, the due date, or whether every reviewer has to approve.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Policy |
dueDate | any | When the round is due |
isFullApprovalRequired | boolean | Whether every reviewer has to approve, rather than any one of them |
name | string | null | What the round is called |
reviewRoundNumber | integer | Which round this is, counting from the first round on this record |
Somebody was asked to review the Policy.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Policy |
reviewerPersonId | integer | The ID of the reviewer |
reviewRoundNumber | integer | The round they were added to |
A reviewer responded to a review round on the Policy. What the reviewer wrote is not recorded.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Policy |
reviewerFeedbackId | string | The ID of the reviewer’s response |
reviewerPersonId | integer | The ID of the reviewer who responded |
reviewRoundNumber | integer | The round they responded to |
A reviewer was taken off a review round on the Policy, which no longer waits on that reviewer.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Policy |
reviewerPersonId | integer | The ID of the reviewer |
reviewRoundNumber | integer | The round they were taken off |
Somebody was granted a role on the Policy, along with the permissions that role carries.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Policy |
personId | integer | The ID of whoever was granted the role |
roleId | string | null | The ID of the role, or null when the assignment carries no role of its own |
Somebody’s role on the Policy was taken away, along with the permissions that role carried.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Policy |
personId | integer | The ID of whoever lost the role |
The Policy Skill was archived, and no longer appears in the library or in any Document.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Policy Skill |
Somebody commented on the Policy Skill. What they wrote is not recorded.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Policy Skill |
commentId | string | The ID of the comment that was added |
commentThreadId | string | The ID of the thread the comment was added to |
commentThreadPersonIds | integer[] | The IDs of everybody taking part in that thread |
mentionedPersonIds | integer[] | The IDs of everybody the comment mentioned |
A draft Policy Skill was created. Drafts stay invisible to an audience until publication.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Policy Skill |
A new version of the Policy Skill was published, replacing whatever was live before.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Policy Skill |
versionNumber | integer | The version that was published |
Somebody was granted a role on the Policy Skill, along with the permissions that role carries.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Policy Skill |
personId | integer | The ID of whoever was granted the role |
roleId | string | null | The ID of the role, or null when the assignment carries no role of its own |
Somebody’s role on the Policy Skill was taken away, along with the permissions that role carried.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Policy Skill |
personId | integer | The ID of whoever lost the role |
Somebody suggested an edit to the Policy Skill rather than making the edit outright. The suggested text is not recorded.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Policy Skill |
suggestionId | string | The ID of the suggestion that was added |
suggestionType | "insertion" | "deletion" | "attribute" | "formatInline" | "formatBlock" | What kind of change was suggested |
An archived Policy Skill was restored to the library.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Policy Skill |
A draft Policy Skill changed.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Policy Skill |
Somebody suggested an edit to the Policy rather than making the edit outright. The suggested text is not recorded.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Policy |
suggestionId | string | The ID of the suggestion that was added |
suggestionType | "insertion" | "deletion" | "attribute" | "formatInline" | "formatBlock" | What kind of change was suggested |
An archived Policy was restored to the library.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Policy |
A draft Policy changed.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Policy |
Somebody read the Policy.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Policy |
viewingSessionId | string | The ID of the visit this read belongs to, so the reads from one sitting group together |
A sign in attempt was refused.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the organization or person |
authId | string | The ID of the account that was tried, usually an email address |
authMethodId | string | The ID of the method the sign in was attempted with |
authType | string | What kind of identifier was tried |
errorCode | string | Why the sign in was refused |
Somebody signed in.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the person |
authMethodId | string | The ID of the method they authenticated with — a magic link, an access code, or your SSO provider |
A session ended.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the person |
reasonCode | string | Why the session ended, which separates signing out from being signed out for inactivity |
Somebody was granted a role on the Team, along with the permissions that role carries.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Team |
personId | integer | The ID of whoever was granted the role |
roleId | string | null | The ID of the role, or null when the assignment carries no role of its own |
Somebody’s role on the Team was taken away, along with the permissions that role carried.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Team |
personId | integer | The ID of whoever lost the role |