curl --request PATCH \
--url https://api.1club.ai/v1/platform/staff/{userId}/role \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"isOwner": true,
"preserveInstructorCapability": true
}
'import requests
url = "https://api.1club.ai/v1/platform/staff/{userId}/role"
payload = {
"isOwner": True,
"preserveInstructorCapability": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({isOwner: true, preserveInstructorCapability: true})
};
fetch('https://api.1club.ai/v1/platform/staff/{userId}/role', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.1club.ai/v1/platform/staff/{userId}/role",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'isOwner' => true,
'preserveInstructorCapability' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.1club.ai/v1/platform/staff/{userId}/role"
payload := strings.NewReader("{\n \"isOwner\": true,\n \"preserveInstructorCapability\": true\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://api.1club.ai/v1/platform/staff/{userId}/role")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"isOwner\": true,\n \"preserveInstructorCapability\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.1club.ai/v1/platform/staff/{userId}/role")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"isOwner\": true,\n \"preserveInstructorCapability\": true\n}"
response = http.request(request)
puts response.read_body{
"userId": 123,
"name": "<string>",
"email": "<string>",
"role": "admin",
"isOwner": true,
"status": "<string>",
"instructorStatus": "reactivated"
}{
"error": "<string>",
"code": "<string>",
"details": {}
}{
"error": "<string>",
"code": "<string>",
"details": {}
}{
"error": "<string>",
"code": "<string>",
"details": {}
}{
"error": "<string>",
"code": "<string>",
"details": {}
}{
"error": "<string>",
"code": "<string>",
"details": {}
}{
"error": "<string>",
"code": "<string>",
"details": {}
}Change a staff member's role
Gives a member of staff another role, with the same limits as the Users page: nobody changes their own role, a manager may act only on roles below manager and promote up to manager, only someone who may assign admin may make an owner, and the last owner stays an owner. Takes effect when the person’s session next refreshes. Requires staff:write. Only a person can make this change - an OAuth connection or the in-app assistant, never an API key, which is refused with a 403 whatever scopes it holds.
curl --request PATCH \
--url https://api.1club.ai/v1/platform/staff/{userId}/role \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"isOwner": true,
"preserveInstructorCapability": true
}
'import requests
url = "https://api.1club.ai/v1/platform/staff/{userId}/role"
payload = {
"isOwner": True,
"preserveInstructorCapability": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({isOwner: true, preserveInstructorCapability: true})
};
fetch('https://api.1club.ai/v1/platform/staff/{userId}/role', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.1club.ai/v1/platform/staff/{userId}/role",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'isOwner' => true,
'preserveInstructorCapability' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.1club.ai/v1/platform/staff/{userId}/role"
payload := strings.NewReader("{\n \"isOwner\": true,\n \"preserveInstructorCapability\": true\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://api.1club.ai/v1/platform/staff/{userId}/role")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"isOwner\": true,\n \"preserveInstructorCapability\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.1club.ai/v1/platform/staff/{userId}/role")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"isOwner\": true,\n \"preserveInstructorCapability\": true\n}"
response = http.request(request)
puts response.read_body{
"userId": 123,
"name": "<string>",
"email": "<string>",
"role": "admin",
"isOwner": true,
"status": "<string>",
"instructorStatus": "reactivated"
}{
"error": "<string>",
"code": "<string>",
"details": {}
}{
"error": "<string>",
"code": "<string>",
"details": {}
}{
"error": "<string>",
"code": "<string>",
"details": {}
}{
"error": "<string>",
"code": "<string>",
"details": {}
}{
"error": "<string>",
"code": "<string>",
"details": {}
}{
"error": "<string>",
"code": "<string>",
"details": {}
}Authorizations
Organization-scoped bearer credential: a customer API key (1club_sk_live_...) or an MCP OAuth access token.
Path Parameters
Body
admin, manager, front_desk, instructor Make (or keep) them an owner. Only with role admin.
When moving an instructor to admin, manager or front desk, keep their instructor profile so they stay bookable. Without it the profile is deactivated.
Response
The member of staff with their new role
admin, manager, front_desk, instructor The membership status, e.g. active, or invited until the invitation is accepted
What happened to their instructor profile, or null when neither role is instructor
reactivated, deactivated, preserved, unchanged, null Was this page helpful?