Consultar un trabajo
Estado, progreso, resumen y coste de un trabajo.
Consúltalo cada 1–2 s hasta que status sea succeeded, failed o canceled.
Autenticación
Parámetros de ruta
idstringobligatorioID del trabajo (job_…).
Parámetros de consulta
includestringresult incluye el plan de carga en la respuesta cuando el trabajo se ha completado.
resultEjemplo de solicitud
curl -X GET "https://runner.cargoduo.com/v1/jobs/job_4bK9mT2xQe7LpW1zRc8VdN3f" \
-H "Authorization: Bearer $CARGODUO_API_KEY"const res = await fetch("https://runner.cargoduo.com/v1/jobs/job_4bK9mT2xQe7LpW1zRc8VdN3f", {
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/jobs/job_4bK9mT2xQe7LpW1zRc8VdN3f",
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/jobs/job_4bK9mT2xQe7LpW1zRc8VdN3f", 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/jobs/job_4bK9mT2xQe7LpW1zRc8VdN3f"))
.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/jobs/job_4bK9mT2xQe7LpW1zRc8VdN3f");
var response = await client.SendAsync(request);
Console.WriteLine($"{(int)response.StatusCode} {await response.Content.ReadAsStringAsync()}");<?php
$ch = curl_init('https://runner.cargoduo.com/v1/jobs/job_4bK9mT2xQe7LpW1zRc8VdN3f');
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/jobs/job_4bK9mT2xQe7LpW1zRc8VdN3f")
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.bodyEjemplo de respuesta
{
"id": "job_4bK9mT2xQe7LpW1zRc8VdN3f",
"object": "job",
"status": "succeeded",
"reference": "order-1042",
"source": "api",
"created_at": "2026-10-19T09:12:03Z",
"started_at": "2026-10-19T09:12:03Z",
"finished_at": "2026-10-19T09:12:07Z",
"progress": {
"stage": "done",
"vehicles_done": 1,
"placed_items": 58
},
"summary": {
"items_requested": 58,
"items_placed": 58,
"items_unplaced": 0,
"vehicles_used": 1,
"total_weight": 8580,
"volume_utilization": 0.3116,
"queue_ms": 12,
"compute_ms": 4210
},
"cost": {
"credits": 0.28105,
"reserved_credits": 1.11,
"rate_card_version": 1,
"breakdown": {
"base": 0.06,
"vehicles": 0.2,
"compute": 0.02105,
"large_load": 0
}
},
"error": null,
"warnings": [],
"result_url": "https://runner.cargoduo.com/v1/jobs/job_4bK9mT2xQe7LpW1zRc8VdN3f/result",
"pdf_url": "https://app.cargoduo.com/r/Xq7Lm2Vt9KbR4cN8wZp1Hs6Yd3Fg5Jk0Ta2Ue7Wn4Ci",
"expires_at": "2026-11-02T09:12:03Z"
}Respuestas
200OKEl trabajo.
NombreTipoObligatorioDescripciónidstringobligatoriostringSíID del trabajo (job_…).
objectstringobligatoriostringSíSiempre
job.jobstatusstringobligatoriostringSíqueued→running→succeeded|failed|canceled.queuedrunningsucceededfailedcanceledreferencestringstringNoTu referencia, tomada de la solicitud.
sourcestringstringNoDónde se creó el trabajo.
apiplaygroundproject_idstringstringNoEl proyecto (prj_…) en el que un trabajo de POST /v1/projects/{id}/pack guarda su plan. Ausente en los demás trabajos.
created_atstringobligatoriostringSíMarca de tiempo RFC 3339.
started_atstring | nullstring | nullNoCuándo empezó el cálculo (RFC 3339) o
null.finished_atstring | nullstring | nullNoCuándo terminó el trabajo (RFC 3339) o
null.progressJobProgressJobProgressNoProgreso en tiempo real mientras está en cola o en curso.
stagestringstringNoFase actual, como
queued,running,finalizingodone. Solo informativa: basa tu lógica enJob.status.vehicles_doneintegerintegerNoVehículos completados hasta ahora.
placed_itemsintegerintegerNoUnidades de artículos colocadas hasta ahora.
summaryJobSummaryJobSummaryNoRecuentos y tiempos.
items_requestedintegerintegerNoTotal de unidades de artículos (suma de cantidades).
items_placedintegerintegerNoUnidades colocadas.
items_unplacedintegerintegerNoUnidades que no se pudieron colocar.
vehicles_usedintegerintegerNoVehículos que llevan al menos un artículo.
total_weightnumber · kgnumber · kgNoPeso cargado.
volume_utilizationnumbernumberNoOcupación media del volumen de los vehículos usados, 0–1.
queue_msintegerintegerNoTiempo de espera de un hueco de cómputo (no se factura).
compute_msintegerintegerNoTiempo de cómputo (se factura).
costJobCostJobCostNoCréditos cobrados (definitivos cuando el trabajo termina) y la reserva retenida mientras se ejecutaba.
creditsnumber · creditsnumber · creditsNoCréditos cobrados (0 hasta que termina el trabajo). Los trabajos fallidos no se cobran, salvo time_limit_exceeded, que se cobra como un trabajo cancelado.
reserved_creditsnumber · creditsnumber · creditsNoCréditos retenidos mientras el trabajo estaba en cola o en curso (el precio máximo posible). Se liberan al terminar.
rate_card_versionintegerintegerNoTarifa con la que se calcula el precio del trabajo.
breakdownCostBreakdownCostBreakdownNoDesglose del precio.
basenumber · creditsnumber · creditsNoTarifa por trabajo.
vehiclesnumber · creditsnumber · creditsNoPor vehículo cargado (no se cobra en trabajos cancelados ni en time_limit_exceeded).
computenumber · creditsnumber · creditsNoPor segundo de cómputo, prorrateado por milisegundo.
large_loadnumber · creditsnumber · creditsNoRecargo por cada tramo de 100 artículos (o fracción) por encima del umbral de carga grande.
errorJobError | nullJobError | nullNoPor qué falló o se canceló el trabajo;
nullen otro caso.codestringstringNoCódigo legible por máquina (consulta Errores).
messagestringstringNoExplicación en inglés.
warningsWarning[]Warning[]NoObservaciones no bloqueantes sobre la solicitud (también se repiten en el resultado).
codestringstringNoCódigo legible por máquina.
messagestringstringNoExplicación en inglés.
result_urlstringstringNoHaz una solicitud GET a esta URL para obtener el resultado completo cuando
statusseasucceeded.pdf_urlstringstringNoEnlace que, abierto en un navegador, genera el plan de carga en PDF (vistas 3D + pasos de carga). Válido hasta expires_at. Vacío tras la caducidad.
expires_atstringstringNoCuándo se eliminan los cuerpos de solicitud y de resultado y el enlace al PDF (RFC 3339). Los metadatos y los cargos del trabajo se conservan.
resultResultResultNoEl resultado completo, incluido solo si se pide (?include=result) o si POST /v1/pack?wait= terminó a tiempo.
job_idstringstringNoEl trabajo.
vehiclesResultVehicle[]ResultVehicle[]NoVehículos cargados en orden de carga (se omiten los vacíos).
indexintegerintegerNoPosición en el plan, empezando en 0.
vehicle_idstringstringNoEl ID de tu definición de vehículo (en un trabajo de proyecto: el ID del vehículo del proyecto, pv_…).
copyintegerintegerNoNúmero de copia de esa definición, empezando en 1 (quantity > 1 o añadido en modo auto).
auto_addedbooleanbooleanNoAñadido por
packing_modeautoademás de laquantityque indicaste.namestringstringNoNombre del vehículo.
typestringstringNoTipo de vehículo.
lengthnumber · cmnumber · cmNoLargo del espacio de carga.
widthnumber · cmnumber · cmNoAncho del espacio de carga.
heightnumber · cmnumber · cmNoAlto del espacio de carga.
max_weightnumber · kgnumber · kgNoLímite de carga útil.
items_placedintegerintegerNoUnidades en este vehículo.
total_weightnumber · kgnumber · kgNoPeso en este vehículo.
volume_utilizationnumbernumberNoVolumen usado / volumen del espacio de carga, 0–1.
weight_utilizationnumbernumberNototal_weight / max_weight, 0–1 (puede superar 1 con allow_overweight).
center_of_gravityPointPointNoCentro de gravedad de la carga (cm).
xnumber · cmnumber · cmNoynumber · cmnumber · cmNoznumber · cmnumber · cmNoplacementsPlacement[]Placement[]NoTodas las unidades de este vehículo.
item_idstringstringNoEl ID de tu definición de artículo (en un trabajo de proyecto: el ID del artículo, item_…).
instanceintegerintegerNoNúmero de unidad, empezando en 1, dentro de esa definición de artículo (único en todo el plan).
labelstringstringNoEtiqueta del artículo.
xnumber · cmnumber · cmNoPosición de la esquina mínima a lo largo de la longitud.
ynumber · cmnumber · cmNoAltura de la esquina mínima sobre el suelo.
znumber · cmnumber · cmNoPosición de la esquina mínima a lo ancho.
lengthnumber · cmnumber · cmNoTamaño a lo largo de x, tal como se colocó.
widthnumber · cmnumber · cmNoTamaño a lo largo de z, tal como se colocó.
heightnumber · cmnumber · cmNoTamaño a lo largo de y, tal como se colocó.
rotatedbooleanbooleanNoColocado con una orientación distinta de la definida.
orientationstringstringNoQué lado definido queda a lo largo de x, z e y:
lwh= tal como se definió,wlh= girado 90° sobre el eje vertical,lhw,hwl,whl,hlw= volcado sobre un lado.stepintegerintegerNoPaso de carga dentro del vehículo, empezando en 1 (carga en orden ascendente).
weightnumber · kgnumber · kgNoPeso unitario.
axle_loadsRequiere accesoAxleLoad[]AxleLoad[]NoCarga por eje (solo vehículos con datos de ejes).
namestringstringNoAxle 1,Axle 2… en el orden deaxle_positions.positionnumber · cmnumber · cmNoPosición del eje desde la parte delantera de la zona de carga.
loadnumber · kgnumber · kgNoCarga sobre el eje.
maxnumber · kgnumber · kgNoMáximo configurado (0 = sin máximo).
okbooleanbooleanNoload≤max(siempretruesi no hay máximo).unplacedUnplacedItem[]UnplacedItem[]NoUnidades que no se pudieron colocar, con el motivo.
item_idstringstringNoEl ID de tu definición de artículo.
instanceintegerintegerNoNúmero de unidad, empezando en 1.
labelstringstringNoEtiqueta del artículo.
reasonstringstringNoPor qué no se pudo colocar.
warningsWarning[]Warning[]NoObservaciones sobre el plan.
codestringstringNoCódigo legible por máquina.
messagestringstringNoExplicación en inglés.
pdf_urlstringstringNoEnlace que, abierto en un navegador, genera el plan en PDF.
expires_atstringstringNoCuándo se elimina este resultado (RFC 3339).
401Unauthorized
unauthorizedkey_revokedkey_expiredunauthorizedClave de API ausente, mal formada o desconocida.key_revokedLa clave se ha revocado.key_expiredLa clave ha superado su fecha de caducidad.
Todos los códigos de errorNombreTipoObligatorioDescripciónerrorErrorBodyobligatorioErrorBodySícodestringobligatoriostringSíCódigo legible por máquina (snake_case). Basa tu lógica en este campo, nunca en
message.messagestringobligatoriostringSíExplicación en inglés.
request_idstringobligatoriostringSíIgual que la cabecera X-Request-Id. Indícalo al contactar con el soporte.
detailsErrorDetail[]ErrorDetail[]NoProblemas por campo (
validation_failed).pathstringstringNoRuta JSON del campo erróneo, p. ej., items[3].length.
codestringstringNorequired,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.messagestringstringNoExplicación en inglés.
403Forbidden
ip_not_allowedsubscription_inactiveaccount_inactivescope_missingip_not_allowedLa IP de origen no está en la lista de IP permitidas de la clave.subscription_inactiveLa organización no tiene ninguna suscripción activa que incluya la API.account_inactiveLa organización está suspendida o no tiene ningún propietario con la cuenta activa.scope_missingA la clave le falta un permiso que requiere este endpoint.
Todos los códigos de errorNombreTipoObligatorioDescripciónerrorErrorBodyobligatorioErrorBodySícodestringobligatoriostringSíCódigo legible por máquina (snake_case). Basa tu lógica en este campo, nunca en
message.messagestringobligatoriostringSíExplicación en inglés.
request_idstringobligatoriostringSíIgual que la cabecera X-Request-Id. Indícalo al contactar con el soporte.
detailsErrorDetail[]ErrorDetail[]NoProblemas por campo (
validation_failed).pathstringstringNoRuta JSON del campo erróneo, p. ej., items[3].length.
codestringstringNorequired,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.messagestringstringNoExplicación en inglés.
404Not found
job_not_foundjob_not_foundNo hay ningún trabajo con este ID en tu organización.
Todos los códigos de errorNombreTipoObligatorioDescripciónerrorErrorBodyobligatorioErrorBodySícodestringobligatoriostringSíCódigo legible por máquina (snake_case). Basa tu lógica en este campo, nunca en
message.messagestringobligatoriostringSíExplicación en inglés.
request_idstringobligatoriostringSíIgual que la cabecera X-Request-Id. Indícalo al contactar con el soporte.
detailsErrorDetail[]ErrorDetail[]NoProblemas por campo (
validation_failed).pathstringstringNoRuta JSON del campo erróneo, p. ej., items[3].length.
codestringstringNorequired,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.messagestringstringNoExplicación en inglés.
429Too many requests
rate_limitedrate_limitedDemasiadas solicitudes en el minuto, la hora o el día en curso (por clave o por organización), o más de 60 autenticaciones fallidas por minuto desde tu dirección IP.
Todos los códigos de errorNombreTipoObligatorioDescripciónerrorErrorBodyobligatorioErrorBodySícodestringobligatoriostringSíCódigo legible por máquina (snake_case). Basa tu lógica en este campo, nunca en
message.messagestringobligatoriostringSíExplicación en inglés.
request_idstringobligatoriostringSíIgual que la cabecera X-Request-Id. Indícalo al contactar con el soporte.
detailsErrorDetail[]ErrorDetail[]NoProblemas por campo (
validation_failed).pathstringstringNoRuta JSON del campo erróneo, p. ej., items[3].length.
codestringstringNorequired,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.messagestringstringNoExplicación en inglés.
500Internal server error
internal_errorinternal_errorAlgo ha fallado por nuestra parte.
Todos los códigos de errorNombreTipoObligatorioDescripciónerrorErrorBodyobligatorioErrorBodySícodestringobligatoriostringSíCódigo legible por máquina (snake_case). Basa tu lógica en este campo, nunca en
message.messagestringobligatoriostringSíExplicación en inglés.
request_idstringobligatoriostringSíIgual que la cabecera X-Request-Id. Indícalo al contactar con el soporte.
detailsErrorDetail[]ErrorDetail[]NoProblemas por campo (
validation_failed).pathstringstringNoRuta JSON del campo erróneo, p. ej., items[3].length.
codestringstringNorequired,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.messagestringstringNoExplicación en inglés.
503Service unavailable
api_disabledapi_disabledLa API está desactivada temporalmente (mantenimiento) o deshabilitada para la organización.
Todos los códigos de errorNombreTipoObligatorioDescripciónerrorErrorBodyobligatorioErrorBodySícodestringobligatoriostringSíCódigo legible por máquina (snake_case). Basa tu lógica en este campo, nunca en
message.messagestringobligatoriostringSíExplicación en inglés.
request_idstringobligatoriostringSíIgual que la cabecera X-Request-Id. Indícalo al contactar con el soporte.
detailsErrorDetail[]ErrorDetail[]NoProblemas por campo (
validation_failed).pathstringstringNoRuta JSON del campo erróneo, p. ej., items[3].length.
codestringstringNorequired,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.messagestringstringNoExplicación en inglés.