product

One product with its stock and the ranges its variants span

One product as the catalogue holds it: title, description, vendor, images, category, subcategory and family, status and published date, country of origin, HS code, unit of measure, and the sales channels it is sold through.

Figures that differ variant by variant are served as {min, max} pairs rather than a single number: unit_cost, sell_price, lead_time, min_order_quantity, weight, length, width and height all take that shape. in_stock, incoming_stock and inventory_value are totals across the product's variants, and variant_count and num_variants both carry the count.

location_id narrows the stock figures to one warehouse. Without it they are the total across every warehouse.

pim_owned_fields names the columns the PIM has taken over, which the connector defers to on sync; it is [] for an organisation that has not opted in. planning_gaps is what planning is missing on this product, each entry {field, label, reason, severity} with severity of missing or review, and size_curve is the effective curve (a declaration beats a measurement beats the labelled default) while size_curve_declared is the raw declaration. Where the effective curve is the labelled default because the engine refused to measure one, size_curve.fallback_reason_code and size_curve.fallback_reason say which refusal and in what words, and price_band_reason says the same for the price band.

A product id that does not exist in this organisation is refused 404.

Scope: products:read.

get/api/v1/product/{product_id}

Request

  • Base URL: https://api.app.tightly.io
  • URL: https://api.app.tightly.io/api/v1/product/{product_id}
  • Auth: HTTP bearer

Path parameters

product_idstring required
Example:7412095483953

The product this reads.

Query parameters

location_idstring
Example:61240442

Narrow in_stock, incoming_stock and inventory_value to one warehouse.

Headers

Tightly-Versionstring
Example:2026-11

The date train to answer on. One train exists today, 2026-11, the one this reference describes and the one every key is minted on, so the call answers on it with or without this header. Send it anyway, so a client built now names its train from the start.

Response

The product, its ranges across variants, and its planning attributes. department contains distinct source NetSuite Department names across variants. It is read-only, independent of Brand and Category, and does not establish purchasing subsidiary, supplier eligibility or channel assignment.

size_curve.fallback_reason_code is one of no_stock_history, a_run_size_never_observed, a_sold_size_outside_the_run, run_broken_every_day, too_few_clean_days, too_few_clean_units or one_size_sold, and size_curve.fallback_reason is that code in words, safe to render as it stands. price_band_reason carries a reason of no_category, no_price, category_too_thin or no_spread, with the counts behind it. Both are null where nothing was refused.

messageobject

severity, service and desc.

Changes

No recorded changes to this operation across all 1 revision of this API.