Looking up stock and receipts through the API
Summary
Two read-only look-ups: GET /api/wms/inventory returns the customer's stock in the warehouse, and GET /api/wms/receipts/{id} returns how a receipt is going. Neither changes anything at the warehouse. Both see only the key's customer.
Looking up stock
GET /api/wms/inventory?page=1&per_page=200 Authorization: Bearer 7|... X-Warehouse-Code: DAL-01 Accept: application/json
HTTP/1.1 200 OK
{
"data": [
{
"sku": "NT-1001",
"name": "Detergent 5 L",
"location": "A-01-02",
"lot": "L2609",
"expiration_date": "2027-03-31",
"on_hand": 58,
"available": 58,
"first_received_at": "2026-10-07T11:42:10-05:00"
},
{
"sku": "NT-2040",
"name": "Softener 1 L",
"location": "B-03-01",
"lot": null,
"expiration_date": null,
"on_hand": 40,
"available": 22,
"first_received_at": "2026-09-12T09:15:00-05:00"
}
],
"meta": { "page": 1, "per_page": 200, "total": 2, "last_page": 1 }
}
What each row carries
A row is a combination of product, location and lot. One SKU in three locations is three rows. Only rows with stock greater than zero come back.
| Field | What it is |
|---|---|
sku, name | The product. |
location | The location code. |
lot, expiration_date | The lot and its expiration, or empty if the product is not lot-tracked. |
on_hand | What is physically in that location. |
available | What can still be committed (see below). |
first_received_at | When that stock first came in: the basis for aging and storage. |
Pages
per_page: 1 to 200. If not sent, 100. Asking for more than 200 gives 200.page: starts at 1.meta.last_pagesays how many pages there are. You have to ask for all of them to get the full stock.- The order is fixed, so walking the pages in order neither repeats nor skips rows as long as nothing moves between one page and the next.
On hand vs. available
available is on_hand minus everything committed: reserved for shipments, on hold, damaged, quarantined, in transit or under inspection. In the example, 18 of the 40 pieces of NT-2040 are reserved for a shipment, so only 22 are available. See Looking up stock and Changing stock status.
available, not on_hand.Looking up a receipt
GET /api/wms/receipts/958 Authorization: Bearer 7|... Accept: application/json
HTTP/1.1 200 OK
{
"id": 958,
"receipt_number": "REC-NT-00058",
"status": "confirmed",
"external_ref": null,
"lines": [
{ "product_id": 3301, "expected_qty": 120, "received_qty": 118 },
{ "product_id": 3302, "expected_qty": 40, "received_qty": 40 }
]
}
The number in the path is the receipt.id returned when the notice was created, not the receipt number. If it does not exist or belongs to another customer, 404. As the example shows, the customer reference comes back empty on receipts created from a notice sent through the API: see Sending an advance ship notice through the API.
Receipt statuses
| Value | Meaning |
|---|---|
pending | Waiting for the goods. |
in_progress | Being unloaded or entered. |
captured | Entered, waiting for supervisor review. |
confirmed | Confirmed: the goods are now stock. |
cancelled | Cancelled. |
Until confirmed, received_qty can still change. See Entry and review.
Good practices
- To know when a receipt was confirmed, subscribe to the callback rather than polling every minute.
- For a daily stock snapshot, one full look-up a day is enough. The customer can also get the daily stock email: see Emails and reports to the customer.
Frequently asked questions
The API total does not match the screen
Check three things: that it is the same warehouse (the warehouse code on the request), that every page was read, and that you are comparing the same number (on hand vs. available). The stock screen can add up several customers or show stock in statuses the customer does not see.
Can I look up a single SKU?
Today there is no filter by SKU or by location. You ask for the pages and filter on the customer's side. With pages of 200, a customer with 2,000 stock rows is ten requests.
Need help?
If something did not work as expected, our support team can help you.
Was this article helpful?