Every listing, from every source, as one clean dataset.

qlever reads classifieds the way their own front ends do — the site's JSON, its embedded state, its structured data — turns them into one vocabulary of attributes, works out which listings describe the same real thing, and keeps the prices comparable across currencies.

Collected so far

690

listings archived from 4 sources across 2 countries, over 1h 18m of continuous collection.

690
live right now
690 first seen in the last 24 hours
875
real-world objects
0 of them advertised on more than one site
690
price observations
0 listings have moved their asking price
879
photographs stored
content-addressed, so one photo is stored once
3
cities covered
resolved against a gazetteer, not by string matching
30
result pages fetched
every one of them archived and replayable

New listings per day

0 375 750 Tue 1 Sep — 690 new listings 690 3 Aug18 Aug1 Sep
Show the numbers
DayNew listings
2026-08-030
2026-08-040
2026-08-050
2026-08-060
2026-08-070
2026-08-080
2026-08-090
2026-08-100
2026-08-110
2026-08-120
2026-08-130
2026-08-140
2026-08-150
2026-08-160
2026-08-170
2026-08-180
2026-08-190
2026-08-200
2026-08-210
2026-08-220
2026-08-230
2026-08-240
2026-08-250
2026-08-260
2026-08-270
2026-08-280
2026-08-290
2026-08-300
2026-08-310
2026-09-01690

How it works

Recipes, not scrapers

A source is a YAML file that names where each field lives — preferring the site's own JSON API, then its embedded state, then its structured data, and only then CSS selectors. Anything above CSS survives a redesign.

The archive is the artifact

Every listing points back at the bytes it came from. A field that stopped extracting is fixed by editing the recipe and replaying 30 archived documents — not by asking the source for them again.

One object, many adverts

The same apartment is posted by four agencies under three prices. Photo fingerprints, geography and attribute tolerances group those adverts into 875 objects, with every decision recorded and reviewable.

Prices you can compare

The published price is never rewritten — it is what the seller wrote. A second, derived amount is computed at the rate of the day the price was observed, so a listing's history does not move when the currency does.

Silence is measured

The characteristic failure of a scraper is a page that still returns 200 while its selectors match nothing. Fill rate is recorded per field per day, so a broken recipe shows up as a number rather than as a quiet gap in the data.

Polite by construction

robots.txt is honoured by default and the crawler identifies itself with an address you can write to. There is no fingerprint spoofing and no CAPTCHA solving: a refusal is a signal to back off, not an obstacle to defeat.

Sources

SiteMarketVertical Live listingsLast seen
olx.ua UA realestate 385 56m ago
dom.ria.com UA realestate 135 56m ago
rieltor.ua UA realestate 121 56m ago
lun.ua UA realestate 49 1h 22m ago

Where the inventory is

Medians over live listings with a comparable price. A “from” price — a whole development quoting its cheapest unit — is excluded, because it describes a building rather than an apartment.

CityCountryLive listings Median priceMedian area
Київ UA 638 $1,598 57 m²
с. Ходосівка UA 2 $57,950 66 m²
с. Крюківщина UA 1 $71,000 45 m²

What is on offer

DealLive listingsShare
unclassified 506
73%
for sale 117
17%
long-term rent 67
10%