curl --request PATCH \
--url https://www.ruddr.io/api/workspace/project-members/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"isActive": true,
"isBillable": true,
"rate": 123,
"overrideCostRate": true,
"costCurrency": "<string>",
"costPerHour": 123,
"overheadCostPerHour": 123,
"estimatedBillableHours": 123,
"estimatedNonBillableHours": 123,
"estimatedMonthlyBillableHours": 123,
"estimatedMonthlyNonBillableHours": 123,
"roleIds": [
"<string>"
]
}
'import requests
url = "https://www.ruddr.io/api/workspace/project-members/{id}"
payload = {
"isActive": True,
"isBillable": True,
"rate": 123,
"overrideCostRate": True,
"costCurrency": "<string>",
"costPerHour": 123,
"overheadCostPerHour": 123,
"estimatedBillableHours": 123,
"estimatedNonBillableHours": 123,
"estimatedMonthlyBillableHours": 123,
"estimatedMonthlyNonBillableHours": 123,
"roleIds": ["<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({
isActive: true,
isBillable: true,
rate: 123,
overrideCostRate: true,
costCurrency: '<string>',
costPerHour: 123,
overheadCostPerHour: 123,
estimatedBillableHours: 123,
estimatedNonBillableHours: 123,
estimatedMonthlyBillableHours: 123,
estimatedMonthlyNonBillableHours: 123,
roleIds: ['<string>']
})
};
fetch('https://www.ruddr.io/api/workspace/project-members/{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/project-members/{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([
'isActive' => true,
'isBillable' => true,
'rate' => 123,
'overrideCostRate' => true,
'costCurrency' => '<string>',
'costPerHour' => 123,
'overheadCostPerHour' => 123,
'estimatedBillableHours' => 123,
'estimatedNonBillableHours' => 123,
'estimatedMonthlyBillableHours' => 123,
'estimatedMonthlyNonBillableHours' => 123,
'roleIds' => [
'<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/project-members/{id}"
payload := strings.NewReader("{\n \"isActive\": true,\n \"isBillable\": true,\n \"rate\": 123,\n \"overrideCostRate\": true,\n \"costCurrency\": \"<string>\",\n \"costPerHour\": 123,\n \"overheadCostPerHour\": 123,\n \"estimatedBillableHours\": 123,\n \"estimatedNonBillableHours\": 123,\n \"estimatedMonthlyBillableHours\": 123,\n \"estimatedMonthlyNonBillableHours\": 123,\n \"roleIds\": [\n \"<string>\"\n ]\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/project-members/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"isActive\": true,\n \"isBillable\": true,\n \"rate\": 123,\n \"overrideCostRate\": true,\n \"costCurrency\": \"<string>\",\n \"costPerHour\": 123,\n \"overheadCostPerHour\": 123,\n \"estimatedBillableHours\": 123,\n \"estimatedNonBillableHours\": 123,\n \"estimatedMonthlyBillableHours\": 123,\n \"estimatedMonthlyNonBillableHours\": 123,\n \"roleIds\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.ruddr.io/api/workspace/project-members/{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 \"isActive\": true,\n \"isBillable\": true,\n \"rate\": 123,\n \"overrideCostRate\": true,\n \"costCurrency\": \"<string>\",\n \"costPerHour\": 123,\n \"overheadCostPerHour\": 123,\n \"estimatedBillableHours\": 123,\n \"estimatedNonBillableHours\": 123,\n \"estimatedMonthlyBillableHours\": 123,\n \"estimatedMonthlyNonBillableHours\": 123,\n \"roleIds\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "a3f2e1d4-5b6c-7890-abcd-ef1234567890",
"typeId": "administrator",
"isActive": true,
"isBillable": true,
"rate": 200,
"overrideCostRate": true,
"costCurrency": "USD",
"costPerHour": 90,
"overheadCostPerHour": 15,
"createdAt": "2025-03-10T14:22:31.000Z",
"member": {
"id": "b7c8d9e0-1f2a-3b4c-5d6e-7f8a9b0c1d2e",
"name": "Sarah Chen"
},
"project": {
"id": "c4d5e6f7-8a9b-0c1d-2e3f-4a5b6c7d8e9f",
"name": "Enterprise Portal Redesign",
"client": {
"id": "d1e2f3a4-b5c6-d7e8-f9a0-b1c2d3e4f5a6",
"name": "Meridian Technologies"
}
},
"roles": null,
"budget": {
"billableHours": 160,
"nonBillableHours": 24
},
"monthlyBudget": {
"billableHours": 40,
"nonBillableHours": 6
},
"rateCards": [
{
"id": "f1a2b3c4-d5e6-4f70-8192-a3b4c5d6e7f8",
"start": null,
"end": "2025-06-30",
"rate": 150,
"overrideCostRate": true,
"costCurrency": "USD",
"costPerHour": 90,
"overheadCostPerHour": 15
},
{
"id": "a9b8c7d6-e5f4-4a3b-9c2d-1e0f9a8b7c6d",
"start": "2025-07-01",
"end": null,
"rate": 200,
"overrideCostRate": true,
"costCurrency": "USD",
"costPerHour": 90,
"overheadCostPerHour": 15
}
]
}Update a project member
curl --request PATCH \
--url https://www.ruddr.io/api/workspace/project-members/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"isActive": true,
"isBillable": true,
"rate": 123,
"overrideCostRate": true,
"costCurrency": "<string>",
"costPerHour": 123,
"overheadCostPerHour": 123,
"estimatedBillableHours": 123,
"estimatedNonBillableHours": 123,
"estimatedMonthlyBillableHours": 123,
"estimatedMonthlyNonBillableHours": 123,
"roleIds": [
"<string>"
]
}
'import requests
url = "https://www.ruddr.io/api/workspace/project-members/{id}"
payload = {
"isActive": True,
"isBillable": True,
"rate": 123,
"overrideCostRate": True,
"costCurrency": "<string>",
"costPerHour": 123,
"overheadCostPerHour": 123,
"estimatedBillableHours": 123,
"estimatedNonBillableHours": 123,
"estimatedMonthlyBillableHours": 123,
"estimatedMonthlyNonBillableHours": 123,
"roleIds": ["<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({
isActive: true,
isBillable: true,
rate: 123,
overrideCostRate: true,
costCurrency: '<string>',
costPerHour: 123,
overheadCostPerHour: 123,
estimatedBillableHours: 123,
estimatedNonBillableHours: 123,
estimatedMonthlyBillableHours: 123,
estimatedMonthlyNonBillableHours: 123,
roleIds: ['<string>']
})
};
fetch('https://www.ruddr.io/api/workspace/project-members/{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/project-members/{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([
'isActive' => true,
'isBillable' => true,
'rate' => 123,
'overrideCostRate' => true,
'costCurrency' => '<string>',
'costPerHour' => 123,
'overheadCostPerHour' => 123,
'estimatedBillableHours' => 123,
'estimatedNonBillableHours' => 123,
'estimatedMonthlyBillableHours' => 123,
'estimatedMonthlyNonBillableHours' => 123,
'roleIds' => [
'<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/project-members/{id}"
payload := strings.NewReader("{\n \"isActive\": true,\n \"isBillable\": true,\n \"rate\": 123,\n \"overrideCostRate\": true,\n \"costCurrency\": \"<string>\",\n \"costPerHour\": 123,\n \"overheadCostPerHour\": 123,\n \"estimatedBillableHours\": 123,\n \"estimatedNonBillableHours\": 123,\n \"estimatedMonthlyBillableHours\": 123,\n \"estimatedMonthlyNonBillableHours\": 123,\n \"roleIds\": [\n \"<string>\"\n ]\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/project-members/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"isActive\": true,\n \"isBillable\": true,\n \"rate\": 123,\n \"overrideCostRate\": true,\n \"costCurrency\": \"<string>\",\n \"costPerHour\": 123,\n \"overheadCostPerHour\": 123,\n \"estimatedBillableHours\": 123,\n \"estimatedNonBillableHours\": 123,\n \"estimatedMonthlyBillableHours\": 123,\n \"estimatedMonthlyNonBillableHours\": 123,\n \"roleIds\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.ruddr.io/api/workspace/project-members/{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 \"isActive\": true,\n \"isBillable\": true,\n \"rate\": 123,\n \"overrideCostRate\": true,\n \"costCurrency\": \"<string>\",\n \"costPerHour\": 123,\n \"overheadCostPerHour\": 123,\n \"estimatedBillableHours\": 123,\n \"estimatedNonBillableHours\": 123,\n \"estimatedMonthlyBillableHours\": 123,\n \"estimatedMonthlyNonBillableHours\": 123,\n \"roleIds\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "a3f2e1d4-5b6c-7890-abcd-ef1234567890",
"typeId": "administrator",
"isActive": true,
"isBillable": true,
"rate": 200,
"overrideCostRate": true,
"costCurrency": "USD",
"costPerHour": 90,
"overheadCostPerHour": 15,
"createdAt": "2025-03-10T14:22:31.000Z",
"member": {
"id": "b7c8d9e0-1f2a-3b4c-5d6e-7f8a9b0c1d2e",
"name": "Sarah Chen"
},
"project": {
"id": "c4d5e6f7-8a9b-0c1d-2e3f-4a5b6c7d8e9f",
"name": "Enterprise Portal Redesign",
"client": {
"id": "d1e2f3a4-b5c6-d7e8-f9a0-b1c2d3e4f5a6",
"name": "Meridian Technologies"
}
},
"roles": null,
"budget": {
"billableHours": 160,
"nonBillableHours": 24
},
"monthlyBudget": {
"billableHours": 40,
"nonBillableHours": 6
},
"rateCards": [
{
"id": "f1a2b3c4-d5e6-4f70-8192-a3b4c5d6e7f8",
"start": null,
"end": "2025-06-30",
"rate": 150,
"overrideCostRate": true,
"costCurrency": "USD",
"costPerHour": 90,
"overheadCostPerHour": 15
},
{
"id": "a9b8c7d6-e5f4-4a3b-9c2d-1e0f9a8b7c6d",
"start": "2025-07-01",
"end": null,
"rate": 200,
"overrideCostRate": true,
"costCurrency": "USD",
"costPerHour": 90,
"overheadCostPerHour": 15
}
]
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
The project member uuid
Body
The type of project member.
collaborator, administrator Whether the member is active on the project team. Only controls project-level participation; the returned value is false whenever the member is deactivated at the workspace level.
Whether the member is billable on this project. Only used if the project is not using roles.
The member's billing rate for the project. Only used if the project is not using roles and the member is billable. When Project Rate Cards is enabled, this updates the rate card covering today; use the project rate cards endpoints for other periods.
Whether to override this project member's cost rate at the project member level rather than using the workspace or member default. When Project Rate Cards is enabled, this updates the rate card covering today; use the project rate cards endpoints for other periods.
The ISO 4217 currency code for the overridden cost rate. This will only get used if overrideCostRate is true. When Project Rate Cards is enabled, this updates the rate card covering today; use the project rate cards endpoints for other periods.
The overridden cost per hour. This will only get used if overrideCostRate is true. When Project Rate Cards is enabled, this updates the rate card covering today; use the project rate cards endpoints for other periods.
The overridden overhead cost per hour. This will only get used if overrideCostRate is true. When Project Rate Cards is enabled, this updates the rate card covering today; use the project rate cards endpoints for other periods.
The number of billable hours to budget. This will only get used if not using roles and useBudget is true and budgetMode is "detailed" on the project.
The number of non-billable hours to budget. This will only get used if not using roles and useBudget is true and budgetMode is "detailed" on the project.
The number of billable hours on the monthly budget. This will only get used if not using roles and useMonthlyBudget is true and monthlyBudgetMode is "detailed" on the project.
The number of non-billable hours on the monthly budget. This will only get used if not using roles and useMonthlyBudget is true and monthlyBudgetMode is "detailed" on the project.
A list of project role IDs (uuid) assigned to the member. Only used if the project is using roles.
Response
200
The unique identifier for the object.
The project member type.
collaborator, administrator Whether the member is active on the project. Returns false when the member is deactivated on the project team or deactivated at the workspace level.
Whether the member is billable on this project. Only used if the project is not using roles; otherwise billability is assigned at the role level and this field is null.
The member's billing rate for the project. Only used if the project is not using roles and the member is billable; otherwise null. When Project Rate Cards is enabled, this is the rate on the rate card covering today; see rateCards for other periods.
Whether this project member's cost rate is overridden at the project member level rather than using the workspace or member default. When Project Rate Cards is enabled, this is the value on the rate card covering today; see rateCards for other periods.
The ISO 4217 currency code for the overridden cost rate. Only populated when overrideCostRate is true; otherwise null. When Project Rate Cards is enabled, this is the value on the rate card covering today.
The overridden cost per hour for this project member. Only populated when overrideCostRate is true; otherwise null. When Project Rate Cards is enabled, this is the value on the rate card covering today.
The overridden overhead cost per hour for this project member. Only populated when overrideCostRate is true; otherwise null. When Project Rate Cards is enabled, this is the value on the rate card covering today.
The timestamp when the object was created.
The workspace member assigned to this project.
Show child attributes
Show child attributes
The project this member belongs to.
Show child attributes
Show child attributes
The project roles assigned to this member. null when the project does not use roles.
Show child attributes
Show child attributes
The member's budget hours for the project. null when the project does not use a budget or uses roles.
Show child attributes
Show child attributes
The member's monthly budget hours for the project. null when the project does not use a monthly budget in detailed mode or uses roles.
Show child attributes
Show child attributes
The member's rates on each project rate card, earliest first. null if the Project Rate Cards feature is not enabled.
Show child attributes
Show child attributes