API

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 в момент вызова.