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" | "configuration" | "dataExport" | "mcp" | "reporting" | ("accessControl" | "authentication" | "collaboration" | "configuration" | "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 | "aiSettings.updated" | "apiKey.archived" | "apiKey.created" | "apiKey.deleted" | "apiKey.unarchived" | "apiRequestReceived" | "authenticationSettings.updated" | "bulkExportCompleted" | "httpsDomain.certificateActivated" | "singleSignOn.certificateActivated" | "httpsDomain.certificateAdded" | "singleSignOn.certificateAdded" | "singleSignOn.certificateDeactivated" | "httpsDomain.certificateRemoved" | "singleSignOn.certificateRemoved" | "httpsDomain.certificateRenewed" | "policy.addedToDocument" | "lawChange.aiAnalysisCreated" | "policy.aiAnalysisCreated" | "audiencePage.archived" | "lawChange.archived" | "laborLawPage.archived" | "policy.archived" | "policySkill.archived" | "audiencePage.commentAdded" | "lawChange.commentAdded" | "laborLawPage.commentAdded" | "policy.commentAdded" | "policySkill.commentAdded" | "audiencePage.created" | "lawChange.created" | "laborLawPage.created" | "policy.created" | "policySkill.created" | "audiencePage.published" | "lawChange.published" | "laborLawPage.published" | "policy.published" | "policySkill.published" | "policy.removedFromDocument" | "lawChange.renewed" | "policy.renewed" | "lawChange.reviewerAdded" | "policy.reviewerAdded" | "lawChange.reviewerFeedbackAdded" | "policy.reviewerFeedbackAdded" | "lawChange.reviewerRemoved" | "policy.reviewerRemoved" | "lawChange.reviewRoundAdded" | "policy.reviewRoundAdded" | "lawChange.reviewRoundEnded" | "policy.reviewRoundEnded" | "lawChange.reviewRoundUpdated" | "policy.reviewRoundUpdated" | "audiencePage.suggestionAdded" | "lawChange.suggestionAdded" | "laborLawPage.suggestionAdded" | "policy.suggestionAdded" | "policySkill.suggestionAdded" | "audiencePage.unarchived" | "lawChange.unarchived" | "laborLawPage.unarchived" | "policy.unarchived" | "policySkill.unarchived" | "audiencePage.updated" | "lawChange.updated" | "laborLawPage.updated" | "policy.updated" | "policySkill.updated" | "policy.viewed" | "emailDomain.added" | "httpsDomain.added" | "emailDomain.removed" | "httpsDomain.removed" | "dataLineageExported" | "featureFlag.added" | "featureFlag.removed" | "document.created" | "document.published" | "document.signatureRoundCreated" | "document.signed" | "document.viewed" | "kioskModeSettings.updated" | "mcpConsentGranted" | "mcpTokenIssued" | "mcpToolCalled" | "mergeField.published" | "organization.updated" | "peopleSynced" | "person.addedToDocument" | "person.archived" | "person.created" | "person.notified" | "person.removedFromDocument" | "audiencePage.roleAssignmentAdded" | "lawChange.roleAssignmentAdded" | "laborLawPage.roleAssignmentAdded" | "policy.roleAssignmentAdded" | "policySkill.roleAssignmentAdded" | "document.roleAssignmentAdded" | "organization.roleAssignmentAdded" | "team.roleAssignmentAdded" | "audiencePage.roleAssignmentRemoved" | "lawChange.roleAssignmentRemoved" | "laborLawPage.roleAssignmentRemoved" | "policy.roleAssignmentRemoved" | "policySkill.roleAssignmentRemoved" | "document.roleAssignmentRemoved" | "organization.roleAssignmentRemoved" | "team.roleAssignmentRemoved" | "person.unarchived" | "person.updated" | "property.updated" | "audiencePage.propertyValueUpdated" | "lawChange.propertyValueUpdated" | "laborLawPage.propertyValueUpdated" | "policy.propertyValueUpdated" | "policySkill.propertyValueUpdated" | "organization.propertyValueUpdated" | "person.propertyValueUpdated" | "signedIn" | "signedOut" | "signInFailed" | "signInRequested" | "singleSignOn.added" | "singleSignOn.removed" | "singleSignOn.updated" | "webhook.created" | "webhook.deleted" | ("aiSettings.updated" | "apiKey.archived" | "apiKey.created" | "apiKey.deleted" | "apiKey.unarchived" | "apiRequestReceived" | "authenticationSettings.updated" | "bulkExportCompleted" | "httpsDomain.certificateActivated" | "singleSignOn.certificateActivated" | "httpsDomain.certificateAdded" | "singleSignOn.certificateAdded" | "singleSignOn.certificateDeactivated" | "httpsDomain.certificateRemoved" | "singleSignOn.certificateRemoved" | "httpsDomain.certificateRenewed" | "policy.addedToDocument" | "lawChange.aiAnalysisCreated" | "policy.aiAnalysisCreated" | "audiencePage.archived" | "lawChange.archived" | "laborLawPage.archived" | "policy.archived" | "policySkill.archived" | "audiencePage.commentAdded" | "lawChange.commentAdded" | "laborLawPage.commentAdded" | "policy.commentAdded" | "policySkill.commentAdded" | "audiencePage.created" | "lawChange.created" | "laborLawPage.created" | "policy.created" | "policySkill.created" | "audiencePage.published" | "lawChange.published" | "laborLawPage.published" | "policy.published" | "policySkill.published" | "policy.removedFromDocument" | "lawChange.renewed" | "policy.renewed" | "lawChange.reviewerAdded" | "policy.reviewerAdded" | "lawChange.reviewerFeedbackAdded" | "policy.reviewerFeedbackAdded" | "lawChange.reviewerRemoved" | "policy.reviewerRemoved" | "lawChange.reviewRoundAdded" | "policy.reviewRoundAdded" | "lawChange.reviewRoundEnded" | "policy.reviewRoundEnded" | "lawChange.reviewRoundUpdated" | "policy.reviewRoundUpdated" | "audiencePage.suggestionAdded" | "lawChange.suggestionAdded" | "laborLawPage.suggestionAdded" | "policy.suggestionAdded" | "policySkill.suggestionAdded" | "audiencePage.unarchived" | "lawChange.unarchived" | "laborLawPage.unarchived" | "policy.unarchived" | "policySkill.unarchived" | "audiencePage.updated" | "lawChange.updated" | "laborLawPage.updated" | "policy.updated" | "policySkill.updated" | "policy.viewed" | "emailDomain.added" | "httpsDomain.added" | "emailDomain.removed" | "httpsDomain.removed" | "dataLineageExported" | "featureFlag.added" | "featureFlag.removed" | "document.created" | "document.published" | "document.signatureRoundCreated" | "document.signed" | "document.viewed" | "kioskModeSettings.updated" | "mcpConsentGranted" | "mcpTokenIssued" | "mcpToolCalled" | "mergeField.published" | "organization.updated" | "peopleSynced" | "person.addedToDocument" | "person.archived" | "person.created" | "person.notified" | "person.removedFromDocument" | "audiencePage.roleAssignmentAdded" | "lawChange.roleAssignmentAdded" | "laborLawPage.roleAssignmentAdded" | "policy.roleAssignmentAdded" | "policySkill.roleAssignmentAdded" | "document.roleAssignmentAdded" | "organization.roleAssignmentAdded" | "team.roleAssignmentAdded" | "audiencePage.roleAssignmentRemoved" | "lawChange.roleAssignmentRemoved" | "laborLawPage.roleAssignmentRemoved" | "policy.roleAssignmentRemoved" | "policySkill.roleAssignmentRemoved" | "document.roleAssignmentRemoved" | "organization.roleAssignmentRemoved" | "team.roleAssignmentRemoved" | "person.unarchived" | "person.updated" | "property.updated" | "audiencePage.propertyValueUpdated" | "lawChange.propertyValueUpdated" | "laborLawPage.propertyValueUpdated" | "policy.propertyValueUpdated" | "policySkill.propertyValueUpdated" | "organization.propertyValueUpdated" | "person.propertyValueUpdated" | "signedIn" | "signedOut" | "signInFailed" | "signInRequested" | "singleSignOn.added" | "singleSignOn.removed" | "singleSignOn.updated" | "webhook.created" | "webhook.deleted")[]optional | Only events going by these names, e.g. policy.created. Repeat the param for more than one. |
order | stringoptional | Newest first (desc, the default) or oldest first (asc). Possible Values:ascdesc |
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. |
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.
Copy Model Policies into the organization's Policy Library as draft policies, each linked to the Model Policy it came from so it receives updates. A Model Policy the organization already copied is skipped.
| Field | Type | Description |
|---|---|---|
ids | integer[]required | The Model Policy ids to copy, from list_model_policies. |
| Field | Type | Description |
|---|---|---|
object[] | The policies created, one per Model Policy the organization did not already have. | |
skippedIds | integer[] | The Model Policies the organization already had a policy copied from, which were left alone. |
Archive document properties or an agency's client properties, so they are no longer listed or set. Their values are kept, and they can be unarchived in Blissbook.
| Field | Type | Description |
|---|---|---|
propertyIds | string[]required | The document or client properties to archive. Use list_properties to find ids. |
| Field | Type | Description |
|---|---|---|
object[] | The properties that were archived, in the order given. |
Create a document of chapters from Model Policies: each chapter is a heading followed by its policies. A Model Policy is copied into the organization's Policy Library as a draft policy, linked to the Model Policy so it receives updates, unless the organization already copied it, in which case the document references its copy.
| Field | Type | Description |
|---|---|---|
object[]optional | The chapters, in order. Omit for a document with only its title. | |
name | stringrequired | The document's name, e.g. "Employee Handbook". |
| Field | Type | Description |
|---|---|---|
id | integer | The new document id. |
name | string | The document's name. |
object[] | The policies the document references, in order, one per Model Policy. |
Create draft policies for the organization, optionally setting property values, the References they cite, and, for a Model Policy, the clients it is for. 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. |
Create a property: one set on documents of the given types, like a policy owner or category, or one of an agency's client properties: a fact it keeps about each client, like their industry, which a Model Policy's clients expression matches on. Set its values with the set properties tools.
| Field | Type | Description |
|---|---|---|
allowMultiple | booleanoptional | For select, person, and url properties: whether a target can have more than one value. Defaults to false. |
description | stringoptional | The property's definition. |
label | stringrequired | The property's name, e.g. Industry. |
max | numberoptional | For number properties: the largest value allowed. |
min | numberoptional | For number properties: the smallest value allowed. |
object[]optional | For select properties: the options, in order. Option ids are generated from their labels. | |
questionHtml | stringoptional | For client properties: the question the agency asks its clients, so they know how to answer it, as HTML. |
step | numberoptional | For number properties: what values count up by, from min or 0. |
targetTypes | string[]required | What the property is set on: one or more document types (e.g. policy, lawChange), or organization on its own for one of an agency's client properties.Possible Values:audiencePagehandbooklawChangelaborLawPagepolicy |
type | stringrequired | The kind of value the property holds. A client property is a number, select, or text, which a clients expression matches it by.Possible Values:datenumberpersonselecttexturl |
| Field | Type | Description |
|---|---|---|
object | The property that was created. |
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 ids of the policies to read (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. |
Read policy skills in full: the published rules the AI Check reviews policies against. Follow them when writing or editing policies so the result matches the organization’s house style. Find ids with list_policy_skills.
| Field | Type | Description |
|---|---|---|
ids | integer[]required | The ids of the policy skills to read (from list_policy_skills). Max 20 per call; fetch larger sets in batches. |
| Field | Type | Description |
|---|---|---|
object[] | The policy skills, in the order they are sorted in Blissbook. Ids not in effect are left out. |
List your agency's client properties — each with its id, label, type, the question it asks when it has one, and the options a select property offers — with your organization's value for each. Set them with set_client_properties. For clients of an agency.
This tool takes no arguments.
| Field | Type | Description |
|---|---|---|
object[] | The client properties the caller may set, in the order the agency lists them. |
Search the organization's Documents (the handbooks people read and sign) by name, with who can see each one and the policies it includes, each with its own audience. A person can read a policy in a Document when they are in the Document's audience and in the policy's. To see which Documents a person can see, use list_people.
| Field | Type | Description |
|---|---|---|
ids | integer[]optional | Only the Documents with these ids. |
limit | integeroptional | Max Documents to return. Defaults to 100. |
offset | integeroptional | Number of Documents to skip. Defaults to 0. |
search | stringoptional | Only Documents whose name contains this text. |
showArchived | booleanoptional | Include archived Documents alongside the active ones. Defaults to false. |
| Field | Type | Description |
|---|---|---|
object[] | The page of Documents, by name. | |
totalCount | integer | Total number of Documents matching the query (before pagination). |
Search the organization's groups by name. Put a group's id in a groups operand to make an audience of its members.
| Field | Type | Description |
|---|---|---|
ids | integer[]optional | Only the groups with these ids. |
limit | integeroptional | Max groups to return. Defaults to 100. |
offset | integeroptional | Number of groups to skip. Defaults to 0. |
search | stringoptional | Only groups whose name contains this text. |
showArchived | booleanoptional | Include archived groups alongside the active ones. Defaults to false. |
| Field | Type | Description |
|---|---|---|
object[] | The page of groups, by name. | |
totalCount | integer | Total number of groups matching the query (before pagination). |
List the Model Policies available to the organization — Blissbook-maintained policy templates — each with the jurisdiction it applies to, how it is classified, and whether it applies to the organization. Returns names and properties only; read one in full with get_model_policy, and copy the ones that apply with add_model_policies.
| Field | Type | Description |
|---|---|---|
hasAdded | boolean | nulloptional | true for only the Model Policies the organization already copied into its Policy Library, false for only the ones it has not. Omit for both. |
inDemographics | booleanoptional | Only the Model Policies for the jurisdictions the organization's demographics put people in: each country (its federal policies), state, county, and city it has people in, plus the ones that apply everywhere. Nothing comes back for an organization with no demographics. |
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). When it is more than the policies returned, page with offset to see the rest. |
Search the organization's people by name, email, or employee ID, with each person's people property values and whether their signature is required: overall, and on each Document they can see. Put a person's id in a people operand to make an audience of them.
| Field | Type | Description |
|---|---|---|
ids | integer[]optional | Only the people with these ids. |
limit | integeroptional | Max people to return. Defaults to 100. |
member | booleanoptional | true = only employees, false = only friends of the organization. |
offset | integeroptional | Number of people to skip. Defaults to 0. |
search | stringoptional | Only people whose name, email, or employee ID contains this text. |
showArchived | booleanoptional | Include archived people alongside the active ones. Defaults to false. |
| Field | Type | Description |
|---|---|---|
object[] | The page of people, by name. | |
totalCount | integer | Total number of people matching the query (before pagination). |
Search the organization's policies by name, the location they apply to, the property values set on them, and whether they have an audience (access control). Returns a page of policies with their properties, publish state, audience, Direct Distribution, and collaborators, 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. | |
hasAudienceExpression | booleanoptional | true = only policies with an audience on their draft, which is how a policy gets access control: only the people in the audience can read it. false = only policies for everyone. Omit for both. |
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. |
search | stringoptional | Only policies whose name contains this text. |
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 organization's policy skills: the writing rules its AI Check reviews policies against. Only skills in effect are listed — published and not archived. Returns names only; read the rules with get_policy_skills.
| Field | Type | Description |
|---|---|---|
limit | integeroptional | Max policy skills to return. Defaults to 100. |
offset | integeroptional | Number of policy skills to skip. Defaults to 0. |
| Field | Type | Description |
|---|---|---|
object[] | The page of policy skills, in the order they are sorted in Blissbook, without their content. | |
totalCount | integer | Total number of policy skills in effect (before pagination). |
List the variables these Model Policies use, such as the company name or the first day of the year, each with the organization's value, absent when it has none yet. Fill in the ones without a value with set_policy_variables.
| Field | Type | Description |
|---|---|---|
modelPolicyIds | integer[]required | The Model Policies whose variables to list, from list_model_policies. |
| Field | Type | Description |
|---|---|---|
object[] | Each static variable the Model Policies use, with the organization's value for it. |
List the properties that can be set on the given target types (e.g. policies, law changes, clients, people) — each with its id, label, definition, 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. A person's properties are the people metadata keys and their values, which a metadata operand in an audience matches on. An agency's client properties (organization) are what it keeps about each client, which a policy's clients expression matches on.
| Field | Type | Description |
|---|---|---|
targetTypes | string[]required | The kinds of thing to list properties for. organization is an agency's client properties.Possible Values:audiencePagehandbooklawChangelaborLawPagepolicy |
| Field | Type | Description |
|---|---|---|
object[] | Every property defined on any of the requested target types. |
Search the organization's saved segments by name, with the filter each one saves. Put a segment's id in a savedSegments operand to make an audience of whoever matches it.
| Field | Type | Description |
|---|---|---|
ids | integer[]optional | Only the saved segments with these ids. |
limit | integeroptional | Max saved segments to return. Defaults to 100. |
offset | integeroptional | Number of saved segments to skip. Defaults to 0. |
search | stringoptional | Only saved segments whose name contains this text. |
showArchived | booleanoptional | Include archived saved segments alongside the active ones. Defaults to false. |
| Field | Type | Description |
|---|---|---|
object[] | The page of saved segments, by name. | |
totalCount | integer | Total number of saved segments matching the query (before pagination). |
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 left on the draft as suggestions an author can accept or reject; pass analysisMode: null to preview them without touching the policy.
| Field | Type | Description |
|---|---|---|
analysisMode | string | nulloptional | What to do to the policy draft with what the check finds. suggest (the default) leaves the recommendations on the draft as suggestions the author can accept or reject; edit writes them into the draft outright; null generates them without changing the policy (preview only).Possible Values:suggestedit |
policyId | integerrequired | The id of the policy to check from list_policies. |
| 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. |
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. |
Search Blissbook's help center for how to use Blissbook: how to do something, what a setting does, or where to find a feature. Each article comes with its text and the url to read it at.
| Field | Type | Description |
|---|---|---|
limit | integeroptional | How many articles to return. Defaults to 3. |
query | stringrequired | What to search for. |
| Field | Type | Description |
|---|---|---|
object[] | Most relevant first. |
Set or clear client property values. A client of an agency answers the client properties its agency asks about; an agency sets any of its client properties on its clients, named by organizationIds, all at once. Returns each client with its client property values after the change.
| Field | Type | Description |
|---|---|---|
organizationIds | integer[]optional | For an agency: the organization ids of the clients to set them on, each set alike. Omit to set your own organization's. |
object[]required | The values to set, in the value shape of each property type: a client of an agency sets those from list_client_properties; an agency sets any of its client properties, from list_properties with targetTypes organization. An existing value is replaced; pass unset: true on an entry to clear it instead. |
| Field | Type | Description |
|---|---|---|
object[] | The clients as they stand after the change, in the order their ids were given: your own organization alone when they were omitted. |
Set the same property values on one or more existing policies, along with the location they apply to, the References they cite, and, for a Model Policy, the clients it is for. 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 |
|---|---|---|
object | nulloptional | Only for an agency with Model Policy Conditions: which clients the Model Policy is for, matched by their client properties (from list_properties with targetTypes organization), employee counts, and demographics. Pass null to make it for every client, or omit it to leave it alone. | |
objectoptional | The location to set on each document. Omitted parts of the location are cleared. Use countryCode "XX" for one that applies everywhere (Global). | |
ids | integer[]required | Ids of the policies to change. Every change below is applied to each of them. |
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. | |
object[]optional | The URLs each document cites as sources, in the order they should read. Each must be https. Replaces the whole list, instructions included, so pass back the instructions of any reference to keep; pass an empty array to clear it, or omit it to leave the references alone. |
| 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. |
Surgically edit a policy draft's HTML without replacing the whole document, anchored to the block ids in the draft HTML (from get_policies): replaceText swaps a snippet of visible text within one block (formatting is preserved), replaceBlocks overwrites whole blocks with new HTML, insertBlocks adds new blocks beside an anchor block, deleteBlocks removes blocks, and wrapInReadMore/unwrapReadMore restructure collapsible Read More sections. By default the operations are applied directly to the draft; pass suggest: true to record them as tracked suggestions an author can accept or reject. Pass annotations to create notes anchored in the content the operations write, which the direct edit requires. The draft stays unpublished either way.
| Field | Type | Description |
|---|---|---|
object[]optional | Notes to create on the policy. Anchor each one by putting data-annotation-id="<id>" on a span inside the html of a replaceBlocks or insertBlocks operation in this same call. A note with no such anchor is rejected before anything is applied, and a note whose operation is reported skipped in operationResults is not created, so a note can never be left dangling. Cannot be combined with suggest: a suggested anchor is only pending, and rejecting it would take the anchor away from a note that has already been created. | |
object[]required | The surgical operations to apply, in order, each anchored to block ids in the draft HTML. Max 50 per call. An operation that replaces or deletes a block retires its block id, so target each block with at most one block-level operation per call (several replaceText operations on one block are fine). | |
policyId | integerrequired | The id of the policy to update (from list_policies). |
suggest | booleanoptional | When true, record each operation as a tracked suggestion attributed to you, for an author to accept or reject, instead of applying it directly to the draft. Cannot be combined with annotations. |
| Field | Type | Description |
|---|---|---|
html | string | The draft HTML after the update (with suggest, including the pending suggestion markers). |
object[] | One entry per input operation, in the same order. A skipped operation names what to fix so it can be retried. | |
policyId | integer | The policy that was updated. |
Update a policy, law change, or client property: optionally set a new label, and remove (pull), replace (set), move, or add (push) select options individually.
| Field | Type | Description |
|---|---|---|
label | stringoptional | The property's new label. |
objectoptional | Changes to the property's options, made in this order: pull, set, move, push. 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 | string[]optional | Only events in these categories. Possible Values:accessControlauthenticationcollaborationconfigurationdataExport |
cursor | stringoptional | The previous page's nextCursor, to continue where it left off. |
limit | integeroptional | Events per page, up to 100. |
nameIds | string[]optional | Only events going by these names, e.g. policy.created or signedIn.Possible Values:aiSettings.updatedapiKey.archivedapiKey.createdapiKey.deletedapiKey.unarchived |
order | stringoptional | Newest first (desc, the default) or oldest first (asc). Possible Values:ascdesc |
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. |
Investigate your organization's people sync: why someone is missing, archived, or wrong.
How each of the organization's people sync integrations is doing: our record of its last sync and counts, plus, for Merge.dev integrations, what Merge reports live about the linked account, its open issues and its last pull of each data model from the HRIS.
This tool takes no arguments.
| Field | Type | Description |
|---|---|---|
object[] | The organization's people sync integrations. |
Trace one person through the organization's people sync to find where they drop out: the HRIS record as the sync provider last pulled it, the row the last sync produced from it with any quarantine or exclusion, and the Blissbook person it became. An empty result means the HRIS never sent the person, so they may have been added to Blissbook by hand (see list_people). For a person's Documents and signature status, use list_people.
| Field | Type | Description |
|---|---|---|
search | stringrequired | Part of the person's name, email, employee ID, or HRIS ID. Matches the HRIS data as the sync provider last pulled it, so it finds people the sync left out as well as those it brought in. |
| Field | Type | Description |
|---|---|---|
object[] | Everyone matching the search, across the organization's integrations. Empty = the HRIS never sent them. |
Where the API is you asking Blissbook, a webhook is Blissbook telling you: when one of the events below happens, Blissbook POSTs a JSON payload to a URL you choose. Every delivery is signed with a secret only you and Blissbook know, so your server can be sure it came from us.
Webhooks are enabled per organization. If you don’t see them on the Tech Setup page, ask your Blissbook administrator to have them turned on for your account.
webhook.test event to your URL and check your handler end to end.A delivery is an HTTP POST with Content-Type: application/json. The body names the event, when it happened, and the data documented per event below:
{
"event": "signature.requested",
"timestamp": "2026-01-15T14:30:00.000Z",
"data": { ... }
}| Header | What it carries |
|---|---|
X-Blissbook-Event | The event id, e.g. signature.requested. Also in the body as event. |
X-Blissbook-Delivery | Unique per delivery, and the same on every retry of it, so you can ignore a repeat. |
X-Blissbook-Timestamp | Unix seconds when Blissbook signed the request. Part of what the signature covers. |
X-Blissbook-Signature | v1= followed by the hex HMAC-SHA256 described below. |
Compute an HMAC-SHA256 of <timestamp>.<rawBody> with your signing secret, where the timestamp is the X-Blissbook-Timestamp header and the body is the raw request bytes before any JSON parsing. Hex-encode it and compare it in constant time to what follows v1= in the X-Blissbook-Signature header. Reject a delivery whose timestamp is more than 5 minutes off your clock, so a captured request cannot be replayed later.
const crypto = require('node:crypto')
// rawBody is the request body as received, before any JSON parsing
function verifyBlissbookSignature({ secret, headers, rawBody }) {
const timestamp = headers['x-blissbook-timestamp']
const signature = headers['x-blissbook-signature'] // "v1=<hex>"
const ageSeconds = Math.abs(Date.now() / 1000 - Number(timestamp))
if (ageSeconds > 300) return false
const expected = crypto.createHmac('sha256', secret).update(`${timestamp}.${rawBody}`).digest('hex')
const received = signature.replace(/^v1=/, '')
return (
expected.length === received.length &&
crypto.timingSafeEqual(Buffer.from(expected, 'hex'), Buffer.from(received, 'hex'))
)
}Respond with any 2xx status within 10 seconds. Anything else, or no answer, counts as a failure: Blissbook tries up to 5 times, waiting 1 minute before the second attempt and doubling the wait each time after, then gives up on that delivery. A retry carries the same X-Blissbook-Delivery header, so treat deliveries as at-least-once and dedupe on it.
The Tech Setup page keeps a log of every attempt for 30 days, retries included, with the event, when it was sent, how long your endpoint took, and the status it answered with. That is the first place to look when something seems missing.
Every event a webhook can subscribe to, with the data it delivers, plus the test event that every webhook receives from the Test button.
Fired when an Audience Member is requested to sign a Document.
| Field | Type | Description |
|---|---|---|
object | What they need to sign. | |
object | Who needs to sign. |
{
"event": "signature.requested",
"timestamp": "2026-01-15T14:30:00.000Z",
"data": {
"person": {
"id": 123,
"employeeId": "abc",
"externalId": "abc",
"email": "abc@abc.com",
"fullName": "a b c"
},
"document": {
"id": 123,
"name": "abc"
}
}
}Someone clicked Test on the webhook in Blissbook. Every webhook receives this one, so use it to check your endpoint and its signature verification end to end.
| Field | Type | Description |
|---|---|---|
message | string | A note that this is a test, for whoever reads the logs. |
object | The webhook being tested. |
{
"event": "webhook.test",
"timestamp": "2026-01-15T14:30:00.000Z",
"data": {
"message": "This is a test delivery from Blissbook. Your endpoint is receiving webhooks.",
"webhook": {
"id": "V1StGXR8_Z5jdHi6B-myT",
"eventIds": [
"signature.requested"
]
}
}
}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.
The organization’s AI settings changed — which AI features are on, and what they are allowed to spend.
| Attribute | Type | Description |
|---|---|---|
changedKeys | string[] | The AI settings that changed. Possible Values:audienceChatbotExcludedSegmentIdaudienceChatbotFallbackMessageHtmlaudienceChatbotModepolicyReviewerModereleaseNotesModeusageLimit |
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 | string | The ID of the endpoint that served the call. Possible Values:exportEventsgetDocumentsexportSavedReportCsvexportSignaturesCsvexportSignaturesJson |
url | string | The endpoint called, including the query string. |
The Audience Page was archived, and no longer appears in the library or in any Document.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Audience Page. |
Somebody commented on the Audience Page. What they wrote is not recorded.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Audience Page. |
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 Audience Page was created. Drafts stay invisible to an audience until publication.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Audience Page. |
A custom property was set, changed, or cleared.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Audience Page. |
A new version of the Audience Page was published, replacing whatever was live before.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Audience Page. |
versionNumber | integer | The version that was published. |
Somebody was granted a role on the Audience Page, along with the permissions that role carries.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Audience Page. |
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 Audience Page was taken away, along with the permissions that role carried.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Audience Page. |
personId | integer | The ID of whoever lost the role. |
Somebody suggested an edit to the Audience Page rather than making the edit outright. The suggested text is not recorded.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Audience Page. |
suggestionId | string | The ID of the suggestion that was added. |
suggestionType | string | What kind of change was suggested. Possible Values:insertiondeletionattributeformatInlineformatBlock |
An archived Audience Page was restored to the library.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Audience Page. |
A draft Audience Page changed.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Audience Page. |
audienceExpression | any | null | Filter to restrict which Audience Members have access. |
inheritTeamRoles | boolean | Whether it inherits the team’s collaborator roles. |
showAudiencePage | boolean | Whether its Direct Distribution Page is shown. |
A way of signing in was reconfigured, which changes who can reach the organization and how.
| Attribute | Type | Description |
|---|---|---|
authMethodId | string | The ID of the way in that was reconfigured: email or employeeId. Possible Values:emailemployeeId |
changedKeys | string[] | The sign-in settings that changed, on the method authMethodId names.Possible Values:allowSavedSegmentIdbuttonTexthelpContentisEnabledverificationContent |
An export from the app finished.
| Attribute | Type | Description |
|---|---|---|
bulkExportTypeId | string | The ID of what was exported. Possible Values:accessControlacknowledgmentshandbookRecipientslawChangespeoplepolicies |
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. |
A Email Domain was added to the organization, so it can be reached at or sent from.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Email Sending Domain. |
domain | string | The domain itself, e.g. handbook.acme.com. |
A Email Domain was removed from the organization, so it is no longer reached at or sent from.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Email Sending Domain. |
domain | string | The domain itself, e.g. handbook.acme.com. |
A HTTPS Domain was added to the organization, so it can be reached at or sent from.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the HTTPS Domain. |
domain | string | The domain itself, e.g. handbook.acme.com. |
A certificate already on file was made active on the HTTPS Domain, so it is trusted under it.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the HTTPS Domain. |
digest | string | The digest identifying the certificate, absent when it has yet to be issued. |
A certificate was added to the HTTPS Domain, so it is trusted under it.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the HTTPS Domain. |
digest | string | The digest identifying the certificate, absent when it has yet to be issued. |
A certificate was deleted from the HTTPS Domain, so it is gone rather than kept on file.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the HTTPS Domain. |
digest | string | The digest identifying the certificate, absent when it has yet to be issued. |
A new certificate was called for on the domain, replacing the one it is served under.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the HTTPS Domain. |
digest | string | The digest identifying the certificate, absent when it has yet to be issued. |
A HTTPS Domain was removed from the organization, so it is no longer reached at or sent from.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the HTTPS Domain. |
domain | string | The domain itself, e.g. handbook.acme.com. |
Kiosk mode was reconfigured — whether shared devices sign themselves out, and how soon.
| Attribute | Type | Description |
|---|---|---|
changedKeys | string[] | The kiosk mode settings that changed. Possible Values:inactivitySecondsisEnabledtimeoutSeconds |
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 | string | The ID of the grant the client presented, which separates a fresh authorization from a refresh. Possible Values:authorization_codeclient_credentialsrefresh_token |
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. |
New values went live, and every Policy using them shows them immediately.
| Attribute | Type | Description |
|---|---|---|
variableIds | string[] | The IDs of the variables whose merge field values were published. |
A custom property was set, changed, or cleared.
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. |
An organization-wide setting changed, such as the organization’s name or its logo.
| Attribute | Type | Description |
|---|---|---|
changedKeys | string[] | The organization settings that changed. Possible Values:logoImageIdname |
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 custom property was set, changed, or cleared.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Person. |
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. |
A person’s record changed — their name, email, employee ID, groups, managers, or one of the organization’s own custom fields.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Person. |
changedKeys | string[] | The fields of this person's record that changed. Possible Values:emailemployeeIdfullNamegroupIdshomePhoneNumber |
changedMetadataKeys | string[] | The organization's own custom fields that changed, by the names the organization gave them. Present when changedKeys includes metadata. |
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 analysis 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 analysis that ran. |
analysisType | string | The kind of analysis: policyCheck, policySkillImport, policySkillUpdate, or sourcePolicyUpdate. |
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 custom property was set, changed, or cleared.
| 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 custom property was set, changed, or cleared.
| 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 | string | What kind of change was suggested. Possible Values:insertiondeletionattributeformatInlineformatBlock |
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. |
audienceExpression | any | null | Filter to restrict which Audience Members have access. |
inheritTeamRoles | boolean | Whether it inherits the team’s collaborator roles. |
showAudiencePage | boolean | Whether its Direct Distribution Page is shown. |
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 | string | What kind of change was suggested. Possible Values:insertiondeletionattributeformatInlineformatBlock |
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. |
audienceExpression | any | null | Filter to restrict which Audience Members have access. |
inheritTeamRoles | boolean | Whether it inherits the team’s collaborator roles. |
showAudiencePage | boolean | Whether its Direct Distribution Page is shown. |
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 custom property was created, changed, archived, or unarchived.
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 asked to sign in — they entered an email address or employee ID, or started a sign in with your SSO provider. It is recorded whether or not the sign in goes on to succeed.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Organization or Person. |
authId | string | The ID of the account that was asked for, an email address or an employee ID. An SSO request carries none. |
authMethodId | string | The ID of the method the sign in was requested with. |
authType | string | What kind of identifier was entered. |
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. |
A single sign-on provider was connected, so people can now sign in through it.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Single Sign-On Provider. |
providerId | string | The ID of the single sign-on provider, e.g. okta / azure / google. |
A certificate already on file was made active on the Single Sign-On, so it is trusted under it.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Single Sign-On Provider. |
digest | string | The digest identifying the certificate, absent when it has yet to be issued. |
A certificate was added to the Single Sign-On, so it is trusted under it.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Single Sign-On Provider. |
digest | string | The digest identifying the certificate, absent when it has yet to be issued. |
A certificate was made inactive on the single sign-on provider, so it is kept on file but no longer trusted.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Single Sign-On Provider. |
digest | string | The digest identifying the certificate, absent when it has yet to be issued. |
A certificate was deleted from the Single Sign-On, so it is gone rather than kept on file.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Single Sign-On Provider. |
digest | string | The digest identifying the certificate, absent when it has yet to be issued. |
A single sign-on provider was disconnected, so nobody can sign in through it any more.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Single Sign-On Provider. |
providerId | string | The ID of the single sign-on provider, e.g. okta / azure / google. |
A connected single sign-on provider was reconfigured, changing how people sign in through it.
| Attribute | Type | Description |
|---|---|---|
targetId | number | The ID of the Single Sign-On Provider. |
changedKeys | string[] | The single sign-on settings that changed on this provider. Possible Values:authKeybuttonTextissuerloginUrl |
providerId | string | The ID of the single sign-on provider, e.g. okta / azure / google. |
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. |
A webhook was added, so Blissbook now delivers its events to the URL.
| Attribute | Type | Description |
|---|---|---|
eventIds | string[] | The IDs of the events the webhook subscribes to, e.g. signature.requested. |
url | string | The URL the webhook delivers to. |
webhookId | string | The ID of the webhook. |
A webhook was deleted, so Blissbook no longer delivers its events to the URL.
| Attribute | Type | Description |
|---|---|---|
eventIds | string[] | The IDs of the events the webhook subscribes to, e.g. signature.requested. |
url | string | The URL the webhook delivers to. |
webhookId | string | The ID of the webhook. |