Skip to content

List brand products

Request

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 with PATCH) appears on this list only at the next refresh — treat the 20 minutes as an upper bound. The POST / PATCH responses 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.

Filtering and sorting

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).

ShapeSyntaxExample
Free-textsearch= — case-insensitive over name, id, ref and collectionsearch=shirt
List of valuesrepeat the key, or a single valueproductCategories=SHIRT&productCategories=DRESS
Numericfield[op]=value (op ∈ eq, neq, gt, gte, lt, lte), or field[min]= / field[max]=weight[gte]=100
Datefield[start]= and/or field[end]= (range, open bounds allowed)traceabilityStartDate[start]=2026-01-01
Booleantrue / falseisProductInAGECScope=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.
  • traceabilityStartDate and theoreticalTraceabilityEndDate — 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.

Response field notes

gtins is returned as a list of plain strings. links is always present (see above). producedQuantity is the amount only, without a unit.

Query
offsetinteger, >= 0

Zero-based index of the first row to return. Default 0; must be >= 0.

Default:0
limitinteger, [ 1 .. 100 ]

Maximum number of rows to return per page. Default 20; must be > 0, max 100.

Default:20
searchstring

Free-text search over product name, id, reference and collection.

sortBystring

Field to sort by (default createdAt). Accepts the sortable keys of the List declared French environmental cost endpoint. Sorting is allowed on fields the response does not return.

Default:"createdAt"
orderBystring

Sort direction. null values always sort last, in both directions.

Default:"asc"
Enum:"asc""desc"
brandProductIdArray of strings, (uuid)

Fairly Made product id (UUID v4). Repeatable to narrow to several products; pass a single id to target one product.

brandProductUniqueIdentifierArray of strings

Your brand product uniqueIdentifier (same value as on POST /brand-products). Repeatable; pass a single value to target one product by client reference.

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'

Responses

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.

Bodyapplication/json
dataArray of objects(BrandProductListItem)required
offsetintegerrequired

Zero-based index of the first row returned.

limitintegerrequired

Maximum number of rows returned in this page.

totalintegerrequired

Total number of products matching the query — the full match count, independent of the page requested.

Response
{ "data": [ { … }, { … } ], "offset": 0, "limit": 20, "total": 1451 }