Looking for the overview — what this API returns, what it costs, and a call you can run without a key? See the Watsons Türkiye API page →
E-commerce & Marketplaces

Watsons Türkiye API & Scraper

The Watsons Türkiye API returns the Turkish beauty and personal-care retailer's catalogue as clean JSON, in four actions: search, product/detail, product/reviews and search/suggest.

4 actionsLive JSON1,000 free credits$0.67–$1.50 / 1,000 creditsMCP-ready
Get a free keyOpen in playground

🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.

A search row carries the product code, the title, the brand, the image, the price as a number in TRY with Watsons' own formatted string, the stock status with the actual unit count, the rating and review count, the EAN barcodes and the category path. Counted by value over 674 rows from 25 live searches on 2026-09-15, title, price, image, stock status and stock level were filled on 674 of 674, and barcodes on 665. search filters by brand, price range and in-stock, can browse a category with no keyword, offers the nine orderings the site itself offers, and returns the brands, categories and price bands available for the query. product/detail adds every image at 1200 px, the category breadcrumb, the per-star rating breakdown, the description as clean text with its own section headings, the ingredients and usage sections when the description publishes them, the supplier, the package dimensions and the shade variants. Price, title, sku, availability, rating and review count were compared against the product page itself on 6 products: 6 of 6 matched on every field. Across 140 single-attempt calls that day, 139 succeeded; the one miss was a network timeout that a retry clears, and a further 70 calls with normal retries succeeded 70 of 70. No Watsons account, no browser. One ReefAPI key and the standard { ok, data, meta, error } envelope.

Reference

Which Watsons price fields exist, and which were empty on the day we measured

Watsons Türkiye's storefront has separate slots for the shelf price, a struck-through was-price, a Watsons Club member price and a 30-day prior price. They are different numbers with different meanings, so the engine returns them as different fields and never folds one into another. The table shows what each field holds and how often it was filled on 2026-09-15, counted by value.

FieldWhat it isFilled on 2026-09-15
priceThe shelf price in TRY that Watsons shows every shopper. Null, never 0, when Watsons shows no price674 of 674 search rows, 25 of 25 product records
was_price, discount_amount, discount_percentThe struck-through price and the difference, only when Watsons publishes one above price0 of 674 rows, 0 of 25 records
member_priceThe Watsons Club member price, kept separate from price0 of 674 rows, 0 of 25 records
prior_priceThe 30-day prior price Watsons publishes next to a promotion0 of 25 records
promotion_messageBasket-level offer text such as a spend threshold. It is never subtracted from price0 of 25 records
stock_status, stock_levelinStock, lowStock or outOfStock, plus the unit count Watsons publishes674 of 674 rows, 25 of 25 records
barcodesThe EAN list; some products carry more than one665 of 674 rows, 25 of 25 records

The zeros are what Watsons published to a logged-out shopper that day, not a parse gap. The same products' rendered category page showed a single price with empty was and member slots, across roughly 1,400 distinct products in eight categories, eight keywords and two promotion categories. The fields read the storefront's own sources, so a campaign will appear in them without a change on our side.

Live example

Real request and response JSON

Captured from the indexed primary action, search, on .

Captured request
{
  "method": "POST",
  "url": "https://api.reefapi.com/watsons-tr/v1/search",
  "headers": {
    "x-api-key": "$REEF_KEY",
    "content-type": "application/json"
  },
  "body": {
    "query": "şampuan"
  }
}
Captured response
{
  "ok": true,
  "meta": {
    "api": "watsons-tr",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": 981.4,
    "record_count": 28,
    "bytes": 117555,
    "cache_hit": false,
    "pagination": {
      "page": 1,
      "page_size": 28,
      "has_more": true,
      "total": 1046
    }
  },
  "data": {
    "results": [
      {
        "position": 1,
        "product_id": "BP_145739",
        "sku": "145739",
        "title": "OGX Dolgunlaştırıcı Biotin ve Kolajen Şampuan 385 ml",
        "brand": "OGX",
        "range_name": "OGX",
        "url": "https://www.watsons.com.tr/ogx-dolgunlastirici-biotin-ve-kolajen-sampuan-385-ml/p/BP_145739",
        "image": "https://media.watsons.com.tr/medias/sys_master/prd-images/hc7/h79/12270210580510/prd-front-145739_195x195/prd-front-145739-195x195.jpg",
        "price": 539.9,
        "price_display": "539,90 ₺",
        "price_type": "BUY",
        "currency": "TRY",
        "was_price": null,
        "discount_amount": null,
        "discount_percent": null,
        "member_price": null,
        "member_price_display": null,
        "prior_price": null,
        "stock_status": "inStock",
        "stock_level": 1473,
        "in_stock": true,
        "purchasable": true,
        "rating": 4.3,
        "review_count": 144,
        "rating_scale": 5,
        "category_path": [
          "Saç Bakım",
          "Şampuanlar",
          "Şampuan"
        ],
        "barcodes": [
          "3574661831008",
          "22796916709",
          "22796976703"
        ],
        "badges": [
          "Çok Satanlar"
        ],
        "new_in": false,
        "promotion": null,
        "multibuy": false
      },
      {
        "position": 2,
        "product_id": "BP_1409835",
        "sku": "1409835",
        "title": "Urban Care Biberiye Şampuan Rosemary Clove 350 ml",
        "brand": "URBAN CARE",
        "range_name": "URBAN CARE EXC.",
        "url": "https://www.watsons.com.tr/urban-care-biberiye-sampuan-rosemary-clove-350-ml/p/BP_1409835",
        "image": "https://media.watsons.com.tr/medias/sys_master/prd-images/hbd/h0d/11223735926814/prd-front-1409835_195x195/prd-front-1409835-195x195.jpg",
        "price": 269.9,
        "price_display": "269,90 ₺",
        "price_type": "BUY",
        "currency": "TRY",
        "was_price": null,
        "discount_amount": null,
        "discount_percent": null,
        "member_price": null,
        "member_price_display": null,
        "prior_price": null,
        "stock_status": "inStock",
        "stock_level": 576,
        "in_stock": true,
        "purchasable": true,
        "rating": 3.6,
        "review_count": 14,
        "rating_scale": 5,
        "category_path": [
          "Saç Bakım",
          "Şampuanlar",
          "Şampuan"
        ],
        "barcodes": [
          "8680690710742"
        ],
        "badges": [
          "Sadece Watsons'ta"
        ],
        "new_in": false,
        "promotion": null,
        "multibuy": false
      },
      {
        "position": 3,
        "product_id": "BP_1343006",
        "sku": "1343006",
        "title": "Head&Shoulders Klasik Bakım 2'si 1 Arada Kepeğe Karşı Etkili Şampuan 250 ml",
        "brand": "HEAD&SHOULDERS",
        "range_name": "HEAD&SHOULDERS",
        "url": "https://www.watsons.com.tr/head-shoulders-klasik-bakim-2si-1-arada-kepege-karsi-etkili-sampuan-250-ml/p/BP_1343006",
        "image": "https://media.watsons.com.tr/medias/sys_master/prd-images/h39/h1b/12450667888670/prd-front-1343006_195x195/prd-front-1343006-195x195.jpg",
        "price": 59,
        "price_display": "59,00 ₺",
        "price_type": "BUY",
        "currency": "TRY",
        "was_price": null,
        "discount_amount": null,
        "discount_percent": null,
        "member_price": null,
        "member_price_display": null,
        "prior_price": null,
        "stock_status": "outOfStock",
        "stock_level": 0,
        "in_stock": false,
        "purchasable": true,
        "rating": 4.3,
        "review_count": 6,
        "rating_scale": 5,
        "category_path": [
          "Saç Bakım",
          "Şampuanlar",
          "Şampuan"
        ],
        "barcodes": [
          "8006530003872",
          "8006530069441",
          "8006540302507"
        ],
        "badges": [],
        "new_in": false,
        "promotion": null,
        "multibuy": false
      }
    ],
    "count": 28,
    "page": 1,
    "page_size": 28,
    "total_results": 1046,
    "total_pages": 38,
    "sort": "most-relevant",
    "redirect_url": null,
    "filters": {
      "brands": [
        {
          "name": "ACTIVEX",
          "count": 2,
          "value": "ACTIVEX"
        },
        {
          "name": "ANUA",
          "count": 5,
          "value": "ANUA"
        },
        {
          "name": "ARKO",
          "count": 1,
          "value": "ARKO"
        }
      ],
      "categories": [
        {
          "name": "Şampuanlar",
          "count": 312,
          "code": "212"
        },
        {
          "name": "Saç Bakım Çok Satanlar",
          "count": 83,
          "code": "102070"
        },
        {
          "name": "Saç Dökülme Karşıtı Ürünler",
          "count": 50,
          "code": "10010"
        }
      ],
      "subcategories": [
        {
          "name": "Şampuan",
          "count": 270,
          "code": "1062"
        },
        {
          "name": "Doğal Saç Bakım Şampuanlar",
          "count": 52,
          "code": "50095"
        },
        {
          "name": "Erkek Şampuan",
          "count": 48,
          "code": "1174"
        }
      ],
      "price_bands": []
    },
    "duplicates_dropped": 0,
    "query": "şampuan",
    "category": null
  }
}
Actions

What the Watsons Türkiye API does

ActionDescriptionConcrete use caseKey params
searchSearch watsons.com.tr by keyword, or browse a category, and get one row per product: product code, title, brand, image, price in TRY, Watsons Club member price and was-price when Watsons publishes them, stock status and unit count, rating and review count, EAN barcodes and category path. Filter by brand, price range and in-stock, sort the way the site does, and page through the results. The response also lists the brands, categories and price bands available for the query.Pricing teams call search to search watsons.com.tr by keyword, or browse a category, and get one row per product.query, category, page, page_size, sort, ...
product/detailThe full Watsons Türkiye product record by product code or URL: title, brand, price in TRY with was-price, discount and Watsons Club member price when published, the basket-promotion message, stock status with unit count, rating with review count and per-star breakdown, every image, the category breadcrumb, the description as clean text with its sections, ingredients and usage when the description publishes them, EAN barcodes, supplier, package dimensions and shade/size variants.Marketplace operators call product/detail to get the full Watsons Türkiye product record by product code or URL.product_id, max_rotations
product/reviewsWritten customer reviews of one Watsons Türkiye product, newest first: star rating (1-5), headline, review text and date. Watsons publishes the text of written reviews only, so this can be far fewer than the product's review_count, which counts every star rating (and can be 0 while the product has ratings).Catalog enrichment teams call product/reviews to get written customer reviews of one Watsons Türkiye product, newest first.product_id, limit, max_rotations
search/suggestWatsons Türkiye's own search-box suggestions for a partial keyword: the suggested search terms and the top matching products with price.Retail analysts call search/suggest to get watsons Türkiye's own search-box suggestions for a partial keyword.query, max_rotations
Code samples

Call search from your stack

curl -X POST https://api.reefapi.com/watsons-tr/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"query":"şampuan"}'
MCP one-liner
Ask your MCP-connected assistant: call reefapi.watsons-tr.search with {"query":"şampuan"}.
Use cases

Who uses this API and why

  • Beauty brands and distributors track their shelf price, unit stock and rating at Watsons Türkiye by product code or EAN barcode.
  • Retail-analytics teams sweep a category with no keyword and read price, stock level and review count for every product on the shelf.
  • Price-comparison sites match Watsons products to other Turkish retailers by EAN, returned on 665 of 674 measured search rows.
  • Catalogue teams pull the full record with 1200 px images, breadcrumb, clean description sections and the written ingredients where Watsons publishes them.
FAQ

Questions developers ask before integrating

Is the Watsons Club member price returned, and is it ever mixed into price?

It has its own field, member_price, and it is never written into price. price is always the shelf price every shopper sees. On 2026-09-15 no product carried a member price: 0 of 674 search rows and 0 of 25 product records, with the rendered category page agreeing. If Watsons runs a Club price again, member_price will fill in and price will stay the shelf price, so a price tracker never records a members-only number as the public one.

Why is price null on a few products instead of 0?

Because Watsons sends 0.00 for a product it is not currently pricing, and a tracker that stores that as a real price records a 100 percent price drop. Measured on a 10 ml shampoo sample: the search row said 0,00 TL, while the product record said no price, not purchasable and out of stock. The engine returns price and price_display as null in both places and keeps the stock fields, which say why.

Is the stock a real number?

Yes. stock_level is the unit count Watsons publishes, and stock_status is its own band of inStock, lowStock or outOfStock. Measured values ran from 3 units, flagged lowStock, to 3,949. One caveat applies to the product page: its structured data only says InStock where Watsons' own data says lowStock, so the API is the more precise source.

Why does product/reviews return fewer reviews than review_count?

Because review_count counts every star rating, while Watsons publishes text for written reviews only. Measured on 2026-09-15: one product had 620 ratings and 619 written reviews, another 282 ratings and 3 written, and another 77 ratings and none written. That last product returns an empty review list alongside a 4.45 rating. That is correct, not a failure, and the field is named total_written_reviews so it cannot be read as review_count. Reviews come back newest first. Watsons sends them in no date order, so the engine sorts them.

Are shades and sizes variants of one product?

No. On watsons.com.tr each lipstick or foundation shade is its own product with its own code, price, stock and barcode. variants[] reports what Watsons publishes on the record, which for a shade is a single entry: 1 of 25 measured records carried one. To collect a whole shade range, search the product line and read each row.

Are ingredients returned?

Only when Watsons writes them. There is no structured ingredients field on the site; the specification block was an empty placeholder on every product sampled. The engine keeps the description's own section headings and fills ingredients from an ingredients or active-ingredients section, and how_to_use from a usage section. That filled ingredients on 13 of 25 measured products and how_to_use on 20 of 25. Everywhere else those fields are null rather than guessed from marketing text.

Which filters actually filter?

Each one was checked against the unfiltered result on 2026-09-15. The keyword şampuan returned 1,049 products. Adding brand ELSEVE cut that to 35, all ELSEVE. A 100 to 200 TRY band gave 383, every row inside the band. in_stock gave 869. The price sorts were strictly monotone over 40 rows in both directions, and page 2 shared no product with page 1. Brand names are matched in whatever casing Watsons uses, so you can type them in lower case: elseve matches ELSEVE, Elidor matches ELİDOR (50 products), creamol matches Creamol and nivea matches NIVEA. The available brand values come back in filters.brands. A category code with no keyword browses that category: mascara returned 179.

What does Watsons Türkiye NOT publish?

No seller field, because Watsons sells its own stock. No units for the package dimensions, so width, height and depth are returned as Watsons' raw strings with unit null. No structured ingredients, as above. No reviewer names are returned by this API. No stock in the search box's product suggestions: those rows reported a product out of stock while search reported 1,483 units in the same minute, so suggest returns terms, titles and prices only and stock comes from search and product/detail. On 2026-09-15 there were also no was-prices, member prices or multi-buy offers to return.

What is the Watsons Türkiye API?

Watsons Türkiye API is a ReefAPI endpoint group for turkish beauty and personal-care retailer: prices in try, stock levels, ratings and barcodes. It returns live JSON through POST requests under /watsons-tr/v1.

Is the Watsons Türkiye API free to try?

Yes. ReefAPI starts with 1,000 free credits, no card required. Watsons Türkiye calls use the same shared credit balance as every other ReefAPI engine.

Do I need a Watsons Türkiye login or account?

No login to Watsons Türkiye is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.

How fresh is the Watsons Türkiye data?

The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.

How many credits does the Watsons Türkiye API use?

Watsons Türkiye actions currently cost 1 credit per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.

Can I call Watsons Türkiye from an AI assistant or MCP client?

Yes. Connect ReefAPI once through MCP and your assistant can call watsons-tr actions with the same key, credit pool and JSON envelope used by normal REST requests.

docs / watsons-tr

Watsons Türkiye

Turkish beauty and personal-care retailer: prices in TRY, stock levels, ratings and barcodes.

base /watsons-tr/v14 endpoints
post/watsons-tr/v1/product/detail1 credit

The full Watsons Türkiye product record by product code or URL: title, brand, price in TRY with was-price, discount and Watsons Club member price when published, the basket-promotion message, stock status with unit count, rating with review count and per-star breakdown, every image, the category breadcrumb, the description as clean text with its sections, ingredients and usage when the description publishes them, EAN barcodes, supplier, package dimensions and shade/size variants.

ParameterAllowed / rangeDescription
product_idrequiredWatsons product code as returned in `product_id` by `search` (BP_153319). The bare number (153319) or a full watsons.com.tr product URL is also accepted.
max_rotations = 4optional1–8Advanced: how many times to retry a difficult request (1-8, default 4 — leave unchanged for typical use).
Try in playground →
post/watsons-tr/v1/product/reviews1 credit

Written customer reviews of one Watsons Türkiye product, newest first: star rating (1-5), headline, review text and date. Watsons publishes the text of written reviews only, so this can be far fewer than the product's review_count, which counts every star rating (and can be 0 while the product has ratings).

ParameterAllowed / rangeDescription
product_idrequiredWatsons product code as returned in `product_id` by `search` (BP_153319). The bare number (153319) or a full watsons.com.tr product URL is also accepted.
limit = 20optional1–200How many reviews to return, newest first (1-200, default 20).
max_rotations = 4optional1–8Advanced: how many times to retry a difficult request (1-8, default 4 — leave unchanged for typical use).
Try in playground →
post/watsons-tr/v1/search/suggest1 credit

Watsons Türkiye's own search-box suggestions for a partial keyword: the suggested search terms and the top matching products with price.

ParameterAllowed / rangeDescription
queryrequiredWhat the shopper has typed so far (at least 2 characters).
max_rotations = 4optional1–8Advanced: how many times to retry a difficult request (1-8, default 4 — leave unchanged for typical use).
Try in playground →