Документация API для расчёта раскроя линейных материалов


Структура запроса
Параметр Тип Обязательный Описание Пример Подписка
name string Название артикула "Мой раскрой"
materialLength integer Длина материала (мм) 6000
cutWidth integer Ширина реза (мм) 4
edgeTrimming integer Обрезка края (мм) 25
parts array Массив деталей.
Каждый элемент — или число (длина в мм), или компактная запись (“длина-количество”), или объект:
{"length": 600, "count": 2, "name": "Маркировка"}
Параметр name (маркировка/название детали) необязателен.
[1000, 500, "700-2", {"length":600,"count":2,"name":"B1"}]
waste array Массив доступных отходов [1500, "1000-2"]
Формат компактной записи: Для передачи нескольких одинаковых деталей или отходов можно использовать формат "длина-количество", например, "600-20" вместо 20 элементов со значением 600. Теперь вы можете передавать детали в виде объекта: {"length": 500, "count": 3, "name": "В1"} — здесь name это опциональная маркировка/название, которое будет использоваться во всех отчетах, экспорте и визуализации.
Пример запроса для одного артикула:

{
  "name": "Простой раскрой",
  "materialLength": 6000,
  "cutWidth": 4,
  "edgeTrimming": 25,
  "parts": [    1500,
    {"length": 1000, "count": 2, "name": "А"},
    {"length": 500, "count": 3, "name": "В_деталь"}
  ]
}
    
Пример запроса для нескольких артикулов:

{
  "articles": [
    {
      "name": "Артикул1",
      "materialLength": 6000,
      "cutWidth": 4,
      "edgeTrimming": 25,
      "parts": [600, 600, 600, "600-17", "500-3"],
      "waste": ["1500-2"]
    },
    {
      "name": "Артикул2",
      "materialLength": 7000,
      "cutWidth": 4,
      "edgeTrimming": 25,
      "parts": ["700-5", 500, 300]
    }
  ]
}
    
Структура ответа

Ответ API - это массив объектов раскроя (по одному на каждый переданный артикул). Каждый объект содержит:

Поле Тип Описание
name string Название артикула из запроса
cutWidth integer Ширина реза (мм)
edgeTrimming integer Обрезка края (мм)
stocks array Массив заготовок (палок) с размещенными деталями
totalStocks integer Общее количество используемых заготовок
totalParts integer Общее количество размещённых деталей
totalPartsLength integer Суммарная длина всех деталей (мм)
totalCutsCount integer Общее количество резов
totalCutsWidth integer Суммарная ширина всех резов (мм)
totalWaste integer Суммарная длина отходов (мм)
efficiency float Эффективность использования материала (0-100%)

Поле Тип Описание
partsarray of объектовМассив деталей. Каждый элемент — объект вида {length, name}, где length — длина детали (мм), name — название (маркировка, если было задано).
countintegerКоличество одинаковых заготовок
parts_countintegerКоличество деталей в заготовке
cuts_countintegerКоличество резов в заготовке
parts_lengthintegerСуммарная длина деталей (мм)
cuts_widthintegerСуммарная ширина резов (мм)
wasteintegerДлина отхода для одной заготовки (мм)
material_lengthintegerДлина материала заготовки (мм)
cutWidthintegerШирина реза (мм)
edgeTrimmingintegerОбрезка края (мм)
isFromWastebooleanПризнак того, что заготовка создана из отхода (необязательное поле)
Важно: Поле waste в заготовке всегда показывает отход на одну палку, даже если count > 1.


[
    {
        "name": "Простой раскрой",
        "cutWidth": 4,
        "edgeTrimming": 25,
        "stocks": [
            {
                "parts": [    
					{"length": 600, "name": "B1"},
					{"length": 500, "name": "C2"}
				],
                "count": 1,
                "parts_count": 6,
                "cuts_count": 6,
                "parts_length": 5000,
                "cuts_width": 24,
                "waste": 926,
                "material_length": 6000,
                "cutWidth": 4,
                "edgeTrimming": 25
            }
        ],
        "totalStocks": 1,
        "totalParts": 6,
        "totalPartsLength": 5000,
        "totalCutsCount": 6,
        "totalCutsWidth": 24,
        "totalWaste": 926,
        "efficiency": 83.3
    }
]
            
Ответ для нескольких артикулов с использованием отходов:

[
    {
        "name": "Артикул1",
        "cutWidth": 4,
        "edgeTrimming": 25,
        "stocks": [
            {
                "parts": [
                    600,
                    600,
                    600
                ],
                "count": 1,
                "parts_count": 3,
                "cuts_count": 3,
                "parts_length": 1800,
                "cuts_width": 12,
                "waste": 138,
                "material_length": 2000,
                "cutWidth": 4,
                "edgeTrimming": 25,
                "isFromWaste": true
            },
            {
                "parts": [
                    600,
                    600,
                    600,
                    600,
                    600,
                    500
                ],
                "count": 3,
                "parts_count": 6,
                "cuts_count": 6,
                "parts_length": 3500,
                "cuts_width": 24,
                "waste": 426,
                "material_length": 4000,
                "cutWidth": 4,
                "edgeTrimming": 25
            },
            {
                "parts": [
                    600,
                    600,
                    500,
                    500
                ],
                "count": 1,
                "parts_count": 4,
                "cuts_count": 4,
                "parts_length": 2200,
                "cuts_width": 16,
                "waste": 734,
                "material_length": 3000,
                "cutWidth": 4,
                "edgeTrimming": 25
            }
        ],
        "totalStocks": 5,
        "totalParts": 27,
        "totalPartsLength": 15700,
        "totalCutsCount": 27,
        "totalCutsWidth": 108,
        "totalWaste": 2516,
        "efficiency": 84.4
    },
    {
        "name": "Артикул2",
        "cutWidth": 4,
        "edgeTrimming": 25,
        "stocks": [
            {
                "parts": [
                    700,
                    700,
                    700,
                    700,
                    700,
                    500,
                    300
                ],
                "count": 1,
                "parts_count": 7,
                "cuts_count": 7,
                "parts_length": 4300,
                "cuts_width": 28,
                "waste": 622,
                "material_length": 5000,
                "cutWidth": 4,
                "edgeTrimming": 25
            }
        ],
        "totalStocks": 1,
        "totalParts": 7,
        "totalPartsLength": 4300,
        "totalCutsCount": 7,
        "totalCutsWidth": 28,
        "totalWaste": 622,
        "efficiency": 86.0
    }
]
            
Авторизация

Для авторизации необходимо в запросе отправлять заголовок X-API-KEY с ключом из личного кабинета.

Пример запроса:

curl -X POST https://dx4.ru/profilecut/api/ \
  -H "Content-Type: application/json" \
  -H "X-API-KEY: ваш_ключ_api" \
  -d '{
    "name": "Простой раскрой",
    "materialLength": 6000,
    "cutWidth": 4,
    "edgeTrimming": 25,
    "parts": [1500, 1000, 1000, 500, 500, 500]
  }'
	  
Пример запроса на JavaScript:

fetch('https://dx4.ru/profilecut/api/', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'X-API-KEY': 'ваш_ключ_api'
  },
  body: JSON.stringify({
    "name": "Простой раскрой",
    "materialLength": 6000,
    "cutWidth": 4,
    "edgeTrimming": 25,
    "parts": [1500, 1000, 1000, 500, 500, 500]
  })
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Ошибка:', error));
	  
Обработка ошибок

{
  "status": "error",
  "error": {
    "code": 400,
    "message": "Длина детали должна быть положительным числом"
  }
}
    
Распространённые ошибки:
  • 400 - ошибка валидации входных данных (некорректные значения полей)
  • 403 - доступ запрещён (проблема с API-ключом или доменом запроса)
  • 429 - превышение лимитов использования API
  • 500 - внутренняя ошибка сервера
Примеры ошибок валидации (400):
  • "Не указано имя артикула"
  • "Некорректная длина материала"
  • "Некорректная ширина реза"
  • "Некорректная обрезка"
  • "Список деталей не может быть пустым"
  • "Деталь длиной [X] мм в артикуле [Y] превышает максимально возможный размер ([Z] мм)"
Лимиты использования API

Для использования API необходима действующая подписка - API доступ.
API недоступно в бесплатном режиме.

Лимиты по тарифам:
Тариф Максимум деталей в запросе Максимум артикулов в запросе
Бесплатный
С подпиской API 10000 100
Важно: При превышении лимитов вы получите ошибку 429 Too Many Requests.

Для увеличения лимитов свяжитесь с поддержкой.