Returns, in one paginated call, all your brand products — selected with the same filters and sorts as the My Products page of the Fairly Made portal — and, for the products whose communication pack is active, the product's QR-code and web links.
All results are scoped to the brand the token belongs to; there is no way to read another brand's data, and a product that is not yours is simply absent from the result set (no 403).
This is the endpoint to retrieve your products' QR-code and web links in bulk — one call returns the links for every product whose communication pack is active. See the Links section below for the exact behavior.
Freshness — a product appears in this list up to 20 minutes after it is created or updated. This list is served from an analytics store refreshed every 20 minutes. So a product just created with
POST /brand-products(or changed withPATCH) appears on this list only at the next refresh — treat the 20 minutes as an upper bound. ThePOST/PATCHresponses return the affected product immediately, so do not poll this list for a just-written product; for a full catalogue sync, schedule it (hourly, nightly) rather than triggering it right after a write.
Because the list and the My Products page read the same store, a given filter returns the same products and the same total in both.
This endpoint accepts the same filters and sorts as List declared French environmental cost (GET /declared-french-environmental-cost) — same field list, encoding→filter mapping and operator/validation rules. See that endpoint for the exhaustive reference.
All filters are optional query parameters; combination rule is OR within a field, AND across fields. An unknown parameter returns 400 (strict schema).
| Shape | Syntax | Example |
|---|---|---|
| Free-text | search= — case-insensitive over name, id, ref and collection | search=shirt |
| List of values | repeat the key, or a single value | productCategories=SHIRT&productCategories=DRESS |
| Numeric | field[op]=value (op ∈ eq, neq, gt, gte, lt, lte), or field[min]= / field[max]= | weight[gte]=100 |
| Date | field[start]= and/or field[end]= (range, open bounds allowed) | traceabilityStartDate[start]=2026-01-01 |
| Boolean | true / false | isProductInAGECScope=true |
The most useful filters for this route:
brandProductId— repeatable (UUID).brandProductUniqueIdentifier,productRef,productName,collections,productCategories,colorCode,gtins.marketSegment— read at the product level on this route.traceabilityStartDateandtheoreticalTraceabilityEndDate— the supplier-collection business dates (launch date and deadline). When no deadline was set, the end defaults to launch + 70 days.supplierIds— one supplier per request (UUID); returns the products associated with that supplier.
Sorting — sortBy=<field> (default createdAt) with orderBy=asc|desc (default asc); the sortable keys are those of the declared-FEC endpoint. Filtering and sorting are allowed on fields the response does not return. Pagination is stable: the sort always adds id as a tie-breaker, so consecutive pages do not overlap. Text sorts ignore case, and values starting with a digit come after the others; null values always sort last, in both directions.
URL-length caveat: large repeated id lists (brandProductId, gtins) can hit the ~8 KB URL limit — filter more narrowly, or page.
For a product whose communication pack is active (hasCommunicationPackage: true), links.qrCode and links.web carry the product's stable, printable hub URLs (null for whichever link the product does not have yet). For a product without the pack (hasCommunicationPackage: false), links are withheld as links: { qrCode: null, web: null }. So within one page, some products carry links and others do not — the hasCommunicationPackage flag tells you which case you are in. A product keeps its links even if the brand later stops the pack on other products; the decision is per product. Activating the pack becomes visible here at the next refresh (up to 20 minutes).
The same links rule applies everywhere on the resource — this list and the create (POST) / update (PATCH) responses all withhold links for a product without the communication pack.
Links are environment-specific: the URL points at the environment serving the request (production, sandbox), not always the production domain.
gtins is returned as a list of plain strings. links is always present (see above). producedQuantity is the amount only, without a unit.
- Mock serverhttps://doc.api.fairlymade.com/_mock/swagger-fairlymadeapi-v3/brand-products
- Productionhttps://api.fairlymade.com/v3/brand-products
- Sandboxhttps://api.sandbox.fairlymade.com/v3/brand-products
curl -i -X GET \
'https://doc.api.fairlymade.com/_mock/swagger-fairlymadeapi-v3/brand-products?offset=0&limit=20&search=string&sortBy=createdAt&orderBy=asc&brandProductId=497f6eca-6276-4993-bfeb-53cbbbba6f08&brandProductUniqueIdentifier=string'Paginated list of your brand products. A valid request with no match returns 200 with data: [] and total: 0. There is no 404 or 403 — a product that does not exist or does not belong to your brand is simply absent from the result set.
{ "data": [ { … }, { … } ], "offset": 0, "limit": 20, "total": 1451 }