Biklo for developersTESTsandbox-api.biklo.comchange

12 September 2026 breakingorderscompanyproducts

Delivery absorption is now set per parcel size, orders carry a packing plan, and you can finally see the commission before you list.

Breaking#

PUT /v1/company/shipping-absorption requires parcel_tier#

Absorption used to be one promise per destination. It is now one per destination and parcel size, because the two are not remotely the same purchase: on RO→HU the courier charges about 26 RON for a small parcel and 539 for a large one.

{
  "country_code": "RO",
  "parcel_tier": "large",
  "currency": "RON",
  "bands": [
    { "min_amount": 0, "max_amount": 150000, "absorbs": false },
    { "min_amount": 150000, "max_amount": null, "absorbs": true }
  ]
}

Omitting it returns 400 parcel_tier_required. We made it required rather than defaulting to small on purpose — a default would have let you set bike thresholds while silently rewriting your accessory bands.

GET /v1/company/shipping-absorption returns one set per tier, and now uses min_amount / max_amount (it previously returned min_amount_cents / max_amount_cents, which you could not round-trip into the write).

New#

GET /v1/products/{id}/pricing#

What a buyer is charged, and what it costs you — from the same service that renders the product page, so you and your buyer never see different numbers.

Commission on every category#

GET /v1/categories now carries commission per category, inherited down the tree. Set margins before listing instead of inferring the fee from a completed order. max_amount: null means uncapped.

Packing: parcels on accept#

POST /v1/orders/{id}/accept takes an optional parcels array — which order lines go in which box. The courier prices per parcel, so three products declared as one box is one charge rather than three. Send nothing and one box per line is assumed, exactly as before.

Packing is merge-only: an order cannot ship in more boxes than it has lines.

Smaller additions#