API reference
Self-service
A person's own profile, team, photo and data export (Me keys).
6 actions · base URL https://api.bizisy.com/v1 · generated from the same definitions as the API.
My profile#
POST/v1/org/me.getRead
Returns your own person record: profile (including private fields), current job, manager, reports and job history. Start here for anything about "me".
- Who can call it
- Me key anyone
- MCP tool
org_me_geton My Workplace- Method
POSTwith a JSON body, orGETwith the input as query parameters
Input
No input: send {}.
Returns
30 fields
idstringrequirednamestringrequiredgiven_namestringrequiredfamily_namestringrequiredpreferred_namestring | nullrequiredwork_emailstringrequiredtitlestring | nullrequiredstatus"pre_hire" | "active" | "terminated" | "none"requiredstart_datestring | nullrequiredunitobject | nullrequired2 fields
idstringrequirednamestringrequired
locationobject | nullrequired2 fields
idstringrequirednamestringrequired
managerobject | nullrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
invitedbooleanrequiredhas_loginbooleanrequiredphoto_urlstring | nullrequiredpronounsstring | nullrequiredwork_phonestring | nullrequiredpersonal_emailstring | nullrequiredpersonal_phonestring | nullrequiredaddressobject | nullrequired5 fields
line1stringrequiredline2stringcitystringrequiredpostal_codestringcountrystringrequired
birthdaystring | nullrequiredemergency_contactsobject[] | nullrequired3 fields
namestringrequiredrelationshipstringrequiredphonestringrequired
tax_idstring | nullrequiredsocial_security_numberstring | nullrequiredibanstring | nullrequiredcustomobject[]required6 fields
keystringrequiredlabelstringrequiredtype"text" | "number" | "date" | "select" | "boolean" | "file"requiredtier"public" | "job" | "private"requiredvaluestring | number | booleanrequiredFor type file: the document id (download it with
documents_downloadordocuments_me_download); over an API key or MCP, "attached" for someone else's file.fileobject | nullType file only: the file, or null when none is attached.
4 fields
namestring | nullrequiredThe file name; null over an API key or MCP for someone else's file.
sizeintegerrequiredcontent_typestringrequiredpreviewablebooleanrequiredThe web app can show it (PDF, PNG, JPEG, WebP).
jobobject | nullrequired17 fields
idstringrequiredvalid_fromstringrequiredvalid_tostring | nullrequiredtitlestringrequiredunitobject | nullrequired2 fields
idstringrequirednamestringrequired
managerobject | nullrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
locationobject | nullrequired2 fields
idstringrequirednamestringrequired
legal_entityobject | nullrequired2 fields
idstringrequirednamestringrequired
employment_type"full_time" | "part_time" | "contractor" | "intern"requiredftenumberrequiredreasonstringrequiredend_reasonstring | nullrequiredcontract_type"permanent" | "fixed_term" | "temporary" | "internship" | "freelance"requiredcontract_end_datestring | nullrequiredprobation_end_datestring | nullrequiredweekly_hoursnumber | nullrequirednotice_period_daysinteger | nullrequired
historyobject[] | nullrequired17 fields
idstringrequiredvalid_fromstringrequiredvalid_tostring | nullrequiredtitlestringrequiredunitobject | nullrequired2 fields
idstringrequirednamestringrequired
managerobject | nullrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
locationobject | nullrequired2 fields
idstringrequirednamestringrequired
legal_entityobject | nullrequired2 fields
idstringrequirednamestringrequired
employment_type"full_time" | "part_time" | "contractor" | "intern"requiredftenumberrequiredreasonstringrequiredend_reasonstring | nullrequiredcontract_type"permanent" | "fixed_term" | "temporary" | "internship" | "freelance"requiredcontract_end_datestring | nullrequiredprobation_end_datestring | nullrequiredweekly_hoursnumber | nullrequirednotice_period_daysinteger | nullrequired
reportsobject[]required4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
visible_tiers"public" | "private" | "job" | "pay"[]required
Errors
validation_failed unauthenticated forbidden not_found rate_limited internal
curl https://api.bizisy.com/v1/org/me.get \
-H "Authorization: Bearer $BIZISY_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'const res = await fetch('https://api.bizisy.com/v1/org/me.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/me.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": {
"id": "p1",
"name": "Ana Ferreira",
"given_name": "Ana",
"family_name": "Ferreira",
"preferred_name": null,
"work_email": "ana@acme.test",
"title": "Engineer",
"status": "active",
"start_date": "2024-01-15",
"unit": {
"id": "u2",
"name": "Engineering"
},
"location": {
"id": "l1",
"name": "Head office"
},
"manager": {
"id": "p2",
"name": "Rui Costa",
"title": "CTO",
"photo_url": "https://acme.bizisy.com/api/photos/people/p2?v=01k0000000000000000000000b"
},
"invited": true,
"has_login": true,
"photo_url": null,
"pronouns": "she/her",
"work_phone": "+351 210 000 000",
"personal_email": null,
"personal_phone": null,
"address": {
"line1": "Rua Augusta 100",
"city": "Lisboa",
"country": "PT"
},
"birthday": "1990-04-10",
"emergency_contacts": [
{
"name": "Rui",
"relationship": "Partner",
"phone": "+351 911 000 000"
}
],
"tax_id": "123456789",
"social_security_number": null,
"iban": "PT50000201231234567890154",
"custom": [
{
"key": "t_shirt_size",
"label": "T-shirt size",
"type": "select",
"tier": "public",
"value": "M"
},
{
"key": "remote",
"label": "Remote allowance",
"type": "boolean",
"tier": "job",
"value": null
},
{
"key": "driving_licence",
"label": "Driving licence",
"type": "file",
"tier": "private",
"value": "d5",
"file": {
"name": "Licence.pdf",
"size": 182000,
"content_type": "application/pdf",
"previewable": true
}
}
],
"job": {
"id": "j1",
"valid_from": "2024-01-15",
"valid_to": null,
"title": "Engineer",
"unit": {
"id": "u2",
"name": "Engineering"
},
"manager": {
"id": "p2",
"name": "Rui Costa",
"title": "CTO",
"photo_url": "https://acme.bizisy.com/api/photos/people/p2?v=01k0000000000000000000000b"
},
"location": {
"id": "l1",
"name": "Head office"
},
"legal_entity": {
"id": "e1",
"name": "Acme Lda"
},
"employment_type": "full_time",
"fte": 1,
"reason": "hire",
"end_reason": null,
"contract_type": "fixed_term",
"contract_end_date": "2026-01-14",
"probation_end_date": "2024-07-14",
"weekly_hours": 40,
"notice_period_days": 30
},
"history": null,
"reports": [],
"visible_tiers": [
"public",
"private",
"job",
"pay"
]
}
}Update my profile#
POST/v1/org/me.updateWrite
Updates your own self-editable fields: preferred_name, pronouns, work_phone, personal_email, personal_phone, address ({line1, line2?, city, postal_code?, country}), birthday (YYYY-MM-DD) and emergency_contacts (up to 5 of {name, relationship, phone}; the list replaces the old one). Payroll details (tax_id, social_security_number, iban) can only be changed by signing in to Bizisy, never over MCP or an API key. Send only what changes; null clears. Names, work email and job fields are changed by HR. Use dry_run first and confirm with the user.
- Who can call it
- Me key anyone
- Keys and apps
- Payroll details (tax_id, social_security_number, iban) are refused.
- MCP tool
org_me_updateon 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
preferred_namestring | null1–100 characters.
pronounsstring | nullUp to 40 characters.
work_phonestring | nullPattern
^\+?[0-9 ().-]{3,40}$.personal_emailany | nullpersonal_phonestring | nullPattern
^\+?[0-9 ().-]{3,40}$.addressobject | null5 fields
line1stringrequired1–200 characters.
line2stringUp to 200 characters.
citystringrequired1–100 characters.
postal_codestringUp to 20 characters.
countryanyrequired
birthdaystring | nullemergency_contactsobject[]Up to 5 items.
3 fields
namestringrequired1–100 characters.
relationshipstringrequired1–60 characters.
phonestringrequiredPattern
^\+?[0-9 ().-]{3,40}$.
tax_idstring | nullPattern
^[A-Za-z0-9 ./-]{1,40}$.social_security_numberstring | nullPattern
^[A-Za-z0-9 ./-]{1,40}$.ibanany | null
Returns
30 fields
idstringrequirednamestringrequiredgiven_namestringrequiredfamily_namestringrequiredpreferred_namestring | nullrequiredwork_emailstringrequiredtitlestring | nullrequiredstatus"pre_hire" | "active" | "terminated" | "none"requiredstart_datestring | nullrequiredunitobject | nullrequired2 fields
idstringrequirednamestringrequired
locationobject | nullrequired2 fields
idstringrequirednamestringrequired
managerobject | nullrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
invitedbooleanrequiredhas_loginbooleanrequiredphoto_urlstring | nullrequiredpronounsstring | nullrequiredwork_phonestring | nullrequiredpersonal_emailstring | nullrequiredpersonal_phonestring | nullrequiredaddressobject | nullrequired5 fields
line1stringrequiredline2stringcitystringrequiredpostal_codestringcountrystringrequired
birthdaystring | nullrequiredemergency_contactsobject[] | nullrequired3 fields
namestringrequiredrelationshipstringrequiredphonestringrequired
tax_idstring | nullrequiredsocial_security_numberstring | nullrequiredibanstring | nullrequiredcustomobject[]required6 fields
keystringrequiredlabelstringrequiredtype"text" | "number" | "date" | "select" | "boolean" | "file"requiredtier"public" | "job" | "private"requiredvaluestring | number | booleanrequiredFor type file: the document id (download it with
documents_downloadordocuments_me_download); over an API key or MCP, "attached" for someone else's file.fileobject | nullType file only: the file, or null when none is attached.
4 fields
namestring | nullrequiredThe file name; null over an API key or MCP for someone else's file.
sizeintegerrequiredcontent_typestringrequiredpreviewablebooleanrequiredThe web app can show it (PDF, PNG, JPEG, WebP).
jobobject | nullrequired17 fields
idstringrequiredvalid_fromstringrequiredvalid_tostring | nullrequiredtitlestringrequiredunitobject | nullrequired2 fields
idstringrequirednamestringrequired
managerobject | nullrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
locationobject | nullrequired2 fields
idstringrequirednamestringrequired
legal_entityobject | nullrequired2 fields
idstringrequirednamestringrequired
employment_type"full_time" | "part_time" | "contractor" | "intern"requiredftenumberrequiredreasonstringrequiredend_reasonstring | nullrequiredcontract_type"permanent" | "fixed_term" | "temporary" | "internship" | "freelance"requiredcontract_end_datestring | nullrequiredprobation_end_datestring | nullrequiredweekly_hoursnumber | nullrequirednotice_period_daysinteger | nullrequired
historyobject[] | nullrequired17 fields
idstringrequiredvalid_fromstringrequiredvalid_tostring | nullrequiredtitlestringrequiredunitobject | nullrequired2 fields
idstringrequirednamestringrequired
managerobject | nullrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
locationobject | nullrequired2 fields
idstringrequirednamestringrequired
legal_entityobject | nullrequired2 fields
idstringrequirednamestringrequired
employment_type"full_time" | "part_time" | "contractor" | "intern"requiredftenumberrequiredreasonstringrequiredend_reasonstring | nullrequiredcontract_type"permanent" | "fixed_term" | "temporary" | "internship" | "freelance"requiredcontract_end_datestring | nullrequiredprobation_end_datestring | nullrequiredweekly_hoursnumber | nullrequirednotice_period_daysinteger | nullrequired
reportsobject[]required4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
visible_tiers"public" | "private" | "job" | "pay"[]required
Errors
validation_failed unauthenticated forbidden not_found conflict rate_limited internal
curl https://api.bizisy.com/v1/org/me.update \
-H "Authorization: Bearer $BIZISY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"preferred_name": null,
"pronouns": "she/her",
"work_phone": "+351 912",
"personal_email": null,
"personal_phone": null,
"birthday": null,
"address": {
"line1": "Rua Augusta 100",
"city": "Lisboa",
"country": "PT"
},
"emergency_contacts": [
{
"name": "Rui",
"relationship": "Partner",
"phone": "+351 911"
}
]
}'const res = await fetch('https://api.bizisy.com/v1/org/me.update', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.BIZISY_API_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID(),
},
body: JSON.stringify({
"preferred_name": null,
"pronouns": "she/her",
"work_phone": "+351 912",
"personal_email": null,
"personal_phone": null,
"birthday": null,
"address": {
"line1": "Rua Augusta 100",
"city": "Lisboa",
"country": "PT"
},
"emergency_contacts": [
{
"name": "Rui",
"relationship": "Partner",
"phone": "+351 911"
}
]
}),
});
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/me.update",
headers={"Authorization": f"Bearer {os.environ['BIZISY_API_KEY']}", "Idempotency-Key": str(uuid.uuid4())},
json={
"preferred_name": None,
"pronouns": "she/her",
"work_phone": "+351 912",
"personal_email": None,
"personal_phone": None,
"birthday": None,
"address": {
"line1": "Rua Augusta 100",
"city": "Lisboa",
"country": "PT",
},
"emergency_contacts": [
{
"name": "Rui",
"relationship": "Partner",
"phone": "+351 911",
},
],
},
)
body = res.json()
if not res.ok:
raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
print(body["data"]){
"data": {
"id": "p1",
"name": "Ana Ferreira",
"given_name": "Ana",
"family_name": "Ferreira",
"preferred_name": null,
"work_email": "ana@acme.test",
"title": "Engineer",
"status": "active",
"start_date": "2024-01-15",
"unit": {
"id": "u2",
"name": "Engineering"
},
"location": {
"id": "l1",
"name": "Head office"
},
"manager": {
"id": "p2",
"name": "Rui Costa",
"title": "CTO",
"photo_url": "https://acme.bizisy.com/api/photos/people/p2?v=01k0000000000000000000000b"
},
"invited": true,
"has_login": true,
"photo_url": null,
"pronouns": "she/her",
"work_phone": "+351 912",
"personal_email": null,
"personal_phone": null,
"address": {
"line1": "Rua Augusta 100",
"city": "Lisboa",
"country": "PT"
},
"birthday": "1990-04-10",
"emergency_contacts": [
{
"name": "Rui",
"relationship": "Partner",
"phone": "+351 911 000 000"
}
],
"tax_id": "123456789",
"social_security_number": null,
"iban": "PT50000201231234567890154",
"custom": [
{
"key": "t_shirt_size",
"label": "T-shirt size",
"type": "select",
"tier": "public",
"value": "M"
},
{
"key": "remote",
"label": "Remote allowance",
"type": "boolean",
"tier": "job",
"value": null
},
{
"key": "driving_licence",
"label": "Driving licence",
"type": "file",
"tier": "private",
"value": "d5",
"file": {
"name": "Licence.pdf",
"size": 182000,
"content_type": "application/pdf",
"previewable": true
}
}
],
"job": {
"id": "j1",
"valid_from": "2024-01-15",
"valid_to": null,
"title": "Engineer",
"unit": {
"id": "u2",
"name": "Engineering"
},
"manager": {
"id": "p2",
"name": "Rui Costa",
"title": "CTO",
"photo_url": "https://acme.bizisy.com/api/photos/people/p2?v=01k0000000000000000000000b"
},
"location": {
"id": "l1",
"name": "Head office"
},
"legal_entity": {
"id": "e1",
"name": "Acme Lda"
},
"employment_type": "full_time",
"fte": 1,
"reason": "hire",
"end_reason": null,
"contract_type": "fixed_term",
"contract_end_date": "2026-01-14",
"probation_end_date": "2024-07-14",
"weekly_hours": 40,
"notice_period_days": 30
},
"history": [
{
"id": "j1",
"valid_from": "2024-01-15",
"valid_to": null,
"title": "Engineer",
"unit": {
"id": "u2",
"name": "Engineering"
},
"manager": {
"id": "p2",
"name": "Rui Costa",
"title": "CTO",
"photo_url": "https://acme.bizisy.com/api/photos/people/p2?v=01k0000000000000000000000b"
},
"location": {
"id": "l1",
"name": "Head office"
},
"legal_entity": {
"id": "e1",
"name": "Acme Lda"
},
"employment_type": "full_time",
"fte": 1,
"reason": "hire",
"end_reason": null,
"contract_type": "fixed_term",
"contract_end_date": "2026-01-14",
"probation_end_date": "2024-07-14",
"weekly_hours": 40,
"notice_period_days": 30
}
],
"reports": [],
"visible_tiers": [
"public",
"private",
"job",
"pay"
]
}
}My team#
POST/v1/org/me.teamRead
Returns your manager, your peers (people with the same manager) and your direct reports, as of today.
- Who can call it
- Me key anyone
- MCP tool
org_me_teamon My Workplace- Method
POSTwith a JSON body, orGETwith the input as query parameters
Input
No input: send {}.
Returns
managerobject | nullrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
peersobject[]required4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
reportsobject[]required4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
Errors
validation_failed unauthenticated forbidden not_found rate_limited internal
curl https://api.bizisy.com/v1/org/me.team \
-H "Authorization: Bearer $BIZISY_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'const res = await fetch('https://api.bizisy.com/v1/org/me.team', {
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/me.team",
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": {
"manager": null,
"peers": [
{
"id": "p2",
"name": "Rui Costa",
"title": "CTO",
"photo_url": "https://acme.bizisy.com/api/photos/people/p2?v=01k0000000000000000000000b"
}
],
"reports": []
}
}Export my data#
POST/v1/org/me.export_dataRead
Returns everything Bizisy holds about you in this organization as JSON (your right of access): profile, profile photo (base64), the documents shared with you (metadata, plus document_files: 5-minute download links), job history, pay history, invites, your logins, API keys (names and dates, never secrets), your Activity, open positions you filled or are recorded as replaced in (those you may see), decided change requests about you (approvals), your checklists (about you, tasks assigned to you, and your comments) and webhook deliveries about you in the last 30 days.
- Who can call it
- Me key anyone
- MCP tool
org_me_export_dataon My Workplace- Method
POSTwith a JSON body, orGETwith the input as query parameters
Input
No input: send {}.
Returns
22 fields
format"bizisy.person-data.v1"requiredgenerated_atstringrequiredorganization_idstringrequiredpersonobjectrequiredphotoobject | nullrequired3 fields
content_typestringrequireddata_base64stringrequiredupdated_atstringrequired
jobsobject[]required17 fields
idstringrequiredvalid_fromstringrequiredvalid_tostring | nullrequiredtitlestringrequiredunitobject | nullrequired2 fields
idstringrequirednamestringrequired
managerobject | nullrequired4 fields
idstringrequirednamestringrequiredtitlestring | nullrequiredphoto_urlstring | nullrequired
locationobject | nullrequired2 fields
idstringrequirednamestringrequired
legal_entityobject | nullrequired2 fields
idstringrequirednamestringrequired
employment_type"full_time" | "part_time" | "contractor" | "intern"requiredftenumberrequiredreasonstringrequiredend_reasonstring | nullrequiredcontract_type"permanent" | "fixed_term" | "temporary" | "internship" | "freelance"requiredcontract_end_datestring | nullrequiredprobation_end_datestring | nullrequiredweekly_hoursnumber | nullrequirednotice_period_daysinteger | nullrequired
payobject[]required8 fields
idstringrequiredvalid_fromstringrequiredvalid_tostring | nullrequiredamountnumberrequiredcurrencystringrequiredperiod"year" | "month" | "hour"requirednotestring | nullrequiredcreated_atstringrequired
invitesobject[]required6 fields
emailstringrequiredrolestringrequiredcreated_atstringrequiredexpires_atstringrequiredaccepted_atstring | nullrequiredrevoked_atstring | nullrequired
loginsobject[]requiredapi_keysobject[]requiredconnected_appsobject[]requiredactivityobject[]requiredactivity_truncatedbooleanrequirednotificationsobject[]required3 fields
typestringrequiredcreated_atstringrequiredread_atstring | nullrequired
remindersobject[]required3 fields
kindstringrequireddatestringrequiredsent_atstringrequired
positionsobject[]required4 fields
idstringrequiredtitlestringrequiredstatusstringrequiredrole"filled" | "replaced"required
approvalsobject[]requiredchecklistsobjectrequired5 fields
about_youobject[]required6 fields
namestringrequiredkindstringrequiredstatusstringrequiredanchor_datestringrequiredstarted_atstringrequiredtasksobject[]required6 fields
titlestringrequireddue_datestringrequiredstatusstringrequiredskip_reasonstring | nullrequiredresolved_atstring | nullrequiredcommentsobject[]required3 fields
textstringrequiredatstringrequiredby_youbooleanrequired
assigned_to_youobject[]required5 fields
checkliststringrequiredtitlestringrequireddue_datestringrequiredstatusstringrequiredresolved_atstring | nullrequired
your_commentsobject[]required4 fields
checkliststringrequiredtaskstringrequiredtextstringrequiredatstringrequired
resolved_by_youobject[]required5 fields
checkliststringrequiredtaskstringrequiredstatusstringrequiredskip_reasonstring | nullrequiredresolved_atstring | nullrequired
template_tasksobject[]required2 fields
templatestringrequiredtaskstringrequired
webhook_deliveriesobject[]required4 fields
event_typestringrequiredendpoint_hoststringrequiredcreated_atstringrequiredstatusstringrequired
documentsobject[]requireddocument_filesobject[]required2 fields
namestringrequiredurlstringrequired
filenamestringrequired
Errors
validation_failed unauthenticated forbidden not_found rate_limited internal
curl https://api.bizisy.com/v1/org/me.export_data \
-H "Authorization: Bearer $BIZISY_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'const res = await fetch('https://api.bizisy.com/v1/org/me.export_data', {
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/me.export_data",
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": {
"format": "bizisy.person-data.v1",
"generated_at": "2026-10-04T10:00:00.000Z",
"organization_id": "o1",
"filename": "my-data-2026-10-04.json",
"person": {
"id": "p1",
"name": "Ana Ferreira"
},
"photo": {
"content_type": "image/webp",
"data_base64": "UklGRg==",
"updated_at": "2026-10-04T10:00:00.000Z"
},
"jobs": [
{
"id": "j1",
"valid_from": "2024-01-15",
"valid_to": null,
"title": "Engineer",
"unit": {
"id": "u2",
"name": "Engineering"
},
"manager": {
"id": "p2",
"name": "Rui Costa",
"title": "CTO",
"photo_url": "https://acme.bizisy.com/api/photos/people/p2?v=01k0000000000000000000000b"
},
"location": {
"id": "l1",
"name": "Head office"
},
"legal_entity": {
"id": "e1",
"name": "Acme Lda"
},
"employment_type": "full_time",
"fte": 1,
"reason": "hire",
"end_reason": null,
"contract_type": "fixed_term",
"contract_end_date": "2026-01-14",
"probation_end_date": "2024-07-14",
"weekly_hours": 40,
"notice_period_days": 30
}
],
"pay": [
{
"id": "pay1",
"valid_from": "2024-01-15",
"valid_to": null,
"amount": 42000,
"currency": "EUR",
"period": "year",
"note": null,
"created_at": "2026-10-04T10:00:00.000Z"
}
],
"invites": [
{
"email": "ana@acme.test",
"role": "member",
"created_at": "2026-10-04T10:00:00.000Z",
"expires_at": "2026-10-18T10:00:00.000Z",
"accepted_at": null,
"revoked_at": null
}
],
"logins": [
{
"email": "ana@acme.test",
"roles": [
"hr"
]
}
],
"api_keys": [],
"connected_apps": [
{
"app": "Claude",
"access": "me"
}
],
"activity": [
{
"at": "2026-10-04T10:00:00.000Z",
"summary": "Updated your profile"
}
],
"activity_truncated": false,
"notifications": [
{
"type": "approval_request",
"created_at": "2026-10-04T10:00:00.000Z",
"read_at": null
}
],
"reminders": [
{
"kind": "probation_end",
"date": "2024-07-14",
"sent_at": "2024-06-30T06:00:00.000Z"
}
],
"positions": [
{
"id": "pos1",
"title": "Engineer",
"status": "filled",
"role": "filled"
}
],
"approvals": [
{
"kind": "job_change",
"status": "approved",
"effective_date": "2026-11-01",
"proposed_at": "2026-10-04T10:00:00.000Z",
"closed_at": "2026-10-05T09:00:00.000Z",
"change": {
"title": "Senior Engineer"
},
"steps": [
{
"role": "hr",
"state": "approved",
"decided_at": "2026-10-05T09:00:00.000Z",
"comment": null,
"automatic": false
}
]
}
],
"checklists": {
"about_you": [
{
"name": "Onboarding",
"kind": "onboarding",
"status": "completed",
"anchor_date": "2024-03-04",
"started_at": "2024-02-20T10:00:00.000Z",
"tasks": [
{
"title": "Complete your profile",
"due_date": "2024-03-04",
"status": "done",
"skip_reason": null,
"resolved_at": "2024-03-04T09:00:00.000Z",
"comments": [
{
"text": "Done on day one",
"at": "2024-03-04T09:00:00.000Z",
"by_you": true
}
]
}
]
}
],
"assigned_to_you": [
{
"checklist": "Onboarding",
"title": "Plan the first week",
"due_date": "2026-10-31",
"status": "open",
"resolved_at": null
}
],
"your_comments": [
{
"checklist": "Onboarding",
"task": "Plan the first week",
"text": "Agenda shared",
"at": "2026-10-04T10:00:00.000Z"
}
],
"resolved_by_you": [
{
"checklist": "Onboarding",
"task": "Plan the first week",
"status": "done",
"skip_reason": null,
"resolved_at": "2026-10-04T10:00:00.000Z"
}
],
"template_tasks": [
{
"template": "IT onboarding",
"task": "Laptop"
}
]
},
"webhook_deliveries": [
{
"event_type": "person.hired",
"endpoint_host": "hooks.example.com",
"created_at": "2026-10-04T10:01:00.000Z",
"status": "succeeded"
}
],
"documents": [
{
"id": "d1",
"title": "Contract 2026",
"category": "Contract",
"file": "documents/people/p1/d1-Contract 2026.pdf"
}
],
"document_files": [
{
"name": "documents/people/p1/d1-Contract 2026.pdf",
"url": "https://storage.googleapis.com/b/orgs/o1/files/d1?X-Goog-Signature=x"
}
]
}
}Upload my photo#
POST/v1/org/me.photo.uploadWrite
Sets your own profile photo. The image (image_base64: the file as base64) must be a JPEG, PNG or WebP of at most 2 MB and 24 megapixels (over MCP the request is limited to 2 MiB, so about 1.5 MB; send larger files through the REST API); the server checks the bytes, centre-crops it to a square, re-encodes it as a 512×512 WebP and drops all metadata (EXIF, location). A new upload replaces the old photo. The photo is visible to everyone in the organization who can see the person (public tier, also over the API and MCP as photo_url); never outside it. Returns the new photo_url. Errors: not_found when your login is not linked to a person, validation_failed for a bad image, rate_limited when the server is busy with other images (retry in a few seconds). Use dry_run first and confirm with the user.
- Who can call it
- Me key anyone
- MCP tool
org_me_photo_uploadon 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
- Body limit
- 3 MiB (other actions: 2 MiB)
Input
image_base64stringrequiredThe image file as base64 (a data: URL is accepted): JPEG, PNG or WebP, at most 2 MB. Square images work best; the server centre-crops.
1–2900000 characters.
Returns
person_idstringrequiredphoto_urlstring | nullrequired
Errors
validation_failed unauthenticated forbidden not_found conflict payload_too_large rate_limited internal
curl https://api.bizisy.com/v1/org/me.photo.upload \
-H "Authorization: Bearer $BIZISY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"image_base64":"UklGRg=="}'const res = await fetch('https://api.bizisy.com/v1/org/me.photo.upload', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.BIZISY_API_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID(),
},
body: JSON.stringify({
"image_base64": "UklGRg=="
}),
});
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/me.photo.upload",
headers={"Authorization": f"Bearer {os.environ['BIZISY_API_KEY']}", "Idempotency-Key": str(uuid.uuid4())},
json={
"image_base64": "UklGRg==",
},
)
body = res.json()
if not res.ok:
raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
print(body["data"]){
"data": {
"person_id": "p1",
"photo_url": "https://acme.bizisy.com/api/photos/people/p1?v=01k0000000000000000000000d"
}
}Remove my photo#
POST/v1/org/me.photo.removeDestructive
Deletes your own profile photo; your initials show instead. Succeeds when there is no photo.
- Who can call it
- Me key anyone
- MCP tool
org_me_photo_removeon 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
No input: send {}.
Returns
person_idstringrequiredphoto_urlstring | nullrequired
Errors
validation_failed unauthenticated forbidden not_found conflict rate_limited internal
curl https://api.bizisy.com/v1/org/me.photo.remove \
-H "Authorization: Bearer $BIZISY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{}'const res = await fetch('https://api.bizisy.com/v1/org/me.photo.remove', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.BIZISY_API_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID(),
},
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, uuid
import requests
res = requests.post(
"https://api.bizisy.com/v1/org/me.photo.remove",
headers={"Authorization": f"Bearer {os.environ['BIZISY_API_KEY']}", "Idempotency-Key": str(uuid.uuid4())},
json={},
)
body = res.json()
if not res.ok:
raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
print(body["data"]){
"data": {
"person_id": "p1",
"photo_url": null
}
}Something missing or wrong on this page? Write to hello@bizisy.com.