Changelog¶
2026-10-20¶
- Products — new
PUT /products/{id}andPUT /productschange only the fields you send: name, description, category, brand, barcode, unit,extra(merged into the product's additional fields) andstockper warehouse. See Updating products. - Products (breaking) —
POST /productsnow only creates:idin the body is a422, an existing product with the samesku/barcodeis a409withdetails.product_id, and an error in the request creates nothing. Previously such a request answered201and could leave the product unchanged. See Creating products. POST /product_stock— takescost_price;"price": 0is now saved.updatedin the answer is the list of product ids.
2026-10-19¶
- Promotions — product
stockhas a newpromotionfield: the promotion applied to the product in the warehouse, including one on an additional price (price_type; price before and after it, its end).promotion_idin a sale item counts the sale towards the promotion in HugeProfit; thepriceof such an item may be omitted — we fill in the promotion price. Newpromotion_*error codes. See Sale with a promotion. - Products — a promotion price in
sale_pricenow has two decimals ("5.40", not"5.4"). - Sales — all request fields of
POST/PUT /salesare now documented in one block;PUTreplaces the sale as a whole. See Sales.
2026-10-17¶
- Courier delivery (Nova Poshta) — the sale's
deliverytakes a courier address (settlement_ref,street,house,flat), andPOST /sales/{id}/waybillsends the parcel to the door. New lookupsGET /delivery/settlementsandGET /delivery/streets. See Delivery.
2026-10-16¶
- Nova Poshta waybills — new
POST /sales/{id}/waybillcreates a waybill through the connected Nova Poshta account (cash on delivery, declared value, payer, parcel size) and saves its number to the sale; newdelivery:writescope. See Nova Poshta waybill. - Sales — new
deliveryfield saves the client's Nova Poshta branch address with the sale;client_delivery_id,delivery_infoandtracking_numberare now documented. See Sales. - Reference — Nova Poshta
carrier_accountslist theirsenders. See Reference. - Safe retries of
POST /sales— newexternal_idfield (your order number): a repeat with the same number creates no second sale and answers409withdetails.sale_id; newGET /sales?external_id=filter; the number comes in the sale object and in theorder_*webhooks. See Repeating a request safely. - Sales —
amountis no longer required and is counted from the items; if passed, it must equal the items' sum, otherwise422withdetails.expected.sale_amountdefaults toamountminus the discount (the discount used to be ignored). Non-numeric or too large amounts, quantities and discounts are a422(they used to be a500or a silent zero). Not enough stock —422withdetails.shortages. - Fixed —
PUT /salesreturns the sale's newid(an edit re-creates the sale under a newid), not the old one. - Polling for changes —
updated_from/updated_tofilters onGET /salesand in/query;after_idpages on past the last sale you got. See Sales. - Webhooks —
order_updatenow also fires when the status changes (delivery tracking included) and when a waybill is added;datacarriesstatus,tracking_number,external_id,previous_status,previous_id. See Webhooks. - Waybill label — new
GET /sales/{id}/waybill/labelreturns a PDF. See Waybill label. - Products —
skuandbarcodefilters (up to 500 comma-separated values) onGET /productsand in/query. - Delivery —
GET /delivery/warehouses: exactnumberfilter, sorted by number,limitup to 500. - Errors — errors that used to carry a
codelikeNotCorrectInstockErrornow carry the stable codes from the table: a rejected operation is a422 validation_error, a reached plan limit — the new403 limit_exceeded.
2026-10-07¶
- Rate limits — each key may make 120 requests per minute; responses carry
X-RateLimit-*headers, and over the limit the API answers429withRetry-After. See Rate limits.
2026-10-06¶
- Shipments — new
paymentslist: every payment for the goods with its date, including deferred and partial ones. See Shipments. - Expenses — new
shipment_idfilter onGET /expensesand in/query; without dates it returns all payments of the shipment regardless of date. See Expenses. - Products —
typenow also returnsbundleandservice(they used to come assimple); bundles carry their composition inbundle_items; newGET /products/{id}/similar; image URLs end with a?c=version that changes when a photo is replaced. See Products. - Orders —
GET /orders/{id}returnstracking_numberandsale_status; newPUT /orders/{id}cancels an order created by the same key (releasing its reserved stock) or sets itsorder_text. See Orders. - Delivery — Nova Poshta and Meest city and branch lookups:
GET /delivery/cities,GET /delivery/warehouses. See Delivery. - Reference — new
carrier_accountssection: the connected delivery services, whoseidis theaccount_idfor Meest lookups. See Reference. - Media — image hosting:
POST /mediauploads images and returns public links,GET /medialists the account's files. See Media. - Productions — new
POST /productions/{id}/runruns a recipe: writes the components off, adds the results to stock, records the expenses. See Running a recipe. - Write-offs — new
POST /write_offswrites goods off a warehouse in one call; categories are inwrite_off_categoriesof/reference. See Write-offs. - Fixed — stock changed through
POST /product_stocknow reaches the connected marketplaces.
2026-10-05¶
- Webhooks —
urlmust point to a publichttp(s)host: localhost and private-network addresses are rejected with422(also in/webhooks/test), and redirects are no longer followed. See Subscriptions.
2026-09-30¶
- Clients — search by phone on
GET /clientsand in/query:phonenow matches the whole number in any notation (380671234567,0671234567,+38 (067) 123-45-67), and the newphone_containsfilter finds clients whose number contains the given digits (at least 3). See Clients.
2026-09-17¶
- Clients — new
with_chats=telegramfilter onGET /clients,GET /clients/{id}and in/query: embeds the client's messenger chats as achatsarray (type,integration_id,chat_id). See Clients.
v2.0 — initial release¶
The v2 public API launches alongside v1 (/bapi), which continues to work unchanged.
- Clean, stable schema — de-prickled field names, one response envelope, nested
items. - Resources — reference, warehouses, suppliers, products (+ stock, sync), categories, clients (+ tags), sales, marketplace orders, shipments, expenses, productions.
- Composite
/query— fetch many resources in one call, with per-resource?include=. - Native webhooks — durable delivery queue, HMAC signatures, retries with backoff, a
delivery journal and a synchronous
/webhooks/test. - Hashed API keys with scopes;
GET /meintrospection.
Not yet exposed
Production runs (inventory execution) are not available through the API yet — recipes can be created and read, but not executed.