curl --request POST \
--url https://www.ruddr.io/api/workspace/project-product-items \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"projectId": "<string>",
"invoiceItemId": "<string>",
"date": "2023-12-25",
"description": "<string>",
"quantity": 123,
"rate": 123,
"fee": 123
}
'import requests
url = "https://www.ruddr.io/api/workspace/project-product-items"
payload = {
"projectId": "<string>",
"invoiceItemId": "<string>",
"date": "2023-12-25",
"description": "<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({
projectId: '<string>',
invoiceItemId: '<string>',
date: '2023-12-25',
description: '<string>',
quantity: 123,
rate: 123,
fee: 123
})
};
fetch('https://www.ruddr.io/api/workspace/project-product-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-product-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([
'projectId' => '<string>',
'invoiceItemId' => '<string>',
'date' => '2023-12-25',
'description' => '<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-product-items"
payload := strings.NewReader("{\n \"projectId\": \"<string>\",\n \"invoiceItemId\": \"<string>\",\n \"date\": \"2023-12-25\",\n \"description\": \"<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-product-items")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"projectId\": \"<string>\",\n \"invoiceItemId\": \"<string>\",\n \"date\": \"2023-12-25\",\n \"description\": \"<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-product-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 \"projectId\": \"<string>\",\n \"invoiceItemId\": \"<string>\",\n \"date\": \"2023-12-25\",\n \"description\": \"<string>\",\n \"quantity\": 123,\n \"rate\": 123,\n \"fee\": 123\n}"
response = http.request(request)
puts response.read_body{
"id": "d4a8c2f6-7e3b-4d9a-b5c1-9f6e2a8d3b74",
"date": "2026-06-04",
"quantity": 10,
"rate": 150,
"fee": 1500,
"description": "Premium CRM licenses",
"createdAt": "2026-06-04T15:32:18.457Z",
"project": {
"id": "3b8f6d2a-9c4e-4b7d-a1f5-8e2c5d9b4163",
"name": "CRM Implementation",
"client": {
"id": "7a2e9f4c-1d6b-4a3e-b8c5-2f9d6e1a7b48",
"name": "Globex Corporation"
}
},
"invoiceItem": {
"id": "9c5b2e8f-4a7d-4c1b-8e6a-3d2f7c4b9a15",
"name": "Products"
},
"invoiced": false
}Create a project product item
curl --request POST \
--url https://www.ruddr.io/api/workspace/project-product-items \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"projectId": "<string>",
"invoiceItemId": "<string>",
"date": "2023-12-25",
"description": "<string>",
"quantity": 123,
"rate": 123,
"fee": 123
}
'import requests
url = "https://www.ruddr.io/api/workspace/project-product-items"
payload = {
"projectId": "<string>",
"invoiceItemId": "<string>",
"date": "2023-12-25",
"description": "<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({
projectId: '<string>',
invoiceItemId: '<string>',
date: '2023-12-25',
description: '<string>',
quantity: 123,
rate: 123,
fee: 123
})
};
fetch('https://www.ruddr.io/api/workspace/project-product-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-product-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([
'projectId' => '<string>',
'invoiceItemId' => '<string>',
'date' => '2023-12-25',
'description' => '<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-product-items"
payload := strings.NewReader("{\n \"projectId\": \"<string>\",\n \"invoiceItemId\": \"<string>\",\n \"date\": \"2023-12-25\",\n \"description\": \"<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-product-items")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"projectId\": \"<string>\",\n \"invoiceItemId\": \"<string>\",\n \"date\": \"2023-12-25\",\n \"description\": \"<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-product-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 \"projectId\": \"<string>\",\n \"invoiceItemId\": \"<string>\",\n \"date\": \"2023-12-25\",\n \"description\": \"<string>\",\n \"quantity\": 123,\n \"rate\": 123,\n \"fee\": 123\n}"
response = http.request(request)
puts response.read_body{
"id": "d4a8c2f6-7e3b-4d9a-b5c1-9f6e2a8d3b74",
"date": "2026-06-04",
"quantity": 10,
"rate": 150,
"fee": 1500,
"description": "Premium CRM licenses",
"createdAt": "2026-06-04T15:32:18.457Z",
"project": {
"id": "3b8f6d2a-9c4e-4b7d-a1f5-8e2c5d9b4163",
"name": "CRM Implementation",
"client": {
"id": "7a2e9f4c-1d6b-4a3e-b8c5-2f9d6e1a7b48",
"name": "Globex Corporation"
}
},
"invoiceItem": {
"id": "9c5b2e8f-4a7d-4c1b-8e6a-3d2f7c4b9a15",
"name": "Products"
},
"invoiced": false
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
The project ID (uuid) for this product item.
The invoice item ID (uuid) for this product item.
The date of the item. Will be in the form YYYY-MM-DD.
A description of the product being charged.
The quantity used to calculate the fee.
The rate used to calculate the fee.
The total amount of the item.
Response
200
The unique identifier for the object.
The date of the 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 of the item.
A description of the product being charged.
The timestamp when the object was created.
The project this item belongs to.
Show child attributes
Show child attributes
The invoice item associated with this product item.
Show child attributes
Show child attributes
Whether the item has been invoiced.