---
title: "Single product with description and category"
method: GET
path: "/api/products/{slug}"
---

# Single product with description and category

`GET /api/products/{slug}`

## Request

- Base URL: `https://api.glowjakt.se`
- URL: `https://api.glowjakt.se/api/products/{slug}`
- Auth: none required

## Path parameters

- `slug` string, required

## Response `200`

Product detail

- ProductDetail
  - `id` integer
  - `name` string
  - `brand` string
  - `brand_slug` string
  - `slug` string: Use with /api/products/{slug}/offers. Product page: https://<site>/<country>/product/<slug>/
  - `price` number: Lowest price among stores that currently have the product in stock (or the lowest listed price if it is sold out everywhere), in local currency (EUR prices have decimals).
  - `currency` string
  - `original_price` number, nullable
  - `image_url` string, nullable
  - `in_stock` boolean
  - `store_name` string: Store offering that price.
  - `affiliate_url` string: Tracked buy link to the store offering that price (https://{market-domain}/go/{id}?t=...). Signed and valid for 48 hours from the response; it redirects (302) to the store. Do not store or replay expired links — fetch fresh ones.
  - `offer_count` integer: Number of stores with this product in stock right now. For a barcode match (see q on /api/products), the number of store listings with that barcode, including sold-out ones.
  - `listing_count` integer: Number of stores carrying this product, including those currently sold out. Equals the number of entries returned by the offers endpoint. Not set for a barcode match (see q on /api/products).
  - `subcategory_path` string, nullable: Product type as category/subcategory path, e.g. "makeup/lipstick".
  - `content_value` number, nullable: Package quantity in base unit (ml or g), parsed from the product name. Served by the German market (country=de) only; used for the legal unit price (Grundpreis per 1 l / 1 kg, PAngV). Null when the quantity is unknown or the product is sold by piece.
  - `content_unit` string, nullable: Base unit for content_value: "ml" or "g". German market only.
  - `category` 'skincare' | 'makeup' | 'haircare' | 'fragrance' | 'nails' | 'body' | 'accessories'
  - `description` string, nullable
  - `inci` string, nullable: Full INCI ingredient list (comma-separated). Null for devices/accessories.
  - `key_ingredients` object[]: Notable ingredients with localized name, INCI term and function.
    - `slug` string
    - `name` string: Localized display name.
    - `note` string: INCI term(s) matched.
    - `category` string: Function, e.g. Hydration, Exfoliation.
    - `tier` integer
  - `gallery` string[]: Product image URLs.
  - `certifications` object[]: Third-party verified brand certifications from the Glowpedia fact base (Ecocert, Leaping Bunny, The Vegan Society...). Localized note explains each cert.
    - `name` string
    - `note` string
  - `claims` string[], nullable: The brand's OWN unverified marketing claims (localized strings). Always attribute to the brand — never present as verified facts.
  - `glowpedia_url` string, nullable: Market-localized URL to the brand article on Glowpedia (the beauty-brand encyclopedia). Null until the market edition is launched.
  - `guide_slug` string, nullable: Slug of the price guide for the product's brand when one exists in this market (GET /api/guides/{slug}); null otherwise.

## Other responses

- `404`: Unknown product slug

---

[API](https://skmtc.dev/glowjakt/apis/glowjakt-public-api.md) · [All operations](https://skmtc.dev/glowjakt/apis/glowjakt-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/glowjakt/apis/glowjakt-public-api/revisions/6f4e2dee0479?raw)
