Commercial product. This repository hosts the public surface — README, API docs, configuration scaffolding. Parser internals and operational pieces are proprietary.
RentScout is a FastAPI service that aggregates Russian rental and short-term-stay listings from Avito, Cian, Yandex Travel, Sutochno, Ostrovok, Otello, and Tvil into a single normalized API. It is built for back-office tooling, market research, and client-facing rental dashboards that need one schema across many sources.
Each rental platform exposes a different schema, different filter vocabulary, and different anti-bot posture. Stitching them together inside a downstream app means writing seven adapters, seven cache strategies, and seven bug surfaces. RentScout collapses that into one HTTP API: same query, same response shape, same SLA assumptions.
- API — FastAPI receives a search query (geo, dates, price band, room count, source filter).
- Search service plans which parsers to run in parallel and merges their results.
- Parsers — per-source modules (
app/parsers/<source>) for Avito, Cian, Yandex Travel, Sutochno, Ostrovok, Otello, Tvil. - Cache — Redis-backed layer keyed by query fingerprint to absorb repeat traffic.
- Filter service applies post-fetch normalization and dedupes near-identical listings.
- Storage — SQLAlchemy + Alembic schema for persistent listings, run history, and audit.
- Telegram bot (optional) exposes the same data to operators for alerts and ad-hoc queries.
See docs/architecture.svg and docs/API.md.
| Layer | Tools |
|---|---|
| API | FastAPI, Uvicorn |
| Async parsing | httpx, asyncio |
| HTML | lxml / BeautifulSoup |
| DB | PostgreSQL + SQLAlchemy + Alembic |
| Cache | Redis |
| Tasks | APScheduler / background tasks |
| Bot | aiogram (operator interface) |
| Deploy | Docker, docker-compose |
| Method | Path | Description |
|---|---|---|
GET |
/health |
liveness |
GET |
/v1/search |
unified search across configured sources |
GET |
/v1/sources |
enabled parsers and their capabilities |
GET |
/v1/listing/{id} |
single normalized listing |
Full reference: docs/API.md.
| Platform | Type | Coverage |
|---|---|---|
| Avito | Long-term & short-term | Russia-wide |
| Cian | Long-term rentals | Major cities |
| Yandex Travel | Short-term stays | Hotels & apartments |
| Sutochno | Short-term stays | Russia & CIS |
| Ostrovok | Short-term stays | Russia-focused |
| Otello | Short-term stays | Russia-focused |
| Tvil | Short-term stays | Russia-focused |
{
"listings": [
{
"id": "avito-284719",
"source": "avito",
"title": "2-room apartment, 58 m², 7/12 floor",
"price": { "value": 45000, "currency": "RUB", "period": "month" },
"location": { "city": "Moscow", "district": "Presnensky", "lat": 55.76, "lng": 37.57 },
"rooms": 2,
"area_m2": 58,
"url": "https://avito.ru/...",
"posted_at": "2025-11-02T14:30:00Z"
}
],
"meta": { "total": 142, "sources_queried": ["avito", "cian"], "cached": false }
}- Public repo is not a runnable product. Some directories (
app/,docker/,scripts/) hold scaffolding; production parsers and ops live elsewhere. - Source platforms change HTML and anti-bot defenses frequently — production maintenance is a paid service, not a community one.
- Geo coverage is Russia-centric; international rentals are not in scope.
- Rate, freshness, and uptime targets are negotiated per deployment; no public SLA.
- Some parsers depend on residential-quality proxies; without them, request success drops sharply.
Commercial inquiries, integrations, custom parsers: creatmanick@gmail.com · creatman.site.
EOF