Resolve products
Supply either Utah DABS SKUs or Nektir product IDs. Each selector accepts up to 25 unique values, and identifiers remain strings so leading zeroes survive.skus, product_ids, or the legacy singular sku parameter. Exact lookup remains a normal product collection: results use deterministic sorting and cursor pagination, not request order. The detail URLs remain available when an application needs raw source fields, aggregate quantities, family members, or retained history.
Exact SKU lookup also recognizes unambiguous historical mappings. The returned product always carries its current SKU in source_ids.utah_dabs_sku; identifier_matches records the requested value and whether it was current, an active_alias, or historical. Conflicted or ambiguous mappings do not resolve.
Resolve stores
Store collections likewise accept one or many stable Nektir IDs or four-digit DABS inventory codes:id or source_ids values when every identifier must resolve. The inventory matrix and availability comparison instead fail with 404 if any requested exact resource is unpublished, preventing silent partial calculations.
Retrieve a dense inventory matrix
GET /v1/inventory accepts one to 25 products and one to 25 stores. It returns at most 625 product-store observations in a single response.
store_limit is capped at 25, so the matrix remains bounded:
meta.coverage.scope records the origin, radius, and cap. Zero nearby stores returns an empty matrix with coverage status none; it does not mean the products have no stock elsewhere.
Products and stores are returned once in data.products and data.stores. Each item in data.observations references product_id and store_id, avoiding repeated resource metadata. Product and store input order is preserved; observations are product-major and store-minor.
The matrix is deliberately dense. Every requested pair has a row:
reported_positiveis a DABS-reported positive quantity, not a purchase guarantee.reported_zerois an explicit reported zero.row_absentmeans a validated product detail omitted that store row; it is not rewritten as zero.uncheckedmeans no observation qualified for the requested retrieval-age policy.
unchecked row has quantity_reported: null, null observation times, and meets_retrieval_policy: false. Never translate it to zero or unavailable.
inventory_age=within_policy for customer-facing freshness. any_age is useful for investigation or an explicitly labeled fallback, but it does not establish current upstream stock.
Choose matrix or comparison
Use the matrix when the application needs raw observations for a known product and store set. Use/v1/availability/comparison when it needs Nektir to search stores near coordinates and rank single-store or fewest-stop plans. Both read one stored publication and never trigger an upstream refresh.