Guides

Supported products

Dessert renders ad creative around a single product with an animatable texture. If you try to generate against an unsupported product (a multi-pack, a wipe, an accessory), the API rejects the request with product_not_supported and a message naming the product. This page lists what works and what doesn't so you can pre-filter on your side.

What we support

Any single SKU from the categories below. Marketing copy doesn't matter — a "milky serum" still counts as a serum, a "buttery balm" still counts as a balm. We classify by the product's actual texture and category, not by the brand's headline copy.

CategoryExamples
Creams & lotionsDay cream, night cream, moisturizer, body cream, body lotion, hand cream.
Serums & essencesVitamin C serum, retinol serum, peptide serum, hydrating essence, ampoule.
OilsFace oil, body oil, hair oil, lip oil, cleansing oil, dry oil.
BalmsLip balm, body balm, cleansing balm, repair balm, multi-balm.
Lip productsLip gloss, lip stain, lip tint, lipstick, lip cream, tinted lip balm.
GelsCleansing gel, gel moisturizer, hydrogel, eye gel, gel-cream.
Mists & tonersFacial mist, hydrating toner, exfoliating toner, setting mist, essence mist.
SunscreensMineral SPF, chemical SPF, tinted SPF, sunscreen gel, sunscreen stick (if flowable).
Eye & lip treatmentsEye cream, eye serum, eye treatment, lip mask, lip treatment.
MasksCream masks, gel masks, clay masks, sleeping masks. Sheet masks not yet supported.
Scrubs & exfoliantsSugar scrub, salt scrub, enzyme exfoliant, AHA/BHA peel (liquid form).
Color & complexionFoundation, primer, concealer, tinted moisturizer, blush, bronzer, highlighter.
Mousses & foamsCleansing foam, mousse moisturizer, foaming wash.

What we don't support yet

These get flagged as is_compatible: false in GET /v1/products and rejected with HTTP 400 in POST /v1/ads/generate.

CategoryWhy notCommon signals
Multi-packs & setsRenderer ships one product per ad. A 3-pack of lip balms or a "Skincare Routine Bundle" can't be cleanly framed.3-pack, set of N, duo, trio, bundle, kit, caddy, sampler, routine, essentials set, collection.
Wipes & sheet productsThe visible product is fabric, not a creamy/oily texture — there's nothing to animate as a swatch or pour.wipes, cleansing cloth, towelettes, cotton pads, sheet mask, patches, strips.
Tools & accessoriesNo product texture at all.brush, spatula, applicator, sponge, gua sha, roller, headband, device, candle, diffuser.
Bar soapSolid bar — no flowable substance to swatch or animate. We may add bar-soap-specific templates later.bar soap.
Hair, fragrance, deodorantOutside our current vertical. Different visual conventions; different templates needed.shampoo, conditioner, perfume, fragrance, eau de, cologne, deodorant, hair.
Samples, gift cards, subscriptionsNot standalone purchasable products with a hero shot.sample, gift card, subscription.

Pre-filtering on your side

The GET /v1/products response includes is_compatible on every product. Filter on that before passing product_refs to POST /v1/ads/generate:

products = requests.get(
    "https://api.dessert.dev/v1/products",
    headers={"Authorization": f"Bearer {api_key}"},
).json()["products"]

usable = [p for p in products if p["usable_for_ads"]]
incompatible = [p for p in products if not p["is_compatible"]]

for p in incompatible:
    print(f"skipped {p['handle']}: {p['incompatibility_reason']}")

Rejection error shape

If you do hit POST /v1/ads/generate with an incompatible product, you'll get a 400 with a structured error envelope:

{
  "error": {
    "code": "product_not_supported",
    "message": "`Honey & Orange Blossom 3-Pack Of Lip Balms` is not supported by this API. Multi-product bundle / kit — our renderer ships one product per ad. See https://docs.dessert.dev/supported-products for the list of supported product types.",
    "doc_url": "https://docs.dessert.dev/supported-products",
    "incompatible_products": [
      {
        "name": "Honey & Orange Blossom 3-Pack Of Lip Balms",
        "handle": "honey-orange-blossom-3-pack-of-lip-balms",
        "reason": "Multi-product bundle / kit — our renderer ships one product per ad."
      }
    ]
  }
}

False positives

We classify products with a three-pass system: hard signals on product title, the AI-extracted texture/category, and an LLM disambiguation pass for ambiguous cases (e.g. marketing copy that reads like a bundle but is actually one item). Most rejections are unambiguous — but if you think a product was wrongly flagged, email support@dessert.dev with the product handle and we'll review within one business day.

Adding a new supported category (foam? stick balm? deodorant cream?) takes about a day on our side once we've validated the template inventory works for it. Open an issue with a sample product URL and we'll prioritize.