FLO API & Scraper
The FLO API returns product data from the Turkish footwear retailer FLO as clean JSON.
🤖 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.
The primary search endpoint returns products with id, title, brand, price, special price, original price and discount rate, and you can pull category/products and a product/detail. It is built for price intelligence, catalog enrichment and Turkish e-commerce analytics that need FLO data without a scraper. One ReefAPI key, one shared credit pool, the standard envelope.
FLO ids: the product id, the size sku, the colorway sibling and the seller
FLO reuses one number in several shapes, and the trap is assuming a size sku and a product id live in the same space. They do not, and neither do colorways, which FLO models as separate products rather than as variants of one. Everything below was read off live search, category and detail responses on 2026-08-27.
| Identifier | Where it comes from | Measured shape |
|---|---|---|
| product_id | the digits at the end of /urun/<slug>-<id> | "101792825" - 9 digits, returned as a string |
| sizes[].sku | one per size | the product id with a 3-digit size index appended: 101792825001 through 101792825008 |
| sizes[].barcode | one per size | 12-digit UPC-A, e.g. 196968173624 for EU 35.5 |
| colors[].sku | the other colorways of the same shoe | a different product id with its own /urun/ URL: 101853780, 101792764 |
| entity_id | product/detail only | "36310805520", 11 digits - FLO's internal record id, unrelated to product_id |
| seller_id / seller_type | who ships it | 10000 with seller_type "flo" is FLO's own stock; marketplace sellers are 5 digits. On 'canta' 14 of 24 rows were FLO and 10 were marketplace across 10152, 10179, 10243, 10410, 10476, 10719 and 10779 |
| price / original_price / discount_rate | search and category cards | JSON numbers in TRY: 3499.9 from 4999.9 with discount_rate 30 |
| stock_message | product/detail only | "1.000 adetten az" - FLO's own Turkish string, where the dot is a thousands separator, so this means fewer than one thousand |
seller_id is an integer on search and category/products but a string inside the seller{} object on product/detail. Product ids also retire: 101465072, which still appears in older FLO links, now returns NOT_FOUND because flo.com.tr answers 404 for it.
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/flo/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"query": "nike"
}
}{
"ok": true,
"meta": {
"api": "flo",
"endpoint": "search",
"mode": "live",
"latency_ms": 6226.1,
"record_count": 24,
"bytes": 2070619,
"cache_hit": false,
"method": "ssr_gtm_product_and_window_productdetail",
"page": 1,
"total": 692
},
"data": {
"products": [
{
"product_id": "[redacted-phone]",
"title": "Court Borough Low Recraft Beyaz Unisex Sneaker",
"brand": "Nike",
"url": "https://www.flo.com.tr/urun/nike-court-borough-low-recraft-beyaz-unisex-sneaker-[redacted-phone]",
"price": 2999,
"special_price": 2999,
"original_price": 3499,
"discount_rate": 14,
"currency": "TRY",
"in_stock": false,
"image": "https://floimages.mncdn.com/media/catalog/product/26-07/13/[redacted-phone]_d1.jpg",
"sizes": [
{
"size": "[trimmed-depth]",
"dimension": "[trimmed-depth]",
"in_stock": "[trimmed-depth]",
"qty": "[trimmed-depth]",
"sku": "[trimmed-depth]",
"barcode": "[trimmed-depth]"
},
{
"size": "[trimmed-depth]",
"dimension": "[trimmed-depth]",
"in_stock": "[trimmed-depth]",
"qty": "[trimmed-depth]",
"sku": "[trimmed-depth]",
"barcode": "[trimmed-depth]"
},
{
"size": "[trimmed-depth]",
"dimension": "[trimmed-depth]",
"in_stock": "[trimmed-depth]",
"qty": "[trimmed-depth]",
"sku": "[trimmed-depth]",
"barcode": "[trimmed-depth]"
}
],
"colors": [
{
"name": "[trimmed-depth]",
"sku": "[trimmed-depth]",
"url": "[trimmed-depth]",
"image": "[trimmed-depth]",
"in_stock": "[trimmed-depth]",
"qty": "[trimmed-depth]",
"barcode": "[trimmed-depth]"
},
{
"name": "[trimmed-depth]",
"sku": "[trimmed-depth]",
"url": "[trimmed-depth]",
"image": "[trimmed-depth]",
"in_stock": "[trimmed-depth]",
"qty": "[trimmed-depth]",
"barcode": "[trimmed-depth]"
},
{
"name": "[trimmed-depth]",
"sku": "[trimmed-depth]",
"url": "[trimmed-depth]",
"image": "[trimmed-depth]",
"in_stock": "[trimmed-depth]",
"qty": "[trimmed-depth]",
"barcode": "[trimmed-depth]"
}
],
"seller_id": 10000,
"seller_type": "flo",
"category": [
"Ayakkabı",
"Sneaker",
"Klasik Sneaker"
]
},
{
"product_id": "[redacted-phone]",
"title": "COURT BOROUGH LOW RECRAFT Beyaz Unisex Sneaker",
"brand": "Nike",
"url": "https://www.flo.com.tr/urun/nike-court-borough-low-recraft-beyaz-unisex-sneaker-[redacted-phone]",
"price": 3499,
"special_price": null,
"original_price": null,
"discount_rate": null,
"currency": "TRY",
"in_stock": false,
"image": "https://floimages.mncdn.com/media/catalog/product/23-10/27/[redacted-phone]_d[redacted-phone].jpg",
"sizes": [
{
"size": "[trimmed-depth]",
"dimension": "[trimmed-depth]",
"in_stock": "[trimmed-depth]",
"qty": "[trimmed-depth]",
"sku": "[trimmed-depth]",
"barcode": "[trimmed-depth]"
},
{
"size": "[trimmed-depth]",
"dimension": "[trimmed-depth]",
"in_stock": "[trimmed-depth]",
"qty": "[trimmed-depth]",
"sku": "[trimmed-depth]",
"barcode": "[trimmed-depth]"
},
{
"size": "[trimmed-depth]",
"dimension": "[trimmed-depth]",
"in_stock": "[trimmed-depth]",
"qty": "[trimmed-depth]",
"sku": "[trimmed-depth]",
"barcode": "[trimmed-depth]"
}
],
"colors": [
{
"name": "[trimmed-depth]",
"sku": "[trimmed-depth]",
"url": "[trimmed-depth]",
"image": "[trimmed-depth]",
"in_stock": "[trimmed-depth]",
"qty": "[trimmed-depth]",
"barcode": "[trimmed-depth]"
},
{
"name": "[trimmed-depth]",
"sku": "[trimmed-depth]",
"url": "[trimmed-depth]",
"image": "[trimmed-depth]",
"in_stock": "[trimmed-depth]",
"qty": "[trimmed-depth]",
"barcode": "[trimmed-depth]"
},
{
"name": "[trimmed-depth]",
"sku": "[trimmed-depth]",
"url": "[trimmed-depth]",
"image": "[trimmed-depth]",
"in_stock": "[trimmed-depth]",
"qty": "[trimmed-depth]",
"barcode": "[trimmed-depth]"
}
],
"seller_id": 10000,
"seller_type": "flo",
"category": [
"Ayakkabı",
"Sneaker",
"Klasik Sneaker"
]
},
{
"product_id": "[redacted-phone]",
"title": "COURT VISION LO NN Beyaz Erkek Sneaker",
"brand": "Nike",
"url": "https://www.flo.com.tr/urun/nike-nike-court-vision-lo-nn-beyaz-erkek-sneaker-[redacted-phone]",
"price": 4399,
"special_price": null,
"original_price": null,
"discount_rate": null,
"currency": "TRY",
"in_stock": false,
"image": "https://floimages.mncdn.com/media/catalog/product/21-09/23/[redacted-phone]_[redacted-phone].JPG",
"sizes": [
{
"size": "[trimmed-depth]",
"dimension": "[trimmed-depth]",
"in_stock": "[trimmed-depth]",
"qty": "[trimmed-depth]",
"sku": "[trimmed-depth]",
"barcode": "[trimmed-depth]"
},
{
"size": "[trimmed-depth]",
"dimension": "[trimmed-depth]",
"in_stock": "[trimmed-depth]",
"qty": "[trimmed-depth]",
"sku": "[trimmed-depth]",
"barcode": "[trimmed-depth]"
},
{
"size": "[trimmed-depth]",
"dimension": "[trimmed-depth]",
"in_stock": "[trimmed-depth]",
"qty": "[trimmed-depth]",
"sku": "[trimmed-depth]",
"barcode": "[trimmed-depth]"
}
],
"colors": [
{
"name": "[trimmed-depth]",
"sku": "[trimmed-depth]",
"url": "[trimmed-depth]",
"image": "[trimmed-depth]",
"in_stock": "[trimmed-depth]",
"qty": "[trimmed-depth]",
"barcode": "[trimmed-depth]"
},
{
"name": "[trimmed-depth]",
"sku": "[trimmed-depth]",
"url": "[trimmed-depth]",
"image": "[trimmed-depth]",
"in_stock": "[trimmed-depth]",
"qty": "[trimmed-depth]",
"barcode": "[trimmed-depth]"
},
{
"name": "[trimmed-depth]",
"sku": "[trimmed-depth]",
"url": "[trimmed-depth]",
"image": "[trimmed-depth]",
"in_stock": "[trimmed-depth]",
"qty": "[trimmed-depth]",
"barcode": "[trimmed-depth]"
}
],
"seller_id": 10000,
"seller_type": "flo",
"category": [
"Ayakkabı",
"Sneaker",
"Klasik Sneaker"
]
}
],
"count": 24,
"total": 692,
"page": 1
}
}What the FLO API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | Search FLO by keyword (`query`), paginated. Every card carries product_id, title, brand, price, special_price (discount), sizes[] (with per-size stock), colors[], image, url, seller_type (flo|marketplace). | Pricing and assortment teams call search to search FLO by keyword (`query`), paginated. | query, page, sort, max_rotations |
| category/products | Browse a FLO category (`category` slug + optional `cinsiyet` gender), paginated — the deep shoe-enumeration workhorse. Same rich card shape as search (sizes, colors, discount, stock). | Brand-protection teams call category/products to get browse a FLO category (`category` slug + optional `cinsiyet` gender), paginated. | category, cinsiyet, page, sort, max_rotations |
| product/detail | Full FLO product by `url` or `product_id`: title, brand, price, original_price, discount_percent, currency=TRY, images[] (full gallery), sizes[] (per-size stock), colors[], coupons[], badges (free-shipping/campaign), rating, seller, description, stock. Parsed from FLO's own window.productDetail JSON (durable) + fallback. | Retail analysts call product/detail to get full FLO product by `url` or `product_id`. | url, product_id, max_rotations |
Call search from your stack
curl -X POST https://api.reefapi.com/flo/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"nike"}'import requests
r = requests.post(
"https://api.reefapi.com/flo/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "nike"
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/flo/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "nike"
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.flo.search with {"query":"nike"}.Who uses this API and why
- Pricing teams call search to track FLO shoe prices and campaigns.
- Catalog-enrichment tools use product/detail to fill listings with images and options.
- Market analysts use category/products to monitor a footwear segment.
Questions developers ask before integrating
Why does product/detail return NOT_FOUND for a FLO id that looks valid?
Because FLO retires product ids when a colorway is discontinued, and the page then 404s. A measured lookup on 101465072, an id that appears in older Nike Revolution links, returned NOT_FOUND with the message that flo.com.tr answered 404. The reliable pattern is to take the url straight off a live search or category row and pass that, which resolved on the first try.
How does a FLO size sku relate to the product id?
The size sku is the product id with a 3-digit size index appended. Product 101792825 has skus 101792825001 through 101792825008 covering EU 35.5 to 40. The index order does not follow size order, so read the size field rather than inferring it from the suffix. Each size also carries its own 12-digit barcode.
Are FLO prices Turkish-formatted?
The prices are not. price, special_price, original_price and discount_rate are plain JSON numbers with currency "TRY", so 3499.9 is what it looks like. The one Turkish-formatted value in the payload is stock_message on product/detail: "1.000 adetten az" means fewer than one thousand units, because the dot there is a thousands separator, not a decimal point.
Are different colors of the same shoe variants or separate products?
Separate products. colors[] gives you the sibling colorways, and each one has its own sku, its own /urun/ URL and its own stock - the measured Nike Court Borough had 8 of them. If you are deduplicating a catalogue, colors[] is the join key; there is no single parent id sitting above them.
How do I tell FLO's own stock from a marketplace seller?
seller_type is "flo" or "marketplace", and seller_id 10000 is FLO itself. Marketplace sellers get 5-digit ids. The mix varies sharply by category: footwear queries came back entirely FLO-owned across 48 rows, while 'canta' returned 10 marketplace rows out of 24 spread across seven different sellers.
Where do I read FLO stock from?
sizes[].qty, per size, and it is a real count rather than a flag - the measured Nike Court Borough showed 0, 0, 0, 10, 178, 458, 1881 and 155 across its eight sizes. product/detail adds available_sizes, which is just the sizes whose qty is above zero, and stock_message, which is FLO's own coarse band.
Is the FLO description plain text or HTML?
HTML. product/detail returns description with FLO's own <strong> and <br> markup intact rather than stripping it, so you keep the paragraph structure and strip it yourself if you want plain text. attributes is separate: a flat object keyed by FLO's own attribute codes such as beden, beden_grubu and bnsr_taban_tipi.
How many products does a FLO category have, and how do I page it?
24 per page, 1-based, with meta.total carrying FLO's own count - 7,506 for spor-ayakkabi filtered to erkek, and 761 for the keyword 'nike'. category/products returns the same card shape as search, sizes and colors included, so a category crawl and a keyword crawl produce identical rows.
What is the FLO API?
FLO API is a ReefAPI endpoint group for flo It returns live JSON through POST requests under /flo/v1.
Is the FLO API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. FLO calls use the same shared credit balance as every other ReefAPI engine.
Do I need a FLO login or account?
No login to FLO 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 FLO 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 FLO API use?
FLO 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 FLO from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call flo actions with the same key, credit pool and JSON envelope used by normal REST requests.