API Loader4D
Вызывайте оптимизацию загрузки прямо из своей ERP, WMS или системы управления перевозками. Тот же самый механизм размещения, что работает в браузере, за одним HTTP-запросом.
Что вы можете сделать
Отправьте свои пространства и список грузов в JSON и получите план размещения с координатами каждой единицы. Нагрузки на оси и неразмещённые позиции тоже приходят в ответе.
Оптимизация занимает секунды. В синхронной схеме оборванное соединение уничтожает результат; здесь вы возвращаетесь с идентификатором задачи и забираете его, не оплачивая один и тот же расчёт дважды.
Кредиты считаются по диапазонам, а не за единицу. Механизм тратит на маленькую отправку тот же бюджет поиска, что и на большую, поэтому оплата за единицу штрафовала бы небольшие вызовы и делала счёт непредсказуемым.
Тестовые ключи возвращают реальные результаты и не расходуют кредиты; лимит — 25 вызовов в месяц. Тестируйте до готовности интеграции: переход в боевой режим — это просто замена ключа.
Точки доступа
Аутентификация выполняется заголовком bearer с вашим ключом. В строке запроса ключ не принимается никогда.
Authorization: Bearer l4d_live_...
| Вызов | Что делает |
|---|---|
| POST /api/v1/pack | Открывает задачу размещения; возвращает 202 и идентификатор задачи. |
| GET /api/v1/jobs/{id} | Возвращает состояние задачи, а по завершении — её результат. |
| GET /api/v1/usage | Возвращает вашу квоту за период и остаток кредитов. |
Пример запроса
Длины в сантиметрах, вес в килограммах. Настройки единиц для отдельного запроса нет; пересчитывайте на своей стороне. Запрос, отправленный в дюймах, загрузит фуру в десять раз длиннее нужной.
POST /api/v1/pack
Authorization: Bearer l4d_test_...
Content-Type: application/json
Idempotency-Key: 7f3c1a9e4b6d4c2f
{
"reference": "SO-2026-4417",
"spaces": [
{ "id": "sp1", "name": "40HC", "type": "container",
"length": 1200, "width": 235, "height": 269,
"max_weight": 26000, "available": 2 }
],
"items": [
{ "id": "A1", "name": "Karton", "length": 120, "width": 100, "height": 40,
"weight": 8, "quantity": 24, "group": "Siparis-1",
"constraints": { "no_tilt": true } },
{ "id": "B1", "name": "Varil", "shape": "cylinder",
"diameter": 58, "length": 88, "weight": 190, "quantity": 12,
"constraints": { "floor_only": true } }
],
"strategy": { "group_items": true, "balance_load": true }
}
Ответ приходит сразу; за результатом вы опрашиваете идентификатор задачи.
HTTP/1.1 202 Accepted
Location: /api/v1/jobs/ba7189d3b1824da3806ca3ee973b2294
{ "id": "ba7189d3...", "status": "queued", "progress": 0,
"reference": "SO-2026-4417", "credits": 1 }
Когда задача завершается, каждая единица приходит со своими координатами. Начало координат — передний левый нижний угол пространства, и указанное значение относится именно к этому углу единицы, а не к её центру.
{ "id": "ba7189d3...", "status": "succeeded", "credits": 1,
"result": {
"summary": { "spaces_used": 1, "pieces_requested": 36,
"pieces_packed": 36, "weight": 2472,
"volume_utilization": 0.7431 },
"spaces": [
{ "space_id": "sp1", "name": "40HC",
"placements": [
{ "item_id": "A1", "sequence": 1,
"x": 0, "y": 0, "z": 0,
"length": 120, "width": 100, "height": 40, "weight": 8 }
],
"axle_loads": [] }
],
"unpacked": []
} }
Полный список полей и ограничений, коды ошибок и документ OpenAPI смотрите в справочнике API
Кредиты и ограничения
Кредиты списываются при приёме задачи, а не при её завершении. Иначе сто одновременно пришедших вызовов прошли бы проверку квоты все до единого, прежде чем был бы засчитан хотя бы один.
| Всего единиц в запросе | Кредиты |
|---|---|
| 1 – 100 | 1 |
| 101 – 1 000 | 5 |
| 1 001 – 10 000 | 25 |
| 10 001 и больше | 100 |
- Не более 50 пространств на запрос.
- Не более 2 000 строк груза на запрос.
- Не более 20 000 единиц суммарно на запрос.
- Не более 10 действующих ключей на команду.
Эти ограничения нужны, чтобы один вызов не занимал сервис минутами. Если вашей нагрузке нужно больше, разбейте её или напишите нам.
Частые вопросы
На каком языке можно сделать интеграцию?
На любом, который умеет отправлять HTTP-запрос. Кроме того, можно скачать наш документ OpenAPI 3.0 и сгенерировать типизированный клиент на большинстве языков; это разница между интеграцией на часы и интеграцией на дни.
Как устроена оплата?
API входит в платные тарифы; для боевых вызовов нужен пакет кредитов, который обновляется каждый период. Неиспользованные кредиты не переносятся. Для пробы кредиты не нужны: тестовый ключ даёт 25 вызовов в месяц.
Как защищены мои ключи?
Ключ показывается один раз, при создании; в базе хранится только зашифрованная свёртка. Ключи принадлежат команде, а не человеку, поэтому интеграция продолжает работать, даже если настроивший её сотрудник ушёл. Дайте каждой интеграции свой ключ; тогда при подозрении на утечку вы отзовёте только его, а остальные продолжат работать.
Что будет, если я случайно отправлю один и тот же запрос дважды?
Отправляйте заголовок Idempotency-Key со значением, которое вы формируете для каждого логического запроса. Повтор с тем же ключом и тем же телом вернёт исходную задачу, а не откроет вторую. Тот же ключ с другим телом будет отклонён: молча вернуть прежний ответ означало бы оставить вас ждать работу, которая никогда не попадала в очередь.
Продолжится ли прерванная задача с того места, где остановилась?
Нет, и сказать это прямо будет честно. Поиск — единый расчёт, промежуточное состояние не сохраняется; неудавшаяся задача выполняется с начала. Идентификатор задачи даёт не непрерывность, а гарантию, что результат не потеряется.
Можно ли увидеть результаты и в интерфейсе?
Задачи, открытые через API, самостоятельны и в список ваших проектов не попадают; результат приходит прямо в ответе. Вызовы API расходуют кредиты, а не места, поэтому на места участников команды, работающих в интерфейсе, они не влияют.