curl --request GET \
--url https://panel.sendcloud.sc/api/v3/invoice-items \
--header 'Authorization: Basic <encoded-value>'import requests
url = "https://panel.sendcloud.sc/api/v3/invoice-items"
headers = {"Authorization": "Basic <encoded-value>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Basic <encoded-value>'}};
fetch('https://panel.sendcloud.sc/api/v3/invoice-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://panel.sendcloud.sc/api/v3/invoice-items",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Basic <encoded-value>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://panel.sendcloud.sc/api/v3/invoice-items"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Basic <encoded-value>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://panel.sendcloud.sc/api/v3/invoice-items")
.header("Authorization", "Basic <encoded-value>")
.asString();require 'uri'
require 'net/http'
url = URI("https://panel.sendcloud.sc/api/v3/invoice-items")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Basic <encoded-value>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": 1042,
"type": "shipment",
"subtype": null,
"description": "Parcel 99887766 — NL → DE",
"created_at": "2026-05-14T08:21:00Z",
"updated_at": "2026-05-14T08:21:00Z",
"price": {
"value": "5.4209",
"currency": "EUR"
},
"conversion": {
"original_price": {
"value": "4.7000",
"currency": "GBP"
},
"exchange_rate": "1.15339153",
"date": "2026-05-14",
"reference_rate": "1.13077601",
"currency_conversion_fee": {
"value": "0.1063",
"currency": "EUR",
"rate": "0.0200"
}
},
"tax": {
"value": "1.1384",
"currency": "EUR"
},
"tax_rate": "0.21",
"vat_code": "NL_STANDARD",
"reference": "99887766",
"parcel_id": 99887766,
"brand": {
"id": 3021,
"name": "Acme"
},
"integration": {
"id": 48210,
"name": "Acme Webshop"
},
"pickup_id": null,
"carrier_id": 17,
"from_country": "NL",
"invoice_id": 5501
},
{
"id": 1043,
"type": "surcharge",
"subtype": "dimensional",
"description": "Dimensional surcharge — parcel 99887767 (pending invoice)",
"created_at": "2026-06-02T14:05:00Z",
"updated_at": null,
"price": {
"value": "4.1000",
"currency": "EUR"
},
"conversion": null,
"tax": null,
"tax_rate": null,
"vat_code": null,
"reference": "99887767",
"parcel_id": 99887767,
"brand": {
"id": 3021,
"name": "Acme"
},
"integration": {
"id": 48210,
"name": "Acme Webshop"
},
"pickup_id": null,
"carrier_id": 17,
"from_country": "NL",
"invoice_id": null
}
]
}{
"errors": [
{
"detail": "Unknown invoice item type `foo`.",
"status": "400",
"code": "invalid",
"source": {
"parameter": "type"
}
}
]
}{
"errors": [
{
"detail": "Authentication credentials were not provided.",
"status": "401",
"code": "not_authenticated"
}
]
}Retrieve a list of invoice items
Retrieve a paginated list of invoice items for your organization.
The response includes both invoiced items (where invoice_id is set) and pending items that have been billed but not yet consolidated onto an invoice (where invoice_id is null and tax / tax_rate are null). Use the date filters to scope the result set, and the cursor in the Link response header to page through results.
This endpoint uses cursor-based pagination via Link headers. See Pagination for details.
Pending invoice items (where invoice_id is null) are not final. Amounts and types can still change, and Sendcloud may remove items, up until they are consolidated onto an invoice. Treat pending items as a preview, not a guarantee.
curl --request GET \
--url https://panel.sendcloud.sc/api/v3/invoice-items \
--header 'Authorization: Basic <encoded-value>'import requests
url = "https://panel.sendcloud.sc/api/v3/invoice-items"
headers = {"Authorization": "Basic <encoded-value>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Basic <encoded-value>'}};
fetch('https://panel.sendcloud.sc/api/v3/invoice-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://panel.sendcloud.sc/api/v3/invoice-items",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Basic <encoded-value>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://panel.sendcloud.sc/api/v3/invoice-items"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Basic <encoded-value>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://panel.sendcloud.sc/api/v3/invoice-items")
.header("Authorization", "Basic <encoded-value>")
.asString();require 'uri'
require 'net/http'
url = URI("https://panel.sendcloud.sc/api/v3/invoice-items")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Basic <encoded-value>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": 1042,
"type": "shipment",
"subtype": null,
"description": "Parcel 99887766 — NL → DE",
"created_at": "2026-05-14T08:21:00Z",
"updated_at": "2026-05-14T08:21:00Z",
"price": {
"value": "5.4209",
"currency": "EUR"
},
"conversion": {
"original_price": {
"value": "4.7000",
"currency": "GBP"
},
"exchange_rate": "1.15339153",
"date": "2026-05-14",
"reference_rate": "1.13077601",
"currency_conversion_fee": {
"value": "0.1063",
"currency": "EUR",
"rate": "0.0200"
}
},
"tax": {
"value": "1.1384",
"currency": "EUR"
},
"tax_rate": "0.21",
"vat_code": "NL_STANDARD",
"reference": "99887766",
"parcel_id": 99887766,
"brand": {
"id": 3021,
"name": "Acme"
},
"integration": {
"id": 48210,
"name": "Acme Webshop"
},
"pickup_id": null,
"carrier_id": 17,
"from_country": "NL",
"invoice_id": 5501
},
{
"id": 1043,
"type": "surcharge",
"subtype": "dimensional",
"description": "Dimensional surcharge — parcel 99887767 (pending invoice)",
"created_at": "2026-06-02T14:05:00Z",
"updated_at": null,
"price": {
"value": "4.1000",
"currency": "EUR"
},
"conversion": null,
"tax": null,
"tax_rate": null,
"vat_code": null,
"reference": "99887767",
"parcel_id": 99887767,
"brand": {
"id": 3021,
"name": "Acme"
},
"integration": {
"id": 48210,
"name": "Acme Webshop"
},
"pickup_id": null,
"carrier_id": 17,
"from_country": "NL",
"invoice_id": null
}
]
}{
"errors": [
{
"detail": "Unknown invoice item type `foo`.",
"status": "400",
"code": "invalid",
"source": {
"parameter": "type"
}
}
]
}{
"errors": [
{
"detail": "Authentication credentials were not provided.",
"status": "401",
"code": "not_authenticated"
}
]
}read:invoice. See Scopes for OAuth apps.Authorizations
Query Parameters
Return only invoice items of this type. Returns 400 if the value is not a recognized public type.
addon, addon_refund, carrier_impl_fee, carrier_parcel_fee, claim, coulance, customer_impl_fee, earned_credit, fuel_refund, fuel_surcharge, import_adm_fee, import_duties, import_vat, insurance, insurance_refund, invoice_check_fee, invoice_check_fee_refund, notification, overcharge_fee, parcel_cancelled, parcel_fee, parcel_fee_refund, pickup, pickup_cancelled, pickup_subscription, refund, shipment, subscription, subscription_refund, surcharge, surcharge_refund, unblock, validation The cursor query string is used as the pivot value to filter results. If no value is provided, the first page of results will be returned. To get this value, you must encode the offset, reverse and position into a base64 string.
There are 3 possible parameters to encode:
o: Offsetr: Reversep: Position
For example, r=1&p=300 encoded as a base64 string would be cj0xJnA9MzAw. The query string would then be cursor=cj0xJnA9MzAw.
"cj0xJnA9MzAw"