Product Status Feed API
v1A cursor-paginated feed of per-product status changes at each pickup and delivery — the product-level companion to the order status feed.
The order status feed tells you when an order changes status. This feed goes one level deeper: it streams status changes per product per stop — which items were actually picked up or delivered, and which were removed or not ready. Use it when your system needs line-item reconciliation (partial deliveries, missing colli) rather than just order-level progress.
Interactive API Explorer
Loading API Documentation...
Authentication
Authorization: apikey YOUR_API_KEY_HEREBase URLs
- Production:
https://app.zenderatms.com/api/ - Staging:
https://staging.zenderatms.com/api/
Reading the feed
GET /v1/order-products/status-feed?since=1718100000000
Query params:
since— unix timestamp in milliseconds; entries from this point forward are returned. Use it for the first call.pagination_token— opaque cursor from the previous response’snextPage. Use it for every subsequent call.
Response:
{
"changes": [
{
"timestamp": "1718100456000",
"orderProductId": "501",
"orderProductInternalNumber": "PROD-PALLET-EUR",
"orderLocationId": "901",
"orderLocationInternalNumber": "LOC-warehouse-1",
"locationType": "DELIVERY",
"productStatusAtLocation": "COMPLETED"
}
],
"nextPage": {
"hasNextPage": false,
"since": "1718100456000",
"paginationToken": "..."
}
}Each entry says: at timestamp, this product (orderProductId / your orderProductInternalNumber) at this stop (orderLocationId, locationType of PICKUP or DELIVERY) changed to productStatusAtLocation.
Product statuses
PENDING— not yet handled at this stopCOMPLETED— picked up / delivered at this stopREMOVED— removed from the orderNOT_READY— flagged not ready for handling
The sync loop
- First call:
?since=<your-last-sync-unix-millis>. - Process
changes, persistnextPage.paginationToken. - While
nextPage.hasNextPageis true, call again with?pagination_token=<token>immediately. - On your next sync run, resume from the stored token.
Common gotchas
- 64-bit numbers arrive as strings.
timestamp,orderProductId, andorderLocationIdare int64 values serialized as JSON strings — parse accordingly. sinceis milliseconds, not seconds and not an ISO date.- Resume from the token, not from
since. Re-derivingsincefrom wall-clock time can skip or duplicate entries; the token is the reliable cursor. - This is product-level, not order-level. For order status changes, use the order status feed.
Related documentation
- Order Summary — order-level status feed and summaries
- Product Upsert — add or update products on an order