Tenant
Your organization's dashboard-level settings.
GET /tenant/settings
Get tenant general settings
Tenant keyExample request
curl -X GET "https://api.openstudio.one/v1/tenant/settings" \
-H "X-Api-Tenant-Key: YOUR_TENANT_KEY"<?php
$ch = curl_init('https://api.openstudio.one/v1/tenant/settings');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-Api-Tenant-Key: YOUR_TENANT_KEY']);
$response = curl_exec($ch);
$data = json_decode($response, true);import requests
headers = {
"X-Api-Tenant-Key": "YOUR_TENANT_KEY",
}
response = requests.get("https://api.openstudio.one/v1/tenant/settings", headers=headers)
data = response.json()fetch('https://api.openstudio.one/v1/tenant/settings', {
method: 'GET',
headers: {
'X-Api-Tenant-Key': 'YOUR_TENANT_KEY'
}
})
.then(res => res.json())
.then(data => console.log(data));ⓘRuns a real request from your browser directly to tenant/settings. Keys are only held in this page's memory while you're here — never stored, never sent anywhere else.
Response fields
| Field | Type | Flags | Access | Notes |
|---|---|---|---|---|
| website | string | — | Editable | The organization's public website URL. |
| logo | string | — | Editable | Absolute URL to the organization's logo image. |
| timezone | string | — | Editable | IANA timezone value used for the tenant, e.g. "Europe/Amsterdam". See GET /reference/timezones for the full list of valid values. |
| restrict_access_admins_only | boolean | — | Editable | Whether the dashboard is restricted to admin users only. |
| brand_id | integer | — | — | The unique numeric ID for this tenant/organization. |
| name | string | — | — | The organization's display name. |
| subdomain | string | — | — | The subdomain used to reach this tenant's dashboard, e.g. "client" for client.openstudio.one (the default). Currently always "client" for every tenant — per-tenant custom subdomains are planned but not yet supported. |
| brand_email | string | — | — | Primary contact email for the organization. |
| registration | string | — | — | UTC timestamp (YYYY-MM-DD HH:MM:SS) of when the tenant/organization was registered on OpenStudio. |
| same_as | array of strings | — | — | Other URLs for the organization (social profiles, etc.). |
| default_language | string | — | — | ISO 639 language code, e.g. "en". See GET /reference/languages for the full list of valid values. |
Example response
{
"success": true,
"data": {
"website": "https://example.com",
"logo": "https://cdn.openstudio.one/logos/42/logo.png",
"timezone": "Europe/Amsterdam",
"restrict_access_admins_only": false,
"brand_id": 42,
"name": "Acme Inc",
"subdomain": "client",
"brand_email": "contact@acme.com",
"registration": "2019-08-21 16:34:00",
"same_as": [
"https://instagram.com/acme",
"https://facebook.com/acme"
],
"default_language": "en"
},
"error": null
}PATCH /tenant/settings
Update tenant general settings
Tenant keyRequest body
| Field | Type | Flags | Required | Notes |
|---|---|---|---|---|
| website | string | — | Optional | — |
| timezone | string | — | Optional | IANA timezone value to set for the tenant, e.g. "Europe/Amsterdam". Must be one of the values returned by GET /reference/timezones. |
| restrict_access_admins_only | boolean | — | Optional | — |
| logo_base64 | string | — | Optional | Base64-encoded image (jpg/png/gif), optionally a data: URI |
Example request
curl -X PATCH "https://api.openstudio.one/v1/tenant/settings" \
-H "X-Api-Tenant-Key: YOUR_TENANT_KEY" \
-H "Content-Type: application/json" \
-d '{"website":"...","timezone":"...","restrict_access_admins_only":true,"logo_base64":"..."}'<?php
$ch = curl_init('https://api.openstudio.one/v1/tenant/settings');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
'website' => '...',
'timezone' => '...',
'restrict_access_admins_only' => true,
'logo_base64' => '...',
]));
curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-Api-Tenant-Key: YOUR_TENANT_KEY', 'Content-Type: application/json']);
$response = curl_exec($ch);
$data = json_decode($response, true);import requests
headers = {
"X-Api-Tenant-Key": "YOUR_TENANT_KEY",
}
body = {
'website': '...',
'timezone': '...',
'restrict_access_admins_only': True,
'logo_base64': '...',
}
response = requests.patch("https://api.openstudio.one/v1/tenant/settings", headers=headers, json=body)
data = response.json()fetch('https://api.openstudio.one/v1/tenant/settings', {
method: 'PATCH',
headers: {
'X-Api-Tenant-Key': 'YOUR_TENANT_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
'website': '...',
'timezone': '...',
'restrict_access_admins_only': true,
'logo_base64': '...',
})
})
.then(res => res.json())
.then(data => console.log(data));Response fields
| Field | Type | Flags | Notes |
|---|---|---|---|
| website | string | — | Only present if provided. |
| timezone | string | — | IANA timezone value now set for the tenant, e.g. "Europe/Amsterdam". Only present if provided. |
| restrict_access_admins_only | boolean | — | Only present if provided. |
| logo | string | — | The saved logo URL. Only present if provided. |
Example response
{
"success": true,
"data": {
"website": "https://example.com",
"timezone": "Europe/Amsterdam",
"restrict_access_admins_only": true,
"logo": "https://cdn.openstudio.one/logos/42.png"
},
"error": null
}GET /tenant/profile
Tenant identity — name, logo, structure/role naming
User keyExample request
curl -X GET "https://api.openstudio.one/v1/tenant/profile" \
-H "X-Api-User-Key: YOUR_USER_KEY"<?php
$ch = curl_init('https://api.openstudio.one/v1/tenant/profile');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-Api-User-Key: YOUR_USER_KEY']);
$response = curl_exec($ch);
$data = json_decode($response, true);import requests
headers = {
"X-Api-User-Key": "YOUR_USER_KEY",
}
response = requests.get("https://api.openstudio.one/v1/tenant/profile", headers=headers)
data = response.json()fetch('https://api.openstudio.one/v1/tenant/profile', {
method: 'GET',
headers: {
'X-Api-User-Key': 'YOUR_USER_KEY'
}
})
.then(res => res.json())
.then(data => console.log(data));ⓘRuns a real request from your browser directly to tenant/profile. Keys are only held in this page's memory while you're here — never stored, never sent anywhere else.
Response fields
| Field | Type | Flags | Notes |
|---|---|---|---|
| name | string | The tenant's display name. | |
| logo_url | string | The tenant's uploaded logo. Null if none has been uploaded (Settings → General). | |
| labels | object | — | Each tenant can rename structure levels and responsible-role titles (ACP → Structures & Hierarchy) — use these instead of hardcoding "Area"/"Department"/"Unit". Always all 9 keys, falling back to the system default English name for any key the tenant hasn't customized. |
| ↳l1 | string | — | Level 1 structure name, singular. Default "Area". |
| ↳l1p | string | — | Level 1 structure name, plural. Default "Areas". |
| ↳l2 | string | — | Level 2 structure name, singular. Default "Department". |
| ↳l2p | string | — | Level 2 structure name, plural. Default "Departments". |
| ↳l3 | string | — | Level 3 structure name, singular. Default "Unit". |
| ↳l3p | string | — | Level 3 structure name, plural. Default "Units". |
| ↳rl1 | string | — | Level 1 responsible-role title. Default "Area Manager". |
| ↳rl2 | string | — | Level 2 responsible-role title. Default "Department Leader". |
| ↳rl3 | string | — | Level 3 responsible-role title. Default "Unit Lead". |
| tone | object | — | The tenant's admin-level greeting-tone default/lock (Settings → Experience) — a caller also needs the CALLER's own users.tone_style (GET /me) to fully resolve which tone actually applies; the priority is: locked ? admin_tone : (the caller's own tone_style, else admin_tone, else "default"). |
| ↳admin_tone | string | The tenant's configured default tone: "default", "friendly", "motivational", or "custom:{id}" (a tenant-authored tone — its per-time-slot text isn't exposed by this API). Null if never configured. | |
| ↳admin_locked | boolean | — | When true, every member sees admin_tone regardless of their own preference. |
Example response
{
"success": true,
"data": {
"name": "Acme Inc.",
"logo_url": "https://www.openstudio.one/cdn/logos/42/logo.png",
"labels": {
"l1": "Area",
"l1p": "Areas",
"l2": "Department",
"l2p": "Departments",
"l3": "Unit",
"l3p": "Units",
"rl1": "Area Manager",
"rl2": "Department Leader",
"rl3": "Unit Lead"
},
"tone": {
"admin_tone": "default",
"admin_locked": false
}
},
"error": null
}