API

Bazoš API: inzeráty z bazos.cz jako JSON

Inzeráty z Bazoše tu dostanete ve stejném rozsahu, jaký vidí nepřihlášený návštěvník: titulek, cenu v Kč, lokalitu s PSČ, počet zobrazení, datum vložení, fotky a celý text inzerátu. Hledat se dá v celém Bazoši, v jedné rubrice (auto, deti, reality, mobil…) i v podrubrice, a hlavně v okruhu kolem PSČ: tedy „kočárek do 25 km od Brna“, ne kočárky z celé republiky. Nejde o nástroj na hromadné vkládání ani správu vlastních inzerátů (moje inzeráty): čte se jen to, co je na Bazoši veřejně vidět. Slovenský bazos.sk obslouží stejný engine s `market: "sk"`, s cenami v eurech.

Endpointy

endpointCo se vracíPovinné
searchHledání podle slova a/nebo rubriky, s podrubrikou, okruhem kolem PSČ, cenovým rozmezím, pěti řazeními (nejnovější, cena vzestupně a sestupně, nejvíc a nejméně zobrazení) a stránkováním po 20 inzerátech. Placené TOP inzeráty zůstávají tam, kam je Bazoš dal, a mají `promoted: true`. Musí být zadáno slovo nebo rubrika.vše volitelné
listingCelý inzerát: titulek, kompletní popis, cena, lokalita, počet zobrazení, datum vložení, drobečková navigace a všechny fotky. Stačí adresa inzerátu z `search`; jinak `listing_id` spolu s rubrikou, protože na Bazoši je rubrika součástí adresy.vše volitelné
categoriesStrom rubrik pro daný trh: bez parametru 20 rubrik s aktuálními počty inzerátů, s `category` podrubriky dané rubriky. Český a slovenský Bazoš používají jiné názvy (dum / dom, zvirata / zvierata), proto `categories` volejte vždy pro ten trh, na kterém hledáte.vše volitelné

Každé volání se účtuje v kreditech. Neúspěšná a blokovaná volání jsou zdarma.

Funkční příklad

Okruh 25 km kolem PSČ 602 00 (Brno) zúžil výsledky hledání „kočárek“ z 8 724 na 666. Engine k tomu pošle i stejný dotaz bez PSČ a obě čísla vrátí ve `filters_verified`. Důvod: neznámé PSČ Bazoš bez varování přeskočí a vrátí celou republiku, takže filtr je potřeba ověřit. Prvních 6 řádků z 20 tvoří placené TOP inzeráty (`promoted_label` „TOP 5x Platí do 13.11. 2026“). Do průměrné ceny je buď započítejte vědomě, nebo je vyřaďte.

Požadavek
curl -X POST https://api.reefapi.com/bazos/v1/search \
  -H "x-api-key: VAS_KLIC" \
  -H "content-type: application/json" \
  -d '{"market": "cz", "query": "kočárek", "postal_code": "60200", "radius_km": 25}'
Odpověď (zkrácená)
{
  "ok": true,
  "data": {
    "market": "cz",
    "currency": "CZK",
    "query": "kočárek",
    "sort": "newest",
    "total_results": 666,
    "page": 1,
    "page_size": 20,
    "has_more": true,
    "listings": [
      {
        "listing_id": "225312502",
        "url": "https://deti.bazos.cz/inzerat/225312502/kocarek-cybex.php",
        "title": "Kočárek CYBEX Priam",
        "price": 17500,
        "price_currency": "CZK",
        "price_kind": "fixed",
        "price_text": "17 500 Kč",
        "locality": "Vyškov",
        "postal_code": "684 01",
        "views": 437,
        "posted_date": "2026-10-24",
        "promoted": true,
        "promoted_label": "TOP 5x Platí do 13.11. 2026",
        "category": "deti"
      },
      ...
      {
        "listing_id": "225510171",
        "url": "https://deti.bazos.cz/inzerat/225510171/inglesina-aptica-xt.php",
        "title": "Inglesina Aptica XT",
        "description_excerpt": "Prodám kočárek značky Inglesina Aptica XT zakoupený v březnu 2023, po jednom dítěti. ...",
        "price": 12500,
        "price_currency": "CZK",
        "price_kind": "fixed",
        "price_text": "12 500 Kč",
        "locality": "Brno",
        "postal_code": "639 00",
        "views": 11,
        "posted_date": "2026-10-24",
        "promoted": false,
        "promoted_label": null,
        "category": "deti"
      },
      ...
    ]
  },
  "meta": {
    "record_count": 20,
    "promoted_count": 6,
    "sort_drops_unpriced_ads": false,
    "filters_verified": { "postal_code": { "control_total": 8724, "filtered_total": 666, "applied": true } },
    "next_page": 2,
    "cache_hit": false,
    "mode": "live"
  }
}

Scraping Bazoše: co stránka neřekne sama

Bazoš je obyčejné HTML a na ochranu proti robotům jsme při stavbě enginu nenarazili, takže první scraper vznikne rychle. Potíž je v tom, co stránka zamlčí. Neexistující PSČ se bez varování ignoruje: dotaz s PSČ 99999 vrátil 7 041 výsledků, přesně tolik jako bez PSČ. Řazení na adrese search.php s konkrétní rubrikou se zahodí: tři různé hodnoty `order` vrátily bajt po bajtu stejnou stránku jako dotaz bez řazení. A podrubrika, kterou Bazoš nezná, vrátí celou rubriku s kódem 200.

Stavové kódy u inzerátů platí obráceně. Smazaný inzerát odpoví HTTP 200 s větou „Inzerát byl vymazán.“ a mřížkou úplně jiných inzerátů. Živý inzerát s chybným slugem v adrese naopak vrátí 404 a přitom celý správný obsah. Kdo věří stavovému kódu, uloží místo smazaného inzerátu třeba cizí chytré hodinky z doporučené mřížky a platný inzerát zahodí.

Engine proto rozhoduje podle textu stránky, ne podle kódu: smazaný inzerát vrací NOT_FOUND, neznámé PSČ, podrubrika nebo řazení INVALID_PARAM (u podrubriky i se seznamem platných). Na jedno hledání stačí prohlížeč. Pokud ale chcete týden co týden sledovat ceny v rubrice, právě tyhle tiché odchylky rozhodují, jestli se na čísla dá spolehnout.

Omezení a poctivé poznámky

  • Jde o neoficiální přístup: Bazoš za ním nestojí a nemáme s ním uzavřenou žádnou dohodu.
  • Telefon prodejce engine nikdy nenačítá. Běžně zapsaná telefonní čísla a e-maily, které prodejce napíše do popisu, se v každé odpovědi nahrazují značkou „[phone removed]“ nebo „[email removed]“. Z údajů o prodejci se vrací jen veřejně zobrazené jméno.
  • Cena napsaná slovem není nula: „Dohodou“, „Nabídněte“ a „V textu“ vrací `price: null` s původním textem v `price_text`; „Zdarma“ je 0 s `price_kind: "free"`. Řazení podle ceny takové inzeráty vyřadí (to dělá sám Bazoš) a celkový počet se zmenší; `meta.sort_drops_unpriced_ads` to oznámí.
  • Bazoš nemá pole pro stav zboží, dopravu ani hodnocení prodejce, takže je nevracíme. Desetinné ceny Bazoš nezná.
  • Řádky z hledání napříč Bazošem nesou jen rubriku (je součástí adresy), ne podrubriku. Podrubriku zjistíte z drobečkové navigace v `listing`.
  • Stránkovat jde nejvýš do 500. stránky: dál Bazoš sice odpovídá, ale jen opakuje konec výpisu.
  • Odkaz na inzerát zestárne, jakmile ho prodejce smaže. Pak `listing` vrátí NOT_FOUND.