Get All Products
GET https://api.firmly.work/api/v1/domains-products/{merchant-domain}
Retrieves a paginated list of all products from a merchant’s store. This endpoint returns product summaries with links to retrieve full details for each product.
Authentication
x-firmly-authorization(string, required) — Device access token from Browser Session
Path Parameters
merchant-domain(string, required) — The domain of the merchant website (e.g.,staging.luma.gift)
Query Parameters
-
page(number, default1) — Page number for pagination -
size(number, default2000) — Number of products per page. Valid values:100,500,1000,2000 -
countryCode(string, defaultus) — Country code for regional product availability. Case-insensitive —usandUSare treated the same; the value is normalized and echoed back inmetadata.countryCode(e.g.US).
Response
Returns an object with metadata describing the page and a products array.
-
metadata(object) — Page and source metadata.Metadata
page(integer) — Current page number (1-indexed)size(integer) — Requested page size — echoes thesizequery parameter (one of100,500,1000,2000), not the count of products returned. On the final page theproductsarray may be shorter thansize.totalRecords(integer) — Total products in the merchant catalogtotalPages(integer) — Total pages available at the currentsizedomain(string) — Merchant domain this catalog belongs tocountryCode(string) — ISO country code applied to this querystartIndex(integer) — Zero-indexed position of the first product on this pageendIndex(integer) — Zero-indexed position of the last product on this pagegeneratedAt(string) — ISO 8601 timestamp when the catalog snapshot was generatedlastPullAt(string) — ISO 8601 timestamp of the last upstream sync from the merchantversion(string) — Snapshot version identifiersource(string) — Source pipeline that generated the catalog (typicallyget-all-products-workflow)
-
products(array) — Array of product summaries.Product Summary
handle(string) — Product handle/identifiertitle(string) — Product titlepdp_url(string) — Full URL to the product detail page on the merchant’s siteloc(string) — Full URL to retrieve detailed product information via the Get Product from URL endpointimage(object) — Primary product image —{ "url": "..." }
Request Example
curl --request GET \--url 'https://api.firmly.work/api/v1/domains-products/staging.luma.gift?page=1&size=100' \--header 'x-firmly-authorization: YOUR_AUTH_TOKEN'
Response Example
{"metadata": {"page": 1,"size": 100,"totalRecords": 132,"totalPages": 2,"domain": "staging.luma.gift","countryCode": "US","startIndex": 0,"endIndex": 99,"generatedAt": "2026-02-16T10:46:30.569Z","lastPullAt": "2026-02-16T10:46:30.569Z","version": "20260216T104629Z","source": "generate-all-products"},"products": [{"handle": "radiant-tee","title": "Radiant Tee","pdp_url": "https://staging.luma.gift/radiant-tee.html","loc": "https://api.firmly.work/api/v1/domains-pdp?url=https%3A%2F%2Fstaging.luma.gift%2Fradiant-tee.html","image": {"url": "https://cdn.staging.luma.gift/products/radiant-tee-main.jpg"}},{"handle": "hero-hoodie","title": "Hero Hoodie","pdp_url": "https://staging.luma.gift/hero-hoodie.html","loc": "https://api.firmly.work/api/v1/domains-pdp?url=https%3A%2F%2Fstaging.luma.gift%2Fhero-hoodie.html","image": {"url": "https://cdn.staging.luma.gift/products/hero-hoodie-main.jpg"}}]}
Error Responses
Errors return a JSON body with code, error, and description. Program against the error value — descriptions are human-readable and may change.
400 — Invalid size
size is not one of 100, 500, 1000, 2000.
{ "error": "Size is not valid: valid values are 100, 500, 1000, 2000" }
400 — MissingAuthHeader
The x-firmly-authorization header is missing or empty (when authenticating as a device).
{ "code": 400, "error": "MissingAuthHeader", "description": "x-firmly-authorization header is missing or invalid." }
400 — InvalidToken
The authorization token is not a valid JWT structure.
{ "code": 400, "error": "InvalidToken", "description": "Jwt token is invalid." }
401 — InvalidJWTToken
The device JWT signature does not verify, or required claims are missing.
{ "code": 401, "error": "InvalidJWTToken", "description": "Jwt token is invalid." }
404 — PartnerNotFound
The appid claim on the device JWT does not map to a known partner / tenant.
{ "code": 404, "error": "PartnerNotFound", "description": "Partner not found." }
404 — DomainNotFound
The {merchant-domain} does not match any merchant configured with Firmly, or the merchant has been disabled.
{ "code": 404, "error": "DomainNotFound", "description": "This domain was not found in firmly servers." }
404 — AllProductsNotFound
No catalog snapshot is available for this merchant — the merchant has no published all-products feed.
{ "code": 404, "error": "AllProductsNotFound", "description": "All products not found." }
412 — OperationNotSupported
The merchant’s adapter does not support listing the full catalog.
{ "code": 412, "error": "OperationNotSupported", "description": "This operation is not supported for this store." }