curl --request POST \
--url https://panel.sendcloud.sc/api/v3/reporting/parcels \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--data '
{
"fields": [
"parcel_id",
"tracking_number",
"shipping_option_code",
"status",
"announced_at",
"delivered_at"
],
"filters": {
"announced_after": "2025-04-01T00:00:00Z",
"announced_before": "2025-04-30T23:59:59Z",
"direction": "outgoing"
}
}
'import requests
url = "https://panel.sendcloud.sc/api/v3/reporting/parcels"
payload = {
"fields": ["parcel_id", "tracking_number", "shipping_option_code", "status", "announced_at", "delivered_at"],
"filters": {
"announced_after": "2025-04-01T00:00:00Z",
"announced_before": "2025-04-30T23:59:59Z",
"direction": "outgoing"
}
}
headers = {
"Authorization": "Basic <encoded-value>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Basic <encoded-value>', 'Content-Type': 'application/json'},
body: JSON.stringify({
fields: [
'parcel_id',
'tracking_number',
'shipping_option_code',
'status',
'announced_at',
'delivered_at'
],
filters: {
announced_after: '2025-04-01T00:00:00Z',
announced_before: '2025-04-30T23:59:59Z',
direction: 'outgoing'
}
})
};
fetch('https://panel.sendcloud.sc/api/v3/reporting/parcels', 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/reporting/parcels",
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([
'fields' => [
'parcel_id',
'tracking_number',
'shipping_option_code',
'status',
'announced_at',
'delivered_at'
],
'filters' => [
'announced_after' => '2025-04-01T00:00:00Z',
'announced_before' => '2025-04-30T23:59:59Z',
'direction' => 'outgoing'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Basic <encoded-value>",
"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://panel.sendcloud.sc/api/v3/reporting/parcels"
payload := strings.NewReader("{\n \"fields\": [\n \"parcel_id\",\n \"tracking_number\",\n \"shipping_option_code\",\n \"status\",\n \"announced_at\",\n \"delivered_at\"\n ],\n \"filters\": {\n \"announced_after\": \"2025-04-01T00:00:00Z\",\n \"announced_before\": \"2025-04-30T23:59:59Z\",\n \"direction\": \"outgoing\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Basic <encoded-value>")
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://panel.sendcloud.sc/api/v3/reporting/parcels")
.header("Authorization", "Basic <encoded-value>")
.header("Content-Type", "application/json")
.body("{\n \"fields\": [\n \"parcel_id\",\n \"tracking_number\",\n \"shipping_option_code\",\n \"status\",\n \"announced_at\",\n \"delivered_at\"\n ],\n \"filters\": {\n \"announced_after\": \"2025-04-01T00:00:00Z\",\n \"announced_before\": \"2025-04-30T23:59:59Z\",\n \"direction\": \"outgoing\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://panel.sendcloud.sc/api/v3/reporting/parcels")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Basic <encoded-value>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"fields\": [\n \"parcel_id\",\n \"tracking_number\",\n \"shipping_option_code\",\n \"status\",\n \"announced_at\",\n \"delivered_at\"\n ],\n \"filters\": {\n \"announced_after\": \"2025-04-01T00:00:00Z\",\n \"announced_before\": \"2025-04-30T23:59:59Z\",\n \"direction\": \"outgoing\"\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "419f3be0-2f49-434b-bee4-d8cff9cf7d01",
"organization_id": 12345,
"status": "queued",
"status_message": "The report is queued",
"fields": [
"parcel_id",
"tracking_number",
"shipping_option_code",
"status",
"announced_at",
"delivered_at"
],
"filters": {
"announced_after": "2025-04-01T00:00:00Z",
"announced_before": "2025-04-30T23:59:59Z",
"direction": "outgoing"
},
"url": null,
"expires_at": null,
"updated_at": "2025-05-01T08:23:10.226265Z",
"created_at": "2025-05-01T08:23:10.226265Z"
}{
"errors": [
{
"status": "400",
"code": "invalid",
"title": "Bad Request",
"detail": "CSV export exceeds row limit of 100000, narrow the date range or apply additional filters."
}
]
}{
"errors": [
{
"status": "401",
"code": "authentication_failed",
"title": "Authentication Failed",
"detail": "Unauthorized"
}
]
}{
"errors": [
{
"status": "403",
"code": "forbidden",
"title": "Forbidden",
"detail": "Forbidden"
}
]
}{
"errors": [
{
"status": "422",
"code": "validation_error",
"title": "Validation Error",
"detail": "Input should be a valid datetime",
"source": {
"pointer": "/data/attributes/filters/announced_after"
}
}
]
}{
"errors": [
{
"status": "500",
"code": "unknown_error",
"title": "Internal Server Error",
"detail": "Something went wrong"
}
]
}Create a parcels report
Generate a CSV report containing information about outgoing or incoming parcels.
curl --request POST \
--url https://panel.sendcloud.sc/api/v3/reporting/parcels \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--data '
{
"fields": [
"parcel_id",
"tracking_number",
"shipping_option_code",
"status",
"announced_at",
"delivered_at"
],
"filters": {
"announced_after": "2025-04-01T00:00:00Z",
"announced_before": "2025-04-30T23:59:59Z",
"direction": "outgoing"
}
}
'import requests
url = "https://panel.sendcloud.sc/api/v3/reporting/parcels"
payload = {
"fields": ["parcel_id", "tracking_number", "shipping_option_code", "status", "announced_at", "delivered_at"],
"filters": {
"announced_after": "2025-04-01T00:00:00Z",
"announced_before": "2025-04-30T23:59:59Z",
"direction": "outgoing"
}
}
headers = {
"Authorization": "Basic <encoded-value>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Basic <encoded-value>', 'Content-Type': 'application/json'},
body: JSON.stringify({
fields: [
'parcel_id',
'tracking_number',
'shipping_option_code',
'status',
'announced_at',
'delivered_at'
],
filters: {
announced_after: '2025-04-01T00:00:00Z',
announced_before: '2025-04-30T23:59:59Z',
direction: 'outgoing'
}
})
};
fetch('https://panel.sendcloud.sc/api/v3/reporting/parcels', 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/reporting/parcels",
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([
'fields' => [
'parcel_id',
'tracking_number',
'shipping_option_code',
'status',
'announced_at',
'delivered_at'
],
'filters' => [
'announced_after' => '2025-04-01T00:00:00Z',
'announced_before' => '2025-04-30T23:59:59Z',
'direction' => 'outgoing'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Basic <encoded-value>",
"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://panel.sendcloud.sc/api/v3/reporting/parcels"
payload := strings.NewReader("{\n \"fields\": [\n \"parcel_id\",\n \"tracking_number\",\n \"shipping_option_code\",\n \"status\",\n \"announced_at\",\n \"delivered_at\"\n ],\n \"filters\": {\n \"announced_after\": \"2025-04-01T00:00:00Z\",\n \"announced_before\": \"2025-04-30T23:59:59Z\",\n \"direction\": \"outgoing\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Basic <encoded-value>")
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://panel.sendcloud.sc/api/v3/reporting/parcels")
.header("Authorization", "Basic <encoded-value>")
.header("Content-Type", "application/json")
.body("{\n \"fields\": [\n \"parcel_id\",\n \"tracking_number\",\n \"shipping_option_code\",\n \"status\",\n \"announced_at\",\n \"delivered_at\"\n ],\n \"filters\": {\n \"announced_after\": \"2025-04-01T00:00:00Z\",\n \"announced_before\": \"2025-04-30T23:59:59Z\",\n \"direction\": \"outgoing\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://panel.sendcloud.sc/api/v3/reporting/parcels")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Basic <encoded-value>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"fields\": [\n \"parcel_id\",\n \"tracking_number\",\n \"shipping_option_code\",\n \"status\",\n \"announced_at\",\n \"delivered_at\"\n ],\n \"filters\": {\n \"announced_after\": \"2025-04-01T00:00:00Z\",\n \"announced_before\": \"2025-04-30T23:59:59Z\",\n \"direction\": \"outgoing\"\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "419f3be0-2f49-434b-bee4-d8cff9cf7d01",
"organization_id": 12345,
"status": "queued",
"status_message": "The report is queued",
"fields": [
"parcel_id",
"tracking_number",
"shipping_option_code",
"status",
"announced_at",
"delivered_at"
],
"filters": {
"announced_after": "2025-04-01T00:00:00Z",
"announced_before": "2025-04-30T23:59:59Z",
"direction": "outgoing"
},
"url": null,
"expires_at": null,
"updated_at": "2025-05-01T08:23:10.226265Z",
"created_at": "2025-05-01T08:23:10.226265Z"
}{
"errors": [
{
"status": "400",
"code": "invalid",
"title": "Bad Request",
"detail": "CSV export exceeds row limit of 100000, narrow the date range or apply additional filters."
}
]
}{
"errors": [
{
"status": "401",
"code": "authentication_failed",
"title": "Authentication Failed",
"detail": "Unauthorized"
}
]
}{
"errors": [
{
"status": "403",
"code": "forbidden",
"title": "Forbidden",
"detail": "Forbidden"
}
]
}{
"errors": [
{
"status": "422",
"code": "validation_error",
"title": "Validation Error",
"detail": "Input should be a valid datetime",
"source": {
"pointer": "/data/attributes/filters/announced_after"
}
}
]
}{
"errors": [
{
"status": "500",
"code": "unknown_error",
"title": "Internal Server Error",
"detail": "Something went wrong"
}
]
}filters you send, and the columns are determined by the fields you select.
Use this endpoint to create the report and obtain the report id, which you then poll with Retrieve a parcels report until the CSV is ready for download.Authorizations
Basic Authentication using API key and secrets is currently the main authentication mechanism.
Body
Request body for creating a parcels report.
Columns to include in the CSV report, in the order they should appear.
1A column that can be included in a parcels report.
parcel_id, direction, carrier_code, carrier_name, from_address_company_name, contract_id, contract_type, from_address_city, from_address_postal_code, from_address_country_code, from_address_country_name, to_address_city, to_address_postal_code, to_address_country_code, to_address_country_name, order_number, tracking_number, announced_at, shipped_at, first_offer_at, delivered_at, shipping_option_code, total_cost, status, sub_status, integration_id, integration_type, weight, brand_id, brand_name Filters that determine which parcels are included in the report.
Show child attributes
Show child attributes
Response
Accepted
Represents a parcels report and its processing state.
Unique identifier of the report.
"419f3be0-2f49-434b-bee4-d8cff9cf7d01"
Identifier of the organization the report belongs to.
x >= 112345
Current processing status of the report.
queued, generating, ready, failed, expired "ready"
Human-readable description of the current status.
"The report is ready"
Columns included in the report.
A column that can be included in a parcels report.
parcel_id, direction, carrier_code, carrier_name, from_address_company_name, contract_id, contract_type, from_address_city, from_address_postal_code, from_address_country_code, from_address_country_name, to_address_city, to_address_postal_code, to_address_country_code, to_address_country_name, order_number, tracking_number, announced_at, shipped_at, first_offer_at, delivered_at, shipping_option_code, total_cost, status, sub_status, integration_id, integration_type, weight, brand_id, brand_name Filters that determine which parcels are included in the report.
Show child attributes
Show child attributes
URL to download the CSV. null until the report status is ready, and again after expiry.
"https://reporting-service.s3.eu-central-1.amazonaws.com/reports/parcels_v3/2025-05-01/419f3be0-2f49-434b-bee4-d8cff9cf7d01.csv"
When the report (and its download URL) will expire. null until the report is ready.
"2025-05-01T08:38:10.226217Z"
When the report was last updated.
"2025-05-01T08:24:10.226265Z"
When the report was created.
"2025-05-01T08:23:10.226265Z"