Changelog
v1.6.1 (Current)
Section titled “v1.6.1 (Current)”Released: August 2026
MCP tools
Section titled “MCP tools”- Permission-aware tool calls: MCP tool calls now respect user permission profiles. A call that touches data the calling user’s permission profile does not allow now returns a
code="permission"error with the message “Permission denied: your permission profile does not allow this action. Ask a workspace admin to update it.” instead of the previous behaviour. Rolling out gradually per workspace.
v1.6.0
Section titled “v1.6.0”Released: August 2026
MCP tools
Section titled “MCP tools”The MCP surface versions independently of the REST endpoints below; this change is listed here because it is customer-visible.
- Stricter tool input validation. Every MCP tool’s input schema now declares
"additionalProperties": falseat the top level, so calls that include unknown top-level fields are rejected instead of having those fields silently ignored. No parameter was added, removed or renamed. Clients that send only the documented parameters are unaffected.
New Features
Section titled “New Features”- Retail price on SKUs:
POST /api/v1/skusnow returnsretail_price, the current Shopify selling price in your store’s default currency. It is the same value already returned asretail_priceon purchase-order lines, so a SKU export and an order export now agree without a join. A number atSKUandSKU_LOCATION, and a{min, max}object atPRODUCTcovering the product’s SKUs — the same shapedays_on_handuses there.
- The field is omitted for a SKU Prediko holds no price for in your store’s default currency — raw materials, typically. Purchase-order lines differ here: they report
0in that case rather than dropping the field. retail_priceis the live catalogue price, not the price captured on any past date. That is true of the purchase-order line field too: a line’sretail_pricereflects today’s selling price for that SKU, not the price when the order was placed. Prediko does not currently expose historical price-at-date.- The field is additive — no existing field changed name, type or meaning. Clients that ignore unknown fields are unaffected.
v1.5.0
Section titled “v1.5.0”Released: August 2026
New Endpoints
Section titled “New Endpoints”GET /api/v1/bundles- List bundles and the SKUs each one is composed of
New Features
Section titled “New Features”- Bundles: Pull the bundles (kits) configured for your account, each with the list of child SKU names it’s made up of. Useful for reconciling sales/forecast data at the component level when a customer buys a bundle.
- ABC category on SKUs:
POST /api/v1/skusnow returnsabc_category, the ABC classification Prediko computes for each SKU from your ABC settings. Available at everyaggregation_level— a string atSKUandSKU_LOCATION(nullwhen the SKU is unclassified or ABC is not configured), and an array of the distinct categories across a product’s SKUs atPRODUCT. Category names come from your ABC settings, so treat the value as a string rather than a fixedA/B/Cenum. - Per-line cost on purchase orders:
POST /api/v1/orderslines now accept an optionalunit_cost, expressed in the supplier’s currency. Previously a cost sent in the payload was silently dropped, so there was no way to set a PO line’s cost through this endpoint.
MCP tools
Section titled “MCP tools”The MCP surface versions independently of the REST endpoints above; these changes are listed here because they are customer-visible.
- Reorder status is now writable.
update_sku_settingstakesre_order_status(boolean) in a SKU patch — the app’s Reorder Yes/No column. It was already readable as a metric and filter onsearch_inventory.status(active/discontinued) is the deprecated spelling of the same field and still works; passing both in one patch is rejected. - Reorder status at product granularity.
search_inventorywithgranularity: "product"now returnsre_order_statusas a{yes, no}count of the product’s SKUs instead of rejecting the metric. It stays a boolean atskuandsku_warehousegranularity. - Setting
re_order_status: trueon a bundle SKU is now rejected. Prediko always excludes bundles from re-order planning, so the call previously succeeded and changed nothing. Set it on the bundle’s component SKUs instead.
update_sku_settingssilently skipped bundle and archived SKUs: they resolved as valid but then matched nothing on the write, so a batch containing them reported every SKU as updated while only the others changed.- Cost fields sent on
POST /api/v1/orderslines (cost,unit_cost,unit_cost_supplier) were accepted with a200and then discarded, never reaching the purchase order. Sendunit_costto set a line’s cost; the other two names are still ignored.
abc_categoryandunit_costare both additive — no existing field changed name, type or meaning. Clients that ignore unknown fields are unaffected.- Cost resolution on PO lines is unchanged when
unit_costis omitted: Prediko still resolves the SKU’s supplier-specific cost for that line’s supplier, falling back to the SKU’s generic unit cost. Only sendunit_costto override what Prediko already holds. A negativeunit_costis rejected with422;0is kept as a real cost (free samples) rather than treated as unset.
v1.4.0
Section titled “v1.4.0”Released: July 2026
Changed
Section titled “Changed”POST /api/v1/transactionsnow takesstore_nameinstead ofstore_id. Store names are what you see in Prediko, so no internal identifier is needed. Matching ignores case and surrounding whitespace — URL-encode names containing spaces.
Deprecated
Section titled “Deprecated”store_idonPOST /api/v1/transactions. It is still accepted so existing integrations keep working, but it will be removed in a future version. Supply eitherstore_nameorstore_id, not both — sending both returns422.
- An unrecognised store is now rejected with
422, listing the store names available on your account. Previously an incorrectstore_idreturned200and the transactions were recorded against a store that did not exist, so they never appeared in Prediko. - Transaction dates:
timestampvalues on the 1st-12th of a month were being recorded in the wrong month — the day and month were transposed, so2026-12-03(3 December) was stored as 12 March. Dates from the 13th onward were unaffected. ISO 8601 timestamps are now recorded exactly as sent. - A
timestampthat is not a valid ISO 8601 datetime is now rejected with422rather than being interpreted as a best guess.
- This is a behaviour change for anyone currently sending an invalid
store_id: those requests returned200before and now return422. The data was not being recorded in either case.
v1.3.0
Section titled “v1.3.0”Released: July 2026
New Endpoints
Section titled “New Endpoints”PATCH /api/v1/skus- Update attributes on up to 200 SKUs per call
New Features
Section titled “New Features”- SKU updates: Set a SKU’s reorder status (
patch.re_order_status) —true(Yes) makes it replenishable and included in reorder recommendations,false(No) excludes it from replenishment. This is the writable counterpart of there_order_statusfield already returned byPOST /api/v1/skus. - Extensible patch body: the endpoint takes a
patchobject rather than a per-attribute URL, so further SKU attributes (lead time, MOQ, minimum/maximum days on hand) will be added as additionalpatchfields without a new endpoint or a breaking change.
- Bundle SKUs cannot be given a reorder status of
true— they are replenished through their components — and return422. - Setting
re_order_statustofalsealso dismisses stock-health alerts for those SKUs; re-enabling does not restore previously dismissed alerts. POST /api/v1/skusserves from a planning dashboard rebuilt by a queued refresh, so it can report the previous value for several minutes after a write. Treat the200fromPATCH /api/v1/skusas the confirmation.
v1.2.0
Section titled “v1.2.0”Released: March 2026
New Endpoints
Section titled “New Endpoints”GET /api/v1/orders/delivery- List deliveries (stock arrivals) across all orders with optional date filteringGET /api/v1/bill-of-materials- List BOM recipes for all finished goods (JSON or Excel format)GET /api/v1/orders/{id}/consumption- Get raw material consumption per production orderPUT /api/v1/orders/{id}/consumption- Update actual consumption quantities for yield/waste tracking
New Features
Section titled “New Features”- Bill of Materials: Pull BOM recipes showing which raw materials compose each finished good and in what quantities. Supports JSON (paginated) and Excel export formats
- Production Consumption: Query raw material quantities planned and consumed per production order, with automatic variance calculation for yield/waste tracking
- Variance Tracking: Computed
quantity_variancefield on consumption data (positive = loss, negative = better yield) - Deliveries: Each line now exposes
order_id,created_at, and a stable 10-charactershipment_id(hash oforder_id+ thecreated_atcalendar day). Lines from the same order recorded on the samecreated_atday share the sameshipment_id. Thecreated_after/created_beforefilters now accept ISO 8601 datetimes and apply on the newcreated_atfield.
New Fields
Section titled “New Fields”- SKUs: Added period sales metrics as default response fields across all aggregation levels (
SKU,SKU_LOCATION,PRODUCT). For eachweekly/monthly/quarterly/yearlywindow:*_quantity(units sold, historical),*_plan_quantity(forecast unit sales plan),*_sales(sales revenue, historical), and*_plan_sales(forecast sales revenue plan) — 16 columns in total. This lets API consumers pull historical units sold and the sales plan (e.g. past/next 3 months) programmatically.
v1.1.0
Section titled “v1.1.0”Released: March 2026
New Fields
Section titled “New Fields”- SKUs: Added
RE_ORDER_STATUS(re-order status),supplier_name,RECOMMENDED_UNITS_TO_ORDER, andlead_time_toas default response fields across all aggregation levels
New Features
Section titled “New Features”- SKUs: Added
PRODUCTaggregation level to retrieve inventory data aggregated by product
v1.0.0
Section titled “v1.0.0”Released: January 2025
Initial release of the Prediko Public API.
Endpoints
Section titled “Endpoints”GET /api/v1/orders- List ordersGET /api/v1/orders/{id}- Get order detailsPOST /api/v1/orders- Create or update ordersPATCH /api/v1/orders/status- Update order statusDELETE /api/v1/orders/{id}- Delete orderPOST /api/v1/skus- List SKUs (paginated)GET /api/v1/suppliers- List suppliersGET /api/v1/warehouses- List warehouses
Features
Section titled “Features”- Orders:
order_typesfilter includesFINISHED_GOOD,RAW_MATERIAL, andPRODUCTION_ORDERoptions - Orders:
aggregation_levelparameter supportsSKU(aggregated) andSKU_LOCATION(by warehouse) - SKUs:
aggregation_levelparameter supportsSKU(aggregated, default) andSKU_LOCATION(by warehouse) - Pagination: Only the SKUs endpoint is paginated (max 5000 results per page)