API reference
Company settings
Colours and logo, sign-in methods, company language, account status and storage.
10 actions · base URL https://api.bizisy.com/v1 · generated from the same definitions as the API.
See the organization colours, sidebar style and logo#
POST/v1/platform/appearance.getRead
Returns the colour palette (emerald, violet, indigo, ocean, amber, rose, graphite or terracotta), the sidebar style (ink = dark sidebar, light = light sidebar tinted with the palette), the company logo (logo_url: a path on the company address, null without one) and whether photos and logos can be uploaded on this server (photos_available).
- Who can call it
- Manage key any Manage role
Me key anyone - MCP tool
platform_appearance_geton My Workplace, HR Assistant- Method
POSTwith a JSON body, orGETwith the input as query parameters
Input
No input: send {}.
Returns
palettestring (enum)requiredOne of:
emerald,violet,indigo,ocean,amber,rose,graphite,terracotta.shell"ink" | "light"requiredlogo_urlstring | nullrequiredphotos_availablebooleanrequired
Errors
validation_failed unauthenticated forbidden not_found rate_limited internal
curl https://api.bizisy.com/v1/platform/appearance.get \
-H "Authorization: Bearer $BIZISY_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'const res = await fetch('https://api.bizisy.com/v1/platform/appearance.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/platform/appearance.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": {
"palette": "emerald",
"shell": "ink",
"logo_url": "https://acme.bizisy.com/api/org/logo?v=01k0000000000000000000000c",
"photos_available": true
}
}Change the organization colours and sidebar style#
POST/v1/platform/appearance.setWrite
Changes the colour palette and/or the sidebar style used by every page of the organization. Palette: emerald (default), violet, indigo, ocean, amber, rose, graphite, terracotta. Sidebar style: ink (default, dark sidebar) or light (light sidebar tinted with the palette). Send only the fields to change; the other keeps its value. Owners and admins only. The logo has its own actions (platform_appearance_logo_upload / remove).
- Who can call it
- Manage key owner admin
- MCP tool
platform_appearance_seton HR Assistant- Preview
?dry_run=trueruns every check and saves nothing- Retries
- An Idempotency-Key replays the first result
Input
palettestring (enum)Accent colour: emerald (default), violet, indigo, ocean, amber, rose, graphite or terracotta.
One of:
emerald,violet,indigo,ocean,amber,rose,graphite,terracotta.shell"ink" | "light"Sidebar style: ink (default, dark sidebar) or light (light sidebar tinted with the palette).
Returns
palettestring (enum)requiredOne of:
emerald,violet,indigo,ocean,amber,rose,graphite,terracotta.shell"ink" | "light"requiredlogo_urlstring | nullrequiredphotos_availablebooleanrequired
Errors
validation_failed unauthenticated forbidden not_found conflict rate_limited internal
curl https://api.bizisy.com/v1/platform/appearance.set \
-H "Authorization: Bearer $BIZISY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"palette":"ocean","shell":"ink"}'const res = await fetch('https://api.bizisy.com/v1/platform/appearance.set', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.BIZISY_API_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID(),
},
body: JSON.stringify({
"palette": "ocean",
"shell": "ink"
}),
});
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/platform/appearance.set",
headers={"Authorization": f"Bearer {os.environ['BIZISY_API_KEY']}", "Idempotency-Key": str(uuid.uuid4())},
json={
"palette": "ocean",
"shell": "ink",
},
)
body = res.json()
if not res.ok:
raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
print(body["data"]){
"data": {
"palette": "ocean",
"shell": "ink",
"logo_url": null,
"photos_available": true
}
}Upload the company logo#
POST/v1/platform/appearance.logo.uploadWrite
Sets the company logo, shown in the sidebar of every page and on the sign-in and invite pages (which anyone who opens the company address can see). 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 about 1.5 MB fits; larger files go through the REST API); the server checks the bytes, fits the whole logo on a transparent square, re-encodes it as a 512×512 WebP and drops all metadata. A new upload replaces the old logo. Owners and admins only. Returns logo_url. Use dry_run to check the image without saving it. rate_limited means the server is busy with other images: retry in a few seconds.
- Who can call it
- Manage key owner admin
- MCP tool
platform_appearance_logo_uploadon 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
- Body limit
- 3 MiB (other actions: 2 MiB)
Input
image_base64stringrequiredThe logo file as base64 (a data: URL is accepted): JPEG, PNG or WebP, at most 2 MB.
1–2900000 characters.
Returns
logo_urlstring | nullrequired
Errors
validation_failed unauthenticated forbidden not_found conflict payload_too_large rate_limited internal
curl https://api.bizisy.com/v1/platform/appearance.logo.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/platform/appearance.logo.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/platform/appearance.logo.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": {
"logo_url": "https://acme.bizisy.com/api/org/logo?v=01k0000000000000000000000c"
}
}Remove the company logo#
POST/v1/platform/appearance.logo.removeDestructive
Deletes the company logo; the sidebar and sign-in page show the coloured mark again. Succeeds when there is no logo. Owners and admins only.
- Who can call it
- Manage key owner admin
- MCP tool
platform_appearance_logo_removeon 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
No input: send {}.
Returns
logo_urlstring | nullrequired
Errors
validation_failed unauthenticated forbidden not_found conflict rate_limited internal
curl https://api.bizisy.com/v1/platform/appearance.logo.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/platform/appearance.logo.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/platform/appearance.logo.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": {
"logo_url": null
}
}See which sign-in methods are on#
POST/v1/platform/sign_in.getRead
Returns the organization's sign-in methods (methods.password, methods.google, methods.microsoft), each with on (the organization's own choice, enforced on every new sign-in), available (Bizisy offers it at all; password always), linked (how many active members' own logins use it today) and privileged_only (owners and admins who sign in only with it). People can sign in with a method that is on and available. Use linked and privileged_only to tell the user who a change affects. Owners and admins only.
- Who can call it
- Manage key owner admin
- MCP tool
platform_sign_in_geton HR Assistant- Method
POSTwith a JSON body, orGETwith the input as query parameters
Input
No input: send {}.
Returns
methodsobjectrequired3 fields
passwordobjectrequired4 fields
onbooleanrequiredThe organization's own choice: true = turned on here. Enforced on every new sign-in.
availablebooleanrequiredBizisy offers this method at all (password always). People can only use a method that is on AND available.
linkedintegerrequiredActive members whose own login uses this method today.
privileged_onlyintegerrequiredOwners and admins who sign in ONLY with this method (turning it off locks them out).
googleobjectrequired4 fields
onbooleanrequiredThe organization's own choice: true = turned on here. Enforced on every new sign-in.
availablebooleanrequiredBizisy offers this method at all (password always). People can only use a method that is on AND available.
linkedintegerrequiredActive members whose own login uses this method today.
privileged_onlyintegerrequiredOwners and admins who sign in ONLY with this method (turning it off locks them out).
microsoftobjectrequired4 fields
onbooleanrequiredThe organization's own choice: true = turned on here. Enforced on every new sign-in.
availablebooleanrequiredBizisy offers this method at all (password always). People can only use a method that is on AND available.
linkedintegerrequiredActive members whose own login uses this method today.
privileged_onlyintegerrequiredOwners and admins who sign in ONLY with this method (turning it off locks them out).
Errors
validation_failed unauthenticated forbidden not_found rate_limited internal
curl https://api.bizisy.com/v1/platform/sign_in.get \
-H "Authorization: Bearer $BIZISY_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'const res = await fetch('https://api.bizisy.com/v1/platform/sign_in.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/platform/sign_in.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": {
"methods": {
"password": {
"on": true,
"available": true,
"linked": 12,
"privileged_only": 2
},
"google": {
"on": true,
"available": true,
"linked": 4,
"privileged_only": 0
},
"microsoft": {
"on": true,
"available": false,
"linked": 0,
"privileged_only": 0
}
}
}
}Turn sign-in methods on or off#
POST/v1/platform/sign_in.setWrite
Turns password, Google and Microsoft sign-in on or off for the whole organization. Send only the methods to change, e.g. { "password": false }. Rules: at least one method that Bizisy offers must stay on; a method Bizisy does not offer yet (see available in platform_sign_in_get) cannot be turned on; and you cannot lock yourself out by turning off every method your own login uses (connect Google or Microsoft from My profile first). A method Bizisy does not offer can always be turned off. Turning a method off refuses new sign-ins, invite acceptances and password resets with it; people already signed in stay signed in until their session ends (7 days) or they sign out. API keys are a separate credential and keep working whatever is chosen here (revoke them under API keys). Check linked and privileged_only in platform_sign_in_get to tell the user who is affected, and preview with dry_run first. Owners and admins only.
- Who can call it
- Manage key owner admin
- MCP tool
platform_sign_in_seton HR Assistant- Preview
?dry_run=trueruns every check and saves nothing- Retries
- An Idempotency-Key replays the first result
Input
passwordbooleanEmail and password sign-in: true turns it on, false turns it off.
googlebooleanContinue with Google: true turns it on, false turns it off. Only when available on Bizisy.
microsoftbooleanContinue with Microsoft: true turns it on, false turns it off. Only when available on Bizisy.
Returns
methodsobjectrequired3 fields
passwordobjectrequired4 fields
onbooleanrequiredThe organization's own choice: true = turned on here. Enforced on every new sign-in.
availablebooleanrequiredBizisy offers this method at all (password always). People can only use a method that is on AND available.
linkedintegerrequiredActive members whose own login uses this method today.
privileged_onlyintegerrequiredOwners and admins who sign in ONLY with this method (turning it off locks them out).
googleobjectrequired4 fields
onbooleanrequiredThe organization's own choice: true = turned on here. Enforced on every new sign-in.
availablebooleanrequiredBizisy offers this method at all (password always). People can only use a method that is on AND available.
linkedintegerrequiredActive members whose own login uses this method today.
privileged_onlyintegerrequiredOwners and admins who sign in ONLY with this method (turning it off locks them out).
microsoftobjectrequired4 fields
onbooleanrequiredThe organization's own choice: true = turned on here. Enforced on every new sign-in.
availablebooleanrequiredBizisy offers this method at all (password always). People can only use a method that is on AND available.
linkedintegerrequiredActive members whose own login uses this method today.
privileged_onlyintegerrequiredOwners and admins who sign in ONLY with this method (turning it off locks them out).
Errors
validation_failed unauthenticated forbidden not_found conflict rate_limited internal
curl https://api.bizisy.com/v1/platform/sign_in.set \
-H "Authorization: Bearer $BIZISY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"password":true,"google":true,"microsoft":true}'const res = await fetch('https://api.bizisy.com/v1/platform/sign_in.set', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.BIZISY_API_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID(),
},
body: JSON.stringify({
"password": true,
"google": true,
"microsoft": 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/platform/sign_in.set",
headers={"Authorization": f"Bearer {os.environ['BIZISY_API_KEY']}", "Idempotency-Key": str(uuid.uuid4())},
json={
"password": True,
"google": True,
"microsoft": True,
},
)
body = res.json()
if not res.ok:
raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
print(body["data"]){
"data": {
"methods": {
"password": {
"on": false,
"available": true,
"linked": 12,
"privileged_only": 2
},
"google": {
"on": true,
"available": true,
"linked": 4,
"privileged_only": 0
},
"microsoft": {
"on": false,
"available": false,
"linked": 0,
"privileged_only": 0
}
}
}
}Change the company language#
POST/v1/platform/language.set_companyWrite
Sets the company's default language: used by everyone who has not chosen their own language (in Me → My profile) and for the company's emails to them. Languages: en (English), pt-PT (Português), es-ES (Español), de-DE (Deutsch), fr-FR (Français), it-IT (Italiano). null = automatic: each person's browser language. People who chose a language keep it. Owners and admins only.
- Who can call it
- Manage key owner admin
- MCP tool
platform_language_set_companyon HR Assistant- Preview
?dry_run=trueruns every check and saves nothing- Retries
- An Idempotency-Key replays the first result
Input
language"en" | "pt-PT" | "es-ES" | "de-DE" | "fr-FR" | "it-IT"requiredOne of en, pt-PT, es-ES, de-DE, fr-FR, it-IT, or null for automatic (the browser's language).
Returns
language"en" | "pt-PT" | "es-ES" | "de-DE" | "fr-FR" | "it-IT"required
Errors
validation_failed unauthenticated forbidden not_found conflict rate_limited internal
curl https://api.bizisy.com/v1/platform/language.set_company \
-H "Authorization: Bearer $BIZISY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"language":"pt-PT"}'const res = await fetch('https://api.bizisy.com/v1/platform/language.set_company', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.BIZISY_API_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID(),
},
body: JSON.stringify({
"language": "pt-PT"
}),
});
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/platform/language.set_company",
headers={"Authorization": f"Bearer {os.environ['BIZISY_API_KEY']}", "Idempotency-Key": str(uuid.uuid4())},
json={
"language": "pt-PT",
},
)
body = res.json()
if not res.ok:
raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
print(body["data"]){
"data": {
"language": "pt-PT"
}
}Company account status#
POST/v1/platform/org.statusRead
Whether the company account is active or closing (closed, with its data deleted on delete_after unless an owner reopens it), and whether you may close it (can_close: an owner in the web app). Closing, reopening and the full company export happen only in the web app: send the user to Manage → Settings → Close account.
- Who can call it
- Manage key any Manage role
- MCP tool
platform_org_statuson HR Assistant- Method
POSTwith a JSON body, orGETwith the input as query parameters
Input
No input: send {}.
Returns
status"active" | "closing"requiredclosed_atstring | nullrequireddelete_afterstring | nullrequiredcan_closebooleanrequiredThe caller may close the company: an owner signed in to the web app.
Errors
validation_failed unauthenticated forbidden not_found rate_limited internal
curl https://api.bizisy.com/v1/platform/org.status \
-H "Authorization: Bearer $BIZISY_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'const res = await fetch('https://api.bizisy.com/v1/platform/org.status', {
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/platform/org.status",
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": {
"status": "active",
"closed_at": null,
"delete_after": null,
"can_close": true
}
}See storage#
POST/v1/platform/storage.getRead
Returns the company's storage: bytes stored now (documents, profile photos and the logo), the highest size this month (what storage is billed on), what is included (500 MB), the price above it (€0.10 per 0.1 GB per month, i.e. €1 per GB, excluding VAT, billed with the monthly invoice on the month's highest size), this month's estimate, and the limits (largest file, company ceiling, self uploads per person per month). Owners, admins and HR.
- Who can call it
- Manage key owner admin hr
- MCP tool
platform_storage_geton HR Assistant- Method
POSTwith a JSON body, orGETwith the input as query parameters
Input
No input: send {}.
Returns
14 fields
bytesintegerrequiredBytes stored now: documents, profile photos and the company logo.
filesintegerrequiredmonthstringrequiredThe current billing month (YYYY-MM, UTC).
peak_bytesintegerrequiredThe highest size reached this month: what the month is billed on (deleting files does not lower it).
free_bytesintegerrequiredIncluded in the price: 500 MB (decimal: 1 GB = 1000 MB).
unit_bytesintegerrequiredOne billing unit: 0.1 GB (100 MB).
unit_price_centsintegerrequired€0.10 per unit per month, excluding VAT (= €1 per GB).
billable_unitsintegerrequiredceil(max(0, peak − 500 MB) / 100 MB) for this month so far.
estimated_centsintegerrequiredbillable_units × unit price, excluding VAT, for this month so far.
billedbooleanrequiredStorage is charged for this company (billing exists and has started); false before billing has started.
limitsobjectrequired4 fields
max_file_mbintegerrequiredLargest file, in MB (1–100; default 25).
From 1 to 100.
ceiling_gbintegerrequiredCompany storage ceiling, in GB (1–200; at most 10 until paid billing is running; default 10).
From 1 to 200.
self_files_per_monthintegerrequiredFiles each person may add to "From me" per month (0–200; 0 turns self upload off; default 20).
From 0 to 200.
self_mb_per_monthintegerrequiredMB each person may add to "From me" per month (0–1000; 0 turns self upload off; default 100).
From 0 to 1000.
defaultsobjectrequired4 fields
max_file_mbintegerrequiredLargest file, in MB (1–100; default 25).
From 1 to 100.
ceiling_gbintegerrequiredCompany storage ceiling, in GB (1–200; at most 10 until paid billing is running; default 10).
From 1 to 200.
self_files_per_monthintegerrequiredFiles each person may add to "From me" per month (0–200; 0 turns self upload off; default 20).
From 0 to 200.
self_mb_per_monthintegerrequiredMB each person may add to "From me" per month (0–1000; 0 turns self upload off; default 100).
From 0 to 1000.
ceiling_max_gbintegerrequiredThe highest ceiling this company may set now.
by_moduleobject[]requireddocuments = documents; org = profile photos; platform = the company logo.
3 fields
modulestringrequiredbytesintegerrequiredfilesintegerrequired
Errors
validation_failed unauthenticated forbidden not_found rate_limited internal
curl https://api.bizisy.com/v1/platform/storage.get \
-H "Authorization: Bearer $BIZISY_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'const res = await fetch('https://api.bizisy.com/v1/platform/storage.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/platform/storage.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": {
"bytes": 320000000,
"files": 41,
"month": "2026-10",
"peak_bytes": 340000000,
"free_bytes": 500000000,
"unit_bytes": 100000000,
"unit_price_cents": 10,
"billable_units": 0,
"estimated_cents": 0,
"billed": false,
"limits": {
"max_file_mb": 25,
"ceiling_gb": 10,
"self_files_per_month": 20,
"self_mb_per_month": 100
},
"defaults": {
"max_file_mb": 25,
"ceiling_gb": 10,
"self_files_per_month": 20,
"self_mb_per_month": 100
},
"ceiling_max_gb": 10,
"by_module": [
{
"module": "documents",
"bytes": 318000000,
"files": 30
},
{
"module": "org",
"bytes": 2000000,
"files": 11
}
]
}
}Change storage limits#
POST/v1/platform/storage.set_limitsWrite
Changes the storage limits: largest file (1–100 MB), company ceiling (1–200 GB; at most 10 GB until paid billing is running), and self uploads per person per month (0–200 files and 0–1000 MB; 0 turns "From me" uploads off). Send only the limits to change. A ceiling below what is stored blocks new uploads until files are deleted; nothing is deleted. Owners and admins.
- Who can call it
- Manage key owner admin
- MCP tool
platform_storage_set_limitson HR Assistant- Preview
?dry_run=trueruns every check and saves nothing- Retries
- An Idempotency-Key replays the first result
Input
max_file_mbintegerLargest file, in MB (1–100; default 25).
From 1 to 100.
ceiling_gbintegerCompany storage ceiling, in GB (1–200; at most 10 until paid billing is running; default 10).
From 1 to 200.
self_files_per_monthintegerFiles each person may add to "From me" per month (0–200; 0 turns self upload off; default 20).
From 0 to 200.
self_mb_per_monthintegerMB each person may add to "From me" per month (0–1000; 0 turns self upload off; default 100).
From 0 to 1000.
Returns
14 fields
bytesintegerrequiredBytes stored now: documents, profile photos and the company logo.
filesintegerrequiredmonthstringrequiredThe current billing month (YYYY-MM, UTC).
peak_bytesintegerrequiredThe highest size reached this month: what the month is billed on (deleting files does not lower it).
free_bytesintegerrequiredIncluded in the price: 500 MB (decimal: 1 GB = 1000 MB).
unit_bytesintegerrequiredOne billing unit: 0.1 GB (100 MB).
unit_price_centsintegerrequired€0.10 per unit per month, excluding VAT (= €1 per GB).
billable_unitsintegerrequiredceil(max(0, peak − 500 MB) / 100 MB) for this month so far.
estimated_centsintegerrequiredbillable_units × unit price, excluding VAT, for this month so far.
billedbooleanrequiredStorage is charged for this company (billing exists and has started); false before billing has started.
limitsobjectrequired4 fields
max_file_mbintegerrequiredLargest file, in MB (1–100; default 25).
From 1 to 100.
ceiling_gbintegerrequiredCompany storage ceiling, in GB (1–200; at most 10 until paid billing is running; default 10).
From 1 to 200.
self_files_per_monthintegerrequiredFiles each person may add to "From me" per month (0–200; 0 turns self upload off; default 20).
From 0 to 200.
self_mb_per_monthintegerrequiredMB each person may add to "From me" per month (0–1000; 0 turns self upload off; default 100).
From 0 to 1000.
defaultsobjectrequired4 fields
max_file_mbintegerrequiredLargest file, in MB (1–100; default 25).
From 1 to 100.
ceiling_gbintegerrequiredCompany storage ceiling, in GB (1–200; at most 10 until paid billing is running; default 10).
From 1 to 200.
self_files_per_monthintegerrequiredFiles each person may add to "From me" per month (0–200; 0 turns self upload off; default 20).
From 0 to 200.
self_mb_per_monthintegerrequiredMB each person may add to "From me" per month (0–1000; 0 turns self upload off; default 100).
From 0 to 1000.
ceiling_max_gbintegerrequiredThe highest ceiling this company may set now.
by_moduleobject[]requireddocuments = documents; org = profile photos; platform = the company logo.
3 fields
modulestringrequiredbytesintegerrequiredfilesintegerrequired
Errors
validation_failed unauthenticated forbidden not_found conflict rate_limited internal
curl https://api.bizisy.com/v1/platform/storage.set_limits \
-H "Authorization: Bearer $BIZISY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"max_file_mb": 25,
"ceiling_gb": 10,
"self_files_per_month": 0,
"self_mb_per_month": 0
}'const res = await fetch('https://api.bizisy.com/v1/platform/storage.set_limits', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.BIZISY_API_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID(),
},
body: JSON.stringify({
"max_file_mb": 25,
"ceiling_gb": 10,
"self_files_per_month": 0,
"self_mb_per_month": 0
}),
});
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/platform/storage.set_limits",
headers={"Authorization": f"Bearer {os.environ['BIZISY_API_KEY']}", "Idempotency-Key": str(uuid.uuid4())},
json={
"max_file_mb": 25,
"ceiling_gb": 10,
"self_files_per_month": 0,
"self_mb_per_month": 0,
},
)
body = res.json()
if not res.ok:
raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
print(body["data"]){
"data": {
"bytes": 320000000,
"files": 41,
"month": "2026-10",
"peak_bytes": 340000000,
"free_bytes": 500000000,
"unit_bytes": 100000000,
"unit_price_cents": 10,
"billable_units": 0,
"estimated_cents": 0,
"billed": false,
"limits": {
"max_file_mb": 25,
"ceiling_gb": 10,
"self_files_per_month": 20,
"self_mb_per_month": 100
},
"defaults": {
"max_file_mb": 25,
"ceiling_gb": 10,
"self_files_per_month": 20,
"self_mb_per_month": 100
},
"ceiling_max_gb": 10,
"by_module": [
{
"module": "documents",
"bytes": 318000000,
"files": 30
},
{
"module": "org",
"bytes": 2000000,
"files": 11
}
]
}
}Something missing or wrong on this page? Write to hello@bizisy.com.