OLX.kz API: объявления Казахстана в JSON
Открытого API для чтения объявлений у OLX.kz нет. Здесь вы получаете то, что сайт показывает без входа в аккаунт: объявления, цены в тенге, город и район, профиль продавца — сразу в виде JSON. Это не интеграция для продавцов, через которую публикуют и продвигают свои объявления, а данные со стороны покупателя. Казахстан выбирается параметром `"country": "kz"`: каждая страна OLX — отдельная площадка, и без него запрос уйдёт на olx.pl.
Эндпоинты
| endpoint | Что возвращает | Обязательные |
|---|---|---|
| search | Поиск по ключевому слову и/или категории: сортировка, состояние (новое или б/у), цена в тенге, доставка, город и район. Платные объявления, вставленные в выдачу, отфильтровываются. Нужен query или category_id. | все необязательные |
| count | Только число объявлений по запросу и фильтрам, без самих объявлений: полное количество и сколько из него OLX даёт пролистать. | все необязательные |
| locations | Перевод названия в id для фильтров: «Алматы» → city_id 1. Без параметров — все регионы, с region_id — города региона, с city_id — районы города. | все необязательные |
| offer | Полная карточка объявления по числовому id: цена, состояние, фото, адрес, продавец, характеристики. | id |
| categories | Категории и подсказки фильтров по запросу, плюс общие определения фильтров. | все необязательные |
| filters | Определения фильтров площадки с ключами filter_enum и filter_float — их можно передать в параметр `filters`. | все необязательные |
| user | Публичный профиль продавца. | user_id |
| user_offers | Все активные объявления одного продавца, постранично через offset. | user_id |
| suggested | Похожие объявления, которые OLX показывает рядом с данным. | id |
| breadcrumbs | Цепочка категорий для категории или конкретного объявления. | все необязательные |
Каждый вызов тарифицируется в кредитах. Неудачные и заблокированные вызовы бесплатны.
Рабочий пример
Поле price — объект, а не число. У объявлений с обменом в нём `"value": 0` и `"type": "exchange"`: если считать среднюю цену по выдаче, такие строки надо отсеять по `type`, иначе обмен утянет среднее вниз. В этой выдаче по Алматы их было 2 из 40. А если продавец снизил цену, прежняя остаётся в `previous_value`.
curl -X POST https://api.reefapi.com/olx/v1/search \
-H "x-api-key: ВАШ_КЛЮЧ" \
-H "content-type: application/json" \
-d '{"query": "iphone 15", "country": "kz", "city_id": 1}'{
"ok": true,
"data": {
"offers": [
{
"id": 402188327,
"title": "Iphone 15 базовый 256гб",
"price": {
"value": 150000,
"type": "price",
"currency": "KZT",
"negotiable": true,
"previous_value": 160000,
"label": "150 000 тг.",
"previous_label": "160 000 тг."
},
"condition": { "key": "used", "label": "Б/у" },
"city": "Алматы",
"district": "Алмалинский район"
},
{
"id": 399993186,
"title": "Обменяю Iphone 15 256 gb blue",
"price": { "value": 0, "type": "exchange", "currency": "KZT", "label": "Обмен" },
"city": "Алматы",
"district": "Турксибский район"
},
...
],
"total": 1000,
"has_more": true,
"next_offset": 40
},
"meta": { "record_count": 40, "country": "kz", "promoted_filtered": 12, "cache_hit": false, "mode": "live" }
}Парсер OLX.kz своими руками: где он спотыкается
Первое — потолок выдачи. По запросу «iphone 15» в Алматы `count` показал 1264 объявления, а пролистать OLX даёт только первые 1000. Самописный парсер дойдёт до тысячи и решит, что собрал всё. Здесь `count` возвращает оба числа, и сразу видно, сколько осталось за пределами: тогда запрос сужают по району или цене.
Второе — платные объявления внутри выдачи. В нашем запросе их было 12 на странице. Движок убирает их по пометкам самого OLX, а `meta.promoted_filtered` показывает, сколько строк убрано.
Третье — пустой ответ. Поиск по точной строке вроде «Gainward NE6406T019P1-1060E 8 Гб» на olx.kz когда-то возвращал у нас ошибку, хотя объявлений просто не было. Теперь движок сверяется с числом, которое сообщает сам OLX: ноль — это честный пустой результат, а пустая страница при ненулевом счётчике — признак поломки, и её мы не выдаём за «ничего не найдено».
Разовую выгрузку на вечер свой скрипт на Python вытянет. Если же мониторинг цен должен работать каждый день, время уходит не на сам код, а на такие мелочи.
Ограничения и честные замечания
- Это не официальный API OLX, и партнёрства с OLX у нас нет.
- Через поиск доступны первые 1000 объявлений по запросу — это ограничение OLX. Полное число показывает `count`.
- Номер телефона OLX без входа в аккаунт не показывает, поэтому в ответе его нет; поле `contact.phone` говорит лишь о том, указал ли продавец телефон.
- У объявлений с обменом цена приходит как 0 с `type: "exchange"` — это не бесплатная вещь.
- Ответы не кэшируются: данные забираются с OLX.kz в момент вызова.