Эндпоинты заказов
/print-jobsСписок заказов
Постраничный список заказов аккаунта, отсортированный по дате создания.
{
"items": [
{
"id": "b6b6c8b0-...",
"model_name": "Кронштейн",
"quantity_pieces": 4,
"material_name": "PETG",
"color_hex": "#000000",
"material_grams": 86.0,
"print_hours": 3.5,
"due_date": "2026-09-01",
"order_notes": "",
"workflow_status": "confirmed",
"printer_id": null,
"printer_name": null
}
],
"total": 1,
"page": 1,
"per_page": 50
}В реальном ответе полей больше (себестоимость, скидки, клиент и т.п.) — здесь показаны только те, что нужны для интеграции с HA. Полный набор — как в веб-интерфейсе заказа.
/print-jobs/{id}Один заказ
Та же структура, что и элемент списка выше, для конкретного id.
GET /print-jobs/b6b6c8b0-... → 200/print-jobs/{id}Обновить статус (или другие поля)
Присылайте только те поля, которые меняете — остальные останутся как есть.
PUT /print-jobs/b6b6c8b0-...
Content-Type: application/json
{ "workflow_status": "assigned" }Значение workflow_status, которого нет в таблице ниже (опечатка, устаревшее имя), молча откатит заказ в статус «Согласование» — сервер не вернёт ошибку. Сверяйтесь со списком статусов при отправке.
Статусы заказа
| Значение | Название | Когда выставлять |
|---|---|---|
| negotiation | Görüşme | Заказ создан, условия ещё обсуждаются |
| confirmed | Onaylandı | Клиент подтвердил, готов к печати |
| modeling | Modelleme | Моделирование: заказ подтверждён, мастер готовит 3D-модель; материал не списан. Новое значение с 11.0 |
| assigned | Yazıcı atandı | HA закрепил конкретный принтер/катушку за заказом |
| printing | Baskıda | Печать идёт на принтере |
| print_error | Baskı hatası | Klipper/Moonraker сообщил об ошибке печати |
| packing | Sipariş hazırlanıyor | Заказ собирается и упаковывается к отправке (в т.ч. из склада готовой продукции) |
| delivery | Teslimatta | Печать готова, едет к клиенту |
| delivered_unpaid | Teslim edildi, ödeme bekleniyor | Доставлено клиенту, ждём оплату (отсрочка/рассрочка); материал уже списан. Новое значение с 11.0 |
| done | Tamamlandı | Заказ выполнен |
| cancelled | İptal edildi | Заказ отменён |
| closed | Kapatıldı | Архивный статус, скрыт из основного списка |
Эндпоинты принтеров
Только чтение — список принтеров фермы и данные одного принтера. Полезно, чтобы сопоставить printer_id заказа с реальным устройством или показать его имя/технологию во внешней системе.
/printersСписок принтеров
Все принтеры аккаунта, включая объединённые в группы (фермы).
{
"items": [
{
"id": "3f2a9c10-...",
"name": "Bambu Lab P1S",
"internal_name": "Ферма 1 / принтер 3",
"model": "P1S",
"technology": "fdm",
"group_id": "a1b2c3d4-...",
"is_favorite": false,
"sort_order": 2
}
],
"total": 1,
"page": 1,
"per_page": 50
}В реальном ответе есть ещё поля (наработка часов, стоимость, служебные привязки к Bambu/Anycubic Cloud, токен агента мониторинга) — они не нужны для внешней автоматизации и здесь не показаны.
/printers/{id}Один принтер
Та же структура, что и элемент списка выше, для конкретного id.
Эндпоинты филаментов
Чтение каталога материалов склада и списание веса катушки по мере расхода — этого достаточно, чтобы завести живой учёт из Klipper/Moonraker, Home Assistant или n8n, по той же идее, что и эндпоинт веса катушки в Spoolman.
/filamentsСписок филаментов
Все позиции склада материалов аккаунта.
{
"items": [
{
"id": "7c4d1e20-...",
"name": "PETG Black",
"brand": "eSUN",
"type_name": "PETG",
"colors": ["#000000"],
"is_gradient": false,
"spool_weight_grams": 1000.0,
"used_grams": 340.0,
"spool_count": 2,
"low_stock_threshold_grams": 150.0
}
],
"total": 1,
"page": 1,
"per_page": 50
}Цена катушки (spool_price_rub) в ответе тоже есть, но не нужна для автоматизации фермы и здесь не показана.
/filaments/{id}Один филамент
Та же структура, что и элемент списка выше, для конкретного id.
/filaments/{id}/consumeСписать вес катушки
Списывает граммы с катушки (FIFO по партиям) и возвращает обновлённый филамент. Использует тот же id филамента, что и поле выше.
API на чтение: свой сайт и Excel
Создайте токен с правом «Только чтение» в «Настройки → Интеграции → Токены доступа» и отметьте разделы, которые он может читать: каталог моделей, заказы, клиенты, склад, заявки. Такой токен отвечает 403 на любой запрос, который меняет данные, и на разделы, которые ему не выданы. Токен передаётся только в заголовке Authorization: Bearer pat_…. Токен внутри ссылки (например, IMPORTDATA в Google Таблицах) намеренно не поддерживается: ссылки попадают в историю браузера и логи.
/read-api/{orders|clients|stock|models|leads}Плоские списки: страницы, дата изменения, CSV
Параметры: page, per_page (до 1000), updated_since (дата/время ISO — только изменённые с этого момента), format=json|csv, delimiter=, или ; (для CSV). У заказов есть ещё workflow_status и is_paid, у моделей — for_sale=true (витрина), у склада — kind=filament|resin|finished. Персональные данные клиентов (имя, телефон, почта) есть, только если токен создан с этой опцией. Лимит: 120 запросов в минуту и 3000 в час на токен.
GET https://api.3dprintpricing.pro/read-api/orders?updated_since=2026-10-01T00:00:00Z&per_page=200
Authorization: Bearer pat_...
GET https://api.3dprintpricing.pro/read-api/stock?format=csv&delimiter=%3BExcel (Power Query)
Данные → Получить данные → Из других источников → Пустой запрос → Расширенный редактор, вставьте запрос ниже и подставьте свой токен. Подойдёт и обычное «Из Интернета»: выберите «Расширенное» и добавьте заголовок Authorization со значением Bearer pat_…. Обновление данных — Данные → Обновить всё.
let
Source = Csv.Document(
Web.Contents(
"https://api.3dprintpricing.pro/read-api/orders",
[Query = [format = "csv", per_page = "1000"],
Headers = [Authorization = "Bearer pat_ВАШ_ТОКЕН"]]
),
[Delimiter = ",", Encoding = 65001, QuoteStyle = QuoteStyle.Csv]
),
Promoted = Table.PromoteHeaders(Source, [PromoteAllScalars = true])
in
PromotedGoogle Таблицы (Apps Script)
IMPORTDATA заголовки передавать не умеет, поэтому — «Расширения → Apps Script» и короткий скрипт, который запускается по расписанию.
function loadOrders() {
const res = UrlFetchApp.fetch(
"https://api.3dprintpricing.pro/read-api/orders?format=csv&per_page=1000",
{ headers: { Authorization: "Bearer pat_YOUR_TOKEN" } }
);
const rows = Utilities.parseCsv(res.getContentText().replace(/^\uFEFF/, ""));
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Orders");
sheet.clear();
sheet.getRange(1, 1, rows.length, rows[0].length).setValues(rows);
}Свой сайт
Для публичной витрины ключ не нужен: открыты JSON анкеты мастера, бейдж badge.svg и виджет оценки. Токен «только чтение» используйте на своём сервере (не в коде страницы) и кэшируйте ответ — например, /read-api/models?for_sale=true.