How to use it: 3 steps
- Make a free Apify accountApify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
iphonein Search keywords. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
OLX Listings Scraper collects public listings from OLX in Poland, Ukraine, Kazakhstan, Portugal, Romania, Bulgaria and Uzbekistan by keyword, city, price or a pasted OLX category URL, and returns one clean row per listing with price, location, category, parameters, dates, photos and seller type.
- Keywords (
queries): one OLX search per keyword on the site you choose incountry. You can limit keyword searches bycity. - OLX URLs (
categoryUrls): paste any OLX results page. The category, city and filters from the page are kept.
Good for
- Track prices of used phones, laptops or cars in one or more countries.
- Build a list of apartments or cars in one city with price, area, year and mileage.
- Watch a search on a schedule and get only listings that appeared since the last run.
Not a good fit
- OLX Brazil (olx.com.br), OLX India and other non-listed OLX sites are not supported.
- No phone numbers, e-mails or names of private sellers. The Actor does not log in and does not open single listing pages.
- OLX shows at most about 1,000 listings per search. To get more, split the search by city, category or price range.
Who uses it
Resellers
Find cheap phones, laptops or cars and check prices fast.
Real estate researchers
List flats in one city with price and area.
Market analysts
Compare prices of the same item in several countries.
Price
Pay per event: you pay for each result the tool saves, plus a small start fee for each run. The price includes Apify platform costs. Apify bills you, not us. Prices below are for the Apify free plan.
| What you pay for | Price | When |
|---|---|---|
| Start fee | $0.01 | Charged once per run. This tool uses 1 GB of memory or less by default; more memory costs more. |
| Saved listing | $0.0007 (from $0.0006 on paid Apify plans) | One OLX listing saved to the default Dataset. A listing found by two searches in the same run is saved and charged once. |
Examples
- One listing: about $0.01.
- 1,000 listings: about $0.71.
- Every day 100 listings, for 30 days: about $2.40 a month.
Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed. That is enough for about 7,000 listings.
Prices checked on 24 October 2026. See the current price on Apify.
Questions
Which OLX sites can I use?
Poland, Ukraine, Kazakhstan, Portugal, Romania, Bulgaria and Uzbekistan. OLX Brazil and India are not supported.
Do I need a proxy or an OLX login?
No. The tool reads public search pages. If a request is blocked, it retries with Apify Proxy. The proxy is in the price.
Why do some ads have no price?
The seller wants an exchange or gave no price. Free items show a price of 0.
Can I get seller names and phones?
No phones or emails. A seller name is shown only for business sellers.
Why is price null for some listings?
The listing has no numeric price: it is for exchange (priceType: exchange) or the seller did not give a price. Free listings have price: 0.
Are the results complete and fresh?
Each row is what OLX showed at fetchedAt. OLX limits a search to about 1,000 listings, and paid listings can appear in several places. The Actor saves each listing once per run.
Can I search OLX Brazil or India?
No. Only olx.pl, olx.ua, olx.kz, olx.pt, olx.ro, olx.bg and olx.uz are supported.
Details
Step by step on Apify
- Open the Input tab.
- Keep Country =
pland Search keywords =iphone(the form prefill), or add your own keyword. - Keep Max listings per search =
20(prefill) for a first test. - Click Start.
- Open the Output tab → Listings and check
title,priceandcity.
Use cases
| Task | Input | You get | Key fields | Next step |
|---|---|---|---|---|
| Resell phones and electronics | queries, priceMax | listing | price, params, postedAt, url | Google Sheets or CSV |
| Car market analysis | categoryUrls (cars category) | listing | price, params (year, mileage, fuel), city | BI tool via API |
| Real estate in one city | categoryUrls or queries + city | listing | price, params (area, rooms), district, latitude | map or spreadsheet |
| Price comparison across countries | same keyword, different country | listing | price, currency, country | Dataset export |
| New listing alerts | onlyNew on a schedule | new listing | title, price, url, isNew | webhook, Slack or e-mail |
Tips for better results
- OLX shows about 1,000 ads per search. Split big searches by city, category or price.
- Paste an OLX category URL to keep the filters you set on the site.
- Schedule the run with only-new mode to get new ads as alerts.
Limits and good to know
- At most about 1,000 listings per search (OLX limit).
RUN_SUMMARY.searches[].totalAvailableshows how many OLX reports - Up to 50 keywords and URLs per run, of them at most 10 URLs (each URL search first loads the OLX page to read its filters). 5 searches × 1,000 listings (5,000 rows) were tested in one run
- The run stops new requests shortly before its timeout and keeps saved rows (
PARTIAL,TIME_LIMIT). The default timeout is 300 s; raise it for large runs - Search relevance is OLX's own: a keyword can return related items (for example cases and glass for
iphone). UsepriceMinor a category URL to narrow - OLX blurs coordinates:
latitudeandlongitudeare approximate
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"id": 1009568339,
"url": "https://www.olx.pl/d/oferta/szklo-hartowane-na-obiektyw-3mk-apple-iphone-15-plus-CID99-ID16k2Qj.html",
"title": "Szkło hartowane na obiektyw 3MK Apple iPhone 15 Plus",
"description": "Lens Protection Pro to szkło ochronne na obiektyw aparatu iPhone'a, które odznacza się naj…",
"price": 25,
"priceLabel": "25 zł",
"currency": "PLN",
"priceType": "price",
"negotiable": false,
"previousPrice": null,
"priceConverted": null,
"convertedCurrency": null,
"city": "Kraków",
"cityId": 8959,
"district": "Mistrzejowice",
"region": "Małopolskie",
"regionId": 4,
"latitude": 50.09557,
"longitude": 20.00366,
"locationRadiusKm": 7,
"categoryId": 2911,
"category": "Folie i szkła ochronne",
"categoryPath": "Elektronika > Telefony > Akcesoria > Folie i szkła ochronne",
"categoryType": "electronics",
"params": { "state": "Nowe", "type": "Szkło hartowane" },
"paramsDetailed": [{ "key": "state", "name": "Stan", "value": "Nowe", "valueKey": "new" }],
"postedAt": "2025-06-21T16:36:04+02:00",
"refreshedAt": "2026-10-14T16:23:01+02:00",
"pushedUpAt": null,
"validTo": "2026-11-13T15:36:05+01:00",
"photos": ["https://ireland.apollo.olxcdn.com/v1/files/tz6bc091m3xh2-PL/image;s=750x1000"],
"photoCount": 1,
"sellerType": "private",
"sellerName": null,
"sellerSince": "2016-01-24T18:22:06+01:00",
"isPromoted": false,
"isHighlighted": false,
"isUrgent": false,
"hasDelivery": true,
"offerType": "offer",
"status": "active",
"country": "pl",
"domain": "www.olx.pl",
"search": "iphone",
"searchUrl": "https://www.olx.pl/api/v1/offers/?offset=0&limit=40&query=iphone&sort_by=created_at%3Adesc",
"position": 4,
"isNew": null,
"source": "olx",
"fetchedAt": "2026-10-14T14:26:33.531Z"
}Use it from code
Actor ID: cliqtomedia/olx-listings-scraper. You need your Apify API token from Apify Console → Settings → API & Integrations.
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/olx-listings-scraper").call(run_input={
"country": "pl",
"queries": [
"iphone"
]
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~olx-listings-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"country": "pl", "queries": ["iphone"]}'# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool
tool = ApifyActorsTool("cliqtomedia/olx-listings-scraper")
result = tool.invoke({"run_input": {"country": "pl", "queries": ["iphone"]}})
print(result)The cURL call waits for the results, up to 300 seconds. For longer runs, start a run (/runs) and get the results with a webhook or by checking the run. Apify API docs. LlamaIndex, MCP for AI agents and the JavaScript client: AI agents & MCP.
Data fields (40)
| Field | Type | Meaning |
|---|---|---|
id | integer | OLX listing id. |
url | string | Listing page URL. |
title | string | Listing title. |
description | string | Description as plain text; null when includeDescription is off. |
price | number | Asking price as a number in currency. 0 = free. null = no numeric price (exchange or not given). |
priceLabel | string | Price as shown on OLX, e.g. "1 199 zł" or "Za darmo". |
currency | string | Price currency, e.g. PLN, UAH, KZT, EUR, RON, BGN, UZS; null when price is null. |
priceType | string | price, arranged (negotiable asking price), free or exchange. |
negotiable | boolean | true if the seller marked the price as negotiable. |
previousPrice | number | Earlier price when the seller lowered it; null otherwise. |
priceConverted | number | Price converted by OLX to a second currency when OLX shows one; null otherwise. |
convertedCurrency | string | Currency of priceConverted. |
city | string | City name. |
cityId | integer | OLX city id. |
district | string | District, when the seller gave one. |
region | string | Region (voivodeship, oblast, district) name. |
regionId | integer | OLX region id. |
latitude | number | Approximate latitude (OLX blurs the location within locationRadiusKm). |
longitude | number | Approximate longitude. |
locationRadiusKm | number | Blur radius of the coordinates in km. |
categoryId | integer | OLX category id. |
category | string | Leaf category name, e.g. iPhone or BMW. |
categoryPath | string | Full category path, e.g. Motoryzacja > Samochody osobowe > BMW. |
categoryType | string | OLX vertical: goods, automotive, real_estate, electronics, job and others. |
params | object | Listing parameters as key → value, e.g. model, year, milage, petrol, m (area), rooms. |
paramsDetailed | array | Same parameters with display name, value and machine value key. |
postedAt | string | When the listing was created (ISO 8601 with offset). |
refreshedAt | string | Last refresh or bump time. |
pushedUpAt | string | Last paid push-up time; null if never. |
validTo | string | When the listing expires. |
photos | array | Photo URLs in original size. |
photoCount | integer | Number of photos. |
sellerType | string | private or business. |
sellerId | integer | OLX seller id (to group listings by seller). |
sellerName | string | Business seller name; always null for private sellers. |
sellerSince | string | When the seller account was created. |
isPromoted | boolean | true for paid listings: promoted slots and OLX TOP ads shown among the results. |
isHighlighted | boolean | Paid highlight flag. |
isUrgent | boolean | Paid urgent flag. |
hasDelivery | boolean | true if OLX delivery is available. |
Input settings (11)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| Country (OLX site) | country | string | "pl" |
| Search keywords | queries | array | ["iphone"] |
| OLX category or search URLs | categoryUrls | array | |
| City (for keyword searches) | city | string | |
| Minimum price | priceMin | integer | |
| Maximum price | priceMax | integer | |
| Sort by | sortBy | string | "newest" |
| Max listings per search | maxItems | integer | 20 |
| Only new listings since the last run | onlyNew | boolean | false |
| Include description text | includeDescription | boolean | true |
| Include promoted listings | includePromoted | boolean | true |
