curl --request POST \
--url https://www.ruddr.io/api/workspace/project-billing-schedule-items \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"date": "2023-12-25",
"name": "<string>",
"projectId": "<string>",
"invoiceItemId": "<string>",
"quantity": 123,
"rate": 123,
"fee": 123
}
'import requests
url = "https://www.ruddr.io/api/workspace/project-billing-schedule-items"
payload = {
"date": "2023-12-25",
"name": "<string>",
"projectId": "<string>",
"invoiceItemId": "<string>",
"quantity": 123,
"rate": 123,
"fee": 123
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
date: '2023-12-25',
name: '<string>',
projectId: '<string>',
invoiceItemId: '<string>',
quantity: 123,
rate: 123,
fee: 123
})
};
fetch('https://www.ruddr.io/api/workspace/project-billing-schedule-items', 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",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'date' => '2023-12-25',
'name' => '<string>',
'projectId' => '<string>',
'invoiceItemId' => '<string>',
'quantity' => 123,
'rate' => 123,
'fee' => 123
]),
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"
payload := strings.NewReader("{\n \"date\": \"2023-12-25\",\n \"name\": \"<string>\",\n \"projectId\": \"<string>\",\n \"invoiceItemId\": \"<string>\",\n \"quantity\": 123,\n \"rate\": 123,\n \"fee\": 123\n}")
req, _ := http.NewRequest("POST", 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.post("https://www.ruddr.io/api/workspace/project-billing-schedule-items")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"date\": \"2023-12-25\",\n \"name\": \"<string>\",\n \"projectId\": \"<string>\",\n \"invoiceItemId\": \"<string>\",\n \"quantity\": 123,\n \"rate\": 123,\n \"fee\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.ruddr.io/api/workspace/project-billing-schedule-items")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"date\": \"2023-12-25\",\n \"name\": \"<string>\",\n \"projectId\": \"<string>\",\n \"invoiceItemId\": \"<string>\",\n \"quantity\": 123,\n \"rate\": 123,\n \"fee\": 123\n}"
response = http.request(request)
puts response.read_body{
"id": "7f3e1a2d-94b8-4c6e-b3f1-d52a8e0c7b94",
"typeId": "custom",
"date": "2026-04-01",
"quantity": 1,
"rate": 15000,
"fee": 15000,
"name": "Phase 1 Delivery",
"createdAt": "2026-03-03T09:15:00.000Z",
"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
}Create a project billing schedule item
curl --request POST \
--url https://www.ruddr.io/api/workspace/project-billing-schedule-items \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"date": "2023-12-25",
"name": "<string>",
"projectId": "<string>",
"invoiceItemId": "<string>",
"quantity": 123,
"rate": 123,
"fee": 123
}
'import requests
url = "https://www.ruddr.io/api/workspace/project-billing-schedule-items"
payload = {
"date": "2023-12-25",
"name": "<string>",
"projectId": "<string>",
"invoiceItemId": "<string>",
"quantity": 123,
"rate": 123,
"fee": 123
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
date: '2023-12-25',
name: '<string>',
projectId: '<string>',
invoiceItemId: '<string>',
quantity: 123,
rate: 123,
fee: 123
})
};
fetch('https://www.ruddr.io/api/workspace/project-billing-schedule-items', 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",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'date' => '2023-12-25',
'name' => '<string>',
'projectId' => '<string>',
'invoiceItemId' => '<string>',
'quantity' => 123,
'rate' => 123,
'fee' => 123
]),
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"
payload := strings.NewReader("{\n \"date\": \"2023-12-25\",\n \"name\": \"<string>\",\n \"projectId\": \"<string>\",\n \"invoiceItemId\": \"<string>\",\n \"quantity\": 123,\n \"rate\": 123,\n \"fee\": 123\n}")
req, _ := http.NewRequest("POST", 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.post("https://www.ruddr.io/api/workspace/project-billing-schedule-items")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"date\": \"2023-12-25\",\n \"name\": \"<string>\",\n \"projectId\": \"<string>\",\n \"invoiceItemId\": \"<string>\",\n \"quantity\": 123,\n \"rate\": 123,\n \"fee\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.ruddr.io/api/workspace/project-billing-schedule-items")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"date\": \"2023-12-25\",\n \"name\": \"<string>\",\n \"projectId\": \"<string>\",\n \"invoiceItemId\": \"<string>\",\n \"quantity\": 123,\n \"rate\": 123,\n \"fee\": 123\n}"
response = http.request(request)
puts response.read_body{
"id": "7f3e1a2d-94b8-4c6e-b3f1-d52a8e0c7b94",
"typeId": "custom",
"date": "2026-04-01",
"quantity": 1,
"rate": 15000,
"fee": 15000,
"name": "Phase 1 Delivery",
"createdAt": "2026-03-03T09:15:00.000Z",
"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 path remains available as an alias for this endpoint.Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
The date of the billing schedule item. Must be in the form YYYY-MM-DD.
The name of the billing schedule item (max 255 chars).
The project ID (uuid) for this billing schedule item. Must be a fixed or fixed_recurring billing type project.
The invoice item ID (uuid) for this billing schedule item.
The type of billing schedule item. Identifies whether the item is one-off ("custom", the default) or recurring ("recurring").
custom, recurring 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.
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.