Создать задание на расчёт загрузки
Проверяет запрос, резервирует кредиты по максимально возможной стоимости и ставит задание в очередь.
Отвечает 202 с заданием; затем опрашивайте GET /v1/jobs/{id} или передайте ?wait=, чтобы ответ пришёл после завершения задания. Ошибки валидации (422) бесплатны и не создают задание.
Аутентификация
Параметры запроса
waitintegerСколько секунд ждать завершения задания, прежде чем ответить. Если задание успело завершиться — 200 с результатом в теле ответа, иначе — 202.
00–60Параметры заголовков
Idempotency-KeystringЛюбая уникальная строка, например UUID или номер вашего заказа. Повторный запрос с тем же ключом в течение 24 ч вернёт исходное задание — новое не создаётся и не оплачивается.
Параметры тела
application/jsonreferencestringВаш собственный идентификатор (номер заказа, ID отправки…). Возвращается в задании.
vehiclesVehicle[]обязательноОписания транспортных средств. У каждого может быть quantity > 1. Минимум одно.
idstringВаш идентификатор, уникальный в пределах запроса. В результатах — vehicle_id. По умолчанию — vehicle_id.
vehicle_idstringID транспортного средства из GET /v1/vehicles: пресет или транспортное средство вашей организации (veh_…). Задаёт тип, название, размеры, грузоподъёмность и все остальные сохранённые значения.
typestringТип транспортного средства. Обязателен, если не указан vehicle_id. Принимаются только типы из GET /v1/limits (allowed_vehicle_types).
trucktrailerflatbedcontainerpalletaircraftshipnamestringОтображаемое название (по умолчанию — название сохранённого транспортного средства или id).
lengthnumber · cmВнутренняя длина грузового пространства, по x (от передней стенки к дверям). Обязательна, если не указан vehicle_id.
widthnumber · cmВнутренняя ширина грузового пространства, по z. Обязательна, если не указан vehicle_id.
heightnumber · cmВнутренняя высота грузового пространства, по y. Обязательна, если не указан vehicle_id.
max_weightnumber · kgМаксимальная грузоподъёмность. Обязательна, если не указан vehicle_id.
quantityintegerСколько одинаковых транспортных средств с этим описанием доступно.
11–100floor_load_capacitynumber · kg/m²Допустимая нагрузка на пол: 0 или больше (0 = без ограничений).
aux_deckbooleanУ транспортного средства есть второй ярус (двухъярусная загрузка).
falseaux_deck_heightnumber · cmВысота второго яруса над полом. Обязательна, если aux_deck равно true.
aux_deck_max_weightnumber · kgДопустимая нагрузка на второй ярус. Обязательна, если aux_deck равно true.
blocked_areasRect[]Зоны пола, где ничего нельзя ставить (колёсные арки, повреждения, зарезервированное место). Каждая должна лежать в пределах пола транспортного средства.
xnumber · cmобязательноРасстояние от передней стенки до ближнего края прямоугольника.
znumber · cmобязательноРасстояние от правой стенки (z = 0; справа, если смотреть от дверей внутрь) до ближнего края прямоугольника.
lengthnumber · cmобязательноПротяжённость по x.
widthnumber · cmобязательноПротяжённость по z.
axle_positionsНужен доступnumber[] · cmПоложения осей (точек опоры) от передней границы грузового пространства; отрицательное значение = перед ней. Та же длина массива, что у axle_max_loads. Каждое значение — от −300 (ось перед грузовым пространством, например передняя ось одиночного грузовика под кабиной) до длины транспортного средства.
axle_max_loadsНужен доступnumber[] · kgМаксимальная нагрузка груза на каждую ось, в порядке axle_positions. Каждое значение больше 0 и не больше 100000.
cog_range_xНужен доступnumber · cmДопустимое смещение центра тяжести от середины длины: от 0 до length / 2.
cog_range_yНужен доступnumber · cmДопустимое смещение центра тяжести от середины ширины: от 0 до width / 2.
tractor_weightНужен доступnumber · kgМодель осей полуприцепа: масса тягача.
empty_trailer_weightНужен доступnumber · kgМодель осей полуприцепа: масса порожнего прицепа.
front_axle_to_middle_axleНужен доступnumber · cmМодель осей полуприцепа: от передней оси тягача до ведущей (средней) оси.
front_axle_to_tractor_cogНужен доступnumber · cmМодель осей полуприцепа: от передней оси до центра тяжести тягача.
front_axle_to_kingpinНужен доступnumber · cmМодель осей полуприцепа: от передней оси до шкворня (седельно-сцепного устройства).
kingpin_to_rear_axleНужен доступnumber · cmМодель осей полуприцепа: от шкворня до группы задних осей прицепа.
trailer_cog_to_rear_axleНужен доступnumber · cmМодель осей полуприцепа: от центра тяжести прицепа до группы задних осей.
trailer_start_to_kingpinНужен доступnumber · cmМодель осей полуприцепа: от передней части прицепа до шкворня.
max_middle_axle_weightНужен доступnumber · kgМодель осей полуприцепа: допустимая по закону нагрузка на ведущую (среднюю) ось.
max_rear_axle_weightНужен доступnumber · kgМодель осей полуприцепа: допустимая по закону нагрузка на группу задних осей.
itemsItem[]обязательноОписания позиций. У каждой может быть quantity > 1. Минимум одна.
idstringВаш идентификатор, уникальный в пределах запроса. В результатах — item_id. По умолчанию — template_id.
template_idstringID шаблона (tpl_…) из GET /v1/templates. Задаёт все поля позиции; поля, переданные рядом с ним, их переопределяют.
labelstringОтображаемая метка (по умолчанию — id).
shapestringФорма позиции. Для cylinder и drum используются radius + height вместо length + width; pallet и drum всегда стоят вертикально.
boxcylinderpalletbagdrumПо умолчанию "box"lengthnumber · cmДлина. Обязательна, если shape не cylinder и не drum.
widthnumber · cmШирина. Обязательна, если shape не cylinder и не drum.
heightnumber · cmобязательноВысота (вертикальная сторона, когда груз стоит в исходной ориентации).
radiusnumber · cmРадиус. Обязателен, если shape — cylinder или drum.
weightnumber · kgобязательноВес ОДНОЙ единицы.
quantityintegerКоличество одинаковых единиц.
11–10000stackablebooleanСверху можно ставить другие грузы.
truemax_stack_weightnumber · kgМаксимальный вес, который можно поставить на одну единицу. 0 = без ограничений.
0rotationstringall = любая из шести ориентаций; upright = только поворот вокруг вертикальной оси (этой стороной вверх); fixed = без поворотов.
alluprightfixedПо умолчанию "all"hazardousbooleanОпасный груз: размещается внизу и отдельно от других опасных грузов.
falsepriorityintegerПриоритет загрузки. Позиции с более высоким приоритетом загружаются раньше и при нехватке места остаются в плане. 0 = без приоритета.
0groupstringНазвание группы, к которой относится позиция (см. groups и options.group_routing).
colorstringЦвет отображения в формате #rrggbb (только в просмотрщике и PDF).
nesting_heightnumber · cmПерекрытие при вкладывании одинаковых единиц друг в друга (вкладываемые ящики, вёдра).
0groupsGroup[]Необязательные группы (клиенты, точки доставки, заказы). Если options.group_routing не "none", они обязательны для каждой группы, указанной в позициях; иначе группы создаются из названий групп в позициях в порядке появления.
namestringобязательноНазвание группы, на которое ссылается Item.group.
orderintegerПорядок загрузки (меньше — раньше). По умолчанию — место в списке.
colorstringЦвет отображения в формате #rrggbb.
optionsOptionsПараметры расчёта загрузки. Все поля необязательны.
packing_modestringauto = когда указанные транспортные средства заполнены, добавляются копии наиболее подходящего (в пределах лимита транспортных средств задания); fleet_only = используются только указанные транспортные средства, всё, что не поместилось, попадает в неразмещённые.
autofleet_onlyПо умолчанию "auto"group_routingstringnone = группы только для информации; wall = каждая группа занимает свою секцию транспортного средства; routing = группы загружаются по порядку, и более поздняя группа может стоять на более ранней или рядом с ней, но не под ней (доставка по нескольким адресам); no_stack = группы загружаются по порядку рядом друг с другом, но не друг на друга.
nonewallroutingno_stackПо умолчанию "none"allow_overweightbooleanИгнорировать ограничения грузоподъёмности транспортных средств.
falsemax_stack_itemsintegerМаксимум единиц в одном штабеле. 0 = без ограничений.
0max_stack_density_kg_m2number · kg/m²Максимальный вес штабеля на единицу площади пола. 0 = без ограничений.
0lock_rotationsbooleanСохранять первую ориентацию, которая проходит по высоте транспортного средства.
falsegroup_identical_binsbooleanСчитать одинаковые транспортные средства одним пулом.
falsetime_limitnumber · sВерхняя граница времени вычислений для всего задания. 0 = автоматически (не больше max_time_limit_seconds из GET /v1/limits). При достижении лимита возвращается лучший план, найденный к этому моменту. Вы платите только за фактически использованное время вычислений.
0enforce_axleНужен доступbooleanОтклонять размещения, которые перегружают группу осей, — для транспортных средств, у которых заполнены все десять полей модели осей.
falseПример запроса
curl -X POST "https://runner.cargoduo.com/v1/pack" \
-H "Authorization: Bearer $CARGODUO_API_KEY" \
-H "Idempotency-Key: order-1042-v1" \
-H "Content-Type: application/json" \
-d '{
"reference": "order-1042",
"vehicles": [
{
"id": "trailer",
"type": "trailer",
"name": "13.6 m trailer",
"length": 1360,
"width": 245,
"height": 270,
"max_weight": 24000
}
],
"items": [
{
"id": "pallet-eu",
"label": "Euro pallet",
"length": 120,
"width": 80,
"height": 140,
"weight": 450,
"quantity": 18,
"stackable": false
},
{
"id": "carton-a",
"label": "Carton A",
"length": 60,
"width": 40,
"height": 40,
"weight": 12,
"quantity": 40,
"rotation": "upright"
}
],
"options": {
"packing_mode": "auto"
}
}'const res = await fetch("https://runner.cargoduo.com/v1/pack", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.CARGODUO_API_KEY}`,
"Idempotency-Key": "order-1042-v1",
"Content-Type": "application/json",
},
body: JSON.stringify({
"reference": "order-1042",
"vehicles": [
{
"id": "trailer",
"type": "trailer",
"name": "13.6 m trailer",
"length": 1360,
"width": 245,
"height": 270,
"max_weight": 24000
}
],
"items": [
{
"id": "pallet-eu",
"label": "Euro pallet",
"length": 120,
"width": 80,
"height": 140,
"weight": 450,
"quantity": 18,
"stackable": false
},
{
"id": "carton-a",
"label": "Carton A",
"length": 60,
"width": 40,
"height": 40,
"weight": 12,
"quantity": 40,
"rotation": "upright"
}
],
"options": {
"packing_mode": "auto"
}
}),
});
const data = await res.json();
console.log(res.status, data);import os
import requests
response = requests.post(
"https://runner.cargoduo.com/v1/pack",
headers={"Authorization": f"Bearer {os.environ['CARGODUO_API_KEY']}", "Idempotency-Key": "order-1042-v1"},
json={
"reference": "order-1042",
"vehicles": [
{
"id": "trailer",
"type": "trailer",
"name": "13.6 m trailer",
"length": 1360,
"width": 245,
"height": 270,
"max_weight": 24000,
},
],
"items": [
{
"id": "pallet-eu",
"label": "Euro pallet",
"length": 120,
"width": 80,
"height": 140,
"weight": 450,
"quantity": 18,
"stackable": False,
},
{
"id": "carton-a",
"label": "Carton A",
"length": 60,
"width": 40,
"height": 40,
"weight": 12,
"quantity": 40,
"rotation": "upright",
},
],
"options": {
"packing_mode": "auto",
},
},
)
print(response.status_code, response.json())package main
import (
"fmt"
"io"
"net/http"
"os"
"strings"
)
func main() {
body := strings.NewReader(`{
"reference": "order-1042",
"vehicles": [
{
"id": "trailer",
"type": "trailer",
"name": "13.6 m trailer",
"length": 1360,
"width": 245,
"height": 270,
"max_weight": 24000
}
],
"items": [
{
"id": "pallet-eu",
"label": "Euro pallet",
"length": 120,
"width": 80,
"height": 140,
"weight": 450,
"quantity": 18,
"stackable": false
},
{
"id": "carton-a",
"label": "Carton A",
"length": 60,
"width": 40,
"height": 40,
"weight": 12,
"quantity": 40,
"rotation": "upright"
}
],
"options": {
"packing_mode": "auto"
}
}`)
req, err := http.NewRequest("POST", "https://runner.cargoduo.com/v1/pack", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("CARGODUO_API_KEY"))
req.Header.Set("Idempotency-Key", "order-1042-v1")
req.Header.Set("Content-Type", "application/json")
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 {
String body = """
{
"reference": "order-1042",
"vehicles": [
{
"id": "trailer",
"type": "trailer",
"name": "13.6 m trailer",
"length": 1360,
"width": 245,
"height": 270,
"max_weight": 24000
}
],
"items": [
{
"id": "pallet-eu",
"label": "Euro pallet",
"length": 120,
"width": 80,
"height": 140,
"weight": 450,
"quantity": 18,
"stackable": false
},
{
"id": "carton-a",
"label": "Carton A",
"length": 60,
"width": 40,
"height": 40,
"weight": 12,
"quantity": 40,
"rotation": "upright"
}
],
"options": {
"packing_mode": "auto"
}
}
""";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://runner.cargoduo.com/v1/pack"))
.header("Authorization", "Bearer " + System.getenv("CARGODUO_API_KEY"))
.header("Idempotency-Key", "order-1042-v1")
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString(body))
.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"));
client.DefaultRequestHeaders.Add("Idempotency-Key", "order-1042-v1");
var json = """
{
"reference": "order-1042",
"vehicles": [
{
"id": "trailer",
"type": "trailer",
"name": "13.6 m trailer",
"length": 1360,
"width": 245,
"height": 270,
"max_weight": 24000
}
],
"items": [
{
"id": "pallet-eu",
"label": "Euro pallet",
"length": 120,
"width": 80,
"height": 140,
"weight": 450,
"quantity": 18,
"stackable": false
},
{
"id": "carton-a",
"label": "Carton A",
"length": 60,
"width": 40,
"height": 40,
"weight": 12,
"quantity": 40,
"rotation": "upright"
}
],
"options": {
"packing_mode": "auto"
}
}
""";
var request = new HttpRequestMessage(HttpMethod.Post, "https://runner.cargoduo.com/v1/pack")
{
Content = new StringContent(json, Encoding.UTF8, "application/json"),
};
var response = await client.SendAsync(request);
Console.WriteLine($"{(int)response.StatusCode} {await response.Content.ReadAsStringAsync()}");<?php
$payload = <<<'JSON'
{
"reference": "order-1042",
"vehicles": [
{
"id": "trailer",
"type": "trailer",
"name": "13.6 m trailer",
"length": 1360,
"width": 245,
"height": 270,
"max_weight": 24000
}
],
"items": [
{
"id": "pallet-eu",
"label": "Euro pallet",
"length": 120,
"width": 80,
"height": 140,
"weight": 450,
"quantity": 18,
"stackable": false
},
{
"id": "carton-a",
"label": "Carton A",
"length": 60,
"width": 40,
"height": 40,
"weight": 12,
"quantity": 40,
"rotation": "upright"
}
],
"options": {
"packing_mode": "auto"
}
}
JSON;
$ch = curl_init('https://runner.cargoduo.com/v1/pack');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('CARGODUO_API_KEY'),
'Idempotency-Key: order-1042-v1',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => $payload,
]);
$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/pack")
request = Net::HTTP::Post.new(uri)
request["Authorization"] = "Bearer #{ENV.fetch("CARGODUO_API_KEY")}"
request["Idempotency-Key"] = "order-1042-v1"
request["Content-Type"] = "application/json"
request.body = <<~'JSON'
{
"reference": "order-1042",
"vehicles": [
{
"id": "trailer",
"type": "trailer",
"name": "13.6 m trailer",
"length": 1360,
"width": 245,
"height": 270,
"max_weight": 24000
}
],
"items": [
{
"id": "pallet-eu",
"label": "Euro pallet",
"length": 120,
"width": 80,
"height": 140,
"weight": 450,
"quantity": 18,
"stackable": false
},
{
"id": "carton-a",
"label": "Carton A",
"length": 60,
"width": 40,
"height": 40,
"weight": 12,
"quantity": 40,
"rotation": "upright"
}
],
"options": {
"packing_mode": "auto"
}
}
JSON
response = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https") do |http|
http.request(request)
end
puts response.code, response.bodyПример ответа
{
"id": "job_4bK9mT2xQe7LpW1zRc8VdN3f",
"object": "job",
"status": "queued",
"reference": "order-1042",
"source": "api",
"created_at": "2026-10-19T09:12:03Z",
"started_at": null,
"finished_at": null,
"progress": {
"stage": "queued",
"vehicles_done": 0,
"placed_items": 0
},
"summary": {
"items_requested": 58,
"items_placed": 0,
"items_unplaced": 0,
"vehicles_used": 0,
"total_weight": 0,
"volume_utilization": 0,
"queue_ms": 0,
"compute_ms": 0
},
"cost": {
"credits": 0,
"reserved_credits": 1.11,
"rate_card_version": 1,
"breakdown": {
"base": 0,
"vehicles": 0,
"compute": 0,
"large_load": 0
}
},
"error": null,
"warnings": [],
"result_url": "https://runner.cargoduo.com/v1/jobs/job_4bK9mT2xQe7LpW1zRc8VdN3f/result",
"pdf_url": "",
"expires_at": "2026-11-02T09:12:03Z"
}Ответы
200OKЗадание завершилось в пределах ?wait, результат встроен в ответ. Так же отвечает идемпотентный повтор завершённого задания.
ИмяТипОбязательноОписаниеidstringобязательноstringДаID задания (job_…).
objectstringобязательноstringДаВсегда
job.jobstatusstringобязательноstringДаqueued→running→succeeded|failed|canceled.queuedrunningsucceededfailedcanceledreferencestringstringНетВаш идентификатор из запроса.
sourcestringstringНетГде создано задание.
apiplaygroundproject_idstringstringНетПроект (prj_…), в который задание POST /v1/projects/{id}/pack сохраняет свой план. У других заданий отсутствует.
created_atstringобязательноstringДаМетка времени RFC 3339.
started_atstring | nullstring | nullНетКогда начались вычисления (RFC 3339), или
null.finished_atstring | nullstring | nullНетКогда задание завершилось (RFC 3339), или
null.progressJobProgressJobProgressНетТекущий прогресс, пока задание в очереди или выполняется.
stagestringstringНетТекущий этап, например
queued,running,finalizingилиdone. Только для информации: ветвите логику поJob.status.vehicles_doneintegerintegerНетСколько транспортных средств уже рассчитано.
placed_itemsintegerintegerНетСколько единиц груза уже размещено.
summaryJobSummaryJobSummaryНетСчётчики и время.
items_requestedintegerintegerНетВсего единиц груза (сумма количеств).
items_placedintegerintegerНетРазмещено единиц.
items_unplacedintegerintegerНетЕдиницы, которые не удалось разместить.
vehicles_usedintegerintegerНетТранспортные средства, в которых есть хотя бы одна единица груза.
total_weightnumber · kgnumber · kgНетЗагруженный вес.
volume_utilizationnumbernumberНетСредняя заполненность по объёму задействованных транспортных средств, 0–1.
queue_msintegerintegerНетВремя ожидания слота вычислений (не оплачивается).
compute_msintegerintegerНетВремя вычислений (оплачивается).
costJobCostJobCostНетСписанные кредиты (окончательные после завершения задания) и резерв, удерживаемый во время выполнения.
creditsnumber · creditsnumber · creditsНетСписанные кредиты (0 до завершения задания). Задания с ошибкой не оплачиваются, кроме time_limit_exceeded: такое задание оплачивается как отменённое.
reserved_creditsnumber · creditsnumber · creditsНетКредиты, удерживаемые, пока задание ждало в очереди или выполнялось (максимально возможная стоимость). Освобождаются по завершении.
rate_card_versionintegerintegerНетТарифная сетка, по которой рассчитана стоимость задания.
breakdownCostBreakdownCostBreakdownНетДетализация стоимости.
basenumber · creditsnumber · creditsНетПлата за задание.
vehiclesnumber · creditsnumber · creditsНетЗа каждое загруженное транспортное средство (не взимается для отменённых заданий и заданий с time_limit_exceeded).
computenumber · creditsnumber · creditsНетЗа секунду вычислений, пропорционально, с точностью до миллисекунды.
large_loadnumber · creditsnumber · creditsНетНадбавка за каждую начатую сотню единиц сверх порога крупной загрузки.
errorJobError | nullJobError | nullНетПочему задание завершилось ошибкой или было отменено; иначе
null.codestringstringНетМашиночитаемый код (см. «Ошибки»).
messagestringstringНетПояснение на английском.
warningsWarning[]Warning[]НетНекритичные замечания к запросу (дублируются в результате).
codestringstringНетМашиночитаемый код.
messagestringstringНетПояснение на английском.
result_urlstringstringНетВыполните GET по этому URL, чтобы получить полный результат, когда
statusстанетsucceeded.pdf_urlstringstringНетСсылка, по которой браузер формирует PDF с планом загрузки (3D-виды + шаги загрузки). Действует до expires_at. После истечения срока пустая.
expires_atstringstringНетКогда удаляются тела запроса и результата и ссылка на PDF (RFC 3339). Метаданные задания и списания сохраняются.
resultResultResultНетПолный результат; встраивается, только если запрошен (?include=result) или если POST /v1/pack?wait= успел завершиться.
job_idstringstringНетЗадание.
vehiclesResultVehicle[]ResultVehicle[]НетЗагруженные транспортные средства в порядке загрузки (пустые не включаются).
indexintegerintegerНетПозиция в плане, начиная с 0.
vehicle_idstringstringНетID вашего описания транспортного средства (для задания проекта — ID слота, pv_…).
copyintegerintegerНетНомер копии этого описания, начиная с 1 (при quantity > 1 или при добавлении в режиме auto).
auto_addedbooleanbooleanНетДобавлено режимом
packing_modeautoсверх указанного вамиquantity.namestringstringНетНазвание транспортного средства.
typestringstringНетТип транспортного средства.
lengthnumber · cmnumber · cmНетДлина грузового пространства.
widthnumber · cmnumber · cmНетШирина грузового пространства.
heightnumber · cmnumber · cmНетВысота грузового пространства.
max_weightnumber · kgnumber · kgНетГрузоподъёмность.
items_placedintegerintegerНетЕдиниц в этом транспортном средстве.
total_weightnumber · kgnumber · kgНетВес груза в этом транспортном средстве.
volume_utilizationnumbernumberНетЗанятый объём / объём грузового пространства, 0–1.
weight_utilizationnumbernumberНетtotal_weight / max_weight, 0–1 (с allow_overweight может быть больше 1).
center_of_gravityPointPointНетЦентр тяжести груза (cm).
xnumber · cmnumber · cmНетynumber · cmnumber · cmНетznumber · cmnumber · cmНетplacementsPlacement[]Placement[]НетВсе единицы в этом транспортном средстве.
item_idstringstringНетID вашего описания позиции (для задания проекта — ID позиции, item_…).
instanceintegerintegerНетНомер единицы внутри описания позиции, начиная с 1 (уникален во всём плане).
labelstringstringНетМетка позиции.
xnumber · cmnumber · cmНетПоложение минимального угла по длине.
ynumber · cmnumber · cmНетВысота минимального угла над полом.
znumber · cmnumber · cmНетПоложение минимального угла по ширине.
lengthnumber · cmnumber · cmНетРазмер по x после размещения.
widthnumber · cmnumber · cmНетРазмер по z после размещения.
heightnumber · cmnumber · cmНетРазмер по y после размещения.
rotatedbooleanbooleanНетРазмещено в ориентации, отличной от описанной.
orientationstringstringНетКакая из описанных сторон лежит вдоль x, z и y:
lwh= как описано,wlh= повёрнуто на 90° вокруг вертикальной оси,lhw,hwl,whl,hlw= положено на бок.stepintegerintegerНетШаг загрузки в этом транспортном средстве, начиная с 1 (загружайте по возрастанию).
weightnumber · kgnumber · kgНетВес единицы.
axle_loadsНужен доступAxleLoad[]AxleLoad[]НетНагрузка на каждую ось (только для транспортных средств с данными об осях).
namestringstringНетAxle 1,Axle 2… в порядкеaxle_positions.positionnumber · cmnumber · cmНетПоложение оси от передней границы грузового пространства.
loadnumber · kgnumber · kgНетНагрузка груза на ось.
maxnumber · kgnumber · kgНетЗаданный максимум (0 = не задан).
okbooleanbooleanНетload≤max(без максимума всегдаtrue).unplacedUnplacedItem[]UnplacedItem[]НетЕдиницы, которые не удалось разместить, с причиной.
item_idstringstringНетID вашего описания позиции.
instanceintegerintegerНетНомер единицы, начиная с 1.
labelstringstringНетМетка позиции.
reasonstringstringНетПочему единицу не удалось разместить.
warningsWarning[]Warning[]НетЗамечания к плану.
codestringstringНетМашиночитаемый код.
messagestringstringНетПояснение на английском.
pdf_urlstringstringНетСсылка, по которой браузер формирует PDF с планом.
expires_atstringstringНетКогда этот результат будет удалён (RFC 3339).
202AcceptedЗадание принято (в очереди или выполняется).
ИмяТипОбязательноОписаниеidstringобязательноstringДаID задания (job_…).
objectstringобязательноstringДаВсегда
job.jobstatusstringобязательноstringДаqueued→running→succeeded|failed|canceled.queuedrunningsucceededfailedcanceledreferencestringstringНетВаш идентификатор из запроса.
sourcestringstringНетГде создано задание.
apiplaygroundproject_idstringstringНетПроект (prj_…), в который задание POST /v1/projects/{id}/pack сохраняет свой план. У других заданий отсутствует.
created_atstringобязательноstringДаМетка времени RFC 3339.
started_atstring | nullstring | nullНетКогда начались вычисления (RFC 3339), или
null.finished_atstring | nullstring | nullНетКогда задание завершилось (RFC 3339), или
null.progressJobProgressJobProgressНетТекущий прогресс, пока задание в очереди или выполняется.
stagestringstringНетТекущий этап, например
queued,running,finalizingилиdone. Только для информации: ветвите логику поJob.status.vehicles_doneintegerintegerНетСколько транспортных средств уже рассчитано.
placed_itemsintegerintegerНетСколько единиц груза уже размещено.
summaryJobSummaryJobSummaryНетСчётчики и время.
items_requestedintegerintegerНетВсего единиц груза (сумма количеств).
items_placedintegerintegerНетРазмещено единиц.
items_unplacedintegerintegerНетЕдиницы, которые не удалось разместить.
vehicles_usedintegerintegerНетТранспортные средства, в которых есть хотя бы одна единица груза.
total_weightnumber · kgnumber · kgНетЗагруженный вес.
volume_utilizationnumbernumberНетСредняя заполненность по объёму задействованных транспортных средств, 0–1.
queue_msintegerintegerНетВремя ожидания слота вычислений (не оплачивается).
compute_msintegerintegerНетВремя вычислений (оплачивается).
costJobCostJobCostНетСписанные кредиты (окончательные после завершения задания) и резерв, удерживаемый во время выполнения.
creditsnumber · creditsnumber · creditsНетСписанные кредиты (0 до завершения задания). Задания с ошибкой не оплачиваются, кроме time_limit_exceeded: такое задание оплачивается как отменённое.
reserved_creditsnumber · creditsnumber · creditsНетКредиты, удерживаемые, пока задание ждало в очереди или выполнялось (максимально возможная стоимость). Освобождаются по завершении.
rate_card_versionintegerintegerНетТарифная сетка, по которой рассчитана стоимость задания.
breakdownCostBreakdownCostBreakdownНетДетализация стоимости.
basenumber · creditsnumber · creditsНетПлата за задание.
vehiclesnumber · creditsnumber · creditsНетЗа каждое загруженное транспортное средство (не взимается для отменённых заданий и заданий с time_limit_exceeded).
computenumber · creditsnumber · creditsНетЗа секунду вычислений, пропорционально, с точностью до миллисекунды.
large_loadnumber · creditsnumber · creditsНетНадбавка за каждую начатую сотню единиц сверх порога крупной загрузки.
errorJobError | nullJobError | nullНетПочему задание завершилось ошибкой или было отменено; иначе
null.codestringstringНетМашиночитаемый код (см. «Ошибки»).
messagestringstringНетПояснение на английском.
warningsWarning[]Warning[]НетНекритичные замечания к запросу (дублируются в результате).
codestringstringНетМашиночитаемый код.
messagestringstringНетПояснение на английском.
result_urlstringstringНетВыполните GET по этому URL, чтобы получить полный результат, когда
statusстанетsucceeded.pdf_urlstringstringНетСсылка, по которой браузер формирует PDF с планом загрузки (3D-виды + шаги загрузки). Действует до expires_at. После истечения срока пустая.
expires_atstringstringНетКогда удаляются тела запроса и результата и ссылка на PDF (RFC 3339). Метаданные задания и списания сохраняются.
resultResultResultНетПолный результат; встраивается, только если запрошен (?include=result) или если POST /v1/pack?wait= успел завершиться.
job_idstringstringНетЗадание.
vehiclesResultVehicle[]ResultVehicle[]НетЗагруженные транспортные средства в порядке загрузки (пустые не включаются).
indexintegerintegerНетПозиция в плане, начиная с 0.
vehicle_idstringstringНетID вашего описания транспортного средства (для задания проекта — ID слота, pv_…).
copyintegerintegerНетНомер копии этого описания, начиная с 1 (при quantity > 1 или при добавлении в режиме auto).
auto_addedbooleanbooleanНетДобавлено режимом
packing_modeautoсверх указанного вамиquantity.namestringstringНетНазвание транспортного средства.
typestringstringНетТип транспортного средства.
lengthnumber · cmnumber · cmНетДлина грузового пространства.
widthnumber · cmnumber · cmНетШирина грузового пространства.
heightnumber · cmnumber · cmНетВысота грузового пространства.
max_weightnumber · kgnumber · kgНетГрузоподъёмность.
items_placedintegerintegerНетЕдиниц в этом транспортном средстве.
total_weightnumber · kgnumber · kgНетВес груза в этом транспортном средстве.
volume_utilizationnumbernumberНетЗанятый объём / объём грузового пространства, 0–1.
weight_utilizationnumbernumberНетtotal_weight / max_weight, 0–1 (с allow_overweight может быть больше 1).
center_of_gravityPointPointНетЦентр тяжести груза (cm).
xnumber · cmnumber · cmНетynumber · cmnumber · cmНетznumber · cmnumber · cmНетplacementsPlacement[]Placement[]НетВсе единицы в этом транспортном средстве.
item_idstringstringНетID вашего описания позиции (для задания проекта — ID позиции, item_…).
instanceintegerintegerНетНомер единицы внутри описания позиции, начиная с 1 (уникален во всём плане).
labelstringstringНетМетка позиции.
xnumber · cmnumber · cmНетПоложение минимального угла по длине.
ynumber · cmnumber · cmНетВысота минимального угла над полом.
znumber · cmnumber · cmНетПоложение минимального угла по ширине.
lengthnumber · cmnumber · cmНетРазмер по x после размещения.
widthnumber · cmnumber · cmНетРазмер по z после размещения.
heightnumber · cmnumber · cmНетРазмер по y после размещения.
rotatedbooleanbooleanНетРазмещено в ориентации, отличной от описанной.
orientationstringstringНетКакая из описанных сторон лежит вдоль x, z и y:
lwh= как описано,wlh= повёрнуто на 90° вокруг вертикальной оси,lhw,hwl,whl,hlw= положено на бок.stepintegerintegerНетШаг загрузки в этом транспортном средстве, начиная с 1 (загружайте по возрастанию).
weightnumber · kgnumber · kgНетВес единицы.
axle_loadsНужен доступAxleLoad[]AxleLoad[]НетНагрузка на каждую ось (только для транспортных средств с данными об осях).
namestringstringНетAxle 1,Axle 2… в порядкеaxle_positions.positionnumber · cmnumber · cmНетПоложение оси от передней границы грузового пространства.
loadnumber · kgnumber · kgНетНагрузка груза на ось.
maxnumber · kgnumber · kgНетЗаданный максимум (0 = не задан).
okbooleanbooleanНетload≤max(без максимума всегдаtrue).unplacedUnplacedItem[]UnplacedItem[]НетЕдиницы, которые не удалось разместить, с причиной.
item_idstringstringНетID вашего описания позиции.
instanceintegerintegerНетНомер единицы, начиная с 1.
labelstringstringНетМетка позиции.
reasonstringstringНетПочему единицу не удалось разместить.
warningsWarning[]Warning[]НетЗамечания к плану.
codestringstringНетМашиночитаемый код.
messagestringstringНетПояснение на английском.
pdf_urlstringstringНетСсылка, по которой браузер формирует PDF с планом.
expires_atstringstringНетКогда этот результат будет удалён (RFC 3339).
400Bad request
invalid_jsonidempotency_key_invalidinvalid_jsonТело запроса — невалидный JSON, или у поля неверный тип.idempotency_key_invalidДлина заголовка Idempotency-Key превышает 128 симв.
Все коды ошибокИмяТипОбязательноОписаниеerrorErrorBodyобязательноErrorBodyДаcodestringобязательноstringДаМашиночитаемый код (snake_case). Ветвите логику по нему, а не по
message.messagestringобязательноstringДаПояснение на английском.
request_idstringобязательноstringДаСовпадает с заголовком X-Request-Id. Указывайте его при обращении в поддержку.
detailsErrorDetail[]ErrorDetail[]НетПроблемы по отдельным полям (
validation_failed).pathstringstringНетJSON-путь к проблемному полю, например items[3].length.
codestringstringНетrequired,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.messagestringstringНетПояснение на английском.
401Unauthorized
unauthorizedkey_revokedkey_expiredunauthorizedAPI-ключ отсутствует, имеет неверный формат или неизвестен.key_revokedКлюч отозван.key_expiredСрок действия ключа истёк.
Все коды ошибокИмяТипОбязательноОписаниеerrorErrorBodyобязательноErrorBodyДаcodestringобязательноstringДаМашиночитаемый код (snake_case). Ветвите логику по нему, а не по
message.messagestringобязательноstringДаПояснение на английском.
request_idstringобязательноstringДаСовпадает с заголовком X-Request-Id. Указывайте его при обращении в поддержку.
detailsErrorDetail[]ErrorDetail[]НетПроблемы по отдельным полям (
validation_failed).pathstringstringНетJSON-путь к проблемному полю, например items[3].length.
codestringstringНетrequired,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.messagestringstringНетПояснение на английском.
402Payment required
insufficient_creditsinsufficient_creditsДоступных кредитов не хватает даже на минимально возможный расчёт этого задания.
Все коды ошибокИмяТипОбязательноОписаниеerrorErrorBodyобязательноErrorBodyДаcodestringобязательноstringДаМашиночитаемый код (snake_case). Ветвите логику по нему, а не по
message.messagestringобязательноstringДаПояснение на английском.
request_idstringобязательноstringДаСовпадает с заголовком X-Request-Id. Указывайте его при обращении в поддержку.
detailsErrorDetail[]ErrorDetail[]НетПроблемы по отдельным полям (
validation_failed).pathstringstringНетJSON-путь к проблемному полю, например items[3].length.
codestringstringНетrequired,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.messagestringstringНетПояснение на английском.
403Forbidden
ip_not_allowedsubscription_inactiveaccount_inactivescope_missingip_not_allowedIP-адреса вызывающей стороны нет в списке разрешённых IP для этого ключа.subscription_inactiveУ организации нет активной подписки, включающей API.account_inactiveРабота организации приостановлена, или у неё нет владельца с активной учётной записью.scope_missingУ ключа нет области доступа, необходимой для этого endpoint.
Все коды ошибокИмяТипОбязательноОписаниеerrorErrorBodyобязательноErrorBodyДаcodestringобязательноstringДаМашиночитаемый код (snake_case). Ветвите логику по нему, а не по
message.messagestringобязательноstringДаПояснение на английском.
request_idstringобязательноstringДаСовпадает с заголовком X-Request-Id. Указывайте его при обращении в поддержку.
detailsErrorDetail[]ErrorDetail[]НетПроблемы по отдельным полям (
validation_failed).pathstringstringНетJSON-путь к проблемному полю, например items[3].length.
codestringstringНетrequired,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.messagestringstringНетПояснение на английском.
413Payload too large
payload_too_largepayload_too_largeТело запроса превышает 10 MB.
Все коды ошибокИмяТипОбязательноОписаниеerrorErrorBodyобязательноErrorBodyДаcodestringобязательноstringДаМашиночитаемый код (snake_case). Ветвите логику по нему, а не по
message.messagestringобязательноstringДаПояснение на английском.
request_idstringобязательноstringДаСовпадает с заголовком X-Request-Id. Указывайте его при обращении в поддержку.
detailsErrorDetail[]ErrorDetail[]НетПроблемы по отдельным полям (
validation_failed).pathstringstringНетJSON-путь к проблемному полю, например items[3].length.
codestringstringНетrequired,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.messagestringstringНетПояснение на английском.
422Unprocessable entity
validation_failedvalidation_failedЗапрос — корректный JSON, но описывает недопустимое задание. В details[] перечислены все проблемы.
Все коды ошибокИмяТипОбязательноОписаниеerrorErrorBodyобязательноErrorBodyДаcodestringобязательноstringДаМашиночитаемый код (snake_case). Ветвите логику по нему, а не по
message.messagestringобязательноstringДаПояснение на английском.
request_idstringобязательноstringДаСовпадает с заголовком X-Request-Id. Указывайте его при обращении в поддержку.
detailsErrorDetail[]ErrorDetail[]НетПроблемы по отдельным полям (
validation_failed).pathstringstringНетJSON-путь к проблемному полю, например items[3].length.
codestringstringНетrequired,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.messagestringstringНетПояснение на английском.
429Too many requests
too_many_jobsrate_limitedtoo_many_jobsУ организации уже максимальное число заданий в очереди и в работе.rate_limitedСлишком много запросов за текущую минуту, час или сутки (на ключ или на организацию) либо число неудачных попыток аутентификации с вашего IP-адреса превысило 60 в минуту.
Все коды ошибокИмяТипОбязательноОписаниеerrorErrorBodyобязательноErrorBodyДаcodestringобязательноstringДаМашиночитаемый код (snake_case). Ветвите логику по нему, а не по
message.messagestringобязательноstringДаПояснение на английском.
request_idstringобязательноstringДаСовпадает с заголовком X-Request-Id. Указывайте его при обращении в поддержку.
detailsErrorDetail[]ErrorDetail[]НетПроблемы по отдельным полям (
validation_failed).pathstringstringНетJSON-путь к проблемному полю, например items[3].length.
codestringstringНетrequired,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.messagestringstringНетПояснение на английском.
500Internal server error
internal_errorinternal_errorСбой на нашей стороне.
Все коды ошибокИмяТипОбязательноОписаниеerrorErrorBodyобязательноErrorBodyДаcodestringобязательноstringДаМашиночитаемый код (snake_case). Ветвите логику по нему, а не по
message.messagestringобязательноstringДаПояснение на английском.
request_idstringобязательноstringДаСовпадает с заголовком X-Request-Id. Указывайте его при обращении в поддержку.
detailsErrorDetail[]ErrorDetail[]НетПроблемы по отдельным полям (
validation_failed).pathstringstringНетJSON-путь к проблемному полю, например items[3].length.
codestringstringНетrequired,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.messagestringstringНетПояснение на английском.
503Service unavailable
api_disabledapi_disabledAPI временно отключён (техническое обслуживание) или выключен для организации.
Все коды ошибокИмяТипОбязательноОписаниеerrorErrorBodyобязательноErrorBodyДаcodestringобязательноstringДаМашиночитаемый код (snake_case). Ветвите логику по нему, а не по
message.messagestringобязательноstringДаПояснение на английском.
request_idstringобязательноstringДаСовпадает с заголовком X-Request-Id. Указывайте его при обращении в поддержку.
detailsErrorDetail[]ErrorDetail[]НетПроблемы по отдельным полям (
validation_failed).pathstringstringНетJSON-путь к проблемному полю, например items[3].length.
codestringstringНетrequired,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.messagestringstringНетПояснение на английском.