Skip to main content
The pilot API is read-only and does not require credentials. Use the versioned /v1 base path.
These docs are hosted at https://api.nektir.com, but that domain does not yet proxy the API runtime. Local development uses http://127.0.0.1:5185/v1; replace it with the published API base URL when the backend is deployed.

Search for products

For typeahead, use the compact suggestion operation instead of requesting full product rows on every keystroke:
Add include=facets to a product query when a browse screen needs query-dependent brand, category, status, and price counts. See Search suggestions and facets.

Build brand filters

Use /v1/brands for a paginated directory and brand detail with reviewed aliases. /v1/meta retains the compact represented-brand facet for filter controls. Pass stable IDs with brand_ids; unresolved products return brand, brand_id, and brand_slug as null.
See Browse brands for directory, detail, product, and family flows. The optional dabs_new_item and dabs_on_spa filters accept only true or false. These are unverified source flags; do not label onSpa as a sale or promotion.

Build product-intelligence filters

Use data.product_intelligence.filters from /v1/meta for current values and human-readable labels. For example:
Empty or null product attributes mean Nektir could not establish the value from public source evidence. They do not mean the attribute is absent. See Product intelligence.

Display store details

Store list responses expose regular_hours_available without repeating a full weekly schedule on every row. Store detail embeds regular_hours when the directory schedule normalized safely, plus neutral tel: and geo: links. Treat the schedule as regular weekly hours: exceptions_known is false, so holidays and temporary closures may differ.

Compare a shopping list

Submit up to 25 exact Utah DABS SKUs once to compare single-store, closest-store, and bounded multi-store plans. Use product_ids instead when your application already stores Nektir’s stable identifiers; the two parameters cannot be combined.
The endpoint reads stored observations and does not trigger a DABS request. See Compare multi-product availability for strategy ordering, purchase eligibility, and incomplete-coverage handling.

Resolve exact products and stores

The same collection operation handles one or many identifiers. Use product detail URLs when you need raw source fields and retained history. See Exact lookups and inventory matrices for bounded product-by-store observations without N+1 requests.

Browse products observed as new or changed

These timestamps describe Nektir’s published observations. They are not Utah DABS release times or upstream update times. An empty first-observed result can simply mean history tracking began after the current products were already known.

Read observed changes

Use the same feed for statewide changes or one product’s retained history:
Inventory events are differences between retrieved public observations. A decrease is not an inferred sale, and a first store observation is not a restock. See Observed changes and history for event semantics and stable pagination. SKUs are exactly six characters. Preserve leading zeroes and never coerce them to numbers.

Before showing availability

  1. Read meta.coverage.status and the code-only meta.warnings when using inventory scope.
  2. Display each product’s inventory_retrieved_at. It is the last successful Nektir retrieval in the requested store/radius scope—or across its published store observations for an unscoped search—and is null when unchecked.
  3. Keep source_updated_at unknown when the source did not provide it.
  4. Treat reported quantity separately from purchase_eligibility.
  5. Do not interpret an empty result as no stock when coverage is partial or absent.
Default metadata is intentionally compact. Add include=coverage_details only for diagnostic pair-state counts. Read the immutable revision from X-Publication-Revision; cursor expiry appears only while meta.page.next_cursor is non-null.