Read endpoints

Every list endpoint shares the same envelope, cursor pagination, and updatedSince incremental-sync filter (see Overview):

List envelope
{
  "data": [ … ],
  "nextCursor": "01H…"   // null on the last page
}

Endpoints

EndpointScopeFilters
GET /api/v1/itemsitems.viewstatus, locationId, categoryId, tag, updatedSince
GET /api/v1/items/{id}items.viewinclude=codes,service (service also needs the service.view scope)
GET /api/v1/productsproducts.viewtrackingMode, categoryId, updatedSince
GET /api/v1/locationsitems.view or stock.view— (returns the full tree with materialized paths)
GET /api/v1/stock-levelsstock.viewproductId, locationId

Filters are exact matches, AND-combined. Location filters do not expand subtrees — fetch /api/v1/locations once and expand paths on your side. Economy fields (purchase price, book-value inputs) appear only for tokens holding economy.view.

Example — incremental item sync
curl "https://your-org.leidang.app/api/v1/items?updatedSince=2026-07-01T00:00:00Z&limit=200" \
  -H "Authorization: Bearer ldg_XXXXXXXXXXXXXXXX"