Changelog
Every change to the public API, newest first. Changes within v1 only add; a removal or incompatible change is announced here at least 12 months ahead. See Versioning & deprecation.
21 October 2026: a packed order can go back to packing
- When a packer corrects a packing mistake, a
packedorder goes back topacking, to be packed again.GET /api/v1/orders/changesreports it as anorder.status_changedtopacking. Nothing else changes:packingwas already one of the statuses. See What happens next in the warehouse.
18 October 2026: when the customer ordered
POST /api/v1/orderstakes an optionalordered_at: when the customer placed the order, as an ISO 8601 date-time with its offset, or a bare date (YYYY-MM-DD) when you only know the day. Picked keeps it, shows it on the order page and dates the packing slip by it. Without it nothing changes: the order imports as before.
18 October 2026: an order can go back to pending
- An order whose pick run stops before the end goes back from
pickingtopending, to be planned again.GET /api/v1/orders/changesreports it as anorder.status_changedtopending, and the order keeps itspicked_quantity. Nothing else changes:pendingwas already one of the statuses. See What happens next in the warehouse.
18 October 2026: the reference documents every error
- Every
4xxand5xxin the API reference now names the error envelope you already receive:messageand a stablecode, plus the fielderrorson a422. Nothing on the wire changed; a client generated from the specification can now readcode. - The specification lists its tags and a support contact, and describes every operation.
18 October 2026: links on every answer
- Every v1 resource and page carries HAL-style
_links, a field only added. A resource with aGETof its own links itself: a receipt, a process run, a stock level, the node catalogue. A page links itself and the pages either side (_links.next,_links.prev) with your filters kept:GET /api/v1/locations,GET /api/v1/stock/changes, andGET /api/v1/stockwithchanged_since.GET /api/v1/stock/changes/feedlinks its next read whilehasMore.GET /api/v1/warehousesand askusread ofGET /api/v1/stocklink themselves. POST /api/v1/receiptsandPOST /api/v1/processes/{process}/runsanswer a new receipt or run with aLocationheader where to read it back. A dry run, and an answer that returns one made before, carry none.
17 October 2026: follow order changes
GET /api/v1/orders/changes?after={cursor}reads every change to your orders after a cursor, oldest first: an order taking a status (order.status_changed), and a shipment created, moved to another carrier, labelled, handed to the carrier, delivered, failed or returned (shipment.created,shipment.carrier_changed,shipment.label_created,shipment.dispatched,shipment.delivered,shipment.failed,shipment.returned). Each embeds the order as it is now, and the page links_links.nextwhile more are waiting. It needsorders:read. See Follow order changes.
17 October 2026: read an order back
GET /api/v1/orders/{id}reads an order back: its status; per linepicked_quantity,shipped_quantityandclosed_short_quantity(the first two null, meaning not counted, while the warehouse counts nothing for the order); and its shipments with carrier, tracking number, the carrier's tracking link, and eachparcelsentry when it went out as several. It needs the neworders:readability. The customer's name and address are never part of it. See Follow the order to shipped.POST /api/v1/ordersanswers a new order with aLocationheader and_links.order, where to read it back. Answers start carrying HAL-style_links: a field only added, so nothing you read today moves.
15 October 2026: use an answer in later steps
- A step that waits for a signal or a callback can take fields of its
payloadordatainto outputs that later steps show and use.POST /api/v1/process-runs/callbacks/{token}answers422whendatalacks such a field or has one of another type, and the work keeps waiting. A signal sent toPOST /api/v1/process-events/{eventKey}that lacks one doesn't wake that step. See Use the answer in later steps. - A signal that arrives after a step's Give up after has passed wakes nothing: the step takes
timed_out, whenever Picked gets round to it. Before, a signal in the minute after the timeout could still win.
15 October 2026: an answer from your system
POST /api/v1/process-runs/callbacks/{token}answers an external action step: the step calls your endpoint with a single-usecallback_url, and calling it back wakes that one piece of work with youroutcomeanddata. It needs no API token. See Let your system decide a step.
15 October 2026: a correction to how order lines find their product
POST /api/v1/ordersmatches a line'sproduct_external_refonly against products you manage in Picked. A product a connected ERP or shop imported carries that system's id as its reference, and an order line could name the wrong product by sharing it. Such a product is now matched by the line's SKU or barcode, and a line that matches nothing gets a placeholder, listed inprovisioned_products. Such a placeholder'sexternal_refis empty when the line's ref was its SKU or another product's reference: match it to your line bysku. This takes effect at once, an exception to the 12 months' notice above: the old match could ship the wrong product, and no integration relied on it yet. See Push orders.
14 October 2026: start a process run
POST /api/v1/processes/{process}/runsstarts a run of a process, named by its public id, with its startingvariables: it lands in the claim pool on the floor, as a scheduled run does.GET /api/v1/process-runs/{id}reads it back. Both need the newprocess-runs:writeability. See Start a process run from an outside system.- The
Idempotency-Keyheader: onPOST /processes/{process}/runs, a retry with the same key within 24 hours returns the first response and opens nothing. See Idempotency. Picked-Dry-Run: trueworks on starting a run too.
13 October 2026: warehouse and location ids, and English answers
GET /api/v1/warehouseslists your warehouses with thewarehouse_idthat orders and receipts take, andGET /api/v1/locationsyour locations with thelocation_idthat stock changes filter by. Any API token may call both, whatever its abilities. See Getting started.- Every
/api/v1answer is in English, errormessageand validationerrorsincluded, whatever language the server runs in.
13 October 2026: stock levels changed since a moment
GET /api/v1/stocktakeschanged_since: the levels of every product whose stock, order commitments or locations changed since then, a page at a time. Order commitments never showed in/stock/changes, so this is how a webshop learns that an order took stock. The answer has the shape of askusread, withpaginationadded. See Keep your webshop's stock in sync.
13 October 2026: a cursor on stock changes
GET /api/v1/stock/changes/feed?after=<cursor>: the stock changes after a cursor, oldest first, with thenextCursorto send next andhasMore. A change that lands while you read is neither skipped nor read twice.GET /api/v1/stock/changesstill answers pages, unchanged. See Paging through stock changes.
13 October 2026: the v1 baseline
This entry records the v1 API as it stands when these guides were published. Every later change is listed above it.
Endpoints
| Endpoint | What it does | Ability |
|---|---|---|
POST /api/v1/orders |
Import a fulfilment order. | orders:write |
GET /api/v1/stock |
Read the stock of one SKU, or up to 100 at once. | stock:read |
GET /api/v1/stock/changes |
Page through the history of stock changes. | stock:read |
POST /api/v1/receipts |
Announce an expected delivery. | receipts:write |
GET /api/v1/receipts/{id} |
Read a receipt's progress back. | receipts:write |
POST /api/v1/process-events/{eventKey} |
Send a signal that wakes the processes waiting for it. | process-events:write |
GET /api/v1/node-catalog |
List every process-node type with its configuration schema. | any valid token |
Behaviour
- One error body for every failure, with a stable
code. - Rate limits of 200 requests per minute for the stock endpoints and 60 for the rest, per workspace, with
X-RateLimit-LimitandX-RateLimit-Remainingon every response to an authenticated call. - Idempotent order imports by
external_id, and delivery announcements byreference. - Dry runs with the
Picked-Dry-Runheader onPOST /api/v1/ordersandPOST /api/v1/receipts.