Consulter un projet
Un projet avec ses véhicules, articles, groupes, options et un résumé de son plan actuel (avec le lien du PDF tant que le plan est celui enregistré par une tâche API).
Gratuit : aucun crédit n'est débité.
Authentification
Paramètres de chemin
idstringobligatoireID du projet (prj_…).
Exemple de requête
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.bodyExemple de réponse
{
"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"
}
}Réponses
200OKLe projet.
NomTypeObligatoireDescriptionidstringstringNonID du projet (prj_…).
objectstringstringNonprojectnamestringstringNonstatusstringstringNondraft= jamais calculé ou données remplacées ;calculated= possède un plan actuel ;stale= un paramètre a changé depuis la création du plan.draftcalculatedstaleerroritem_countintegerintegerNonUnités d'articles (somme des quantités).
vehicle_countintegerintegerNonVéhicules (somme des quantités).
app_urlstringstringNonOuvre le projet dans l'éditeur 3D de l'application.
created_byUserRef | nullUserRef | nullNonLe membre qui l'a créé (pour les appels API : le membre qui a créé la clé).
nullsi inconnu.idstringstringNonID du membre (usr_…). Filtrez les listes avec ?created_by=.
namestringstringNonupdated_byUserRef | nullUserRef | nullNonLe dernier membre à l'avoir modifié.
idstringstringNonID du membre (usr_…). Filtrez les listes avec ?created_by=.
namestringstringNoncreated_atstringstringNonRFC 3339.
updated_atstringstringNonRFC 3339.
optionsProjectOptionsProjectOptionsNonLes options de chargement enregistrées dans un projet.
packing_modestringstringNonauto= lorsque les véhicules listés sont pleins, d'autres exemplaires du véhicule le plus adapté sont ajoutés (dans la limite de véhicules de la tâche) ;fleet_only= seuls les véhicules listés sont utilisés, et ce qui ne rentre pas est signalé comme non placé.autofleet_onlyPar défaut"auto"group_routingstringstringNonnone= les groupes sont informatifs ;wall= chaque groupe dispose de sa propre section du véhicule ;routing= les groupes sont chargés dans l'ordre et un groupe ultérieur peut se placer sur ou à côté d'un groupe précédent, mais jamais en dessous (livraison multi-arrêts) ;no_stack= les groupes sont chargés dans l'ordre côte à côte, jamais les uns sur les autres.nonewallroutingno_stackPar défaut"none"allow_overweightbooleanbooleanNonIgnore les limites de charge utile des véhicules.
Par défautfalsevehiclesProjectVehicle[]ProjectVehicle[]NonidstringstringNonID du véhicule du projet (pv_…). Les résultats des tâches du projet le désignent par vehicle_id. Lecture seule.
vehicle_idstringobligatoirestringOuiUn ID de véhicule issu de GET /v1/vehicles (préréglage ou veh_…).
namestringstringNonNom du véhicule enregistré. Lecture seule.
typestringstringNonType du véhicule enregistré. Lecture seule.
trucktrailerflatbedcontainerpalletaircraftshiplengthnumber · cmnumber · cmNonValeur utilisée pour le calcul ; si elle est envoyée, elle remplace celle du véhicule enregistré.
widthnumber · cmnumber · cmNonValeur utilisée pour le calcul ; si elle est envoyée, elle remplace celle du véhicule enregistré.
heightnumber · cmnumber · cmNonValeur utilisée pour le calcul ; si elle est envoyée, elle remplace celle du véhicule enregistré.
max_weightnumber · kgnumber · kgNonValeur utilisée pour le calcul ; si elle est envoyée, elle remplace celle du véhicule enregistré.
quantityintegerintegerNonNombre de véhicules identiques disponibles pour cette définition.
Par défaut11–100aux_deckbooleanbooleanNonLe véhicule a un second plancher (double plancher).
Par défautfalseaux_deck_heightnumber · cmnumber · cmNonHauteur du second plancher au-dessus du plancher. Obligatoire lorsque
aux_deckvauttrue.aux_deck_max_weightnumber · kgnumber · kgNonLimite de charge du second plancher. Obligatoire lorsque
aux_deckvauttrue.blocked_areasRect[]Rect[]NonZones du plancher sur lesquelles rien ne peut être posé (passages de roue, dégâts, espace réservé). Chacune doit se trouver sur le plancher du véhicule.
≤ 32 itemsxnumber · cmobligatoirenumber · cmOuiDistance entre la paroi avant et le bord le plus proche du rectangle.
znumber · cmobligatoirenumber · cmOuiDistance entre la paroi droite (z = 0 ; la droite vue depuis la porte, en regardant vers l'intérieur) et le bord le plus proche du rectangle.
lengthnumber · cmobligatoirenumber · cmOuiÉtendue selon x.
widthnumber · cmobligatoirenumber · cmOuiÉtendue selon z.
tractor_weightAccès requisnumber · kgnumber · kgNonModèle d'essieux de semi-remorque : masse du tracteur.
empty_trailer_weightAccès requisnumber · kgnumber · kgNonModèle d'essieux de semi-remorque : masse à vide de la remorque.
front_axle_to_middle_axleAccès requisnumber · cmnumber · cmNonModèle d'essieux de semi-remorque : de l'essieu avant du tracteur à l'essieu moteur (central).
front_axle_to_tractor_cogAccès requisnumber · cmnumber · cmNonModèle d'essieux de semi-remorque : de l'essieu avant au centre de gravité du tracteur.
front_axle_to_kingpinAccès requisnumber · cmnumber · cmNonModèle d'essieux de semi-remorque : de l'essieu avant au pivot d'attelage (sellette).
kingpin_to_rear_axleAccès requisnumber · cmnumber · cmNonModèle d'essieux de semi-remorque : du pivot d'attelage au groupe d'essieux arrière de la remorque.
trailer_cog_to_rear_axleAccès requisnumber · cmnumber · cmNonModèle d'essieux de semi-remorque : du centre de gravité de la remorque au groupe d'essieux arrière.
trailer_start_to_kingpinAccès requisnumber · cmnumber · cmNonModèle d'essieux de semi-remorque : de l'avant de la remorque au pivot d'attelage.
max_middle_axle_weightAccès requisnumber · kgnumber · kgNonModèle d'essieux de semi-remorque : limite légale de l'essieu moteur (central).
max_rear_axle_weightAccès requisnumber · kgnumber · kgNonModèle d'essieux de semi-remorque : limite légale du groupe d'essieux arrière.
itemsItem[]Item[]NonFret au format Item de /v1/pack ; les ID sont de la forme item_….
idstringstringNonVotre identifiant, unique dans la requête. Les résultats le désignent par item_id. Par défaut : template_id.
≤ 128 charstemplate_idstringstringNonUn ID de modèle (tpl_…) issu de GET /v1/templates. Fournit tous les champs de l'article ; les champs envoyés en plus les remplacent.
labelstringstringNonLibellé affiché (par défaut, l'ID).
≤ 255 charsshapestringstringNonForme de l'article.
cylinderetdrumutilisentradius+heightau lieu delength+width;palletetdrumrestent toujours debout.boxcylinderpalletbagdrumPar défaut"box"lengthnumber · cmnumber · cmNonLongueur. Obligatoire sauf si
shapevautcylinderoudrum.widthnumber · cmnumber · cmNonLargeur. Obligatoire sauf si
shapevautcylinderoudrum.heightnumber · cmobligatoirenumber · cmOuiHauteur (le côté vertical lorsque l'article est posé tel que défini).
radiusnumber · cmnumber · cmNonRayon. Obligatoire lorsque
shapevautcylinderoudrum.weightnumber · kgobligatoirenumber · kgOuiPoids d'UNE unité.
quantityintegerintegerNonNombre d'unités identiques.
Par défaut11–10000stackablebooleanbooleanNonD'autres articles peuvent être placés dessus.
Par défauttruemax_stack_weightnumber · kgnumber · kgNonPoids maximal pouvant reposer sur une unité. 0 = illimité.
Par défaut0rotationstringstringNonall= l'une des six orientations ;upright= rotation autour de l'axe vertical uniquement (ce côté vers le haut) ;fixed= jamais tourné.alluprightfixedPar défaut"all"hazardousbooleanbooleanNonMarchandise dangereuse : placée près du plancher et séparée des autres articles dangereux.
Par défautfalsepriorityintegerintegerNonPriorité de chargement. Plus élevée = chargé en premier et conservé quand l'espace manque. 0 = aucune.
Par défaut0groupstringstringNonNom du groupe auquel appartient cet article (voir
groupsetoptions.group_routing).colorstringstringNonCouleur d'affichage au format #rrggbb (visionneuse et PDF uniquement).
nesting_heightnumber · cmnumber · cmNonRecouvrement télescopique lorsque des unités identiques s'empilent (caisses ou seaux emboîtables).
Par défaut0groupsGroup[]Group[]NonnamestringobligatoirestringOuiNom du groupe, référencé par Item.group.
≤ 128 charsorderintegerintegerNonOrdre de chargement (plus petit = chargé en premier). Par défaut : sa position dans la liste.
colorstringstringNonCouleur d'affichage au format #rrggbb.
planProjectPlan | nullProjectPlan | nullNonLe plan actuel ;
nullsi le projet n'en a pas.items_placedintegerintegerNonUnités placées.
items_unplacedintegerintegerNonUnités qui n'ont pas pu être placées.
vehicles_usedintegerintegerNonVéhicules transportant au moins un article.
total_weightnumber · kgnumber · kgNonPoids chargé.
volume_utilizationnumbernumberNonTaux de remplissage moyen (en volume) des véhicules utilisés, 0–1.
job_idstringstringNonLa tâche API à l'origine de ce plan, tant que rien ne l'a modifié depuis. Vide pour un plan créé ou modifié dans l'application.
pdf_urlstringstringNonLe lien PDF de cette tâche (jusqu'à son expires_at). Vide sinon.
401Unauthorized
unauthorizedkey_revokedkey_expiredunauthorizedClé API absente, mal formée ou inconnue.key_revokedLa clé a été révoquée.key_expiredLa clé a dépassé sa date d'expiration.
Tous les codes d'erreurNomTypeObligatoireDescriptionerrorErrorBodyobligatoireErrorBodyOuicodestringobligatoirestringOuiCode lisible par machine (snake_case). Basez votre logique sur ce champ, jamais sur
message.messagestringobligatoirestringOuiExplication en anglais.
request_idstringobligatoirestringOuiIdentique à l'en-tête X-Request-Id. Indiquez-le lorsque vous contactez le support.
detailsErrorDetail[]ErrorDetail[]NonProblèmes par champ (
validation_failed).pathstringstringNonChemin JSON du champ en cause, par ex. items[3].length.
codestringstringNonrequired,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.messagestringstringNonExplication en anglais.
403Forbidden
ip_not_allowedsubscription_inactiveaccount_inactivescope_missingip_not_allowedL'adresse IP appelante ne figure pas dans la liste des adresses IP autorisées de la clé.subscription_inactiveL'organisation n'a aucun abonnement actif incluant l'API.account_inactiveL'organisation est suspendue ou n'a aucun propriétaire dont le compte est actif.scope_missingIl manque à la clé une autorisation requise par cet endpoint.
Tous les codes d'erreurNomTypeObligatoireDescriptionerrorErrorBodyobligatoireErrorBodyOuicodestringobligatoirestringOuiCode lisible par machine (snake_case). Basez votre logique sur ce champ, jamais sur
message.messagestringobligatoirestringOuiExplication en anglais.
request_idstringobligatoirestringOuiIdentique à l'en-tête X-Request-Id. Indiquez-le lorsque vous contactez le support.
detailsErrorDetail[]ErrorDetail[]NonProblèmes par champ (
validation_failed).pathstringstringNonChemin JSON du champ en cause, par ex. items[3].length.
codestringstringNonrequired,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.messagestringstringNonExplication en anglais.
404Not found
project_not_foundproject_not_foundAucun projet avec cet ID dans votre organisation.
Tous les codes d'erreurNomTypeObligatoireDescriptionerrorErrorBodyobligatoireErrorBodyOuicodestringobligatoirestringOuiCode lisible par machine (snake_case). Basez votre logique sur ce champ, jamais sur
message.messagestringobligatoirestringOuiExplication en anglais.
request_idstringobligatoirestringOuiIdentique à l'en-tête X-Request-Id. Indiquez-le lorsque vous contactez le support.
detailsErrorDetail[]ErrorDetail[]NonProblèmes par champ (
validation_failed).pathstringstringNonChemin JSON du champ en cause, par ex. items[3].length.
codestringstringNonrequired,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.messagestringstringNonExplication en anglais.
429Too many requests
rate_limitedrate_limitedTrop de requêtes dans la minute, l'heure ou la journée en cours (par clé ou par organisation), ou plus de 60 échecs d'authentification par minute depuis votre adresse IP.
Tous les codes d'erreurNomTypeObligatoireDescriptionerrorErrorBodyobligatoireErrorBodyOuicodestringobligatoirestringOuiCode lisible par machine (snake_case). Basez votre logique sur ce champ, jamais sur
message.messagestringobligatoirestringOuiExplication en anglais.
request_idstringobligatoirestringOuiIdentique à l'en-tête X-Request-Id. Indiquez-le lorsque vous contactez le support.
detailsErrorDetail[]ErrorDetail[]NonProblèmes par champ (
validation_failed).pathstringstringNonChemin JSON du champ en cause, par ex. items[3].length.
codestringstringNonrequired,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.messagestringstringNonExplication en anglais.
500Internal server error
internal_errorinternal_errorUne erreur s'est produite de notre côté.
Tous les codes d'erreurNomTypeObligatoireDescriptionerrorErrorBodyobligatoireErrorBodyOuicodestringobligatoirestringOuiCode lisible par machine (snake_case). Basez votre logique sur ce champ, jamais sur
message.messagestringobligatoirestringOuiExplication en anglais.
request_idstringobligatoirestringOuiIdentique à l'en-tête X-Request-Id. Indiquez-le lorsque vous contactez le support.
detailsErrorDetail[]ErrorDetail[]NonProblèmes par champ (
validation_failed).pathstringstringNonChemin JSON du champ en cause, par ex. items[3].length.
codestringstringNonrequired,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.messagestringstringNonExplication en anglais.
503Service unavailable
api_disabledapi_disabledL'API est temporairement désactivée (maintenance) ou désactivée pour l'organisation.
Tous les codes d'erreurNomTypeObligatoireDescriptionerrorErrorBodyobligatoireErrorBodyOuicodestringobligatoirestringOuiCode lisible par machine (snake_case). Basez votre logique sur ce champ, jamais sur
message.messagestringobligatoirestringOuiExplication en anglais.
request_idstringobligatoirestringOuiIdentique à l'en-tête X-Request-Id. Indiquez-le lorsque vous contactez le support.
detailsErrorDetail[]ErrorDetail[]NonProblèmes par champ (
validation_failed).pathstringstringNonChemin JSON du champ en cause, par ex. items[3].length.
codestringstringNonrequired,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.messagestringstringNonExplication en anglais.