curl --request PATCH \
--url https://www.ruddr.io/api/workspace/client-roles/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"isBillable": true,
"rate": 123,
"currency": "<string>",
"disciplineId": "<string>",
"practiceId": "<string>",
"locationId": "<string>"
}
'import requests
url = "https://www.ruddr.io/api/workspace/client-roles/{id}"
payload = {
"name": "<string>",
"isBillable": True,
"rate": 123,
"currency": "<string>",
"disciplineId": "<string>",
"practiceId": "<string>",
"locationId": "<string>"
}
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({
name: '<string>',
isBillable: true,
rate: 123,
currency: '<string>',
disciplineId: '<string>',
practiceId: '<string>',
locationId: '<string>'
})
};
fetch('https://www.ruddr.io/api/workspace/client-roles/{id}', 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://www.ruddr.io/api/workspace/client-roles/{id}",
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([
'name' => '<string>',
'isBillable' => true,
'rate' => 123,
'currency' => '<string>',
'disciplineId' => '<string>',
'practiceId' => '<string>',
'locationId' => '<string>'
]),
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://www.ruddr.io/api/workspace/client-roles/{id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"isBillable\": true,\n \"rate\": 123,\n \"currency\": \"<string>\",\n \"disciplineId\": \"<string>\",\n \"practiceId\": \"<string>\",\n \"locationId\": \"<string>\"\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://www.ruddr.io/api/workspace/client-roles/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"isBillable\": true,\n \"rate\": 123,\n \"currency\": \"<string>\",\n \"disciplineId\": \"<string>\",\n \"practiceId\": \"<string>\",\n \"locationId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.ruddr.io/api/workspace/client-roles/{id}")
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 \"name\": \"<string>\",\n \"isBillable\": true,\n \"rate\": 123,\n \"currency\": \"<string>\",\n \"disciplineId\": \"<string>\",\n \"practiceId\": \"<string>\",\n \"locationId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "d2f5a7b1-9c34-4e80-b6d1-3a8e0c5f72b4",
"name": "Principal Engineer",
"isBillable": true,
"rate": 250,
"currency": "USD",
"createdAt": "2025-08-22T09:41:17.563Z",
"client": {
"id": "d4e1b7a3-8c52-4f90-b6d3-1a9e0c7f45b8",
"name": "Acme Corporation"
},
"discipline": {
"id": "5b8e2a1c-3d47-4f09-a6e3-8c0d2f1b47a9",
"name": "Software Engineering"
},
"practice": {
"id": "c9a3d5b7-1e48-4f63-b7d0-a2e1c8f92d56",
"name": "Web Development"
},
"location": {
"id": "e2b4c6a8-7f19-4d30-a5e1-9c3b0d8f62a7",
"name": "New York"
},
"workspaceRole": null
}Update a client role
Linked client roles (where workspaceRole is not null) cannot be modified and will return a 409 ReadOnlyError. Delete and recreate to change linking.
curl --request PATCH \
--url https://www.ruddr.io/api/workspace/client-roles/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"isBillable": true,
"rate": 123,
"currency": "<string>",
"disciplineId": "<string>",
"practiceId": "<string>",
"locationId": "<string>"
}
'import requests
url = "https://www.ruddr.io/api/workspace/client-roles/{id}"
payload = {
"name": "<string>",
"isBillable": True,
"rate": 123,
"currency": "<string>",
"disciplineId": "<string>",
"practiceId": "<string>",
"locationId": "<string>"
}
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({
name: '<string>',
isBillable: true,
rate: 123,
currency: '<string>',
disciplineId: '<string>',
practiceId: '<string>',
locationId: '<string>'
})
};
fetch('https://www.ruddr.io/api/workspace/client-roles/{id}', 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://www.ruddr.io/api/workspace/client-roles/{id}",
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([
'name' => '<string>',
'isBillable' => true,
'rate' => 123,
'currency' => '<string>',
'disciplineId' => '<string>',
'practiceId' => '<string>',
'locationId' => '<string>'
]),
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://www.ruddr.io/api/workspace/client-roles/{id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"isBillable\": true,\n \"rate\": 123,\n \"currency\": \"<string>\",\n \"disciplineId\": \"<string>\",\n \"practiceId\": \"<string>\",\n \"locationId\": \"<string>\"\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://www.ruddr.io/api/workspace/client-roles/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"isBillable\": true,\n \"rate\": 123,\n \"currency\": \"<string>\",\n \"disciplineId\": \"<string>\",\n \"practiceId\": \"<string>\",\n \"locationId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.ruddr.io/api/workspace/client-roles/{id}")
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 \"name\": \"<string>\",\n \"isBillable\": true,\n \"rate\": 123,\n \"currency\": \"<string>\",\n \"disciplineId\": \"<string>\",\n \"practiceId\": \"<string>\",\n \"locationId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "d2f5a7b1-9c34-4e80-b6d1-3a8e0c5f72b4",
"name": "Principal Engineer",
"isBillable": true,
"rate": 250,
"currency": "USD",
"createdAt": "2025-08-22T09:41:17.563Z",
"client": {
"id": "d4e1b7a3-8c52-4f90-b6d3-1a9e0c7f45b8",
"name": "Acme Corporation"
},
"discipline": {
"id": "5b8e2a1c-3d47-4f09-a6e3-8c0d2f1b47a9",
"name": "Software Engineering"
},
"practice": {
"id": "c9a3d5b7-1e48-4f63-b7d0-a2e1c8f92d56",
"name": "Web Development"
},
"location": {
"id": "e2b4c6a8-7f19-4d30-a5e1-9c3b0d8f62a7",
"name": "New York"
},
"workspaceRole": null
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
The client role uuid.
Body
The name of the client role. Maximum 255 characters.
Whether the role is billable.
The billing rate for the role.
The three-letter ISO currency code for the role. Maximum 3 characters.
The uuid of the discipline for this role.
The uuid of the practice for this role.
The uuid of the location for this role.
Response
200
The unique identifier for the object.
The name of the client role. Reflects the workspace role's name when linked.
Whether the role is billable. Reflects the workspace role's value when linked.
The billing rate for the role. null when the role is non-billable. Reflects the workspace role's value when linked.
The three-letter ISO currency code for the role. null when the role is non-billable. Reflects the workspace role's value when linked.
The timestamp when the object was created.
The client this role belongs to.
Show child attributes
Show child attributes
The discipline associated with this role. Reflects the workspace role's value when linked.
Show child attributes
Show child attributes
The practice associated with this role. Reflects the workspace role's value when linked.
Show child attributes
Show child attributes
The location associated with this role. Reflects the workspace role's value when linked.
Show child attributes
Show child attributes
The workspace role this client role is linked to. When linked, the client role's name, billing fields, and classification fields are overridden with the workspace role's current values. null for standalone client roles.
Show child attributes
Show child attributes