Dafiti API & Scraper
The Dafiti API turns Latin America's largest fashion marketplace into clean JSON in four actions.
🤖 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.
search takes a keyword and returns rows with sku, title, brand, colour, url, image, both prices, the struck-through list price, the discount, the category path, whether the tile was a paid placement and whether Dafiti itself is the seller; category walks a whole department by its URL path with the same filters; product returns one garment in full, adding the rating and review count, the attribute table, the images, the other colourways and the full size list; availability is the one built for clothing, returning size-level stock for up to 10 products in a single call, where each size carries its own variant code, whether it is buyable, how many units remain when Dafiti publishes that, and who ships it. Clothing is not one stock number: a shoe listed in 12 sizes is 12 separately buyable variants, and this API returns them one row per size instead of a single in-stock flag. Brazilian shops quote two prices side by side and this API keeps them apart: price_pix_brl is the cash price the storefront headlines and price_card_brl is what the same item costs on a card, exactly 10 percent higher wherever the cash discount applies, with list_price_brl holding the struck-through original and discount_pct computed from them. Those fields were checked against an independent read of the product page on 20 products: the selling price matched 20 of 20, the card price 14 of 14, the list price 14 of 14, and the size list and which sizes were buyable matched 14 of 14. Filters bite and the numbers are published: on tenis, 34,678 results unfiltered, 857 for Nike, 9,763 for the colour Preto, 14,135 in size 40, 4,615 sold by Dafiti itself, 9,783 with free shipping, 6,743 between 100 and 200 BRL, and combining Nike with Preto and size 40 narrows it to 104. Two storefronts are live, Brazil in BRL and Colombia in COP, and they differ in what they publish, which is documented rather than papered over. No Dafiti account needed - one ReefAPI key and the standard { ok, data, meta, error } envelope.
What each storefront publishes
Dafiti's Brazilian and Colombian storefronts are not the same site in two languages, and they do not publish the same fields. This is the measured difference, so you can decide before you build.
| Field | Brazil (br) | Colombia (co) |
|---|---|---|
| Currency | BRL | COP |
| Size-level availability | Yes - every size with its own variant code and buyable flag | Not published anywhere |
| Units remaining per size | Yes, up to 11; above that stock_at_least: 11 | Not published |
| Cash price vs card price | Both, in separate fields | One price |
| List price and discount | Yes, when the item is discounted | Yes, on 184 of 189 rows |
| Colour on search rows | 100% of rows | Not published (0 of 189) |
| Seller on search rows | sold_by_dafiti on every row | Not published (0 of 189) |
| Result total and last page | Yes - 34,678 results, 723 pages for tenis | Neither; page until a page is empty |
| Rating and review count | Yes, on product | Not published |
| availability action | Yes, up to 10 products per call | Refused, and says why |
Argentina and Chile are not options. Measured 2026-09-23: dafiti.com.ar now serves a fashion blog with no catalogue and dafiti.cl a farewell page announcing the store's closure, so country=ar and country=cl are rejected with that reason rather than returning an empty or irrelevant result.
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/dafiti/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"query": "tenis",
"country": "br"
}
}{
"ok": true,
"meta": {
"api": "dafiti",
"endpoint": "search",
"mode": "live",
"latency_ms": 1684,
"record_count": 59,
"bytes": 983218,
"cache_hit": false,
"stop_reason": "limit_reached",
"total_results": 34603,
"last_page": 721,
"country": "br",
"sponsored_count": 12,
"charged_credits": 3,
"version": "1.0.0"
},
"data": {
"products": [
{
"sku": "VI618SHF15ETK",
"title": "Tênis Feminino Vizzano Cadarço Branco",
"brand": "Vizzano",
"color": "Branco",
"sold_by_dafiti": true,
"seller": "Dafiti",
"seller_registered_name": "Dafiti",
"url": "https://www.dafiti.com.br/Tenis-Feminino-Vizzano-Cadarco-Branco-14960384.html",
"image": "https://static.dafiti.com.br/p/vizzano-tenis-feminino-vizzano-cadarco-branco-4710-48306941-still-product.jpg",
"price_pix_brl": 119.99,
"price_card_brl": 133.32,
"list_price_brl": 179.9,
"discount_pct": 33,
"discount_pct_source": 33,
"installments": "2x",
"category_path": [
"Calçados",
"Calçados Femininos",
"Tênis"
],
"sponsored": true,
"currency": "BRL"
},
{
"sku": "VI618SHF82LZD",
"title": "Tênis Feminino Vizzano Detalhe Metalizado Branco",
"brand": "Vizzano",
"color": "Branco",
"sold_by_dafiti": true,
"seller": "Dafiti",
"seller_registered_name": "Dafiti",
"url": "https://www.dafiti.com.br/Tenis-Feminino-Vizzano-Detalhe-Metalizado-Branco-15000417.html",
"image": "https://static.dafiti.com.br/p/vizzano-tenis-feminino-vizzano-detalhe-metalizado-branco-2022-71400051-still-product.jpg",
"price_pix_brl": 145.99,
"price_card_brl": 162.21,
"list_price_brl": 219.9,
"discount_pct": 34,
"discount_pct_source": 34,
"installments": "2x",
"category_path": [
"Calçados",
"Calçados Femininos",
"Tênis"
],
"sponsored": true,
"currency": "BRL"
},
{
"sku": "VI618SHF85EMW",
"title": "Tênis Feminino Vizzano Casual Bege",
"brand": "Vizzano",
"color": "Bege",
"sold_by_dafiti": true,
"seller": "Dafiti",
"seller_registered_name": "Dafiti",
"url": "https://www.dafiti.com.br/Tenis-Feminino-Vizzano-Casual-Bege-14960214.html",
"image": "https://static.dafiti.com.br/p/vizzano-tenis-feminino-vizzano-casual-bege-0503-41206941-still-product.jpg",
"price_pix_brl": 144.99,
"price_card_brl": 161.1,
"list_price_brl": 219.9,
"discount_pct": 34,
"discount_pct_source": 34,
"installments": "2x",
"category_path": [
"Calçados",
"Calçados Femininos",
"Tênis"
],
"sponsored": true,
"currency": "BRL"
}
],
"total_results": 34603,
"page": 1,
"last_page": 721,
"country": "br",
"currency": "BRL",
"facets": {
"genders": [
"Feminino",
"Masculino",
"Menina"
],
"categories": [
"Bolsas e Acessórios",
"Calçados",
"Esporte"
],
"sizes": [
"10",
"12",
"13"
],
"brands": [
"!ou",
"Acostamento",
"Acostamento Essentials"
],
"colors": [
"Amarelo",
"Azul",
"Azul Marinho"
],
"sellers": [
"10K Sports",
"Abreus Jeans",
"Acostamento Oficial"
]
},
"sponsored_count": 12,
"no_match": false,
"query": "tenis"
}
}What the Dafiti API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | Search Dafiti's fashion catalogue by keyword. Every row carries the brand, the colour, the seller, the cash price AND the struck-through list price, the discount, and whether the tile was a paid placement. A query that matches nothing returns an honest empty result rather than the padded grid the site shows in its place. | Pricing teams call search to search Dafiti's fashion catalogue by keyword. | query, country, page, sort, brand, ... |
| category | Browse a Dafiti category page (e.g. 'roupas-femininas/vestidos') with the same row shape and the same filters as search. Use it to walk a catalogue rather than guess keywords. | Marketplace operators call category to get browse a Dafiti category page (e.g. | category_path, country, page, sort, brand, ... |
| product | One product in full: prices (cash and card), the struck-through list price, the discount, brand, colour, marketplace seller, rating and review count, the attribute table, the images, the other colourways — and on br the full size list with a remaining-stock integer per size. | Catalog enrichment teams call product to get one product in full. | sku, country |
| availability | SIZE-LEVEL STOCK for up to 10 products in ONE call, from the storefront's own 3.7 KB JSON: per size, the variant SKU, whether it is buyable, how many units remain, and who ships it. Brazil only — the Colombian storefront publishes no stock anywhere. This is the cheap call: use it to re-check stock, and `product` only when you need the full record. | Retail analysts call availability to get sIZE-LEVEL STOCK for up to 10 products in ONE call, from the storefront's own 3.7 KB JSON. | skus, country |
Call search from your stack
curl -X POST https://api.reefapi.com/dafiti/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"tenis","country":"br"}'import requests
r = requests.post(
"https://api.reefapi.com/dafiti/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "tenis",
"country": "br"
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/dafiti/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "tenis",
"country": "br"
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.dafiti.search with {"query":"tenis","country":"br"}.Who uses this API and why
- Fashion price trackers store the cash price and the card price as separate series, so a card number never overwrites the headline price a shopper actually sees.
- Brands check size availability per colourway with availability, ten SKUs at a time, and see which sizes have sold out rather than whether the style is merely in stock.
- Marketplace sellers reprice against Dafiti and read sold_by_dafiti to tell Dafiti's own stock from a third party's before matching a price.
- Discount monitors watch list_price_brl against price_pix_brl to catch a real markdown, and ignore rows where the struck-through price equals the selling price.
- Apparel dataset builders walk categories in both Brazil and Colombia and get brand, colour, category path and images on every Brazilian row.
Questions developers ask before integrating
Does this really return stock per size, or just whether the product is in stock?
Per size. A shoe listed in 12 sizes comes back as 12 rows, each with its own variant code (for example KO992SHF67UFS-53 for size 35), an in_stock flag, the delivery type and the seller who ships it. sizes_in_stock and sizes_total sit next to the list, so on the sample product 5 of 7 sizes were buyable. The size names and which sizes were buyable were checked against the product page itself on 14 products and matched on 14 of 14. This is Brazil only; the Colombian storefront does not publish size names or stock at all, and says so instead of guessing.
Why is stock_qty sometimes null when the size is in stock?
Because Dafiti stops counting at 11. Measured across 478 size-variants on 59 products, every quantity it publishes is between 0 and 11 and 250 of them are exactly 11, so 11 means 'eleven or more', not eleven. When that happens you get stock_qty: null, stock_at_least: 11 and stock_capped: true; when Dafiti really does publish an exact figure, 0 through 10, it is in stock_qty. For the same reason stock_total is null whenever any size is capped and stock_total_at_least carries the lower bound - summing a ceiling would invent a number Dafiti never published.
Why are there two prices on every Brazilian product?
Because Brazilian shops quote two. price_pix_brl is the cash price the storefront headlines, price_card_brl is what the same item costs on a card, and wherever the cash discount applies the card price is exactly 10 percent higher - 144.43 against 129.99 on the sample product. list_price_brl holds the struck-through original (199.99) and discount_pct is computed from the prices, with the site's own badge kept separately in discount_pct_source so you can see if they ever disagree. Where a product has no cash discount the two prices are equal. All three were verified against the product page's own machine-readable values on 20 products with no mismatches.
Do the filters and sorts really apply?
Yes, and only the ones Dafiti applies are offered. Measured on tenis on 2026-09-23: 34,678 results unfiltered, 857 for Nike, 9,763 for the colour Preto, 14,135 in size 40, 4,615 sold by Dafiti itself, 9,783 with free shipping, 6,743 between 100 and 200 BRL, and combining Nike with Preto gives 219 and adding size 40 gives 104. Five sorts are offered - relevance, price_asc, price_desc, discount and newest - and each returns a different first row and a different price ladder. Dafiti also accepts a popularity order and then ignores it, returning the identical 20 products in the identical positions as the default, so that one is deliberately not offered here. Every search response also carries a facets block listing the brands, colours, sizes and sellers this particular query accepts, spelled the way the filter wants them, so you never have to guess.
What happens if my keyword matches nothing?
You get an empty result with no_match: true, not a page of unrelated products. This matters because Dafiti answers a keyword that matches nothing with a normal-looking page of 48 products it picked for you, and reports a result total for them. A search for a nonsense string returns zero rows here, and a real search is never mistaken for one.
Which countries can I query?
Brazil (br, BRL) and Colombia (co, COP). Those are the two storefronts that still trade. Dafiti is often listed as a four-country marketplace, but as of 2026-09-23 dafiti.com.ar serves a fashion blog with no catalogue and dafiti.cl serves a page announcing the Chilean store's closure, so country=ar and country=cl are rejected with that explanation. The two live storefronts publish different fields and the difference is documented in the table above rather than hidden behind an average.
Does the API tell me when Dafiti is not the seller?
Yes. Every Brazilian row carries sold_by_dafiti as a boolean, and product and availability return the seller Dafiti's own page credits for the item, such as adidas or Olympikus. Where an item is listed by an individual trader rather than a company, that person's registered personal name is withheld - Dafiti does not show it on the product page either - and you still get sold_by_dafiti: false so you know it is not first-party stock.
What does Dafiti NOT publish?
No review texts, only an average and a count, and only in Brazil. No seller ratings and no seller ids. No price or stock history. No size-level stock, no size names, no colour and no seller on search rows in Colombia, and no result total or last page there either. Sponsored placements are not hidden: they are returned as normal rows flagged sponsored, 13 of 58 on one tenis search, so you can drop them yourself if a ranking study needs to.
What is the Dafiti API?
Dafiti API is a ReefAPI endpoint group for latin america's biggest fashion marketplace: size-by-size availability, brand, colour, the discount against the list price and the marketplace seller. It returns live JSON through POST requests under /dafiti/v1.
Is the Dafiti API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. Dafiti calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Dafiti login or account?
No login to Dafiti 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 Dafiti 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 Dafiti API use?
Dafiti actions currently cost 1-3 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
Can I call Dafiti from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call dafiti actions with the same key, credit pool and JSON envelope used by normal REST requests.