First API Request
This walks through the response from Quickstart field by field. The exact, generated schema is always the API Reference - this page is a guided introduction to reading it.
The envelope
Section titled “The envelope”{ "rows": [ /* ... */ ], "page": 1, "pageSize": 5, "total": 479, "totalPages": 96}List endpoints that support pagination (products, inventory stock) always return this shape:
rows (the actual data for this page), page and pageSize (what you asked for, or the
defaults), and total/totalPages, which are independent of pagination - total is always
the count of everything matching your filters, not just what’s on this page. Endpoints that don’t
paginate (categories, promotions) return a plain array instead - see each route’s entry in the
API Reference for which shape it uses.
A product row
Section titled “A product row”{ "id": "clx1product000001", "storeId": "clx1store0000001", "categoryId": "clx1category000001", "name": "Alpha Bread 800g", "sku": "SKU-ALPHA-BREAD", "barcode": "5000000000001", "brand": "Priory", "size": "800g", "unitType": "item", "sellingPriceGross": "1.25", "sellingPriceNet": "1.04", "taxCategory": "STANDARD", "vatRate": { "id": "clx1vatrate000001", "code": "STD", "name": "Standard Rate", "percentage": "20.00" }, "isActive": true, "variablePrice": false, "ageRestricted": false, "alcoholRestricted": false, "tobaccoRestricted": false, "vapeRestricted": false, "updatedAt": "2026-08-27T17:51:41.976Z"}A few things worth knowing before you write code against this:
- Money is always a string.
sellingPriceGross/sellingPriceNetare"1.25", not1.25. This preserves exact decimal precision - don’tparseFloat()unless you specifically need a float for display; prefer a decimal-safe parser for anything involving totals. categoryId/barcode/brand/size/vatRatecan benull. Not every product has a category, barcode, brand, size, or an assigned VAT rate.updatedAtis ISO 8601 UTC. Use it withupdatedSince(see Catalog Sync) to fetch only what’s changed.- Restriction flags are booleans, not a single “restricted” flag. A product can be
ageRestrictedandalcoholRestrictedat once, or neither. - What you don’t see is deliberate. No cost price, no margin, no supplier information, no stock movement history. This API returns what’s safe to expose to an external integration, not a mirror of the internal database - see each resource’s page under API for what’s excluded and why.
Next: filter and paginate
Section titled “Next: filter and paginate”curl "https://dev-api.theprioryshop.co.uk/v1/catalog/products?storeId=clx1store0000001&categoryId=clx1category000001&page=2&pageSize=20" \ -H "Authorization: Bearer epos_dev_sk_example_not_real"See Products for the full filter list, or the Examples
section for more request patterns (search, updatedSince sync, error handling, pagination loops).