A feed for the shopper

post/v1/shoppers/me/feed

A page of your catalogue chosen for the shopper. Each of their styles gets a share of the page by how strong it is, near-duplicates are dropped, and one place in ten goes to something new, never near something they passed on. Only products in stock are chosen, and never products that are not worn (slot non fashion: homeware, toys, gift cards). Send ageGroup: adult on an adult shopper's feed when your catalogue also sells children's clothes.

With no token, or a profile that has learnt nothing yet, the feed is a spread across the catalogue to react to (reason says so). When your organization has shopper profiles off, the token is not read and the feed is always that spread.

Items are compact cards. Open one with Retrieve products for its variants and photos.

Public keyapi.v1.shoppersDemo key OK

Headers

1
X-Shopper-Tokenstring

The shopper's profile token, from auth/start, auth/verify or any call that made a profile. Optional here.

Request body

application/json
slotstring

Only this garment slot, as products carry it in metadata.slot (top, bottom, one-piece, outerwear, shoes, …).

genderstring

Only this department, plus unisex products.

One ofwomensmens
ageGroupstring

Only this age group, as products carry it in metadata.age_group. adult keeps products with no age group (labelled before age groups existed), as search does.

One ofadultkidsbaby
occasionstring

Leans the feed toward styles they reacted to for this occasion (the occasion sent with signals).

excludearray<string>

itemIds not to show again (already rated or seen). Only the first 1000 are read.

maxItems: 1000
limitinteger

Products to return. Clamped to 1–60.

default: 24min: 1max: 60
countrystring

The shopper's two-letter country. Prices are in their market, and products their market does not sell are left out.

Response

200The feed, in order.
array<ShopperProductCard>required
itemIdstring

The product. Open it with Retrieve products.

namestringnullable

The product's name.

urlstringnullable

The product's page on its store.

pricenumbernullable

Price in currency, in the shopper's market when country was sent.

currencystringnullable

ISO currency code.

compareAtPricenumbernullable

The price before a sale, when on sale.

imagestringnullable

A 600 px wide WebP of the product's best photo.

slotstringnullable

The garment slot.

colourstringnullable

Its colour family.

scorenumber

How well it fits their taste, or how alike it is for similar.

reasonstringnullable

Why it is here, in a short sentence the shopper can read.

stylestringnullable

The id of the style it was chosen for, from profile.styles. Null for something new.

Errors

23

Every error is JSON with a single error string unless noted. Match on the status code; the message is for humans.

400
Request body must be valid JSON.

A body was sent and could not be parsed as JSON.

400
Request body must be a JSON object.

A body was sent and parsed to something other than a JSON object.

401
That shopper token is not valid here. Start a profile or sign in again.

X-Shopper-Token was sent but cannot be opened with this key. Leave it out for an unpersonalised feed.

422
ageGroup must be one of adult, kids, baby.

ageGroup was sent (non-null) but is another value.

curl -X POST "https://stylor.ai/api/v1/shoppers/me/feed" \
  -H "Authorization: Bearer $STYLOR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "slot": "top",
  "gender": "womens",
  "ageGroup": "adult",
  "exclude": [
    "701e5cee-41da-4e91-a688-69e8c8dd5fe3",
    "a342cbe3-965b-4055-8ac3-20f63103cade"
  ],
  "limit": 24,
  "country": "US"
}'
Response · 200
{
  "items": [
    {
      "itemId": "35a725c8-23fb-4009-a52a-2a778d2e504a",
      "name": "SLIM JEAN DENIM",
      "url": "https://ca.stussy.com/products/slim-jean-denim",
      "price": 195,
      "currency": "CAD",
      "compareAtPrice": null,
      "image": "https://stylor.ai/api/v1/image/v1/datasets/images/598fb45a.jpeg?resize=600x&format=webp",
      "slot": "bottom",
      "colour": "blue",
      "score": 0.41,
      "reason": "Fits your dark, slim, jeans.",
      "style": "3f9a1c2e"
    }
  ]
}