Blissbook for Developers

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.

REST API

Overview

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 base URL
https://{your-subdomain}.blissbook.com/api

API access is enabled per organization. If a request comes back 403, ask your Blissbook administrator to have it turned on for your account.

Authentication

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:

  1. Open Settings → Tech Setup in Blissbook.
  2. Find the section for Blissbook’s API.
  3. Click Generate an API Key.
  4. Copy the Access Key ID and Secret Access Key.
  5. Save the Secret Access Key right away, because Blissbook only shows it once.

Rate Limiting

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.

Error Handling

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"
}
StatusWhen
400 Bad RequestA parameter or argument failed validation. The message names the field and what it expected.
401 UnauthorizedYour credentials are missing, wrong, or no longer active.
403 ForbiddenYou 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 FoundNothing exists by that id, or nothing you are allowed to see does.
429 Too Many RequestsYou are over the rate limit. Wait, then retry.
500 Internal Server ErrorOur fault, and we are looking into it. The message stays generic; retrying is safe.

Audience Members

The live, personalized content an audience member can see.

Get Personalized Documents

GET/documentsapplication/json

Get the live, personalized Documents a person can see. Identify the person by email, employee ID, or Blissbook ID.

Query parameters
FieldTypeDescription
email
stringoptional
The person’s email address.
employeeId
stringoptional
The person’s employee ID.
personId
integeroptional
The person’s Blissbook ID.
Returns
FieldTypeDescription
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.

Reporting

Signature Reports and Audit Logs for your organization.

List Events

GET/eventsapplication/json

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.

Query parameters
FieldTypeDescription
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.
Returns
FieldTypeDescription
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 CSV

GET/saved-reports/{savedReportId}/export.csvtext/csv

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.

Path parameters
FieldTypeDescription
savedReportId
stringrequired
The Saved Report’s ID, from its URL in Blissbook.
Returns

The rows of the Saved Report, with the columns, filters, and sort order saved with it.

Export Signatures as CSV

GET/signatures.csvtext/csv

The same Signatures as the JSON endpoint, as a CSV file with one row per Signature.

Query parameters
FieldTypeDescription
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.
Returns

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 Signatures

GET/signaturesapplication/json

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.

Query parameters
FieldTypeDescription
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.
Returns
FieldTypeDescription
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.

Get the Acknowledgement PDF

GET/signatures/{signatureId}/acknowledgement.pdfapplication/json

Render just the acknowledgement the person signed and return a temporary download link to the PDF. The link expires after seven days.

Path parameters
FieldTypeDescription
signatureId
integerrequired
The Signature’s ID.
Returns
FieldTypeDescription
pdfUrl
string
Temporary download link to the PDF, valid for seven days.

Get the Signed Document PDF

GET/signatures/{signatureId}/export.pdfapplication/json

Render the Document as it was signed and return a temporary download link to the PDF. The link expires after seven days.

Path parameters
FieldTypeDescription
signatureId
integerrequired
The Signature’s ID.
Returns
FieldTypeDescription
pdfUrl
string
Temporary download link to the PDF, valid for seven days.

MCP Server

Overview

The MCP server speaks Streamable HTTP. Add the endpoint below to any MCP client and it will walk you through authorizing your Blissbook account.

MCP endpoint
https://blissbook.com/mcp
Discovery metadata
https://blissbook.com/.well-known/oauth-authorization-server

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.

Authentication

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.

Rate Limiting

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.

Error Handling

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"
}
StatusWhen
400 Bad RequestA parameter or argument failed validation. The message names the field and what it expected.
401 UnauthorizedYour credentials are missing, wrong, or no longer active.
403 ForbiddenYou 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 FoundNothing exists by that id, or nothing you are allowed to see does.
429 Too Many RequestsYou are over the rate limit. Wait, then retry.
500 Internal Server ErrorOur 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.

Use Cases

Connect your Chatbot to Blissbook

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:

  1. Create a person in Blissbook for the integration, with a name you’ll recognize, on an email address your IT team owns rather than an individual’s.
  2. Give that person the Reporting Only team role. It grants reporting across your Documents and nothing else: no editing, no publishing.
  3. Sign in as that account, then add the MCP endpoint above to your chatbot and complete the authorization prompt as that account.
  4. Have your chatbot pass the asking employee as 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.

Audience Members

The live, personalized content an audience member can see.

read-only

get_live_content

Read the live, personalized content for the current user OR the person identified in asPerson.

Arguments
FieldTypeDescription
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.
Returns
FieldTypeDescription
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.
read-only

list_live_content

List the live, personalized content for the current user OR the person identified in asPerson.

Arguments
FieldTypeDescription
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.
Returns
FieldTypeDescription
object[]
All of the content this person can access.
read-only

search_live_content

Search the live, personalized content for the current user OR the person identified in asPerson.

Arguments
FieldTypeDescription
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.
Returns
FieldTypeDescription
object[]
Most relevant content first.

Collaboration

Read and write the policies, documents, properties, and demographics of your organization.

writes data

add_model_policies

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.

Arguments
FieldTypeDescription
ids
integer[]required
The Model Policy ids to copy, from list_model_policies.
Returns
FieldTypeDescription
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.
writes data

archive_properties

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.

Arguments
FieldTypeDescription
propertyIds
string[]required
The document or client properties to archive. Use list_properties to find ids.
Returns
FieldTypeDescription
object[]
The properties that were archived, in the order given.
writes data

create_document

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.

Arguments
FieldTypeDescription
object[]optional
The chapters, in order. Omit for a document with only its title.
name
stringrequired
The document's name, e.g. "Employee Handbook".
Returns
FieldTypeDescription
id
integer
The new document id.
name
string
The document's name.
object[]
The policies the document references, in order, one per Model Policy.
writes data

create_policies

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.

Arguments
FieldTypeDescription
object[]required
One entry per document to create, up to 10 per call.
Returns
FieldTypeDescription
object[]
The policies that were created, in the order given.
writes data

create_property

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.

Arguments
FieldTypeDescription
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
Returns
FieldTypeDescription
object
The property that was created.
read-only

get_demographics

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.

Arguments

This tool takes no arguments.

Returns
FieldTypeDescription
object[]
One entry per location the organization has people in, with its people counts.
read-only

get_model_policy

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.

Arguments
FieldTypeDescription
id
integerrequired
The Model Policy id from list_model_policies.
Returns
FieldTypeDescription
object
The model policy, with its published content.
read-only

get_policies

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.

Arguments
FieldTypeDescription
ids
integer[]required
The ids of the policies to read (from list_policies). Max 20 per call; fetch larger sets in batches.
Returns
FieldTypeDescription
object[]
The policies, in the order their ids were given.
read-only

get_policy_skills

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.

Arguments
FieldTypeDescription
ids
integer[]required
The ids of the policy skills to read (from list_policy_skills). Max 20 per call; fetch larger sets in batches.
Returns
FieldTypeDescription
object[]
The policy skills, in the order they are sorted in Blissbook. Ids not in effect are left out.
read-only

list_client_properties

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.

Arguments

This tool takes no arguments.

Returns
FieldTypeDescription
object[]
The client properties the caller may set, in the order the agency lists them.
read-only

list_documents

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.

Arguments
FieldTypeDescription
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.
Returns
FieldTypeDescription
object[]
The page of Documents, by name.
totalCount
integer
Total number of Documents matching the query (before pagination).
read-only

list_groups

Search the organization's groups by name. Put a group's id in a groups operand to make an audience of its members.

Arguments
FieldTypeDescription
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.
Returns
FieldTypeDescription
object[]
The page of groups, by name.
totalCount
integer
Total number of groups matching the query (before pagination).
read-only

list_model_policies

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.

Arguments
FieldTypeDescription
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.
Returns
FieldTypeDescription
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.
read-only

list_people

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.

Arguments
FieldTypeDescription
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.
Returns
FieldTypeDescription
object[]
The page of people, by name.
totalCount
integer
Total number of people matching the query (before pagination).
read-only

list_policies

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.

Arguments
FieldTypeDescription
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.
Returns
FieldTypeDescription
object[]
The page of policies, in the order they are sorted in Blissbook.
totalCount
integer
Total number of policies matching the query (before pagination).
read-only

list_policy_skills

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.

Arguments
FieldTypeDescription
limit
integeroptional
Max policy skills to return. Defaults to 100.
offset
integeroptional
Number of policy skills to skip. Defaults to 0.
Returns
FieldTypeDescription
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).
read-only

list_policy_variables

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.

Arguments
FieldTypeDescription
modelPolicyIds
integer[]required
The Model Policies whose variables to list, from list_model_policies.
Returns
FieldTypeDescription
object[]
Each static variable the Model Policies use, with the organization's value for it.
read-only

list_properties

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.

Arguments
FieldTypeDescription
targetTypes
string[]required
The kinds of thing to list properties for. organization is an agency's client properties.
Possible Values:audiencePagehandbooklawChangelaborLawPagepolicy
Returns
FieldTypeDescription
object[]
Every property defined on any of the requested target types.
read-only

list_saved_segments

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.

Arguments
FieldTypeDescription
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.
Returns
FieldTypeDescription
object[]
The page of saved segments, by name.
totalCount
integer
Total number of saved segments matching the query (before pagination).
writes data

run_policy_check

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.

Arguments
FieldTypeDescription
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.
Returns
FieldTypeDescription
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.
read-only

search_draft_content

Search the draft (unpublished) content for the current user, the person identified in asPerson, or ALL of the content in the organization.

Arguments
FieldTypeDescription
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.
Returns
FieldTypeDescription
object[]
Most relevant content first.
read-only

search_help_articles

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.

Arguments
FieldTypeDescription
limit
integeroptional
How many articles to return. Defaults to 3.
query
stringrequired
What to search for.
Returns
FieldTypeDescription
object[]
Most relevant first.
writes data

set_client_properties

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.

Arguments
FieldTypeDescription
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.
Returns
FieldTypeDescription
object[]
The clients as they stand after the change, in the order their ids were given: your own organization alone when they were omitted.
writes data

set_policy_properties

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.

Arguments
FieldTypeDescription
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.
Returns
FieldTypeDescription
object[]
The policies as they stand after the change.
writes data

update_demographics

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.

Arguments
FieldTypeDescription
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.
Returns
FieldTypeDescription
object[]
One entry per location the organization has people in, with its people counts.
writes data

update_policy_html

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.

Arguments
FieldTypeDescription
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.
Returns
FieldTypeDescription
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.
writes data

update_property

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.

Arguments
FieldTypeDescription
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.
Returns
FieldTypeDescription
object
The property as it stands after the change.

Reporting

Signature Reports and Audit Logs for your organization.

read-only

list_events

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.

Arguments
FieldTypeDescription
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.
Returns
FieldTypeDescription
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.

Support

Investigate your organization's people sync: why someone is missing, archived, or wrong.

read-only

get_hris_integrations

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.

Arguments

This tool takes no arguments.

Returns
FieldTypeDescription
object[]
The organization's people sync integrations.
read-only

get_hris_person

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.

Arguments
FieldTypeDescription
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.
Returns
FieldTypeDescription
object[]
Everyone matching the search, across the organization's integrations. Empty = the HRIS never sent them.

Webhooks

Overview

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.

Adding a Webhook

  1. Open Settings → Tech Setup in Blissbook.
  2. Find the Webhooks section and click Add Webhook.
  3. Choose the events to deliver and enter the https URL to deliver them to.
  4. Copy the signing secret right away, because Blissbook only shows it once.
  5. Click Test to send a webhook.test event to your URL and check your handler end to end.

Delivery

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": { ... }
}
HeaderWhat it carries
X-Blissbook-EventThe event id, e.g. signature.requested. Also in the body as event.
X-Blissbook-DeliveryUnique per delivery, and the same on every retry of it, so you can ignore a repeat.
X-Blissbook-TimestampUnix seconds when Blissbook signed the request. Part of what the signature covers.
X-Blissbook-Signaturev1= followed by the hex HMAC-SHA256 described below.

Verifying Signatures

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'))
  )
}

Retries and Logs

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.

Events

Every event a webhook can subscribe to, with the data it delivers, plus the test event that every webhook receives from the Test button.

Signature Requested

signature.requested

Fired when an Audience Member is requested to sign a Document.

Payload data
FieldTypeDescription
object
What they need to sign.
object
Who needs to sign.
Example delivery
{
  "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"
    }
  }
}

Webhook test

Test button only
webhook.test

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.

Payload data
FieldTypeDescription
message
string
A note that this is a test, for whoever reads the logs.
object
The webhook being tested.
Example delivery
{
  "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"
      ]
    }
  }
}

Resources

Events

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.

AI Settings Updated

Configuration
aiSettings.updated

The organization’s AI settings changed — which AI features are on, and what they are allowed to spend.

Attributes
AttributeTypeDescription
changedKeysstring[]The AI settings that changed.
Possible Values:audienceChatbotExcludedSegmentIdaudienceChatbotFallbackMessageHtmlaudienceChatbotModepolicyReviewerModereleaseNotesModeusageLimit

API Key Archived

Access Control
apiKey.archived

An API key was archived, and every request that key makes is refused until the key is unarchived.

Attributes
AttributeTypeDescription
apiKeyIdstringThe Access Key ID of the API key this event is about.

API Key Created

Access Control
apiKey.created

An API key was generated.

Attributes
AttributeTypeDescription
apiKeyIdstringThe Access Key ID of the API key this event is about.

API Key Deleted

Access Control
apiKey.deleted

An API key was deleted for good. The requests that key already made stay in the log.

Attributes
AttributeTypeDescription
apiKeyIdstringThe Access Key ID of the API key this event is about.

API Key Unarchived

Access Control
apiKey.unarchived

An archived API key was put back into service.

Attributes
AttributeTypeDescription
apiKeyIdstringThe Access Key ID of the API key this event is about.

API Request Received

Data Export
apiRequestReceived

A request to the REST API was served.

Attributes
AttributeTypeDescription
apiEndpointIdstringThe ID of the endpoint that served the call.
Possible Values:exportEventsgetDocumentsexportSavedReportCsvexportSignaturesCsvexportSignaturesJson
urlstringThe endpoint called, including the query string.

Audience Page Archived

Collaboration
audiencePage.archived

The Audience Page was archived, and no longer appears in the library or in any Document.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Audience Page.

Audience Page Comment Added

Collaboration
audiencePage.commentAdded

Somebody commented on the Audience Page. What they wrote is not recorded.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Audience Page.
commentIdstringThe ID of the comment that was added.
commentThreadIdstringThe ID of the thread the comment was added to.
commentThreadPersonIdsinteger[]The IDs of everybody taking part in that thread.
mentionedPersonIdsinteger[]The IDs of everybody the comment mentioned.

Audience Page Created

Collaboration
audiencePage.created

A draft Audience Page was created. Drafts stay invisible to an audience until publication.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Audience Page.

Audience Page Property Value Updated

Collaboration
audiencePage.propertyValueUpdated

A custom property was set, changed, or cleared.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Audience Page.

Audience Page Published

Collaboration
audiencePage.published

A new version of the Audience Page was published, replacing whatever was live before.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Audience Page.
versionNumberintegerThe version that was published.

Audience Page Role Assignment Added

Access Control
audiencePage.roleAssignmentAdded

Somebody was granted a role on the Audience Page, along with the permissions that role carries.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Audience Page.
personIdintegerThe ID of whoever was granted the role.
roleIdstring | nullThe ID of the role, or null when the assignment carries no role of its own.

Audience Page Role Assignment Removed

Access Control
audiencePage.roleAssignmentRemoved

Somebody’s role on the Audience Page was taken away, along with the permissions that role carried.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Audience Page.
personIdintegerThe ID of whoever lost the role.

Audience Page Suggestion Added

Collaboration
audiencePage.suggestionAdded

Somebody suggested an edit to the Audience Page rather than making the edit outright. The suggested text is not recorded.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Audience Page.
suggestionIdstringThe ID of the suggestion that was added.
suggestionTypestringWhat kind of change was suggested.
Possible Values:insertiondeletionattributeformatInlineformatBlock

Audience Page Unarchived

Collaboration
audiencePage.unarchived

An archived Audience Page was restored to the library.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Audience Page.

Audience Page Updated

Collaboration
audiencePage.updated

A draft Audience Page changed.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Audience Page.
audienceExpressionany | nullFilter to restrict which Audience Members have access.
inheritTeamRolesbooleanWhether it inherits the team’s collaborator roles.
showAudiencePagebooleanWhether its Direct Distribution Page is shown.

Authentication Settings Updated

Authentication
authenticationSettings.updated

A way of signing in was reconfigured, which changes who can reach the organization and how.

Attributes
AttributeTypeDescription
authMethodIdstringThe ID of the way in that was reconfigured: email or employeeId.
Possible Values:emailemployeeId
changedKeysstring[]The sign-in settings that changed, on the method authMethodId names.
Possible Values:allowSavedSegmentIdbuttonTexthelpContentisEnabledverificationContent

Bulk Export Completed

Data Export
bulkExportCompleted

An export from the app finished.

Attributes
AttributeTypeDescription
bulkExportTypeIdstringThe ID of what was exported.
Possible Values:accessControlacknowledgmentshandbookRecipientslawChangespeoplepolicies
documentIdintegerThe ID of the Document the export covered, when the export covered just one.

Data Lineage Exported

Data Export
dataLineageExported

A data lineage report was exported.

Attributes
AttributeTypeDescription
policyIdsinteger[]The IDs of the policies the report covered.

Document Created

Collaboration
document.created

A Document was created. A new Document has no published version and no audience.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Document.

Document Published

Collaboration
document.published

A new version of the Document went live to its audience.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Document.
versionNumberintegerThe version that went live.

Document Role Assignment Added

Access Control
document.roleAssignmentAdded

Somebody was granted a role on the Document, along with the permissions that role carries.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Document.
personIdintegerThe ID of whoever was granted the role.
roleIdstring | nullThe ID of the role, or null when the assignment carries no role of its own.

Document Role Assignment Removed

Access Control
document.roleAssignmentRemoved

Somebody’s role on the Document was taken away, along with the permissions that role carried.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Document.
personIdintegerThe ID of whoever lost the role.

Document Signature Round Created

Collaboration
document.signatureRoundCreated

A signature round was opened, so the Document’s audience is asked to sign again.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Document.
signatureRoundIdintegerThe ID of the signature round that was opened.

Document Signed

Reporting
document.signed

Somebody signed the Document.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Document.
signatureIdintegerThe ID of the Signature, which the PDF endpoints take.

Document Viewed

Reporting
document.viewed

Somebody opened the Document.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Document.
viewingSessionIdintegerThe ID of the visit this read belongs to.

Email Domain Added

Configuration
emailDomain.added

A Email Domain was added to the organization, so it can be reached at or sent from.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Email Sending Domain.
domainstringThe domain itself, e.g. handbook.acme.com.

Email Domain Removed

Configuration
emailDomain.removed

A Email Domain was removed from the organization, so it is no longer reached at or sent from.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Email Sending Domain.
domainstringThe domain itself, e.g. handbook.acme.com.

HTTPS Domain Added

Configuration
httpsDomain.added

A HTTPS Domain was added to the organization, so it can be reached at or sent from.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the HTTPS Domain.
domainstringThe domain itself, e.g. handbook.acme.com.

HTTPS Domain Certificate Activated

Configuration
httpsDomain.certificateActivated

A certificate already on file was made active on the HTTPS Domain, so it is trusted under it.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the HTTPS Domain.
digeststringThe digest identifying the certificate, absent when it has yet to be issued.

HTTPS Domain Certificate Added

Configuration
httpsDomain.certificateAdded

A certificate was added to the HTTPS Domain, so it is trusted under it.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the HTTPS Domain.
digeststringThe digest identifying the certificate, absent when it has yet to be issued.

HTTPS Domain Certificate Removed

Configuration
httpsDomain.certificateRemoved

A certificate was deleted from the HTTPS Domain, so it is gone rather than kept on file.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the HTTPS Domain.
digeststringThe digest identifying the certificate, absent when it has yet to be issued.

HTTPS Domain Certificate Renewed

Configuration
httpsDomain.certificateRenewed

A new certificate was called for on the domain, replacing the one it is served under.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the HTTPS Domain.
digeststringThe digest identifying the certificate, absent when it has yet to be issued.

HTTPS Domain Removed

Configuration
httpsDomain.removed

A HTTPS Domain was removed from the organization, so it is no longer reached at or sent from.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the HTTPS Domain.
domainstringThe domain itself, e.g. handbook.acme.com.

Kiosk Mode Settings Updated

Authentication
kioskModeSettings.updated

Kiosk mode was reconfigured — whether shared devices sign themselves out, and how soon.

Attributes
AttributeTypeDescription
changedKeysstring[]The kiosk mode settings that changed.
Possible Values:inactivitySecondsisEnabledtimeoutSeconds

MCP Consent Granted

MCP
mcpConsentGranted

Somebody authorized an MCP client to act as them.

Attributes
AttributeTypeDescription
clientIdstringThe ID of the OAuth client, which stays identifiable even after the client is renamed or removed.
clientNamestringWhat the client called itself.

MCP Token Issued

MCP
mcpTokenIssued

An access token was issued to an MCP client.

Attributes
AttributeTypeDescription
clientIdstringThe ID of the OAuth client, which stays identifiable even after the client is renamed or removed.
clientNamestringWhat the client called itself.
grantTypeIdstringThe ID of the grant the client presented, which separates a fresh authorization from a refresh.
Possible Values:authorization_codeclient_credentialsrefresh_token

MCP Tool Called

MCP
mcpToolCalled

An MCP client ran a tool. What the tool was called with is not recorded.

Attributes
AttributeTypeDescription
clientIdstringThe ID of the OAuth client, which stays identifiable even after the client is renamed or removed.
clientNamestringWhat the client called itself.
toolNamestringThe tool that ran.

Merge Field Published

Collaboration
mergeField.published

New values went live, and every Policy using them shows them immediately.

Attributes
AttributeTypeDescription
variableIdsstring[]The IDs of the variables whose merge field values were published.

Organization Property Value Updated

Collaboration
organization.propertyValueUpdated

A custom property was set, changed, or cleared.

Organization Role Assignment Added

Access Control
organization.roleAssignmentAdded

Somebody was granted a role on the Organization, along with the permissions that role carries.

Attributes
AttributeTypeDescription
personIdintegerThe ID of whoever was granted the role.
roleIdstring | nullThe ID of the role, or null when the assignment carries no role of its own.

Organization Role Assignment Removed

Access Control
organization.roleAssignmentRemoved

Somebody’s role on the Organization was taken away, along with the permissions that role carried.

Attributes
AttributeTypeDescription
personIdintegerThe ID of whoever lost the role.

Organization Updated

Configuration
organization.updated

An organization-wide setting changed, such as the organization’s name or its logo.

Attributes
AttributeTypeDescription
changedKeysstring[]The organization settings that changed.
Possible Values:logoImageIdname

People Synced

Access Control
peopleSynced

A sync with your HR system or directory finished. Each change the sync made shows up as its own person event.

Person Added To Document

Access Control
person.addedToDocument

A person came into a Document’s audience, so they can now read that Document and may be asked to sign.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Person.
documentIdintegerThe ID of the Document.

Person Archived

Access Control
person.archived

A person was archived, which ends their access and takes them out of every audience.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Person.

Person Created

Access Control
person.created

A person was added to the organization — by hand, by import, or by a sync.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Person.

Person Notified

Reporting
person.notified

A notification was sent to somebody.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Person.
notificationIdintegerThe ID of the message that was sent.

Person Property Value Updated

Collaboration
person.propertyValueUpdated

A custom property was set, changed, or cleared.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Person.

Person Removed From Document

Access Control
person.removedFromDocument

A person left a Document’s audience, and lost access to that Document.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Person.
documentIdintegerThe ID of the Document.

Person Unarchived

Access Control
person.unarchived

An archived person was restored and can sign in again.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Person.

Person Updated

Access Control
person.updated

A person’s record changed — their name, email, employee ID, groups, managers, or one of the organization’s own custom fields.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Person.
changedKeysstring[]The fields of this person's record that changed.
Possible Values:emailemployeeIdfullNamegroupIdshomePhoneNumber
changedMetadataKeysstring[]The organization's own custom fields that changed, by the names the organization gave them. Present when changedKeys includes metadata.

Policy Added To Document

Collaboration
policy.addedToDocument

The Policy was added to a Document, whose audience now reads the Policy.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Policy.
documentIdintegerThe ID of the Document.

Policy AI Analysis Created

Collaboration
policy.aiAnalysisCreated

An AI analysis ran against the Policy and returned its findings.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Policy.
aiAnalysisIdstringThe ID of the AI analysis that ran.
analysisTypestringThe kind of analysis: policyCheck, policySkillImport, policySkillUpdate, or sourcePolicyUpdate.

Policy Archived

Collaboration
policy.archived

The Policy was archived, and no longer appears in the library or in any Document.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Policy.

Policy Comment Added

Collaboration
policy.commentAdded

Somebody commented on the Policy. What they wrote is not recorded.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Policy.
commentIdstringThe ID of the comment that was added.
commentThreadIdstringThe ID of the thread the comment was added to.
commentThreadPersonIdsinteger[]The IDs of everybody taking part in that thread.
mentionedPersonIdsinteger[]The IDs of everybody the comment mentioned.

Policy Created

Collaboration
policy.created

A draft Policy was created. Drafts stay invisible to an audience until publication.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Policy.

Policy Property Value Updated

Collaboration
policy.propertyValueUpdated

A custom property was set, changed, or cleared.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Policy.

Policy Published

Collaboration
policy.published

A new version of the Policy was published, replacing whatever was live before.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Policy.
versionNumberintegerThe version that was published.

Policy Removed From Document

Collaboration
policy.removedFromDocument

The Policy was removed from a Document, whose audience no longer reads the Policy.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Policy.
documentIdintegerThe ID of the Document.

Policy Renewed

Collaboration
policy.renewed

The Policy was reviewed and left as written, which restarts the review cycle without publishing a new version.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Policy.

Policy Review Round Added

Collaboration
policy.reviewRoundAdded

A review round was started on the Policy. The message to reviewers is not recorded.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Policy.
dueDateanyWhen the round is due.
isFullApprovalRequiredbooleanWhether every reviewer has to approve, rather than any one of them.
namestring | nullWhat the round is called.
reviewRoundNumberintegerWhich round this is, counting from the first round on this record.

Policy Review Round Ended

Collaboration
policy.reviewRoundEnded

A review round on the Policy finished, and no longer collects feedback.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Policy.
reviewRoundNumberintegerWhich round ended.

Policy Review Round Updated

Collaboration
policy.reviewRoundUpdated

A review round on the Policy changed: the round’s name, the due date, or whether every reviewer has to approve.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Policy.
dueDateanyWhen the round is due.
isFullApprovalRequiredbooleanWhether every reviewer has to approve, rather than any one of them.
namestring | nullWhat the round is called.
reviewRoundNumberintegerWhich round this is, counting from the first round on this record.

Policy Reviewer Added

Collaboration
policy.reviewerAdded

Somebody was asked to review the Policy.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Policy.
reviewerPersonIdintegerThe ID of the reviewer.
reviewRoundNumberintegerThe round they were added to.

Policy Reviewer Feedback Added

Collaboration
policy.reviewerFeedbackAdded

A reviewer responded to a review round on the Policy. What the reviewer wrote is not recorded.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Policy.
reviewerFeedbackIdstringThe ID of the reviewer’s response.
reviewerPersonIdintegerThe ID of the reviewer who responded.
reviewRoundNumberintegerThe round they responded to.

Policy Reviewer Removed

Collaboration
policy.reviewerRemoved

A reviewer was taken off a review round on the Policy, which no longer waits on that reviewer.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Policy.
reviewerPersonIdintegerThe ID of the reviewer.
reviewRoundNumberintegerThe round they were taken off.

Policy Role Assignment Added

Access Control
policy.roleAssignmentAdded

Somebody was granted a role on the Policy, along with the permissions that role carries.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Policy.
personIdintegerThe ID of whoever was granted the role.
roleIdstring | nullThe ID of the role, or null when the assignment carries no role of its own.

Policy Role Assignment Removed

Access Control
policy.roleAssignmentRemoved

Somebody’s role on the Policy was taken away, along with the permissions that role carried.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Policy.
personIdintegerThe ID of whoever lost the role.

Policy Skill Archived

Collaboration
policySkill.archived

The Policy Skill was archived, and no longer appears in the library or in any Document.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Policy Skill.

Policy Skill Comment Added

Collaboration
policySkill.commentAdded

Somebody commented on the Policy Skill. What they wrote is not recorded.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Policy Skill.
commentIdstringThe ID of the comment that was added.
commentThreadIdstringThe ID of the thread the comment was added to.
commentThreadPersonIdsinteger[]The IDs of everybody taking part in that thread.
mentionedPersonIdsinteger[]The IDs of everybody the comment mentioned.

Policy Skill Created

Collaboration
policySkill.created

A draft Policy Skill was created. Drafts stay invisible to an audience until publication.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Policy Skill.

Policy Skill Property Value Updated

Collaboration
policySkill.propertyValueUpdated

A custom property was set, changed, or cleared.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Policy Skill.

Policy Skill Published

Collaboration
policySkill.published

A new version of the Policy Skill was published, replacing whatever was live before.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Policy Skill.
versionNumberintegerThe version that was published.

Policy Skill Role Assignment Added

Access Control
policySkill.roleAssignmentAdded

Somebody was granted a role on the Policy Skill, along with the permissions that role carries.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Policy Skill.
personIdintegerThe ID of whoever was granted the role.
roleIdstring | nullThe ID of the role, or null when the assignment carries no role of its own.

Policy Skill Role Assignment Removed

Access Control
policySkill.roleAssignmentRemoved

Somebody’s role on the Policy Skill was taken away, along with the permissions that role carried.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Policy Skill.
personIdintegerThe ID of whoever lost the role.

Policy Skill Suggestion Added

Collaboration
policySkill.suggestionAdded

Somebody suggested an edit to the Policy Skill rather than making the edit outright. The suggested text is not recorded.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Policy Skill.
suggestionIdstringThe ID of the suggestion that was added.
suggestionTypestringWhat kind of change was suggested.
Possible Values:insertiondeletionattributeformatInlineformatBlock

Policy Skill Unarchived

Collaboration
policySkill.unarchived

An archived Policy Skill was restored to the library.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Policy Skill.

Policy Skill Updated

Collaboration
policySkill.updated

A draft Policy Skill changed.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Policy Skill.
audienceExpressionany | nullFilter to restrict which Audience Members have access.
inheritTeamRolesbooleanWhether it inherits the team’s collaborator roles.
showAudiencePagebooleanWhether its Direct Distribution Page is shown.

Policy Suggestion Added

Collaboration
policy.suggestionAdded

Somebody suggested an edit to the Policy rather than making the edit outright. The suggested text is not recorded.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Policy.
suggestionIdstringThe ID of the suggestion that was added.
suggestionTypestringWhat kind of change was suggested.
Possible Values:insertiondeletionattributeformatInlineformatBlock

Policy Unarchived

Collaboration
policy.unarchived

An archived Policy was restored to the library.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Policy.

Policy Updated

Collaboration
policy.updated

A draft Policy changed.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Policy.
audienceExpressionany | nullFilter to restrict which Audience Members have access.
inheritTeamRolesbooleanWhether it inherits the team’s collaborator roles.
showAudiencePagebooleanWhether its Direct Distribution Page is shown.

Policy Viewed

Reporting
policy.viewed

Somebody read the Policy.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Policy.
viewingSessionIdstringThe ID of the visit this read belongs to, so the reads from one sitting group together.

Property Updated

Collaboration
property.updated

A custom property was created, changed, archived, or unarchived.

Sign In Failed

Authentication
signInFailed

A sign in attempt was refused.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Organization or Person.
authIdstringThe ID of the account that was tried, usually an email address.
authMethodIdstringThe ID of the method the sign in was attempted with.
authTypestringWhat kind of identifier was tried.
errorCodestringWhy the sign in was refused.

Sign In Requested

Authentication
signInRequested

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.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Organization or Person.
authIdstringThe ID of the account that was asked for, an email address or an employee ID. An SSO request carries none.
authMethodIdstringThe ID of the method the sign in was requested with.
authTypestringWhat kind of identifier was entered.

Signed In

Authentication
signedIn

Somebody signed in.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Person.
authMethodIdstringThe ID of the method they authenticated with — a magic link, an access code, or your SSO provider.

Signed Out

Authentication
signedOut

A session ended.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Person.
reasonCodestringWhy the session ended, which separates signing out from being signed out for inactivity.

Single Sign-On Added

Authentication
singleSignOn.added

A single sign-on provider was connected, so people can now sign in through it.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Single Sign-On Provider.
providerIdstringThe ID of the single sign-on provider, e.g. okta / azure / google.

Single Sign-On Certificate Activated

Configuration
singleSignOn.certificateActivated

A certificate already on file was made active on the Single Sign-On, so it is trusted under it.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Single Sign-On Provider.
digeststringThe digest identifying the certificate, absent when it has yet to be issued.

Single Sign-On Certificate Added

Configuration
singleSignOn.certificateAdded

A certificate was added to the Single Sign-On, so it is trusted under it.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Single Sign-On Provider.
digeststringThe digest identifying the certificate, absent when it has yet to be issued.

Single Sign-On Certificate Deactivated

Authentication
singleSignOn.certificateDeactivated

A certificate was made inactive on the single sign-on provider, so it is kept on file but no longer trusted.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Single Sign-On Provider.
digeststringThe digest identifying the certificate, absent when it has yet to be issued.

Single Sign-On Certificate Removed

Configuration
singleSignOn.certificateRemoved

A certificate was deleted from the Single Sign-On, so it is gone rather than kept on file.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Single Sign-On Provider.
digeststringThe digest identifying the certificate, absent when it has yet to be issued.

Single Sign-On Removed

Authentication
singleSignOn.removed

A single sign-on provider was disconnected, so nobody can sign in through it any more.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Single Sign-On Provider.
providerIdstringThe ID of the single sign-on provider, e.g. okta / azure / google.

Single Sign-On Updated

Authentication
singleSignOn.updated

A connected single sign-on provider was reconfigured, changing how people sign in through it.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Single Sign-On Provider.
changedKeysstring[]The single sign-on settings that changed on this provider.
Possible Values:authKeybuttonTextissuerloginUrl
providerIdstringThe ID of the single sign-on provider, e.g. okta / azure / google.

Team Role Assignment Added

Access Control
team.roleAssignmentAdded

Somebody was granted a role on the Team, along with the permissions that role carries.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Team.
personIdintegerThe ID of whoever was granted the role.
roleIdstring | nullThe ID of the role, or null when the assignment carries no role of its own.

Team Role Assignment Removed

Access Control
team.roleAssignmentRemoved

Somebody’s role on the Team was taken away, along with the permissions that role carried.

Attributes
AttributeTypeDescription
targetIdnumberThe ID of the Team.
personIdintegerThe ID of whoever lost the role.

Webhook Created

Access Control
webhook.created

A webhook was added, so Blissbook now delivers its events to the URL.

Attributes
AttributeTypeDescription
eventIdsstring[]The IDs of the events the webhook subscribes to, e.g. signature.requested.
urlstringThe URL the webhook delivers to.
webhookIdstringThe ID of the webhook.

Webhook Deleted

Access Control
webhook.deleted

A webhook was deleted, so Blissbook no longer delivers its events to the URL.

Attributes
AttributeTypeDescription
eventIdsstring[]The IDs of the events the webhook subscribes to, e.g. signature.requested.
urlstringThe URL the webhook delivers to.
webhookIdstringThe ID of the webhook.