List, filter, sort and paginate all your brand products in a single call. Same filters and sorts as the My products page of the portal.
Retrieve your products' links in bulk. For every product whose communication pack is active, the response carries the product's QR-code and web links — so this is the endpoint to use to pull all your QR-code and web links at once.
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 }