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.
Request
- Base URL: https://api.app.tightly.io
- URL: https://api.app.tightly.io/api/v1/products/table
- Auth: HTTP bearer
Query parameters
Rows to skip before this page.
Rows in this page.
Free text over product title, SKU and vendor.
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.
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.
Answer a download URL for the filtered set instead of a page of rows.
Headers
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.
Changes
No recorded changes to this operation across all 1 revision of this API.