Tenant

Your organization's dashboard-level settings.

GET /tenant/settings

Get tenant general settings

Tenant key

Example 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

FieldTypeFlagsAccessNotes
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 key

Request body

FieldTypeFlagsRequiredNotes
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

FieldTypeFlagsNotes
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 key

Example 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

FieldTypeFlagsNotes
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
}
ESC