API reference
Activity
The record of every change, with who made it and through what.
2 actions · base URL https://api.bizisy.com/v1 · generated from the same definitions as the API.
List activity#
POST/v1/platform/activity.listRead
Lists Activity entries, newest first: every change made in Bizisy (and, for AI assistants, every preview and failed attempt), with who did it, through what (web or which API key), status (ok, dry_run = preview only, error), a one-line summary and links to what it touched. Owners, admins and HR (in Manage) see the whole organization; everyone else, and every call through the me audience, sees only their own activity. Filter by status, channel (ui, api, mcp, job), action_id, actor_user_id, or subject_id: entries about one record, e.g. a person id from org_people_list (changes to their profile, job, pay, invites and login link). Each entry lists subject_ids (ids only, never names). Page with before = next_before from the previous page; limit defaults to 50 (at most 100).
- Who can call it
- Manage key any Manage role
Me key anyone - MCP tool
platform_activity_liston My Workplace, HR Assistant- Method
POSTwith a JSON body, orGETwith the input as query parameters
Input
status"ok" | "dry_run" | "error"actor_user_idstringaction_idstringchannel"ui" | "api" | "mcp" | "job"subject_idstringA record id (e.g. a person id): only entries about it.
beforestring | nullAn entry id: return only entries older than it (next_before of the previous page).
limitintegerFrom 1 to 100. Default
50.
Returns
entriesobject[]required16 fields
idstringrequiredcreated_atstringrequiredaction_idstringrequiredaction_titlestringrequiredkind"read" | "write" | "destructive"requiredchannel"ui" | "api" | "mcp" | "job"requiredstatus"ok" | "dry_run" | "error"requireddry_runbooleanrequiredsummarystringrequiredactorobject | nullrequired5 fields
user_idstringrequiredperson_idstring | nullrequirednamestring | nullrequiredemailstring | nullrequiredcredentialobjectrequired4 fields
kind"session" | "api_key"requiredidstringrequirednamestring | nullrequiredappbooleanrequiredA connected app (signed in with OAuth) rather than an API key; name is the app's.
inputobject | nullrequiredinput_keysstring[] | nullrequirederrorobject | nullrequired2 fields
codestringrequiredmessagestringrequired
linksobject[]required2 fields
labelstringrequiredpathstringrequired
subject_idsstring[]requiredeventsstring[]required
next_beforestring | nullrequired
Errors
validation_failed unauthenticated forbidden not_found rate_limited internal
curl https://api.bizisy.com/v1/platform/activity.list \
-H "Authorization: Bearer $BIZISY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"actor_user_id": "u1",
"action_id": "org.people.hire",
"before": "01k0000000000000000000000a"
}'const res = await fetch('https://api.bizisy.com/v1/platform/activity.list', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.BIZISY_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"actor_user_id": "u1",
"action_id": "org.people.hire",
"before": "01k0000000000000000000000a"
}),
});
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/platform/activity.list",
headers={"Authorization": f"Bearer {os.environ['BIZISY_API_KEY']}"},
json={
"actor_user_id": "u1",
"action_id": "org.people.hire",
"before": "01k0000000000000000000000a",
},
)
body = res.json()
if not res.ok:
raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
print(body["data"]){
"data": {
"entries": [
{
"id": "01k0000000000000000000000a",
"created_at": "2026-10-04T10:00:00.000Z",
"action_id": "org.people.change_job",
"action_title": "Change a person's job (effective-dated)",
"kind": "write",
"channel": "mcp",
"status": "dry_run",
"dry_run": true,
"summary": "Changed a person's job (from 2026-11-01)",
"actor": {
"user_id": "usr1",
"person_id": "p1",
"name": "Ana Ferreira",
"email": "ana@acme.test",
"credential": {
"kind": "api_key",
"id": "k1",
"name": "Claude",
"app": false
}
},
"input": {
"person_id": "p1",
"title": "Lead"
},
"input_keys": null,
"error": null,
"links": [
{
"label": "Open person",
"path": "/manage/people/p1"
}
],
"subject_ids": [
"p1"
],
"events": [
"org.person.job_changed.v1"
]
}
],
"next_before": null
}
}Get an activity entry#
POST/v1/platform/activity.getRead
Returns one Activity entry by id (the id at the end of a view_url). Owners, admins and HR (in Manage) see the whole organization; everyone else, and every call through the me audience, sees only their own activity. not_found otherwise.
- Who can call it
- Manage key any Manage role
Me key anyone - MCP tool
platform_activity_geton My Workplace, HR Assistant- Method
POSTwith a JSON body, orGETwith the input as query parameters
Input
idstringrequired
Returns
16 fields
idstringrequiredcreated_atstringrequiredaction_idstringrequiredaction_titlestringrequiredkind"read" | "write" | "destructive"requiredchannel"ui" | "api" | "mcp" | "job"requiredstatus"ok" | "dry_run" | "error"requireddry_runbooleanrequiredsummarystringrequiredactorobject | nullrequired5 fields
user_idstringrequiredperson_idstring | nullrequirednamestring | nullrequiredemailstring | nullrequiredcredentialobjectrequired4 fields
kind"session" | "api_key"requiredidstringrequirednamestring | nullrequiredappbooleanrequiredA connected app (signed in with OAuth) rather than an API key; name is the app's.
inputobject | nullrequiredinput_keysstring[] | nullrequirederrorobject | nullrequired2 fields
codestringrequiredmessagestringrequired
linksobject[]required2 fields
labelstringrequiredpathstringrequired
subject_idsstring[]requiredeventsstring[]required
Errors
validation_failed unauthenticated forbidden not_found rate_limited internal
curl https://api.bizisy.com/v1/platform/activity.get \
-H "Authorization: Bearer $BIZISY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"id":"01k0000000000000000000000a"}'const res = await fetch('https://api.bizisy.com/v1/platform/activity.get', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.BIZISY_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"id": "01k0000000000000000000000a"
}),
});
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/platform/activity.get",
headers={"Authorization": f"Bearer {os.environ['BIZISY_API_KEY']}"},
json={
"id": "01k0000000000000000000000a",
},
)
body = res.json()
if not res.ok:
raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
print(body["data"]){
"data": {
"id": "01k0000000000000000000000a",
"created_at": "2026-10-04T10:00:00.000Z",
"action_id": "org.people.change_job",
"action_title": "Change a person's job (effective-dated)",
"kind": "write",
"channel": "mcp",
"status": "dry_run",
"dry_run": true,
"summary": "Changed a person's job (from 2026-11-01)",
"actor": {
"user_id": "usr1",
"person_id": "p1",
"name": "Ana Ferreira",
"email": "ana@acme.test",
"credential": {
"kind": "api_key",
"id": "k1",
"name": "Claude",
"app": false
}
},
"input": {
"person_id": "p1",
"title": "Lead"
},
"input_keys": null,
"error": null,
"links": [
{
"label": "Open person",
"path": "/manage/people/p1"
}
],
"subject_ids": [
"p1"
],
"events": [
"org.person.job_changed.v1"
]
}
}Something missing or wrong on this page? Write to hello@bizisy.com.