OLX Scraper — Listings, Prices & Sellers | $4/1K avatar

OLX Scraper — Listings, Prices & Sellers | $4/1K

Pricing

from $3.88 / 1,000 listings

Go to Apify Store
OLX Scraper — Listings, Prices & Sellers | $4/1K

OLX Scraper — Listings, Prices & Sellers | $4/1K

Scrape OLX listings via its public internal API. Get titles, prices, seller locations and listing URLs. Run with searchQuery; no OLX login or buyer-supplied API key needed. Pricing: $0.004/listing on Free, plus $0.00005 per Actor Start.

Pricing

from $3.88 / 1,000 listings

Rating

0.0

(0)

Developer

Vitalii Bondarev

Vitalii Bondarev

Maintained by Community

Actor stats

0

Bookmarked

43

Total users

6

Monthly active users

5 days ago

Last modified

Features

Limited permissions

Share

OLX Listings Scraper

Scrape OLX classified listings by keyword from the OLX public internal API on olx.pl, olx.ua, olx.bg, olx.ro and olx.pt, with no OLX login. On the Free plan, pricing is $0.004 per listing plus a $0.00005 Actor Start event.

  • Extract titles, descriptions, prices, currencies, locations, photos and canonical URLs.
  • Compare classified prices and locations across OLX country domains.
  • Review cars, electronics and real-estate listings for arbitrage research.
  • Collect seller IDs, names, category IDs and timestamps for lead-generation workflows.

What you get

Fields are null when OLX omits them; negotiable and delivery_available default to false, photos and warnings are empty arrays, and domain and parse_confidence are always set.

FieldTypeDescription
offer_idintegerNumeric OLX offer ID; null if absent.
titlestringListing title; null if absent.
descriptionstringHTML-free description; null if absent or empty.
pricenumberNumeric price; null if absent.
currencystringListing currency; null if absent.
negotiablebooleanWhether the price is negotiable; false if no flag or price parameter is provided.
citystringListing city; null if absent.
regionstringListing region; null if absent.
category_idintegerOLX category ID; null if absent. Output only; no category filter.
seller_idintegerOLX seller ID; null if absent.
seller_namestringSeller display name; null if absent.
seller_last_seenISO 8601 stringSeller last-seen timestamp; null if absent.
urlstringCanonical listing URL; null if absent.
photo_urlstringFirst photo at 400×400; null if unavailable.
photosarray of stringsAll photos at 400×400; empty if unavailable.
created_timeISO 8601 stringListing creation time; null if absent.
last_refresh_timeISO 8601 stringLast refresh time; null if absent.
delivery_availablebooleanWhether OLX Delivery (Rock) is active; false unless active.
domainstringOLX domain used; always set.
parse_confidencenumberNumber from 0 to 1: 1 minus deductions, clamped to 0–1.
warningsarray of stringsQuality codes; empty if none. Codes: offer_id_missing, title_missing, price_missing, currency_missing, city_missing, url_missing, photo_missing.
CodeDeductionLine
offer_id_missing0.5src/normalize.py:130
title_missing0.2src/normalize.py:134
price_missing0.2src/normalize.py:158
currency_missing0.05src/normalize.py:160
city_missing0.05src/normalize.py:169
url_missing0.1src/normalize.py:184
photo_missing0.05src/normalize.py:194

Sample output

Example row for the keyword nike on olx.pl.

{
"offer_id": 1102683547,
"title": "Nike shox czarne",
"description": "Nike Shox – czarne, nowe Sprzedam nowe, nieużywane buty Nike Shox w kolorze czarnym. Sportowy model z charakterystyczną podeszwą Shox. Buty nigdy nie były noszone. Rozmiar: 45 Stan: nowe Kolor: czarny Cena: 349 zł Możliwa wysyłka Paczkomatem InPost po wcześniejszym opłaceniu. Możliwy również odbiór osobisty. Brak pudełka",
"price": 299, "currency": "PLN",
"negotiable": false, "city": "Jaworze",
"region": "Śląskie", "category_id": 2961,
"seller_id": 980297664, "seller_name": "Piotr",
"seller_last_seen": "2026-10-10T21:35:36+02:00",
"url": "https://www.olx.pl/d/oferta/nike-shox-czarne-CID87-ID1cCKmw.html",
"photo_url": "https://ireland.apollo.olxcdn.com:443/v1/files/oa1gn3i8f6op-PL/image;s=400x400",
"photos": ["https://ireland.apollo.olxcdn.com:443/v1/files/oa1gn3i8f6op-PL/image;s=400x400", "https://ireland.apollo.olxcdn.com:443/v1/files/zej93z5rg7s3-PL/image;s=400x400", "https://ireland.apollo.olxcdn.com:443/v1/files/who3vj2ojtxt2-PL/image;s=400x400", "https://ireland.apollo.olxcdn.com:443/v1/files/88zct9vc317r2-PL/image;s=400x400"],
"created_time": "2026-10-04T19:07:02+02:00",
"last_refresh_time": "2026-10-13T21:37:02+02:00",
"delivery_available": true, "domain": "olx.pl",
"parse_confidence": 1, "warnings": []
}

price is the structured OLX price. description is the seller's text and can quote a different price, as Cena: 349 zł does here.

Pricing

Pricing is pay per event:

PlanEventPrice per event
Free planapify-actor-start$0.000050
Free planapify-default-dataset-item$0.004000

apify-actor-start is charged once per GB of run memory, with a minimum of one event. apify-default-dataset-item represents one OLX listing. The listing-item event has no price, so the buyer is not charged for it.

Worked example: 100 results = $0.40005 on Free: 100 × $0.004000 plus $0.000050.

On Free, 1,000 listing events = 1,000 × $0.004000 + $0.000050 = $4.00005, and 10,000 listing events = 10,000 × $0.004000 + $0.000050 = $40.00005.

The Apify Free plan includes $5 of monthly platform usage credit. The Free plan's $5 credit covers 1 full run (1,249 listing events) when the run uses the minimum one Actor Start event.

You pay only for the events listed above. This Actor does not use the Pay per event + usage option, so compute, proxy traffic and storage are not billed separately.

How to use

  1. Enter the required searchQuery, such as nike, iphone 13 or laptop.
  2. Set domain to olx.pl, olx.ua, olx.bg, olx.ro or olx.pt.
  3. Choose maxItems; set 0 to read pages until OLX returns no more. The Actor stops on an empty page, a page containing only repeated listings, or no next page. OLX caps search results at 1,000 per query.
  4. Add minPrice or maxPrice for client-side filtering in the listing's local currency. Use 0 to disable a boundary. minPrice excludes listings without a price; maxPrice keeps them.
  5. Run the Actor and inspect fields such as price, currency, photos, seller_name, delivery_available, parse_confidence and warnings.
  6. Schedule repeat runs through Apify Schedules; daily is a practical starting point for listing and price monitoring.

Example input:

{
"searchQuery": "nike",
"domain": "olx.pl",
"maxItems": 100,
"minPrice": 0,
"maxPrice": 0
}

Export the dataset as JSON or CSV, or read it through the Apify dataset API.

Input parameters

ParameterWhat it doesDefault
searchQueryRequired keyword or keywords sent to OLX. Blank input ends the run without rows.Required
domainOLX domain to search.olx.pl
maxItemsMaximum listings; 0 means no Actor-level limit.100
minPriceRemoves listings below this local-currency value and listings without a price; 0 disables it.0
maxPriceRemoves listings above this local-currency value; keeps listings without a price; 0 disables it.0
proxyConfigurationOptional Apify proxy for OLX requests; failed setup does not stop the run.Not set
disableUsageStatsSet to true to turn off the run summary described in Usage statistics.false

Limits and edge cases

For applicable rows, OUTPUT contains totalItems, failedCount, query, domain and scrapedAt. For a blank searchQuery, it contains only error.

ConditionWhat you seeWhat to do
A query has more than 1,000 OLX resultsAt most 1,000 listings.Use narrower or multiple searches.
A price filter is used with non-zero maxItemsThe Actor reads at most 3 × maxItems listings before filtering, so fewer than maxItems rows may result. With maxItems at 0, there is no scan cap.Raise maxItems or narrow the keyword.
OLX returns no listings for the keywordEmpty dataset and a Succeeded run. The status message and log warning give the reason; OUTPUT contains the zero-item summary.Use a broader or local-language keyword and the matching domain.
minPrice or maxPrice removes every listingEmpty dataset, Succeeded run, status message and OUTPUT summary.Widen or clear the range.
searchQuery is missing or blankNo rows; Succeeded run; OUTPUT is {"error": "searchQuery_required"}.Enter a keyword and run again.
OLX blocks or rejects a requestHTTP 429, HTTP 5xx and network errors are tried 3 times total, waiting 2 s and 4 s between attempts. Other errors such as 403, 404 or 400 stop immediately. If no rows were pushed, the run still ends Succeeded; OUTPUT shows totalItems 0 and failedCount 1.Run later; for 403 add proxyConfiguration.
A later page fails after earlier pages were fetchedEarlier listings are pushed; the error is logged, failedCount is 1, and no status message is set when at least one row was returned.Review returned rows and run again.
An abort, timeout or crash occursDuring fetching, pages are fetched before rows are pushed, so the dataset stays empty and no OUTPUT summary is written. During pushing, already-pushed batches remain.Run again; a lower maxItems means fewer pages before pushing.
Promoted listings repeat across pagesRepeated offer IDs are removed during pagination.Use offer_id for downstream checks.

FAQ

How much does it cost to scrape OLX listings?

On the Free plan, listings cost $0.004 each and the Actor Start event costs $0.000050. 100 results = $0.40005 on Free.

Why are no OLX listings returned?

The query may have no matches, use the wrong language for the domain, or be removed by price filters. Check the status message and OUTPUT, then broaden the keyword or price range.

Do I need an OLX login or proxy?

No OLX login is required, and the public API works from Apify cloud IPs without a proxy. An optional proxyConfiguration is available if you observe a 403 response.

Why use this instead of the official OLX API?

This Actor uses the OLX public internal API and converts responses into flat dataset rows. It handles pagination, repeated offer IDs, 400×400 photos and client-side price filters.

The Actor accesses OLX public data. Whether a use is legal or allowed depends on the source terms and applicable law for your use case; review those requirements before using the data.

Usage statistics

This Actor creates a small, content-free summary at the end of each run, used only to monitor reliability and improve this Actor. No input values, credentials or scraped data are sent.

A copy of the exact record for your run is saved as USAGE_STATS in your own Apify key-value store.

To opt out, set disableUsageStats to true in the input. Nothing is sent then.

Full list of collected fields

⌂ 换网址