Changelog
A record of all additions and breaking changes to the BOCP REST API v1.
1.10.0 — 2026-08-31
New endpoints
-
GET /marketplace/orders/list/— an account-wide, read-only list of imported webshop / marketplace orders across all connectors, with the sales receipts, fiscal invoices and AWBs generated for each one. It is the global counterpart ofGET /connector/{connector_id}/order/list/: the item shape is the same, but it is not bound to a single connector and every item carries aconnectorblock (connector_id,name,type) telling you where the order came from. Use it when you want one feed of every order regardless of source; use/sales/list/when you need the issued sales themselves rather than the orders.
Filters (URL path segments):connector_id,datefrom/datethrough(order-date period,YYYY-MM-DD, both inclusive),year,yearmonth,date,modifiedafter/modifiedthrough,skipcancelled,id,minid,page. Orders come back newest first, 250 per page, withdata_next_page_existsin the envelope. For an incremental sync, keep the highestlast_changed_tsyou have seen and pass it back asmodifiedafter. -
GET /marketplace/connectors/list/— lists the order connectors configured on the account (the webshops and marketplaces orders come from) with their BOCP IDs, type, whether they are active, and when orders were last imported from each. Call this first:connector_idon the order list is the value returned here, and until now there was no way to discover it — every other connector route requires you to already know the ID. Inactive and deleted connectors are included, flagged byactiveanddeleted, because historical orders still reference them. Connector credentials and internal URLs are deliberately not returned.
Enhanced endpoints
-
New
datefrom/datethroughperiod filters — every list endpoint that supports the document-date filters (year,yearmonth,date) now also accepts an arbitrary date range instead of only a whole year, month or single day. Both bounds are inclusive and expectYYYY-MM-DD; an unparseable date returns 400 rather than being silently ignored. -
GET /connector/{connector_id}/order/list/now supports the standard date filters — it previously accepted onlyid,minidandpage, and passingyear,date,modifiedafterorskipcancelledproduced a server error rather than a result. The full standard set now works:year,yearmonth,yearmonthday,date,datefrom,datethrough,modifiedafter,modifiedthrough,skipcancelled,id,minid,page. Date filters apply to the order date;modifiedafter/modifiedthroughapply to the last time the order changed in BOCP. -
Cancelled AWBs and cancelled sale receipts are now returned, flagged rather than
hidden — on both order lists,
awbs[]andsales[]each carry acancelledfield. Previously a cancelled AWB simply vanished from the response, so a system syncing the data had no way to tell "this shipment was cancelled" apart from "this order never had a shipment", and a stale AWB number could sit in your copy forever. Active AWBs are listed before cancelled ones. Checkcancelledbefore treating an AWB as the live shipment.
1.9.0 — 2026-08-27
Enhanced endpoints
-
Order payment method — the connector order payload accepts a top-level
payment_method(bank_transfer,card,paypal,credit): the method the customer selected, independent of whether any money has arrived. Previously the payment method could only be inferred from apaymentsentry, so an order that was not paid yet — a bank transfer awaiting payment, for instance — carried no payment method at all, and the automations keyed to it (notably auto-issuing a proforma invoice) never triggered. Send it on every order, paid or not:paymentscarries the money,payment_methodcarries the intent. Only when it is omitted and the order has no payment method yet does BOCP fall back to the firstpaymentsentry; a method already recorded on the order is never overwritten from payment data. -
Failed order imports now return a real error status — the connector order
endpoint returned HTTP 200 on a rejected import, with the errors buried in
messagesanddataempty. An integrator checking only the status code saw success. A refused import now returns 400, the payload sits indatawhere the success response already put it, andmessagesholds the list of errors. If you treat any 2xx as success, this changes what you see — but it now reflects what actually happened. -
shipping_methodis now actually applied — it was documented as required but never read, so every order defaulted to "ship by courier". An order the customer chose to collect in person therefore still had a courier AWB generated for it. Accepted values are nowcourier,locker,post,own_fleet,digitalandpersonal_pickup; an unrecognised value falls back tocourierand is reported back in the response notices. -
Short item field names accepted —
name,quantityandpriceare now accepted as aliases foritem_name,item_quantityanditem_price. The canonical name wins when both are present. Any alias actually used is reported back inimport_summary. -
Required fields are validated, with an explicit response — a create (POST)
must carry the full required set; an update (PUT) is validated only on the parts it actually
sends, so you can PUT just a status, just a client block, or just the items. When something is
missing the response now names the exact field(s) instead of importing a partial order
silently. Every response also carries an
import_summaryblock (items received vs. imported, payments registered vs. skipped, payment method applied, aliases used) to make debugging an integration a single request instead of a support round-trip. -
Any direct child can be updated on its own —
cod_amountwas previously only read when a non-emptypaymentsarray was sent in the same request, so a COD-only update was silently ignored; it is now handled independently.order_mentionsandorder_reference, previously write-once at create, can now be updated on PUT. -
Pending payments are no longer recorded as money — an entry with
"payment_status": "pending"previously created a transaction on the order even though it had not been collected. It now creates nothing and does not affectpaid_amount. It is still read as evidence of the chosen payment method when the order-levelpayment_methodis absent. Resend the order withconfirmedonce the money actually arrives. -
Payment field naming — entries in
paymentsare read frompayment_method, as documented. The endpoint previously read only the undocumented nametype, so a payment sent per the documentation was rejected as "Payment type is invalid" and silently dropped.typeremains accepted for integrators already sending it.
1.8.0 — 2026-08-17
New endpoints
-
Product push — BOCPRAPI connectors are now a regular push destination,
the same way BOCP already pushes to Shopify, GoMag and other platforms: the connector's
order-event notification URL also receives the CURRENT full state of a product (identity,
category, price, stock, description) whenever it's published, edited, or its stock/price
changes —
notification_typeofproduct_published,product_update, orproduct_unpublished. This replaces the need to pollGET .../products/on a schedule; the pull endpoint keeps working for initial sync or reconciliation. See the Sending Orders guide, section "Product push (catalog changes)".
1.6.0 — 2026-08-17
Enhanced endpoints
-
GET /product/list/ and GET /connector/{connector_id}/products/
(which reuses the same payload) — each product now also returns
stock_reserved(quantity reserved for other orders) andstock_available(stoc_global - stock_reserved, floored at 0), so callers can distinguish total stock from what is actually sellable.
1.5.0 — 2026-08-17
New endpoints
-
GET /connector/{connector_id}/config/ — read the connector's configuration:
which automations run on submitted orders (sale issue, invoicing, proforma, AWB), how products
sync in both directions (auto-import mode, update options, push feed URL), and the
event → status mapping. Option fields include the full list of possible values, and
per-connector settings that fall back to an account-wide default carry a
sourcekey.
Enhanced endpoints
-
PUT /connector/{connector_id}/order/{order_id}/ — a partial update sending only
order_unique_id+order_statusnow works as documented (previously returned HTTP 500), and an update withoutitemsno longer touches the existing order lines. The documentedorder_cancelledfield is now honoured on update. -
POST /connector/{connector_id}/order/{order_id}/ — a new order without the
clientblock is now rejected with a clear validation error.
1.4.0 — 2026-07-30
New endpoints
-
POST /attachments/upload/ — upload a file (multipart/form-data) and attach it to any BOCP document
by
doctype+doc_id. Files are stored on the account's external FTP storage; executable file types are rejected. - GET /attachments/{attachment_id}/ — read an attachment's metadata (filename, size, owning document, visibility).
-
DELETE /attachments/{attachment_id}/ — delete an attachment (file, metadata and download key).
Requires the
DELETEHTTP method to be allowed for your API user.
1.3.0 — 2026-07-19
New endpoints
-
GET /connector/{connector_id}/products/ — pull the product catalog published to a connector.
Returns the same payload shape as
/product/list/, restricted to products published to the connector from Product Catalogue. Supportspage,format,code,modifiedafter,include, andmagazia_idfilters.
Documentation
- The Sending Orders guide now includes a "Reading the product catalog" section covering the pull feed and incremental sync.
1.2.0 — 2026-07-14
New endpoints
- POST /connector/{connector_id}/order/{order_id}/ — submit a new order to BOCP via the eCommerce or DropShip connector. Supports products, discount lines, and service lines. Accepts client details, invoice & delivery addresses, and payments. BOCP sends webhook notifications back to your configured URL on status change, invoice issuance, and AWB issuance.
-
PUT /connector/{connector_id}/order/{order_id}/ — update an existing connector order.
Partial updates: only fields present in the body are changed;
itemsfully replaces existing lines when included.
Both endpoints are shared by two connector types — tag determines which applies:
- DropShip Orders — invoices issued to the preconfigured dropshipper contact, not the end client.
- eCommerce Orders — invoices issued directly to the client supplied in the order payload.
Removed
- Webshop Orders — removed from public docs. The
/webshoporder/route is internal-only and not available to third-party integrations.
1.1.0 — 2026-07-14
New endpoints
- GET /pricelists/list/ — enumerate pricelists defined in the account (name, item count, currency, flags). Use the returned
bocp_idas thepricelist_idfilter on/product/list/. - GET /contacts/list/ — paginated list of clients with optional includes:
pricelist,address,contacts,banks.
Enhanced endpoints
- GET /product/list/ — new
pricelist_idfilter. Requiresmagazia_id. Only returns products that have a rule in the given pricelist. Price fields are mapped based on workpoint type:- En-gros workpoint: pricelist price replaces
pret_vanzare/pret_vanzare_cu_tva; discounted fields arenull. - En-detail workpoint: retail price stays in
pret_vanzare; pricelist price appears inpret_vanzare_discounted/pret_vanzare_cu_tva_discounted.
- En-gros workpoint: pricelist price replaces
- GET /contacts/{contact_id}/ — new
include:pricelistaddspricelist_idandpricelist_nameto the response, with group-level fallback.
1.0.0-beta — initial release
Initial public beta covering: Sales, Invoices, Proformas, Fiscal Receipts, Payments, Offers, GRN, Stock Transfers, Consumptions, Inventory, Products, Product Web Categories, AWB, Courier Pickup Points, Workmanager, Contacts (view), Subscriptions, Workpoints, Postcodes, eCommerce / DropShip Order connector.