curl --request PATCH \
--url https://www.ruddr.io/api/workspace/project-billing-schedule-items/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"date": "2023-12-25",
"quantity": 123,
"rate": 123,
"fee": 123,
"name": "<string>",
"invoiceItemId": "<string>"
}
'import requests
url = "https://www.ruddr.io/api/workspace/project-billing-schedule-items/{id}"
payload = {
"date": "2023-12-25",
"quantity": 123,
"rate": 123,
"fee": 123,
"name": "<string>",
"invoiceItemId": "<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({
date: '2023-12-25',
quantity: 123,
rate: 123,
fee: 123,
name: '<string>',
invoiceItemId: '<string>'
})
};
fetch('https://www.ruddr.io/api/workspace/project-billing-schedule-items/{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-billing-schedule-items/{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([
'date' => '2023-12-25',
'quantity' => 123,
'rate' => 123,
'fee' => 123,
'name' => '<string>',
'invoiceItemId' => '<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-billing-schedule-items/{id}"
payload := strings.NewReader("{\n \"date\": \"2023-12-25\",\n \"quantity\": 123,\n \"rate\": 123,\n \"fee\": 123,\n \"name\": \"<string>\",\n \"invoiceItemId\": \"<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/project-billing-schedule-items/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"date\": \"2023-12-25\",\n \"quantity\": 123,\n \"rate\": 123,\n \"fee\": 123,\n \"name\": \"<string>\",\n \"invoiceItemId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.ruddr.io/api/workspace/project-billing-schedule-items/{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 \"date\": \"2023-12-25\",\n \"quantity\": 123,\n \"rate\": 123,\n \"fee\": 123,\n \"name\": \"<string>\",\n \"invoiceItemId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "a8b2c4d6-3e1f-4a9b-8c7d-f5e2a1b9c6d3",
"typeId": "recurring",
"date": "2026-07-31",
"quantity": 10,
"rate": 2650,
"fee": 26500,
"name": "Monthly Services - July 2026",
"createdAt": "2026-02-25T17:42:21.203Z",
"project": {
"id": "d077258e-2158-4f34-aabd-97e971d0c18d",
"name": "Cloud Infrastructure Services",
"client": {
"id": "aa39afdb-e168-4956-b061-41c7c62e8c2e",
"name": "Paul's Boutique"
}
},
"invoiceItem": {
"id": "aba04832-216c-463e-8998-c520948f707c",
"name": "Consulting Services"
},
"invoiced": false
}Update a project billing schedule item
curl --request PATCH \
--url https://www.ruddr.io/api/workspace/project-billing-schedule-items/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"date": "2023-12-25",
"quantity": 123,
"rate": 123,
"fee": 123,
"name": "<string>",
"invoiceItemId": "<string>"
}
'import requests
url = "https://www.ruddr.io/api/workspace/project-billing-schedule-items/{id}"
payload = {
"date": "2023-12-25",
"quantity": 123,
"rate": 123,
"fee": 123,
"name": "<string>",
"invoiceItemId": "<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({
date: '2023-12-25',
quantity: 123,
rate: 123,
fee: 123,
name: '<string>',
invoiceItemId: '<string>'
})
};
fetch('https://www.ruddr.io/api/workspace/project-billing-schedule-items/{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-billing-schedule-items/{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([
'date' => '2023-12-25',
'quantity' => 123,
'rate' => 123,
'fee' => 123,
'name' => '<string>',
'invoiceItemId' => '<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-billing-schedule-items/{id}"
payload := strings.NewReader("{\n \"date\": \"2023-12-25\",\n \"quantity\": 123,\n \"rate\": 123,\n \"fee\": 123,\n \"name\": \"<string>\",\n \"invoiceItemId\": \"<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/project-billing-schedule-items/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"date\": \"2023-12-25\",\n \"quantity\": 123,\n \"rate\": 123,\n \"fee\": 123,\n \"name\": \"<string>\",\n \"invoiceItemId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.ruddr.io/api/workspace/project-billing-schedule-items/{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 \"date\": \"2023-12-25\",\n \"quantity\": 123,\n \"rate\": 123,\n \"fee\": 123,\n \"name\": \"<string>\",\n \"invoiceItemId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "a8b2c4d6-3e1f-4a9b-8c7d-f5e2a1b9c6d3",
"typeId": "recurring",
"date": "2026-07-31",
"quantity": 10,
"rate": 2650,
"fee": 26500,
"name": "Monthly Services - July 2026",
"createdAt": "2026-02-25T17:42:21.203Z",
"project": {
"id": "d077258e-2158-4f34-aabd-97e971d0c18d",
"name": "Cloud Infrastructure Services",
"client": {
"id": "aa39afdb-e168-4956-b061-41c7c62e8c2e",
"name": "Paul's Boutique"
}
},
"invoiceItem": {
"id": "aba04832-216c-463e-8998-c520948f707c",
"name": "Consulting Services"
},
"invoiced": false
}/project-invoice-milestones/{id} path remains available as an alias for this endpoint.Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
The project billing schedule item uuid
Body
The type of billing schedule item. Identifies whether the item is one-off ("custom", the default) or recurring ("recurring").
custom, recurring The date of the billing schedule item. Must be in the form YYYY-MM-DD.
The quantity for calculating the fee. Required when rate is provided.
The rate for calculating the fee. Required when quantity is provided.
The total amount for the billing schedule item. Required when quantity and rate are not provided.
The name of the billing schedule item (max 255 chars).
The invoice item ID (uuid) for this billing schedule item.
Response
200
The unique identifier for the object.
The type of billing schedule item. Identifies whether the item is one-off ("custom", the default) or recurring ("recurring").
custom, recurring The date of the billing schedule item. Will be in the form YYYY-MM-DD.
The quantity used to calculate the fee.
The rate used to calculate the fee.
The total amount for the billing schedule item.
The name of the billing schedule item.
The timestamp when the object was created.
The project this billing schedule item belongs to.
Show child attributes
Show child attributes
The invoice item associated with this billing schedule item.
Show child attributes
Show child attributes
Whether the billing schedule item has been invoiced.