API reference
Checklists
Onboarding, offboarding and custom checklists: templates, runs and tasks.
14 actions · base URL https://api.bizisy.com/v1 · generated from the same definitions as the API.
List checklist templates#
POST/v1/org/checklists.templates.listRead
Lists the company's checklist templates (Settings → Checklists): onboarding (due dates relative to the start date), offboarding (relative to the last day) and custom (relative to a date chosen when starting). Each has auto_start (onboarding and offboarding start by themselves when someone is hired or terminated), conditions (unit_ids — a unit includes its subunits —, location_ids, legal_entity_ids; empty = everyone; lists combine with AND) and tasks (title, description, link_url, assignee: hr | manager | person | member with a person, offset_days: negative = before). Until the company changes anything, the two starter templates Bizisy ships are listed with saved=false. Archived templates only with include_archived. Owners, admins and HR.
- Who can call it
- Manage key owner admin hr
- MCP tool
org_checklists_templates_liston HR Assistant- Method
POSTwith a JSON body, orGETwith the input as query parameters
Input
include_archivedboolean
Returns
templatesobject[]required9 fields
idstringrequirednamestringrequiredkind"onboarding" | "offboarding" | "custom"requiredauto_startbooleanrequiredconditionsobjectrequired3 fields
unit_idsstring[]requiredlocation_idsstring[]requiredlegal_entity_idsstring[]required
tasksobject[]required7 fields
idstringrequiredtitlestringrequireddescriptionstring | nullrequiredlink_urlstring | nullrequiredassigneeobjectrequired2 fields
type"hr" | "manager" | "person" | "member"requiredpersonobject | nullrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
offset_daysintegerrequiredvisible_daysinteger | nullrequired
archivedbooleanrequiredsavedbooleanrequiredupdated_atstring | nullrequired
Errors
validation_failed unauthenticated forbidden not_found rate_limited internal
curl https://api.bizisy.com/v1/org/checklists.templates.list \
-H "Authorization: Bearer $BIZISY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"include_archived":true}'const res = await fetch('https://api.bizisy.com/v1/org/checklists.templates.list', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.BIZISY_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"include_archived": true
}),
});
const body = await res.json();
if (!res.ok) throw new Error(`${body.error.code}: ${body.error.message}`);
console.log(body.data);import os
import requests
res = requests.post(
"https://api.bizisy.com/v1/org/checklists.templates.list",
headers={"Authorization": f"Bearer {os.environ['BIZISY_API_KEY']}"},
json={
"include_archived": True,
},
)
body = res.json()
if not res.ok:
raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
print(body["data"]){
"data": {
"templates": [
{
"id": "o1_onboarding",
"name": "Onboarding",
"kind": "onboarding",
"auto_start": true,
"conditions": {
"unit_ids": [],
"location_ids": [
"l1"
],
"legal_entity_ids": []
},
"tasks": [
{
"id": "t1",
"title": "Prepare the employment contract",
"description": "Send it for signature before the first day.",
"link_url": null,
"assignee": {
"type": "hr",
"person": null
},
"offset_days": -10,
"visible_days": null
},
{
"id": "t2",
"title": "Read the employee handbook",
"description": null,
"link_url": "https://intranet.acme.test/handbook",
"assignee": {
"type": "member",
"person": {
"id": "p1",
"name": "Ana Ferreira",
"title": "CEO",
"photo_url": null
}
},
"offset_days": 3,
"visible_days": null
}
],
"archived": false,
"saved": true,
"updated_at": "2026-10-04T10:00:00.000Z"
},
{
"id": "o1_offboarding",
"name": "Offboarding",
"kind": "offboarding",
"auto_start": true,
"conditions": {
"unit_ids": [],
"location_ids": [
"l1"
],
"legal_entity_ids": []
},
"tasks": [
{
"id": "t1",
"title": "Prepare the employment contract",
"description": "Send it for signature before the first day.",
"link_url": null,
"assignee": {
"type": "hr",
"person": null
},
"offset_days": -10,
"visible_days": null
},
{
"id": "t2",
"title": "Read the employee handbook",
"description": null,
"link_url": "https://intranet.acme.test/handbook",
"assignee": {
"type": "member",
"person": {
"id": "p1",
"name": "Ana Ferreira",
"title": "CEO",
"photo_url": null
}
},
"offset_days": 3,
"visible_days": null
}
],
"archived": false,
"saved": false,
"updated_at": null
}
]
}
}Create a checklist template#
POST/v1/org/checklists.templates.createWrite
Creates a checklist template: name, kind (onboarding, offboarding or custom), tasks (1–40: title, optional description and link_url (https), assignee {type: hr | manager | person | member, person_id only for member}, offset_days from -365 to 365 relative to the start date / last day / chosen date), optional conditions {unit_ids, location_ids, legal_entity_ids} and auto_start (default true for onboarding and offboarding; custom templates never start by themselves). "hr" means any owner, admin or HR member; "manager" is the person's manager when the checklist starts (HR if they have none); "person" is the person the checklist is about. A member assignee sees that task and whom it is about. Offboarding tasks show to the leaver and to member assignees only from visible_days (default 7) days before they are due. At most 30 active templates. Applies to checklists started from now on. Use dry_run first. Owners, admins and HR.
- Who can call it
- Manage key owner admin hr
- MCP tool
org_checklists_templates_createon HR Assistant- Preview
?dry_run=trueruns every check and saves nothing- Retries
- An Idempotency-Key prevents a second run, but the result is never stored (it holds a secret or personal data): a retry gets a 409 that points to Activity
Input
namestringrequired1–80 characters.
kind"onboarding" | "offboarding" | "custom"requiredauto_startbooleanconditionsobject3 fields
unit_idsstring[]1–100 characters. Up to 50 items.
location_idsstring[]1–100 characters. Up to 50 items.
legal_entity_idsstring[]1–100 characters. Up to 50 items.
tasksobject[]required1–40 items.
7 fields
idstringPattern
^[a-z0-9_-]{1,40}$.titlestringrequired1–120 characters.
descriptionstring | nullUp to 1000 characters.
link_urlstring | nullUp to 500 characters.
assigneeobjectrequired2 fields
type"hr" | "manager" | "person" | "member"requiredperson_idstring1–100 characters.
offset_daysintegerrequiredFrom -365 to 365.
visible_daysinteger | nullFrom 0 to 365.
Returns
9 fields
idstringrequirednamestringrequiredkind"onboarding" | "offboarding" | "custom"requiredauto_startbooleanrequiredconditionsobjectrequired3 fields
unit_idsstring[]requiredlocation_idsstring[]requiredlegal_entity_idsstring[]required
tasksobject[]required7 fields
idstringrequiredtitlestringrequireddescriptionstring | nullrequiredlink_urlstring | nullrequiredassigneeobjectrequired2 fields
type"hr" | "manager" | "person" | "member"requiredpersonobject | nullrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
offset_daysintegerrequiredvisible_daysinteger | nullrequired
archivedbooleanrequiredsavedbooleanrequiredupdated_atstring | nullrequired
Errors
validation_failed unauthenticated forbidden not_found conflict rate_limited internal
curl https://api.bizisy.com/v1/org/checklists.templates.create \
-H "Authorization: Bearer $BIZISY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"name": "Porto office",
"kind": "onboarding",
"conditions": {
"location_ids": [
"l1"
]
},
"tasks": [
{
"title": "Desk and badge",
"assignee": {
"type": "member",
"person_id": "p2"
},
"offset_days": -1,
"link_url": "https://intranet.acme.test/desks"
}
]
}'const res = await fetch('https://api.bizisy.com/v1/org/checklists.templates.create', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.BIZISY_API_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID(),
},
body: JSON.stringify({
"name": "Porto office",
"kind": "onboarding",
"conditions": {
"location_ids": [
"l1"
]
},
"tasks": [
{
"title": "Desk and badge",
"assignee": {
"type": "member",
"person_id": "p2"
},
"offset_days": -1,
"link_url": "https://intranet.acme.test/desks"
}
]
}),
});
const body = await res.json();
if (!res.ok) throw new Error(`${body.error.code}: ${body.error.message}`);
console.log(body.data);import os, uuid
import requests
res = requests.post(
"https://api.bizisy.com/v1/org/checklists.templates.create",
headers={"Authorization": f"Bearer {os.environ['BIZISY_API_KEY']}", "Idempotency-Key": str(uuid.uuid4())},
json={
"name": "Porto office",
"kind": "onboarding",
"conditions": {
"location_ids": [
"l1",
],
},
"tasks": [
{
"title": "Desk and badge",
"assignee": {
"type": "member",
"person_id": "p2",
},
"offset_days": -1,
"link_url": "https://intranet.acme.test/desks",
},
],
},
)
body = res.json()
if not res.ok:
raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
print(body["data"]){
"data": {
"id": "o1_onboarding",
"name": "Porto office",
"kind": "onboarding",
"auto_start": true,
"conditions": {
"unit_ids": [],
"location_ids": [
"l1"
],
"legal_entity_ids": []
},
"tasks": [
{
"id": "t1",
"title": "Prepare the employment contract",
"description": "Send it for signature before the first day.",
"link_url": null,
"assignee": {
"type": "hr",
"person": null
},
"offset_days": -10,
"visible_days": null
},
{
"id": "t2",
"title": "Read the employee handbook",
"description": null,
"link_url": "https://intranet.acme.test/handbook",
"assignee": {
"type": "member",
"person": {
"id": "p1",
"name": "Ana Ferreira",
"title": "CEO",
"photo_url": null
}
},
"offset_days": 3,
"visible_days": null
}
],
"archived": false,
"saved": true,
"updated_at": "2026-10-04T10:00:00.000Z"
}
}Change a checklist template#
POST/v1/org/checklists.templates.updateWrite
Changes a checklist template (see org_checklists_templates_list for ids, including the starter templates): name, auto_start, conditions (replaces all three lists) and/or tasks (replaces the whole task list: send every task you want to keep, with its id; 1–40 tasks, same fields as org_checklists_templates_create). Checklists already running keep their tasks; only checklists started afterwards use the new version. Use dry_run first. Owners, admins and HR.
- Who can call it
- Manage key owner admin hr
- MCP tool
org_checklists_templates_updateon HR Assistant- Preview
?dry_run=trueruns every check and saves nothing- Retries
- An Idempotency-Key prevents a second run, but the result is never stored (it holds a secret or personal data): a retry gets a 409 that points to Activity
Input
template_idstringrequired1–100 characters.
namestring1–80 characters.
auto_startbooleanconditionsobject3 fields
unit_idsstring[]1–100 characters. Up to 50 items.
location_idsstring[]1–100 characters. Up to 50 items.
legal_entity_idsstring[]1–100 characters. Up to 50 items.
tasksobject[]1–40 items.
7 fields
idstringPattern
^[a-z0-9_-]{1,40}$.titlestringrequired1–120 characters.
descriptionstring | nullUp to 1000 characters.
link_urlstring | nullUp to 500 characters.
assigneeobjectrequired2 fields
type"hr" | "manager" | "person" | "member"requiredperson_idstring1–100 characters.
offset_daysintegerrequiredFrom -365 to 365.
visible_daysinteger | nullFrom 0 to 365.
Returns
9 fields
idstringrequirednamestringrequiredkind"onboarding" | "offboarding" | "custom"requiredauto_startbooleanrequiredconditionsobjectrequired3 fields
unit_idsstring[]requiredlocation_idsstring[]requiredlegal_entity_idsstring[]required
tasksobject[]required7 fields
idstringrequiredtitlestringrequireddescriptionstring | nullrequiredlink_urlstring | nullrequiredassigneeobjectrequired2 fields
type"hr" | "manager" | "person" | "member"requiredpersonobject | nullrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
offset_daysintegerrequiredvisible_daysinteger | nullrequired
archivedbooleanrequiredsavedbooleanrequiredupdated_atstring | nullrequired
Errors
validation_failed unauthenticated forbidden not_found conflict rate_limited internal
curl https://api.bizisy.com/v1/org/checklists.templates.update \
-H "Authorization: Bearer $BIZISY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"template_id": "o1_onboarding",
"auto_start": false,
"conditions": {
"unit_ids": [],
"location_ids": [],
"legal_entity_ids": []
},
"tasks": [
{
"id": "t1",
"title": "Contract",
"description": null,
"link_url": null,
"assignee": {
"type": "hr"
},
"offset_days": -10,
"visible_days": 14
}
]
}'const res = await fetch('https://api.bizisy.com/v1/org/checklists.templates.update', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.BIZISY_API_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID(),
},
body: JSON.stringify({
"template_id": "o1_onboarding",
"auto_start": false,
"conditions": {
"unit_ids": [],
"location_ids": [],
"legal_entity_ids": []
},
"tasks": [
{
"id": "t1",
"title": "Contract",
"description": null,
"link_url": null,
"assignee": {
"type": "hr"
},
"offset_days": -10,
"visible_days": 14
}
]
}),
});
const body = await res.json();
if (!res.ok) throw new Error(`${body.error.code}: ${body.error.message}`);
console.log(body.data);import os, uuid
import requests
res = requests.post(
"https://api.bizisy.com/v1/org/checklists.templates.update",
headers={"Authorization": f"Bearer {os.environ['BIZISY_API_KEY']}", "Idempotency-Key": str(uuid.uuid4())},
json={
"template_id": "o1_onboarding",
"auto_start": False,
"conditions": {
"unit_ids": [],
"location_ids": [],
"legal_entity_ids": [],
},
"tasks": [
{
"id": "t1",
"title": "Contract",
"description": None,
"link_url": None,
"assignee": {
"type": "hr",
},
"offset_days": -10,
"visible_days": 14,
},
],
},
)
body = res.json()
if not res.ok:
raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
print(body["data"]){
"data": {
"id": "o1_onboarding",
"name": "Onboarding",
"kind": "onboarding",
"auto_start": false,
"conditions": {
"unit_ids": [],
"location_ids": [
"l1"
],
"legal_entity_ids": []
},
"tasks": [
{
"id": "t1",
"title": "Prepare the employment contract",
"description": "Send it for signature before the first day.",
"link_url": null,
"assignee": {
"type": "hr",
"person": null
},
"offset_days": -10,
"visible_days": null
},
{
"id": "t2",
"title": "Read the employee handbook",
"description": null,
"link_url": "https://intranet.acme.test/handbook",
"assignee": {
"type": "member",
"person": {
"id": "p1",
"name": "Ana Ferreira",
"title": "CEO",
"photo_url": null
}
},
"offset_days": 3,
"visible_days": null
}
],
"archived": false,
"saved": true,
"updated_at": "2026-10-04T10:00:00.000Z"
}
}Archive or restore a checklist template#
POST/v1/org/checklists.templates.archiveWrite
Archives a checklist template (archived: true): it no longer starts by itself and cannot be started by hand; checklists already running are not affected. archived: false restores it. Templates are never deleted. Owners, admins and HR.
- Who can call it
- Manage key owner admin hr
- MCP tool
org_checklists_templates_archiveon HR Assistant- Preview
?dry_run=trueruns every check and saves nothing- Retries
- An Idempotency-Key prevents a second run, but the result is never stored (it holds a secret or personal data): a retry gets a 409 that points to Activity
Input
template_idstringrequired1–100 characters.
archivedbooleanrequired
Returns
9 fields
idstringrequirednamestringrequiredkind"onboarding" | "offboarding" | "custom"requiredauto_startbooleanrequiredconditionsobjectrequired3 fields
unit_idsstring[]requiredlocation_idsstring[]requiredlegal_entity_idsstring[]required
tasksobject[]required7 fields
idstringrequiredtitlestringrequireddescriptionstring | nullrequiredlink_urlstring | nullrequiredassigneeobjectrequired2 fields
type"hr" | "manager" | "person" | "member"requiredpersonobject | nullrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
offset_daysintegerrequiredvisible_daysinteger | nullrequired
archivedbooleanrequiredsavedbooleanrequiredupdated_atstring | nullrequired
Errors
validation_failed unauthenticated forbidden not_found conflict rate_limited internal
curl https://api.bizisy.com/v1/org/checklists.templates.archive \
-H "Authorization: Bearer $BIZISY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"template_id":"o1_onboarding","archived":true}'const res = await fetch('https://api.bizisy.com/v1/org/checklists.templates.archive', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.BIZISY_API_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID(),
},
body: JSON.stringify({
"template_id": "o1_onboarding",
"archived": true
}),
});
const body = await res.json();
if (!res.ok) throw new Error(`${body.error.code}: ${body.error.message}`);
console.log(body.data);import os, uuid
import requests
res = requests.post(
"https://api.bizisy.com/v1/org/checklists.templates.archive",
headers={"Authorization": f"Bearer {os.environ['BIZISY_API_KEY']}", "Idempotency-Key": str(uuid.uuid4())},
json={
"template_id": "o1_onboarding",
"archived": True,
},
)
body = res.json()
if not res.ok:
raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
print(body["data"]){
"data": {
"id": "o1_onboarding",
"name": "Onboarding",
"kind": "onboarding",
"auto_start": true,
"conditions": {
"unit_ids": [],
"location_ids": [
"l1"
],
"legal_entity_ids": []
},
"tasks": [
{
"id": "t1",
"title": "Prepare the employment contract",
"description": "Send it for signature before the first day.",
"link_url": null,
"assignee": {
"type": "hr",
"person": null
},
"offset_days": -10,
"visible_days": null
},
{
"id": "t2",
"title": "Read the employee handbook",
"description": null,
"link_url": "https://intranet.acme.test/handbook",
"assignee": {
"type": "member",
"person": {
"id": "p1",
"name": "Ana Ferreira",
"title": "CEO",
"photo_url": null
}
},
"offset_days": 3,
"visible_days": null
}
],
"archived": true,
"saved": true,
"updated_at": "2026-10-04T10:00:00.000Z"
}
}Start a checklist for a person#
POST/v1/org/checklists.runs.startWrite
Starts a checklist from a template (template_id from org_checklists_templates_list) for a person (person_id from org_people_list). Due dates hang off anchor_date: by default their start date (onboarding: the current or next employment), their last day (offboarding: they must have one, so terminate first) or today (custom). Pass anchor_date (YYYY-MM-DD) to use another date. Assignees are resolved now: the manager on that date (HR if none), the person, or the named member. Refused when an open checklist from the same template already runs for them, or when the template is archived. Onboarding and offboarding templates with auto_start also start by themselves on org_people_hire, org_people_rehire and org_people_terminate. Use dry_run first. Owners, admins and HR.
- Who can call it
- Manage key owner admin hr
- MCP tool
org_checklists_runs_starton HR Assistant- Preview
?dry_run=trueruns every check and saves nothing- Retries
- An Idempotency-Key prevents a second run, but the result is never stored (it holds a secret or personal data): a retry gets a 409 that points to Activity
Input
person_idstringrequired1–100 characters.
template_idstringrequired1–100 characters.
anchor_datestring
Returns
18 fields
idstringrequirednamestringrequiredkind"onboarding" | "offboarding" | "custom"requiredtemplate_idstring | nullrequiredpersonobjectrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
anchor_datestring | nullrequiredanchor_source"start" | "last_day" | "chosen"requiredstatus"open" | "completed" | "cancelled"requiredstarted_by"auto" | "manual"requiredstarted_atstringrequiredcompleted_atstring | nullrequiredcancelled_atstring | nullrequiredprogressobject | nullrequired3 fields
doneintegerrequiredskippedintegerrequiredtotalintegerrequired
access"full" | "assigned"requiredcan_cancelbooleanrequiredshared_with_personbooleanrequiredcan_sharebooleanrequiredtasksobject[]required15 fields
idstringrequiredtitlestringrequireddescriptionstring | nullrequiredlink_urlstring | nullrequiredassigneeobjectrequired2 fields
type"hr" | "manager" | "person" | "member"requiredpersonobject | nullrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
manager_missingbooleanrequiredoffset_daysintegerrequireddue_datestringrequiredvisible_fromstring | nullrequiredstatus"open" | "done" | "skipped"requiredresolved_atstring | nullrequiredresolved_byobject | nullrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
skip_reasonstring | nullrequiredcommentsobject[]required4 fields
idstringrequiredauthorobject | nullrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
textstringrequiredatstringrequired
canobjectrequired4 fields
tickbooleanrequiredskipbooleanrequiredreassignbooleanrequiredcommentbooleanrequired
Errors
validation_failed unauthenticated forbidden not_found conflict rate_limited internal
curl https://api.bizisy.com/v1/org/checklists.runs.start \
-H "Authorization: Bearer $BIZISY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"person_id":"p2","template_id":"t9","anchor_date":"2026-11-02"}'const res = await fetch('https://api.bizisy.com/v1/org/checklists.runs.start', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.BIZISY_API_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID(),
},
body: JSON.stringify({
"person_id": "p2",
"template_id": "t9",
"anchor_date": "2026-11-02"
}),
});
const body = await res.json();
if (!res.ok) throw new Error(`${body.error.code}: ${body.error.message}`);
console.log(body.data);import os, uuid
import requests
res = requests.post(
"https://api.bizisy.com/v1/org/checklists.runs.start",
headers={"Authorization": f"Bearer {os.environ['BIZISY_API_KEY']}", "Idempotency-Key": str(uuid.uuid4())},
json={
"person_id": "p2",
"template_id": "t9",
"anchor_date": "2026-11-02",
},
)
body = res.json()
if not res.ok:
raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
print(body["data"]){
"data": {
"id": "r1",
"name": "Onboarding",
"kind": "onboarding",
"template_id": "o1_onboarding",
"person": {
"id": "p2",
"name": "Rui Costa",
"title": "CTO",
"photo_url": "https://acme.bizisy.com/api/photos/people/p2?v=01k0000000000000000000000b"
},
"anchor_date": "2026-11-02",
"anchor_source": "start",
"status": "open",
"started_by": "auto",
"shared_with_person": false,
"can_share": false,
"started_at": "2026-10-04T10:00:00.000Z",
"completed_at": null,
"cancelled_at": null,
"progress": {
"done": 1,
"skipped": 0,
"total": 10
},
"access": "full",
"can_cancel": true,
"tasks": [
{
"id": "t1",
"title": "Prepare the employment contract",
"description": "Send it for signature before the first day.",
"link_url": null,
"assignee": {
"type": "manager",
"person": {
"id": "p1",
"name": "Ana Ferreira",
"title": "CEO",
"photo_url": null
}
},
"manager_missing": false,
"offset_days": -10,
"due_date": "2026-10-10",
"visible_from": null,
"status": "done",
"resolved_at": "2026-10-04T10:00:00.000Z",
"resolved_by": {
"id": "p1",
"name": "Ana Ferreira",
"title": "CEO",
"photo_url": null
},
"skip_reason": null,
"comments": [
{
"id": "c1",
"author": {
"id": "p1",
"name": "Ana Ferreira",
"title": "CEO",
"photo_url": null
},
"text": "Sent for signature",
"at": "2026-10-04T10:00:00.000Z"
}
],
"can": {
"tick": true,
"skip": true,
"reassign": true,
"comment": true
}
}
]
}
}Cancel a checklist#
POST/v1/org/checklists.runs.cancelWrite
Cancels a running (or completed) checklist: it stays visible with its ticked tasks but nothing can change any more and its tasks leave everyone’s lists and emails. Use it when a hire falls through or a checklist was started by mistake. Owners, admins and HR.
- Who can call it
- Manage key owner admin hr
- MCP tool
org_checklists_runs_cancelon HR Assistant- Preview
?dry_run=trueruns every check and saves nothing- Retries
- An Idempotency-Key prevents a second run, but the result is never stored (it holds a secret or personal data): a retry gets a 409 that points to Activity
Input
run_idstringrequired1–100 characters.
Returns
18 fields
idstringrequirednamestringrequiredkind"onboarding" | "offboarding" | "custom"requiredtemplate_idstring | nullrequiredpersonobjectrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
anchor_datestring | nullrequiredanchor_source"start" | "last_day" | "chosen"requiredstatus"open" | "completed" | "cancelled"requiredstarted_by"auto" | "manual"requiredstarted_atstringrequiredcompleted_atstring | nullrequiredcancelled_atstring | nullrequiredprogressobject | nullrequired3 fields
doneintegerrequiredskippedintegerrequiredtotalintegerrequired
access"full" | "assigned"requiredcan_cancelbooleanrequiredshared_with_personbooleanrequiredcan_sharebooleanrequiredtasksobject[]required15 fields
idstringrequiredtitlestringrequireddescriptionstring | nullrequiredlink_urlstring | nullrequiredassigneeobjectrequired2 fields
type"hr" | "manager" | "person" | "member"requiredpersonobject | nullrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
manager_missingbooleanrequiredoffset_daysintegerrequireddue_datestringrequiredvisible_fromstring | nullrequiredstatus"open" | "done" | "skipped"requiredresolved_atstring | nullrequiredresolved_byobject | nullrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
skip_reasonstring | nullrequiredcommentsobject[]required4 fields
idstringrequiredauthorobject | nullrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
textstringrequiredatstringrequired
canobjectrequired4 fields
tickbooleanrequiredskipbooleanrequiredreassignbooleanrequiredcommentbooleanrequired
Errors
validation_failed unauthenticated forbidden not_found conflict rate_limited internal
curl https://api.bizisy.com/v1/org/checklists.runs.cancel \
-H "Authorization: Bearer $BIZISY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"run_id":"r1"}'const res = await fetch('https://api.bizisy.com/v1/org/checklists.runs.cancel', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.BIZISY_API_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID(),
},
body: JSON.stringify({
"run_id": "r1"
}),
});
const body = await res.json();
if (!res.ok) throw new Error(`${body.error.code}: ${body.error.message}`);
console.log(body.data);import os, uuid
import requests
res = requests.post(
"https://api.bizisy.com/v1/org/checklists.runs.cancel",
headers={"Authorization": f"Bearer {os.environ['BIZISY_API_KEY']}", "Idempotency-Key": str(uuid.uuid4())},
json={
"run_id": "r1",
},
)
body = res.json()
if not res.ok:
raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
print(body["data"]){
"data": {
"id": "r1",
"name": "Onboarding",
"kind": "onboarding",
"template_id": "o1_onboarding",
"person": {
"id": "p2",
"name": "Rui Costa",
"title": "CTO",
"photo_url": "https://acme.bizisy.com/api/photos/people/p2?v=01k0000000000000000000000b"
},
"anchor_date": "2026-10-20",
"anchor_source": "start",
"status": "cancelled",
"started_by": "auto",
"shared_with_person": false,
"can_share": false,
"started_at": "2026-10-04T10:00:00.000Z",
"completed_at": null,
"cancelled_at": "2026-10-05T10:00:00.000Z",
"progress": {
"done": 1,
"skipped": 0,
"total": 10
},
"access": "full",
"can_cancel": false,
"tasks": [
{
"id": "t1",
"title": "Prepare the employment contract",
"description": "Send it for signature before the first day.",
"link_url": null,
"assignee": {
"type": "manager",
"person": {
"id": "p1",
"name": "Ana Ferreira",
"title": "CEO",
"photo_url": null
}
},
"manager_missing": false,
"offset_days": -10,
"due_date": "2026-10-10",
"visible_from": null,
"status": "done",
"resolved_at": "2026-10-04T10:00:00.000Z",
"resolved_by": {
"id": "p1",
"name": "Ana Ferreira",
"title": "CEO",
"photo_url": null
},
"skip_reason": null,
"comments": [
{
"id": "c1",
"author": {
"id": "p1",
"name": "Ana Ferreira",
"title": "CEO",
"photo_url": null
},
"text": "Sent for signature",
"at": "2026-10-04T10:00:00.000Z"
}
],
"can": {
"tick": true,
"skip": true,
"reassign": true,
"comment": true
}
}
]
}
}Share an offboarding checklist with the person leaving#
POST/v1/org/checklists.runs.shareWrite
Shares an offboarding checklist with the person it is about (shared: true): from then on they see their own tasks on it (for example "Hand over your work") in Me → My tasks and in their emails. Until it is shared, they only see each of their tasks from 7 days before it is due (or the number of days its template sets), since a last day is often recorded before it is announced. shared: false stops sharing. Member assignees outside HR and the manager chain always follow those visible-from dates. Owners, admins and HR.
- Who can call it
- Manage key owner admin hr
- MCP tool
org_checklists_runs_shareon HR Assistant- Preview
?dry_run=trueruns every check and saves nothing- Retries
- An Idempotency-Key prevents a second run, but the result is never stored (it holds a secret or personal data): a retry gets a 409 that points to Activity
Input
run_idstringrequired1–100 characters.
sharedbooleanrequired
Returns
18 fields
idstringrequirednamestringrequiredkind"onboarding" | "offboarding" | "custom"requiredtemplate_idstring | nullrequiredpersonobjectrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
anchor_datestring | nullrequiredanchor_source"start" | "last_day" | "chosen"requiredstatus"open" | "completed" | "cancelled"requiredstarted_by"auto" | "manual"requiredstarted_atstringrequiredcompleted_atstring | nullrequiredcancelled_atstring | nullrequiredprogressobject | nullrequired3 fields
doneintegerrequiredskippedintegerrequiredtotalintegerrequired
access"full" | "assigned"requiredcan_cancelbooleanrequiredshared_with_personbooleanrequiredcan_sharebooleanrequiredtasksobject[]required15 fields
idstringrequiredtitlestringrequireddescriptionstring | nullrequiredlink_urlstring | nullrequiredassigneeobjectrequired2 fields
type"hr" | "manager" | "person" | "member"requiredpersonobject | nullrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
manager_missingbooleanrequiredoffset_daysintegerrequireddue_datestringrequiredvisible_fromstring | nullrequiredstatus"open" | "done" | "skipped"requiredresolved_atstring | nullrequiredresolved_byobject | nullrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
skip_reasonstring | nullrequiredcommentsobject[]required4 fields
idstringrequiredauthorobject | nullrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
textstringrequiredatstringrequired
canobjectrequired4 fields
tickbooleanrequiredskipbooleanrequiredreassignbooleanrequiredcommentbooleanrequired
Errors
validation_failed unauthenticated forbidden not_found conflict rate_limited internal
{
"data": {
"id": "r2",
"name": "Offboarding",
"kind": "offboarding",
"template_id": "o1_onboarding",
"person": {
"id": "p2",
"name": "Rui Costa",
"title": "CTO",
"photo_url": "https://acme.bizisy.com/api/photos/people/p2?v=01k0000000000000000000000b"
},
"anchor_date": "2026-10-20",
"anchor_source": "last_day",
"status": "open",
"started_by": "auto",
"shared_with_person": true,
"can_share": true,
"started_at": "2026-10-04T10:00:00.000Z",
"completed_at": null,
"cancelled_at": null,
"progress": {
"done": 1,
"skipped": 0,
"total": 10
},
"access": "full",
"can_cancel": true,
"tasks": [
{
"id": "t1",
"title": "Prepare the employment contract",
"description": "Send it for signature before the first day.",
"link_url": null,
"assignee": {
"type": "manager",
"person": {
"id": "p1",
"name": "Ana Ferreira",
"title": "CEO",
"photo_url": null
}
},
"manager_missing": false,
"offset_days": -10,
"due_date": "2026-10-10",
"visible_from": null,
"status": "done",
"resolved_at": "2026-10-04T10:00:00.000Z",
"resolved_by": {
"id": "p1",
"name": "Ana Ferreira",
"title": "CEO",
"photo_url": null
},
"skip_reason": null,
"comments": [
{
"id": "c1",
"author": {
"id": "p1",
"name": "Ana Ferreira",
"title": "CEO",
"photo_url": null
},
"text": "Sent for signature",
"at": "2026-10-04T10:00:00.000Z"
}
],
"can": {
"tick": true,
"skip": true,
"reassign": true,
"comment": true
}
}
]
}
}List checklists#
POST/v1/org/checklists.runs.listRead
Lists checklists (onboarding, offboarding, custom) with their progress (done, skipped, total) and tasks. person_id: only that person’s checklists. status: open, completed, cancelled or all (default: all with person_id, else open). Owners, admins, HR and the person’s managers see every task; the person themself and member assignees see only the tasks assigned to them (access "assigned"; a member assignee gets no date or progress for the checklist), and on offboarding only from each task’s visible_from date (the person sooner if HR shared it with them, org_checklists_runs_share); others see nothing. Each task says what you may do with it (can).
- Who can call it
- Manage key any Manage role
Me key anyone - MCP tool
org_checklists_runs_liston HR Assistant, My Workplace- Method
POSTwith a JSON body, orGETwith the input as query parameters
Input
person_idstring1–100 characters.
status"open" | "completed" | "cancelled" | "all"
Returns
todaystringrequiredrunsobject[]required18 fields
idstringrequirednamestringrequiredkind"onboarding" | "offboarding" | "custom"requiredtemplate_idstring | nullrequiredpersonobjectrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
anchor_datestring | nullrequiredanchor_source"start" | "last_day" | "chosen"requiredstatus"open" | "completed" | "cancelled"requiredstarted_by"auto" | "manual"requiredstarted_atstringrequiredcompleted_atstring | nullrequiredcancelled_atstring | nullrequiredprogressobject | nullrequired3 fields
doneintegerrequiredskippedintegerrequiredtotalintegerrequired
access"full" | "assigned"requiredcan_cancelbooleanrequiredshared_with_personbooleanrequiredcan_sharebooleanrequiredtasksobject[]required15 fields
idstringrequiredtitlestringrequireddescriptionstring | nullrequiredlink_urlstring | nullrequiredassigneeobjectrequired2 fields
type"hr" | "manager" | "person" | "member"requiredpersonobject | nullrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
manager_missingbooleanrequiredoffset_daysintegerrequireddue_datestringrequiredvisible_fromstring | nullrequiredstatus"open" | "done" | "skipped"requiredresolved_atstring | nullrequiredresolved_byobject | nullrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
skip_reasonstring | nullrequiredcommentsobject[]required4 fields
idstringrequiredauthorobject | nullrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
textstringrequiredatstringrequired
canobjectrequired4 fields
tickbooleanrequiredskipbooleanrequiredreassignbooleanrequiredcommentbooleanrequired
Errors
validation_failed unauthenticated forbidden not_found rate_limited internal
curl https://api.bizisy.com/v1/org/checklists.runs.list \
-H "Authorization: Bearer $BIZISY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"person_id":"p2","status":"all"}'const res = await fetch('https://api.bizisy.com/v1/org/checklists.runs.list', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.BIZISY_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"person_id": "p2",
"status": "all"
}),
});
const body = await res.json();
if (!res.ok) throw new Error(`${body.error.code}: ${body.error.message}`);
console.log(body.data);import os
import requests
res = requests.post(
"https://api.bizisy.com/v1/org/checklists.runs.list",
headers={"Authorization": f"Bearer {os.environ['BIZISY_API_KEY']}"},
json={
"person_id": "p2",
"status": "all",
},
)
body = res.json()
if not res.ok:
raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
print(body["data"]){
"data": {
"today": "2026-10-04",
"runs": [
{
"id": "r1",
"name": "Onboarding",
"kind": "onboarding",
"template_id": "o1_onboarding",
"person": {
"id": "p2",
"name": "Rui Costa",
"title": "CTO",
"photo_url": "https://acme.bizisy.com/api/photos/people/p2?v=01k0000000000000000000000b"
},
"anchor_date": "2026-10-20",
"anchor_source": "start",
"status": "open",
"started_by": "auto",
"shared_with_person": false,
"can_share": false,
"started_at": "2026-10-04T10:00:00.000Z",
"completed_at": null,
"cancelled_at": null,
"progress": {
"done": 1,
"skipped": 0,
"total": 10
},
"access": "full",
"can_cancel": true,
"tasks": [
{
"id": "t1",
"title": "Prepare the employment contract",
"description": "Send it for signature before the first day.",
"link_url": null,
"assignee": {
"type": "manager",
"person": {
"id": "p1",
"name": "Ana Ferreira",
"title": "CEO",
"photo_url": null
}
},
"manager_missing": false,
"offset_days": -10,
"due_date": "2026-10-10",
"visible_from": null,
"status": "done",
"resolved_at": "2026-10-04T10:00:00.000Z",
"resolved_by": {
"id": "p1",
"name": "Ana Ferreira",
"title": "CEO",
"photo_url": null
},
"skip_reason": null,
"comments": [
{
"id": "c1",
"author": {
"id": "p1",
"name": "Ana Ferreira",
"title": "CEO",
"photo_url": null
},
"text": "Sent for signature",
"at": "2026-10-04T10:00:00.000Z"
}
],
"can": {
"tick": true,
"skip": true,
"reassign": true,
"comment": true
}
}
]
},
{
"id": "r3",
"name": "Onboarding",
"kind": "onboarding",
"template_id": "o1_onboarding",
"person": {
"id": "p2",
"name": "Rui Costa",
"title": "CTO",
"photo_url": "https://acme.bizisy.com/api/photos/people/p2?v=01k0000000000000000000000b"
},
"anchor_date": null,
"anchor_source": "start",
"status": "open",
"started_by": "auto",
"shared_with_person": false,
"can_share": false,
"started_at": "2026-10-04T10:00:00.000Z",
"completed_at": null,
"cancelled_at": null,
"progress": null,
"access": "assigned",
"can_cancel": false,
"tasks": [
{
"id": "t1",
"title": "Prepare the employment contract",
"description": "Send it for signature before the first day.",
"link_url": null,
"assignee": {
"type": "manager",
"person": {
"id": "p1",
"name": "Ana Ferreira",
"title": "CEO",
"photo_url": null
}
},
"manager_missing": false,
"offset_days": -10,
"due_date": "2026-10-10",
"visible_from": null,
"status": "done",
"resolved_at": "2026-10-04T10:00:00.000Z",
"resolved_by": {
"id": "p1",
"name": "Ana Ferreira",
"title": "CEO",
"photo_url": null
},
"skip_reason": null,
"comments": [
{
"id": "c1",
"author": {
"id": "p1",
"name": "Ana Ferreira",
"title": "CEO",
"photo_url": null
},
"text": "Sent for signature",
"at": "2026-10-04T10:00:00.000Z"
}
],
"can": {
"tick": true,
"skip": true,
"reassign": true,
"comment": true
}
}
]
}
]
}
}List checklist tasks#
POST/v1/org/checklists.tasks.listRead
Lists checklist tasks across people, soonest due first. scope: mine (default: tasks assigned to you, plus HR tasks if you are an owner, admin or HR), team (every task on the checklists of people who report to you, directly or further down) or all (owners, admins and HR only). status: open (default) or all (adds done and skipped tasks of running and completed checklists). due_by (YYYY-MM-DD): only tasks due on or before it, e.g. today for what is due or overdue. Each item carries its checklist (run) and the person it is about.
- Who can call it
- Manage key any Manage role
Me key anyone - MCP tool
org_checklists_tasks_liston HR Assistant, My Workplace- Method
POSTwith a JSON body, orGETwith the input as query parameters
Input
scope"mine" | "team" | "all"status"open" | "all"due_bystring
Returns
todaystringrequiredtasksobject[]required17 fields
idstringrequiredtitlestringrequireddescriptionstring | nullrequiredlink_urlstring | nullrequiredassigneeobjectrequired2 fields
type"hr" | "manager" | "person" | "member"requiredpersonobject | nullrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
manager_missingbooleanrequiredoffset_daysintegerrequireddue_datestringrequiredvisible_fromstring | nullrequiredstatus"open" | "done" | "skipped"requiredresolved_atstring | nullrequiredresolved_byobject | nullrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
skip_reasonstring | nullrequiredcommentsobject[]required4 fields
idstringrequiredauthorobject | nullrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
textstringrequiredatstringrequired
canobjectrequired4 fields
tickbooleanrequiredskipbooleanrequiredreassignbooleanrequiredcommentbooleanrequired
runobjectrequired5 fields
idstringrequirednamestringrequiredkind"onboarding" | "offboarding" | "custom"requiredstatus"open" | "completed" | "cancelled"requiredanchor_datestring | nullrequired
personobjectrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
Errors
validation_failed unauthenticated forbidden not_found rate_limited internal
curl https://api.bizisy.com/v1/org/checklists.tasks.list \
-H "Authorization: Bearer $BIZISY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"scope":"team","status":"all","due_by":"2026-10-11"}'const res = await fetch('https://api.bizisy.com/v1/org/checklists.tasks.list', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.BIZISY_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"scope": "team",
"status": "all",
"due_by": "2026-10-11"
}),
});
const body = await res.json();
if (!res.ok) throw new Error(`${body.error.code}: ${body.error.message}`);
console.log(body.data);import os
import requests
res = requests.post(
"https://api.bizisy.com/v1/org/checklists.tasks.list",
headers={"Authorization": f"Bearer {os.environ['BIZISY_API_KEY']}"},
json={
"scope": "team",
"status": "all",
"due_by": "2026-10-11",
},
)
body = res.json()
if not res.ok:
raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
print(body["data"]){
"data": {
"today": "2026-10-04",
"tasks": [
{
"id": "t1",
"title": "Prepare the employment contract",
"description": "Send it for signature before the first day.",
"link_url": null,
"assignee": {
"type": "manager",
"person": {
"id": "p1",
"name": "Ana Ferreira",
"title": "CEO",
"photo_url": null
}
},
"manager_missing": false,
"offset_days": -10,
"due_date": "2026-10-10",
"visible_from": null,
"status": "done",
"resolved_at": "2026-10-04T10:00:00.000Z",
"resolved_by": {
"id": "p1",
"name": "Ana Ferreira",
"title": "CEO",
"photo_url": null
},
"skip_reason": null,
"comments": [
{
"id": "c1",
"author": {
"id": "p1",
"name": "Ana Ferreira",
"title": "CEO",
"photo_url": null
},
"text": "Sent for signature",
"at": "2026-10-04T10:00:00.000Z"
}
],
"can": {
"tick": true,
"skip": true,
"reassign": true,
"comment": true
},
"run": {
"id": "r1",
"name": "Onboarding",
"kind": "onboarding",
"status": "open",
"anchor_date": "2026-10-20"
},
"person": {
"id": "p2",
"name": "Rui Costa",
"title": "CTO",
"photo_url": "https://acme.bizisy.com/api/photos/people/p2?v=01k0000000000000000000000b"
}
}
]
}
}Tick, untick or skip a checklist task#
POST/v1/org/checklists.tasks.set_statusWrite
Sets a task’s status: done (tick), open (untick or undo a skip) or skipped (with a reason, up to 200 characters, e.g. "Already has a laptop"). The checklist completes by itself when no task is open, and reopens when one is unticked. The assignee (and HR for HR tasks) can tick and untick; skipping, and undoing a skip, is for owners, admins, HR and the person’s managers. Cancelled checklists cannot change. Use run_id and task_id from org_checklists_tasks_list or org_checklists_runs_list.
- Who can call it
- Manage key any Manage role
Me key anyone - MCP tool
org_checklists_tasks_set_statuson HR Assistant, My Workplace- Preview
?dry_run=trueruns every check and saves nothing- Retries
- An Idempotency-Key prevents a second run, but the result is never stored (it holds a secret or personal data): a retry gets a 409 that points to Activity
Input
run_idstringrequired1–100 characters.
task_idstringrequired1–100 characters.
status"open" | "done" | "skipped"requiredreasonstring1–200 characters.
Returns
17 fields
idstringrequiredtitlestringrequireddescriptionstring | nullrequiredlink_urlstring | nullrequiredassigneeobjectrequired2 fields
type"hr" | "manager" | "person" | "member"requiredpersonobject | nullrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
manager_missingbooleanrequiredoffset_daysintegerrequireddue_datestringrequiredvisible_fromstring | nullrequiredstatus"open" | "done" | "skipped"requiredresolved_atstring | nullrequiredresolved_byobject | nullrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
skip_reasonstring | nullrequiredcommentsobject[]required4 fields
idstringrequiredauthorobject | nullrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
textstringrequiredatstringrequired
canobjectrequired4 fields
tickbooleanrequiredskipbooleanrequiredreassignbooleanrequiredcommentbooleanrequired
runobjectrequired5 fields
idstringrequirednamestringrequiredkind"onboarding" | "offboarding" | "custom"requiredstatus"open" | "completed" | "cancelled"requiredanchor_datestring | nullrequired
personobjectrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
Errors
validation_failed unauthenticated forbidden not_found conflict rate_limited internal
curl https://api.bizisy.com/v1/org/checklists.tasks.set_status \
-H "Authorization: Bearer $BIZISY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"run_id": "r1",
"task_id": "t1",
"status": "skipped",
"reason": "Already has a laptop"
}'const res = await fetch('https://api.bizisy.com/v1/org/checklists.tasks.set_status', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.BIZISY_API_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID(),
},
body: JSON.stringify({
"run_id": "r1",
"task_id": "t1",
"status": "skipped",
"reason": "Already has a laptop"
}),
});
const body = await res.json();
if (!res.ok) throw new Error(`${body.error.code}: ${body.error.message}`);
console.log(body.data);import os, uuid
import requests
res = requests.post(
"https://api.bizisy.com/v1/org/checklists.tasks.set_status",
headers={"Authorization": f"Bearer {os.environ['BIZISY_API_KEY']}", "Idempotency-Key": str(uuid.uuid4())},
json={
"run_id": "r1",
"task_id": "t1",
"status": "skipped",
"reason": "Already has a laptop",
},
)
body = res.json()
if not res.ok:
raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
print(body["data"]){
"data": {
"id": "t1",
"title": "Prepare the employment contract",
"description": "Send it for signature before the first day.",
"link_url": null,
"assignee": {
"type": "manager",
"person": {
"id": "p1",
"name": "Ana Ferreira",
"title": "CEO",
"photo_url": null
}
},
"manager_missing": false,
"offset_days": -10,
"due_date": "2026-10-10",
"visible_from": null,
"status": "skipped",
"resolved_at": "2026-10-04T10:00:00.000Z",
"resolved_by": {
"id": "p1",
"name": "Ana Ferreira",
"title": "CEO",
"photo_url": null
},
"skip_reason": null,
"comments": [
{
"id": "c1",
"author": {
"id": "p1",
"name": "Ana Ferreira",
"title": "CEO",
"photo_url": null
},
"text": "Sent for signature",
"at": "2026-10-04T10:00:00.000Z"
}
],
"can": {
"tick": true,
"skip": true,
"reassign": true,
"comment": true
},
"run": {
"id": "r1",
"name": "Onboarding",
"kind": "onboarding",
"status": "open",
"anchor_date": "2026-10-20"
},
"person": {
"id": "p2",
"name": "Rui Costa",
"title": "CTO",
"photo_url": "https://acme.bizisy.com/api/photos/people/p2?v=01k0000000000000000000000b"
}
}
}Reassign a checklist task#
POST/v1/org/checklists.tasks.reassignWrite
Gives a task to someone else: assignee {type: hr} (any owner, admin or HR member), {type: manager} (the person’s manager today), {type: person} (the person the checklist is about) or {type: member, person_id} (any current employee; they will see this task and whom it is about). Owners, admins, HR and the person’s managers. Cancelled checklists cannot change.
- Who can call it
- Manage key any Manage role
Me key anyone - MCP tool
org_checklists_tasks_reassignon HR Assistant, My Workplace- Preview
?dry_run=trueruns every check and saves nothing- Retries
- An Idempotency-Key prevents a second run, but the result is never stored (it holds a secret or personal data): a retry gets a 409 that points to Activity
Input
run_idstringrequired1–100 characters.
task_idstringrequired1–100 characters.
assigneeobjectrequired2 fields
type"hr" | "manager" | "person" | "member"requiredperson_idstring1–100 characters.
Returns
17 fields
idstringrequiredtitlestringrequireddescriptionstring | nullrequiredlink_urlstring | nullrequiredassigneeobjectrequired2 fields
type"hr" | "manager" | "person" | "member"requiredpersonobject | nullrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
manager_missingbooleanrequiredoffset_daysintegerrequireddue_datestringrequiredvisible_fromstring | nullrequiredstatus"open" | "done" | "skipped"requiredresolved_atstring | nullrequiredresolved_byobject | nullrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
skip_reasonstring | nullrequiredcommentsobject[]required4 fields
idstringrequiredauthorobject | nullrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
textstringrequiredatstringrequired
canobjectrequired4 fields
tickbooleanrequiredskipbooleanrequiredreassignbooleanrequiredcommentbooleanrequired
runobjectrequired5 fields
idstringrequirednamestringrequiredkind"onboarding" | "offboarding" | "custom"requiredstatus"open" | "completed" | "cancelled"requiredanchor_datestring | nullrequired
personobjectrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
Errors
validation_failed unauthenticated forbidden not_found conflict rate_limited internal
curl https://api.bizisy.com/v1/org/checklists.tasks.reassign \
-H "Authorization: Bearer $BIZISY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"run_id": "r1",
"task_id": "t1",
"assignee": {
"type": "member",
"person_id": "p1"
}
}'const res = await fetch('https://api.bizisy.com/v1/org/checklists.tasks.reassign', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.BIZISY_API_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID(),
},
body: JSON.stringify({
"run_id": "r1",
"task_id": "t1",
"assignee": {
"type": "member",
"person_id": "p1"
}
}),
});
const body = await res.json();
if (!res.ok) throw new Error(`${body.error.code}: ${body.error.message}`);
console.log(body.data);import os, uuid
import requests
res = requests.post(
"https://api.bizisy.com/v1/org/checklists.tasks.reassign",
headers={"Authorization": f"Bearer {os.environ['BIZISY_API_KEY']}", "Idempotency-Key": str(uuid.uuid4())},
json={
"run_id": "r1",
"task_id": "t1",
"assignee": {
"type": "member",
"person_id": "p1",
},
},
)
body = res.json()
if not res.ok:
raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
print(body["data"]){
"data": {
"id": "t1",
"title": "Prepare the employment contract",
"description": "Send it for signature before the first day.",
"link_url": null,
"assignee": {
"type": "manager",
"person": {
"id": "p1",
"name": "Ana Ferreira",
"title": "CEO",
"photo_url": null
}
},
"manager_missing": false,
"offset_days": -10,
"due_date": "2026-10-10",
"visible_from": null,
"status": "done",
"resolved_at": "2026-10-04T10:00:00.000Z",
"resolved_by": {
"id": "p1",
"name": "Ana Ferreira",
"title": "CEO",
"photo_url": null
},
"skip_reason": null,
"comments": [
{
"id": "c1",
"author": {
"id": "p1",
"name": "Ana Ferreira",
"title": "CEO",
"photo_url": null
},
"text": "Sent for signature",
"at": "2026-10-04T10:00:00.000Z"
}
],
"can": {
"tick": true,
"skip": true,
"reassign": true,
"comment": true
},
"run": {
"id": "r1",
"name": "Onboarding",
"kind": "onboarding",
"status": "open",
"anchor_date": "2026-10-20"
},
"person": {
"id": "p2",
"name": "Rui Costa",
"title": "CTO",
"photo_url": "https://acme.bizisy.com/api/photos/people/p2?v=01k0000000000000000000000b"
}
}
}Comment on a checklist task#
POST/v1/org/checklists.tasks.commentWrite
Adds a comment (up to 1000 characters) to a task, e.g. "Laptop ordered, arrives Tuesday". Everyone who sees the task sees its comments, with your name and the time. At most 50 comments per task; comments cannot be edited. The assignee, owners, admins, HR and the person’s managers can comment. Do not put health or other sensitive details in comments.
- Who can call it
- Manage key any Manage role
Me key anyone - MCP tool
org_checklists_tasks_commenton HR Assistant, My Workplace- Preview
?dry_run=trueruns every check and saves nothing- Retries
- An Idempotency-Key prevents a second run, but the result is never stored (it holds a secret or personal data): a retry gets a 409 that points to Activity
Input
run_idstringrequired1–100 characters.
task_idstringrequired1–100 characters.
textstringrequired1–1000 characters.
Returns
17 fields
idstringrequiredtitlestringrequireddescriptionstring | nullrequiredlink_urlstring | nullrequiredassigneeobjectrequired2 fields
type"hr" | "manager" | "person" | "member"requiredpersonobject | nullrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
manager_missingbooleanrequiredoffset_daysintegerrequireddue_datestringrequiredvisible_fromstring | nullrequiredstatus"open" | "done" | "skipped"requiredresolved_atstring | nullrequiredresolved_byobject | nullrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
skip_reasonstring | nullrequiredcommentsobject[]required4 fields
idstringrequiredauthorobject | nullrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
textstringrequiredatstringrequired
canobjectrequired4 fields
tickbooleanrequiredskipbooleanrequiredreassignbooleanrequiredcommentbooleanrequired
runobjectrequired5 fields
idstringrequirednamestringrequiredkind"onboarding" | "offboarding" | "custom"requiredstatus"open" | "completed" | "cancelled"requiredanchor_datestring | nullrequired
personobjectrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
Errors
validation_failed unauthenticated forbidden not_found conflict rate_limited internal
curl https://api.bizisy.com/v1/org/checklists.tasks.comment \
-H "Authorization: Bearer $BIZISY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"run_id":"r1","task_id":"t1","text":"Laptop ordered"}'const res = await fetch('https://api.bizisy.com/v1/org/checklists.tasks.comment', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.BIZISY_API_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID(),
},
body: JSON.stringify({
"run_id": "r1",
"task_id": "t1",
"text": "Laptop ordered"
}),
});
const body = await res.json();
if (!res.ok) throw new Error(`${body.error.code}: ${body.error.message}`);
console.log(body.data);import os, uuid
import requests
res = requests.post(
"https://api.bizisy.com/v1/org/checklists.tasks.comment",
headers={"Authorization": f"Bearer {os.environ['BIZISY_API_KEY']}", "Idempotency-Key": str(uuid.uuid4())},
json={
"run_id": "r1",
"task_id": "t1",
"text": "Laptop ordered",
},
)
body = res.json()
if not res.ok:
raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
print(body["data"]){
"data": {
"id": "t1",
"title": "Prepare the employment contract",
"description": "Send it for signature before the first day.",
"link_url": null,
"assignee": {
"type": "manager",
"person": {
"id": "p1",
"name": "Ana Ferreira",
"title": "CEO",
"photo_url": null
}
},
"manager_missing": false,
"offset_days": -10,
"due_date": "2026-10-10",
"visible_from": null,
"status": "done",
"resolved_at": "2026-10-04T10:00:00.000Z",
"resolved_by": {
"id": "p1",
"name": "Ana Ferreira",
"title": "CEO",
"photo_url": null
},
"skip_reason": null,
"comments": [
{
"id": "c1",
"author": {
"id": "p1",
"name": "Ana Ferreira",
"title": "CEO",
"photo_url": null
},
"text": "Sent for signature",
"at": "2026-10-04T10:00:00.000Z"
}
],
"can": {
"tick": true,
"skip": true,
"reassign": true,
"comment": true
},
"run": {
"id": "r1",
"name": "Onboarding",
"kind": "onboarding",
"status": "open",
"anchor_date": "2026-10-20"
},
"person": {
"id": "p2",
"name": "Rui Costa",
"title": "CTO",
"photo_url": "https://acme.bizisy.com/api/photos/people/p2?v=01k0000000000000000000000b"
}
}
}Get checklist settings#
POST/v1/org/checklists.settings.getRead
Returns the checklist settings: email_tasks (default true) — whether the daily reminder email tells each assignee about their checklist tasks on the due date and then once a week while they stay open. Owners, admins and HR.
- Who can call it
- Manage key owner admin hr
- MCP tool
org_checklists_settings_geton HR Assistant- Method
POSTwith a JSON body, orGETwith the input as query parameters
Input
No input: send {}.
Returns
email_tasksbooleanrequiredupdated_atstring | nullrequired
Errors
validation_failed unauthenticated forbidden not_found rate_limited internal
curl https://api.bizisy.com/v1/org/checklists.settings.get \
-H "Authorization: Bearer $BIZISY_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'const res = await fetch('https://api.bizisy.com/v1/org/checklists.settings.get', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.BIZISY_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({}),
});
const body = await res.json();
if (!res.ok) throw new Error(`${body.error.code}: ${body.error.message}`);
console.log(body.data);import os
import requests
res = requests.post(
"https://api.bizisy.com/v1/org/checklists.settings.get",
headers={"Authorization": f"Bearer {os.environ['BIZISY_API_KEY']}"},
json={},
)
body = res.json()
if not res.ok:
raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
print(body["data"]){
"data": {
"email_tasks": true,
"updated_at": null
}
}Change checklist settings#
POST/v1/org/checklists.settings.updateWrite
Turns the checklist task emails on or off (email_tasks). On: the daily reminder email lists each assignee’s due and overdue checklist tasks (on the due date, then once a week while open); HR tasks go to every owner, admin and HR member. Applies from the next daily run. Owners, admins and HR.
- Who can call it
- Manage key owner admin hr
- MCP tool
org_checklists_settings_updateon HR Assistant- Preview
?dry_run=trueruns every check and saves nothing- Retries
- An Idempotency-Key replays the first result
Input
email_tasksbooleanrequired
Returns
email_tasksbooleanrequiredupdated_atstring | nullrequired
Errors
validation_failed unauthenticated forbidden not_found conflict rate_limited internal
curl https://api.bizisy.com/v1/org/checklists.settings.update \
-H "Authorization: Bearer $BIZISY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"email_tasks":false}'const res = await fetch('https://api.bizisy.com/v1/org/checklists.settings.update', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.BIZISY_API_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID(),
},
body: JSON.stringify({
"email_tasks": false
}),
});
const body = await res.json();
if (!res.ok) throw new Error(`${body.error.code}: ${body.error.message}`);
console.log(body.data);import os, uuid
import requests
res = requests.post(
"https://api.bizisy.com/v1/org/checklists.settings.update",
headers={"Authorization": f"Bearer {os.environ['BIZISY_API_KEY']}", "Idempotency-Key": str(uuid.uuid4())},
json={
"email_tasks": False,
},
)
body = res.json()
if not res.ok:
raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
print(body["data"]){
"data": {
"email_tasks": false,
"updated_at": "2026-10-04T10:00:00.000Z"
}
}Something missing or wrong on this page? Write to hello@bizisy.com.