products

A page of the product catalogue, one row per product

A page of products with the catalogue fields an integrator syncs on: title, vendor, category, department, num_variants, status, GTIN, description, currency, HS code, country of origin, unit of measure, sales_channels, and last_updated_at and last_updated_by.

Figures that differ variant by variant are {min, max} pairs, not single numbers: unit_cost, sell_price, weight, length, width and height. variant_options is the option map {name: [values]} and gallery_images the image list.

Paging is offset and limit, limit at most 10,000 and 8 by default. Four counts come back with the rows: products_count and size for this page, filtered_max_size for the filtered set and max_size for the catalogue. Page on filtered_max_size, never on max_size, or a filtered walk never ends.

Narrow with filter_args: product_id, vendor, category, department, product_status, sales_channel_id, country_of_origin and collection_id take eq and in; unit_cost and sell_price take gte and lte. search matches title, SKU and vendor. Sort with sort_args: comma-separated columns, - for descending, bare or + for ascending.

export=true answers a download URL in data.url instead of rows.

Planning attributes ride along where the PIM holds them: replenishment_mode is the declared lifecycle and is_seasonal the detected one, size_curve is the effective curve, and planning_gaps is what planning is missing, each {field, label, reason, severity}.

Scope: products:read.

get/api/v1/products/table

Request

  • Base URL: https://api.app.tightly.io
  • URL: https://api.app.tightly.io/api/v1/products/table
  • Auth: HTTP bearer

Query parameters

offsetinteger

Rows to skip before this page.

limitinteger
Example:50

Rows in this page.

searchstring
Example:overshirt

Free text over product title, SKU and vendor.

filter_argsstring
Example:[{"key":"category","operation":"in","value":["Outerwear"]},{"key":"product_status","operation":"eq","value":"ACTIVE"}]

A JSON array of {key, operation, value}. product_id, vendor, category, department, product_status, sales_channel_id, country_of_origin and collection_id take eq and in; unit_cost and sell_price take gte and lte. product_status is one of ACTIVE, ARCHIVED, DRAFT, UNLISTED. collection_id is a collection as the store syncs it, not a curated collection, so a curated collection's id matches nothing here. A product can sit in several, so in answers every product in any of the ids given.

sort_argsstring
Example:-last_updated_at,vendor

Comma-separated sort columns, - for descending and + or nothing for ascending. Sortable: product_id, product_title, vendor, category, department, product_status, num_variants, unit_cost, sell_price, last_updated_at, last_updated_by, weight, length, width, height, description, gtin, currency, uom, weight_unit, hs_code, country_of_origin, sales_channels.

exportboolean

Answer a download URL for the filtered set instead of a page of rows.

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

A page of products, with the page's counts and the filtered set's size. department is the source NetSuite item Department label, independent of Brand/Category mapping and distinct from native purchasing subsidiary and the merchandise hierarchy Department. It is read-only; null means no source label. Filter with eq or in using exact labels. A product matches any SKU Department while retaining all its SKU aggregates.

messageobject

severity, service and desc.

Changes

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