Get a project
A project with its vehicles, items, groups, options and a summary of its current plan (with the PDF link while the plan is the one an API job saved).
Free: no credits are charged.
Autenticação
Parâmetros de caminho
idstringobrigatórioProject id (prj_…).
Exemplo de pedido
curl -X GET "https://runner.cargoduo.com/v1/projects/prj_3051" \
-H "Authorization: Bearer $CARGODUO_API_KEY"const res = await fetch("https://runner.cargoduo.com/v1/projects/prj_3051", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.CARGODUO_API_KEY}`,
},
});
const data = await res.json();
console.log(res.status, data);import os
import requests
response = requests.get(
"https://runner.cargoduo.com/v1/projects/prj_3051",
headers={"Authorization": f"Bearer {os.environ['CARGODUO_API_KEY']}"},
)
print(response.status_code, response.json())package main
import (
"fmt"
"io"
"net/http"
"os"
)
func main() {
req, err := http.NewRequest("GET", "https://runner.cargoduo.com/v1/projects/prj_3051", nil)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("CARGODUO_API_KEY"))
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.StatusCode, string(out))
}import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Main {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://runner.cargoduo.com/v1/projects/prj_3051"))
.header("Authorization", "Bearer " + System.getenv("CARGODUO_API_KEY"))
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode() + " " + response.body());
}
}using System.Net.Http.Headers;
using System.Text;
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", Environment.GetEnvironmentVariable("CARGODUO_API_KEY"));
var request = new HttpRequestMessage(HttpMethod.Get, "https://runner.cargoduo.com/v1/projects/prj_3051");
var response = await client.SendAsync(request);
Console.WriteLine($"{(int)response.StatusCode} {await response.Content.ReadAsStringAsync()}");<?php
$ch = curl_init('https://runner.cargoduo.com/v1/projects/prj_3051');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('CARGODUO_API_KEY'),
],
]);
$response = curl_exec($ch);
echo curl_getinfo($ch, CURLINFO_HTTP_CODE), ' ', $response, PHP_EOL;require "net/http"
require "uri"
uri = URI("https://runner.cargoduo.com/v1/projects/prj_3051")
request = Net::HTTP::Get.new(uri)
request["Authorization"] = "Bearer #{ENV.fetch("CARGODUO_API_KEY")}"
response = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https") do |http|
http.request(request)
end
puts response.code, response.bodyExemplo de resposta
{
"id": "prj_3051",
"object": "project",
"name": "Order 1042",
"status": "calculated",
"item_count": 58,
"vehicle_count": 1,
"app_url": "https://app.cargoduo.com/projects/3051",
"created_by": {
"id": "usr_7",
"name": "Elif Kaya"
},
"updated_by": {
"id": "usr_7",
"name": "Elif Kaya"
},
"created_at": "2026-10-19T09:10:03Z",
"updated_at": "2026-10-19T09:12:07Z",
"options": {
"packing_mode": "auto",
"group_routing": "none",
"allow_overweight": false
},
"vehicles": [
{
"id": "pv_5120",
"vehicle_id": "standard-trailer-13-6m",
"name": "Standard Trailer (13.6m)",
"type": "trailer",
"quantity": 1,
"length": 1362,
"width": 248,
"height": 270,
"max_weight": 24000
}
],
"items": [
{
"id": "item_88410",
"label": "Euro pallet",
"shape": "box",
"length": 120,
"width": 80,
"height": 140,
"weight": 450,
"quantity": 18,
"stackable": false,
"rotation": "all",
"color": "#3b82f6"
},
{
"id": "item_88411",
"label": "Carton A",
"shape": "box",
"length": 60,
"width": 40,
"height": 40,
"weight": 12,
"quantity": 40,
"stackable": true,
"rotation": "upright",
"color": "#f59e0b"
}
],
"groups": [],
"plan": {
"items_placed": 58,
"items_unplaced": 0,
"vehicles_used": 1,
"total_weight": 8580,
"volume_utilization": 0.3116,
"job_id": "job_4bK9mT2xQe7LpW1zRc8VdN3f",
"pdf_url": "https://app.cargoduo.com/r/Xq7Lm2Vt9KbR4cN8wZp1Hs6Yd3Fg5Jk0Ta2Ue7Wn4Ci"
}
}Respostas
200OKThe project.
NomeTipoObrigatórioDescriçãoidstringstringNãoProject id (prj_…).
objectstringstringNãoprojectnamestringstringNãostatusstringstringNãodraft= never packed or inputs replaced;calculated= has a current plan;stale= a setting changed since the plan was made.draftcalculatedstaleerroritem_countintegerintegerNãoItem units (sum of quantities).
vehicle_countintegerintegerNãoVehicles (sum of quantities).
app_urlstringstringNãoOpens the project in the app's 3D editor.
created_byUserRef | nullUserRef | nullNãoThe member who created it (for API calls: the member who created the key).
nullwhen unknown.idstringstringNãoMember id (usr_…). Filter lists with ?created_by=.
namestringstringNãoupdated_byUserRef | nullUserRef | nullNãoThe member who last changed it.
idstringstringNãoMember id (usr_…). Filter lists with ?created_by=.
namestringstringNãocreated_atstringstringNãoRFC 3339.
updated_atstringstringNãoRFC 3339.
optionsProjectOptionsProjectOptionsNãoThe pack options a project stores.
packing_modestringstringNãoauto= when the listed vehicles are full, more copies of the most suitable vehicle are added (up to the job's vehicle limit);fleet_only= only the listed vehicles are used, anything that does not fit is reported as unplaced.autofleet_onlyPredefinição"auto"group_routingstringstringNãonone= groups are informational;wall= each group gets its own section of the vehicle;routing= groups load in order and a later group may sit on or beside an earlier one but never below it (multi-stop delivery);no_stack= groups load in order side by side, never on top of each other.nonewallroutingno_stackPredefinição"none"allow_overweightbooleanbooleanNãoIgnore vehicle payload limits.
PredefiniçãofalsevehiclesProjectVehicle[]ProjectVehicle[]NãoidstringstringNãoSlot id (pv_…). Results of the project's jobs refer to it as vehicle_id. Read-only.
vehicle_idstringobrigatóriostringSimA vehicle id from GET /v1/vehicles (preset or veh_…).
namestringstringNãoThe saved vehicle's name. Read-only.
typestringstringNãoThe saved vehicle's type. Read-only.
trucktrailerflatbedcontainerpalletaircraftshiplengthnumber · cmnumber · cmNãoThe size the slot packs with; sent, an override of the saved vehicle's.
widthnumber · cmnumber · cmNãoThe size the slot packs with; sent, an override of the saved vehicle's.
heightnumber · cmnumber · cmNãoThe size the slot packs with; sent, an override of the saved vehicle's.
max_weightnumber · kgnumber · kgNãoThe size the slot packs with; sent, an override of the saved vehicle's.
quantityintegerintegerNãoHow many identical vehicles of this definition are available.
Predefinição11–100aux_deckbooleanbooleanNãoThe vehicle has a second deck (double-decker).
Predefiniçãofalseaux_deck_heightnumber · cmnumber · cmNãoSecond deck height above the floor. Required when
aux_deckistrue.aux_deck_max_weightnumber · kgnumber · kgNãoLoad limit of the second deck. Required when
aux_deckistrue.blocked_areasRect[]Rect[]NãoFloor zones nothing may stand on (wheel arches, damage, reserved space). Each must lie on the vehicle floor.
≤ 32 itemsxnumber · cmobrigatórionumber · cmSimDistance from the front wall to the rectangle's near edge.
znumber · cmobrigatórionumber · cmSimDistance from the right wall (z = 0; right as seen from the door looking in) to the rectangle's near edge.
lengthnumber · cmobrigatórionumber · cmSimExtent along x.
widthnumber · cmobrigatórionumber · cmSimExtent along z.
tractor_weightAcesso mediante pedidonumber · kgnumber · kgNãoSemi-trailer axle model: tractor unit mass.
empty_trailer_weightAcesso mediante pedidonumber · kgnumber · kgNãoSemi-trailer axle model: unladen trailer mass.
front_axle_to_middle_axleAcesso mediante pedidonumber · cmnumber · cmNãoSemi-trailer axle model: tractor front axle to drive (middle) axle.
front_axle_to_tractor_cogAcesso mediante pedidonumber · cmnumber · cmNãoSemi-trailer axle model: front axle to tractor centre of gravity.
front_axle_to_kingpinAcesso mediante pedidonumber · cmnumber · cmNãoSemi-trailer axle model: front axle to kingpin (fifth wheel).
kingpin_to_rear_axleAcesso mediante pedidonumber · cmnumber · cmNãoSemi-trailer axle model: kingpin to trailer rear axle group.
trailer_cog_to_rear_axleAcesso mediante pedidonumber · cmnumber · cmNãoSemi-trailer axle model: trailer centre of gravity to rear axle group.
trailer_start_to_kingpinAcesso mediante pedidonumber · cmnumber · cmNãoSemi-trailer axle model: trailer front to kingpin.
max_middle_axle_weightAcesso mediante pedidonumber · kgnumber · kgNãoSemi-trailer axle model: legal drive (middle) axle limit.
max_rear_axle_weightAcesso mediante pedidonumber · kgnumber · kgNãoSemi-trailer axle model: legal rear axle group limit.
itemsItem[]Item[]NãoCargo in the /v1/pack Item shape; ids are item_….
idstringstringNãoYour identifier, unique within the request. Results refer to it as item_id. Defaults to template_id.
≤ 128 charstemplate_idstringstringNãoA template id (tpl_…) from GET /v1/templates. Supplies every item field; fields sent next to it override them.
labelstringstringNãoDisplay label (defaults to the id).
≤ 255 charsshapestringstringNãoItem shape.
cylinderanddrumuseradius+heightinstead oflength+width;palletanddrumalways stay upright.boxcylinderpalletbagdrumPredefinição"box"lengthnumber · cmnumber · cmNãoLength. Required unless
shapeiscylinderordrum.widthnumber · cmnumber · cmNãoWidth. Required unless
shapeiscylinderordrum.heightnumber · cmobrigatórionumber · cmSimHeight (the vertical side when the item stands as defined).
radiusnumber · cmnumber · cmNãoRadius. Required when
shapeiscylinderordrum.weightnumber · kgobrigatórionumber · kgSimWeight of ONE unit.
quantityintegerintegerNãoNumber of identical units.
Predefinição11–10000stackablebooleanbooleanNãoOther items may be placed on top of this one.
Predefiniçãotruemax_stack_weightnumber · kgnumber · kgNãoMaximum weight that may rest on one unit. 0 = unlimited.
Predefinição0rotationstringstringNãoall= any of the six orientations;upright= may only turn around the vertical axis (this side up);fixed= never rotated.alluprightfixedPredefinição"all"hazardousbooleanbooleanNãoDangerous goods: kept low and separated from other hazardous items.
PredefiniçãofalsepriorityintegerintegerNãoLoad priority. Higher = loaded first and kept when space runs out. 0 = none.
Predefinição0groupstringstringNãoName of the group this item belongs to (see
groupsandoptions.group_routing).colorstringstringNãoDisplay colour as #rrggbb (viewer and PDF only).
nesting_heightnumber · cmnumber · cmNãoTelescoping overlap when identical units stack (nested crates, buckets).
Predefinição0groupsGroup[]Group[]NãonamestringobrigatóriostringSimGroup name, referenced by Item.group.
≤ 128 charsorderintegerintegerNãoLoading order (lower = loaded first). Defaults to the position in the list.
colorstringstringNãoDisplay colour as #rrggbb.
planProjectPlan | nullProjectPlan | nullNãoThe current plan;
nullwhen the project has none.items_placedintegerintegerNãoUnits placed.
items_unplacedintegerintegerNãoUnits that could not be placed.
vehicles_usedintegerintegerNãoVehicles carrying at least one item.
total_weightnumber · kgnumber · kgNãoWeight loaded.
volume_utilizationnumbernumberNãoAverage volume utilization of the used vehicles, 0–1.
job_idstringstringNãoThe API job whose plan this is, while nothing changed it since. Empty for a plan made or edited in the app.
pdf_urlstringstringNãoThat job's PDF link (until its expires_at). Empty otherwise.
401Unauthorized
unauthorizedkey_revokedkey_expiredunauthorizedMissing, malformed or unknown API key.key_revokedThe key was revoked.key_expiredThe key passed its expiry date.
Todos os códigos de erroNomeTipoObrigatórioDescriçãoerrorErrorBodyobrigatórioErrorBodySimcodestringobrigatóriostringSimMachine code (snake_case). Branch on this, never on
message.messagestringobrigatóriostringSimEnglish explanation.
request_idstringobrigatóriostringSimSame as the X-Request-Id header. Quote it when contacting support.
detailsErrorDetail[]ErrorDetail[]NãoPer-field problems (
validation_failed).pathstringstringNãoJSON path of the offending field, e.g. items[3].length.
codestringstringNãorequired,invalid_value,out_of_range,duplicate_id,unknown_vehicle,unknown_template,type_not_allowed,unknown_group,does_not_fit,too_many_items,too_many_vehicles,unknown_field,invalid_json.messagestringstringNãoEnglish explanation.
403Forbidden
ip_not_allowedsubscription_inactiveaccount_inactivescope_missingip_not_allowedThe calling IP is not on the key's allowlist.subscription_inactiveThe organization has no active subscription that includes the API.account_inactiveThe organization is suspended, or has no owner whose account is active.scope_missingThe key lacks a scope this endpoint needs.
Todos os códigos de erroNomeTipoObrigatórioDescriçãoerrorErrorBodyobrigatórioErrorBodySimcodestringobrigatóriostringSimMachine code (snake_case). Branch on this, never on
message.messagestringobrigatóriostringSimEnglish explanation.
request_idstringobrigatóriostringSimSame as the X-Request-Id header. Quote it when contacting support.
detailsErrorDetail[]ErrorDetail[]NãoPer-field problems (
validation_failed).pathstringstringNãoJSON path of the offending field, e.g. items[3].length.
codestringstringNãorequired,invalid_value,out_of_range,duplicate_id,unknown_vehicle,unknown_template,type_not_allowed,unknown_group,does_not_fit,too_many_items,too_many_vehicles,unknown_field,invalid_json.messagestringstringNãoEnglish explanation.
404Not found
project_not_foundproject_not_foundNo project with this id in your organization.
Todos os códigos de erroNomeTipoObrigatórioDescriçãoerrorErrorBodyobrigatórioErrorBodySimcodestringobrigatóriostringSimMachine code (snake_case). Branch on this, never on
message.messagestringobrigatóriostringSimEnglish explanation.
request_idstringobrigatóriostringSimSame as the X-Request-Id header. Quote it when contacting support.
detailsErrorDetail[]ErrorDetail[]NãoPer-field problems (
validation_failed).pathstringstringNãoJSON path of the offending field, e.g. items[3].length.
codestringstringNãorequired,invalid_value,out_of_range,duplicate_id,unknown_vehicle,unknown_template,type_not_allowed,unknown_group,does_not_fit,too_many_items,too_many_vehicles,unknown_field,invalid_json.messagestringstringNãoEnglish explanation.
429Too many requests
rate_limitedrate_limitedToo many requests in the current minute, hour or day (per key or per organization), or more than 60 failed authentications per minute from your IP address.
Todos os códigos de erroNomeTipoObrigatórioDescriçãoerrorErrorBodyobrigatórioErrorBodySimcodestringobrigatóriostringSimMachine code (snake_case). Branch on this, never on
message.messagestringobrigatóriostringSimEnglish explanation.
request_idstringobrigatóriostringSimSame as the X-Request-Id header. Quote it when contacting support.
detailsErrorDetail[]ErrorDetail[]NãoPer-field problems (
validation_failed).pathstringstringNãoJSON path of the offending field, e.g. items[3].length.
codestringstringNãorequired,invalid_value,out_of_range,duplicate_id,unknown_vehicle,unknown_template,type_not_allowed,unknown_group,does_not_fit,too_many_items,too_many_vehicles,unknown_field,invalid_json.messagestringstringNãoEnglish explanation.
500Internal server error
internal_errorinternal_errorSomething failed on our side.
Todos os códigos de erroNomeTipoObrigatórioDescriçãoerrorErrorBodyobrigatórioErrorBodySimcodestringobrigatóriostringSimMachine code (snake_case). Branch on this, never on
message.messagestringobrigatóriostringSimEnglish explanation.
request_idstringobrigatóriostringSimSame as the X-Request-Id header. Quote it when contacting support.
detailsErrorDetail[]ErrorDetail[]NãoPer-field problems (
validation_failed).pathstringstringNãoJSON path of the offending field, e.g. items[3].length.
codestringstringNãorequired,invalid_value,out_of_range,duplicate_id,unknown_vehicle,unknown_template,type_not_allowed,unknown_group,does_not_fit,too_many_items,too_many_vehicles,unknown_field,invalid_json.messagestringstringNãoEnglish explanation.
503Service unavailable
api_disabledapi_disabledThe API is temporarily disabled (maintenance) or switched off for the organization.
Todos os códigos de erroNomeTipoObrigatórioDescriçãoerrorErrorBodyobrigatórioErrorBodySimcodestringobrigatóriostringSimMachine code (snake_case). Branch on this, never on
message.messagestringobrigatóriostringSimEnglish explanation.
request_idstringobrigatóriostringSimSame as the X-Request-Id header. Quote it when contacting support.
detailsErrorDetail[]ErrorDetail[]NãoPer-field problems (
validation_failed).pathstringstringNãoJSON path of the offending field, e.g. items[3].length.
codestringstringNãorequired,invalid_value,out_of_range,duplicate_id,unknown_vehicle,unknown_template,type_not_allowed,unknown_group,does_not_fit,too_many_items,too_many_vehicles,unknown_field,invalid_json.messagestringstringNãoEnglish explanation.