Looking for the overview — what this API returns, what it costs, and a call you can run without a key? See the ŞOK Market API page →
docs / sok

ŞOK Market

Turkish discount grocery online: ŞOK Market and ŞOK Ekstra, this week's Haftanın Fırsatları deals, prices in lira per store.

base /sok/v17 endpoints
post/sok/v1/category/products1 credit

Browse one ŞOK category — every product ŞOK lists in it, paged, with the same fields as search and the same optional brand, price and campaign filters. Category ids come from the `categories` action or from the number at the end of a ŞOK category URL.

ParameterAllowed / rangeDescription
category_idrequired—The ŞOK category to browse — an id from the `categories` action or the number at the end of a category URL (…-c-460 → 460).
channel = marketoptionalmarket · ekstraWhich ŞOK shop to read. The two shops have separate catalogues, separate stores and separate prices.
page = 0optional0–500Zero-based page number (ŞOK's own numbering).
page_size = 100optional1–500Products per page, 1-500 (default 100).
sort = relevanceoptionalrelevance · relevance_asc · price_asc · price_descThe four sort orders ŞOK's own search supports.
brand_idoptional—Restrict to one ŞOK brand id (the `brand_id` on any row).
min_priceoptional0–Only products priced at or above this, in TRY.
max_priceoptional0–Only products priced at or below this, in TRY.
only_campaign_products = falseoptional—Only products carrying a ŞOK campaign badge (ŞOK's own "Kampanyalı Ürünler" filter).
store_idoptional—Advanced: read a named ŞOK store instead of the default online store. Prices are almost always the same across stores but the assortment is not; every answer says which store it came from.
max_rotations = 5optional1–10Advanced: how many times to retry a difficult request (1-10, default 5).
Try in playground →
post/sok/v1/categoriesfree

ŞOK's whole category tree for a shop — every category with its id, name, level, parent and URL, nested — plus the shortcuts ŞOK links from its own front page (its weekly deal page, new products, gluten-free and so on). Use the ids with `category/products`.

ParameterAllowed / rangeDescription
channel = marketoptionalmarket · ekstraWhich ŞOK shop to read. The two shops have separate catalogues, separate stores and separate prices.
max_depth = 3optional1–6How many levels of the category tree to return (1-6).
store_idoptional—Advanced: read a named ŞOK store instead of the default online store. Prices are almost always the same across stores but the assortment is not; every answer says which store it came from.
max_rotations = 5optional1–10Advanced: how many times to retry a difficult request (1-10, default 5).
Try in playground →
post/sok/v1/product/detail1 credit

One ŞOK product by id or URL: the store's price, ŞOK's struck price and discount where one exists, stock, brand, own-brand flag, images, the full category path, campaign badges, the product description, country of origin, net quantity, ingredients, allergen warning, storage condition, usage instructions, the nutrition table and the package dimensions ŞOK publishes.

ParameterAllowed / rangeDescription
product_idoptional—The ŞOK product id — the number at the end of a product URL (…-p-5834 → 5834). Give this or `url`.
urloptional—A ŞOK product page URL, instead of `product_id`.
channel = marketoptionalmarket · ekstraWhich ŞOK shop to read. The two shops have separate catalogues, separate stores and separate prices.
store_idoptional—Advanced: read a named ŞOK store instead of the default online store. Prices are almost always the same across stores but the assortment is not; every answer says which store it came from.
max_rotations = 5optional1–10Advanced: how many times to retry a difficult request (1-10, default 5).
Try in playground →
post/sok/v1/campaigns2 credits

The products of a ŞOK campaign listing. `weekly_deals` (the default) is ŞOK's own deal page — every product it currently sells below its struck price, with both prices and the discount. `badge_campaigns` is ŞOK's "Kampanyalı Ürünler" filter (1 Alana 1 Bedava, 50 TL ve üzeri…). `campaign` returns one named campaign's products together with its terms; `promotion_group` and `product_group` return ŞOK's own grouped listings.

ParameterAllowed / rangeDescription
campaign = weekly_dealsoptionalweekly_deals · badge_campaigns · campaign · promotion_group · product_groupWhich ŞOK campaign listing to return. `weekly_deals` is the deal page ŞOK links from its own front page.
campaign_idoptional—Required with campaign=campaign: a campaign id from the `campaigns/list` action.
group_idoptional—Required with campaign=promotion_group or campaign=product_group: the id at the end of the group's URL (…-pgrp-<id> / …-sgrp-<id>).
channel = marketoptionalmarket · ekstraWhich ŞOK shop to read. The two shops have separate catalogues, separate stores and separate prices.
page = 0optional0–500Zero-based page number (ŞOK's own numbering).
page_size = 100optional1–500Products per page, 1-500 (default 100).
store_idoptional—Advanced: read a named ŞOK store instead of the default online store. Prices are almost always the same across stores but the assortment is not; every answer says which store it came from.
max_rotations = 5optional1–10Advanced: how many times to retry a difficult request (1-10, default 5).
Try in playground →
post/sok/v1/campaigns/listfree

ŞOK's campaign catalogue: every campaign currently running with its id, title, conditions, page URL and artwork, plus the campaign groups ŞOK sorts them into. Feed a campaign_id back into the `campaigns` action to get that campaign's products.

ParameterAllowed / rangeDescription
channel = marketoptionalmarket · ekstraWhich ŞOK shop to read. The two shops have separate catalogues, separate stores and separate prices.
group_idoptional—Only list campaigns in one ŞOK campaign group (an id from this action's own `groups` list).
page = 0optional0–500Zero-based page number (ŞOK's own numbering).
store_idoptional—Advanced: read a named ŞOK store instead of the default online store. Prices are almost always the same across stores but the assortment is not; every answer says which store it came from.
max_rotations = 5optional1–10Advanced: how many times to retry a difficult request (1-10, default 5).
Try in playground →
post/sok/v1/suggest1 credit

ŞOK's own search autocomplete for a partial keyword: the search terms and category suggestions the site offers while the shopper types.

ParameterAllowed / rangeDescription
queryrequired—What the shopper has typed so far (2+ characters).
channel = marketoptionalmarket · ekstraWhich ŞOK shop to read. The two shops have separate catalogues, separate stores and separate prices.
store_idoptional—Advanced: read a named ŞOK store instead of the default online store. Prices are almost always the same across stores but the assortment is not; every answer says which store it came from.
max_rotations = 5optional1–10Advanced: how many times to retry a difficult request (1-10, default 5).
Try in playground →