OLX Public Classified Listing Scraper
Pricing
from $2.99 / 1,000 listings
OLX Public Classified Listing Scraper
Collects public OLX classified listings through a built-in OLX India search mode or supplied public search, category, and ad URLs. Optional deep scraping adds descriptions, sellers, locations, images, phones, and specifications.
Pricing
from $2.99 / 1,000 listings
Rating
0.0
(0)
Developer
w3crawler
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
2
Monthly active users
5 days ago
Last modified
Categories
Security
Limited permissionsShare
OLX Public Classified Listing Scraper collects classified listings exposed on public OLX country sites. It can build a keyword search for a selected country, crawl a supplied public search or category URL, or inspect supplied public listing URLs. Optional deep scraping follows search results to collect public detail fields such as description, seller, location, images, phone, and specifications.
Get started
- Open the Actor Store page and select Try for free or open the Input tab.
- Choose a
mode. Forsearch, setsearchQueryandcountryCode. ForsearchUrl,categoryUrl, oradUrl, supply the matching public URL field; the country is inferred from the URL. - Keep
maxItemsandmaxPagessmall for the first run. EnabledeepScrapingonly if you need seller and description detail. - Start the Actor, open the dataset, and export the saved records as JSON, CSV, or Excel. Open Run summary (
OUTPUT) to check the outcome and counts. A blocked run contains arun_diagnosticrow anddataAvailable: false.
Input
All fields are optional, but the selected mode needs its matching target. Unsupported field names and out-of-range values are rejected before requests start.
| Field | Type | Required? | Default | Meaning |
|---|---|---|---|---|
mode | string enum | Optional | search | Input type: search, adUrl, searchUrl, or categoryUrl. |
searchQuery | string | Optional | iphone | Search term for built-in search mode; combined with countryCode. Use a search URL for a custom market view. |
countryCode | string enum | Optional | IN | Two-letter country code used by built-in search mode to select the OLX country site. URL modes infer the country from the URL. |
adUrls | string array | Optional | Not supplied | Public listing URLs from supported OLX country sites. up to 100 items. |
searchUrl | string | Optional | Not supplied | Full public OLX country search URL. 1–2000 characters. |
categoryUrl | string | Optional | Not supplied | Full public OLX country category URL. 1–2000 characters. |
maxItems | integer | Optional | 50 | Maximum number of items to scrape. 1–100. |
deepScraping | boolean | Optional | false | Enable deep scraping to extract detailed ad information including seller info, description, location, etc. |
proxyConfiguration | object | Optional | {"useApifyProxy":false} | Optional standard Apify Proxy configuration. Direct access is the default; credentials are resolved by the SDK and never written to logs or records. |
maxPages | integer | Optional | 5 | Safety cap on public search/category pages. 1–10. |
timeoutMs | integer | Optional | 30000 | Maximum time to wait for each public response. 5000–60000. |
maxBytes | integer | Optional | 5000000 | Safety limit for each public response. 1000–10000000. |
requestDelayMs | integer | Optional | 250 | Optional bounded delay between public requests. |
maxRequestRetries | integer | Optional | 1 | Retry budget for transient public-request failures. 0–3. |
fixturePath | string | Optional | Not supplied | Optional checked-in relative fixture for local validation; it never replaces a failed live request unless explicitly supplied. up to 260 characters. |
countryCode accepts IN, PL, UA, BR, PK, ID, AR, TR, PT, KZ, RO, BG, BA, UZ, LK, PH, KE, ZA, EG, NG, GH, TN, MA, or DZ.
Full default input:
{"mode": "search","searchQuery": "iphone","countryCode": "IN","maxItems": 50,"deepScraping": false,"proxyConfiguration": {"useApifyProxy": false},"maxPages": 5,"timeoutMs": 30000,"maxBytes": 5000000,"requestDelayMs": 250,"maxRequestRetries": 1}
The Actor reads public data from OLX. proxyConfiguration uses the standard Apify Proxy settings. fixturePath is for the Actor's offline QA only and should be left empty for live runs.
Output
The dataset contains one listing row per unique public ad. When OLX blocks a search, category, or listing page, it contains a structured run_diagnostic row with dataAvailable: false instead. The 2026-10-25 saved run returned one such row for an OLX India search that answered HTTP 403; no live listing was saved. Listing fields such as title, price, seller, and phone are available only on normal rows and are not evidenced by that run.
| Field | Type | Availability | Meaning |
|---|---|---|---|
recordType | string enum | Always | olx-global-listing for a listing row or run_diagnostic for a run outcome. |
targetType | string enum | Always | Always olx-listing. |
id | string | Always | Listing ID, or diagnostic:<errorCode>:<url> on a diagnostic row. |
source | string | Always | Source label, olx-global. |
dataAvailable | boolean | Always | True only when usable public listing data is present. |
verified | boolean | On listing rows | True when the row came from an observed public OLX listing source. |
verificationStatus | string | On listing rows | public_listing for a normal listing row. |
accessStatus | string | Always | public_page for a listing, access_boundary for a blocked response. |
sourceBlocked | boolean | Always | Whether the public request hit an access boundary. |
transport | string enum | Always | http for live requests or fixture for a QA fixture. |
sourceTransport | string enum | Always | Transport that supplied the row; http or fixture. |
proxyUsed | boolean | Always | Whether Apify Proxy routing was used. |
requestUrl | string | Always | Public URL requested for the row. |
finalUrl | string | Always | Final public URL observed after redirects. |
httpStatus | integer | Always | HTTP status observed for the request. |
pageType | string | Always | Public page type, such as search, category, or detail. |
sourceType | string enum | On diagnostic rows | diagnostic marker. |
listingId | string | On listing rows | Public listing identifier. |
title | string | On listing rows | Listing headline. |
price | string | On listing rows | Displayed price text when the listing shows a price. |
priceAmount | number | When a numeric price is published | Parsed price amount. |
currency | string | When a price is published | Currency for the parsed amount. |
description | string | When deepScraping is enabled and published | Public listing description. |
location | string | On listing rows | Public locality or seller area. |
date | string | When published | Listing date label from the source. |
seller | string | When deepScraping is enabled and published | Public seller label. |
phone | string | When deepScraping is enabled and published | Public phone value on the listing. |
posted | string | When published | Raw posted-date text from the source. |
url | string | Always | Public listing URL, or the blocked source URL on a diagnostic row. |
image | string | When published | Lead image URL that passed the OLX asset-host boundary. |
images | string array | When published | Public image URLs that passed the OLX asset-host boundary. |
imageCount | integer | When images are published | Number of normalized images, or the source media count. |
videoCount | integer | When published | Source video count or normalized video count. |
specs | object | When deepScraping is enabled and published | Up to 100 public specification entries with string values. |
featured | boolean | When published | Whether the source marks the listing as featured. |
countryCode | string | Always | Country selected for search or inferred from the supplied URL. |
searchQuery | string | When built-in search is used | Search term used to build the URL. |
searchUrl | string | Always | Search or category URL tied to the row. |
sourceUrl | string | Always | Source URL requested for the row. |
pageUrl | string | Always | Page associated with the row. |
detailUrl | string | When a detail page is followed | Public ad-detail URL. |
pageNumber | integer | Always | One-based page number. |
itemPosition | integer | On listing rows | One-based position on the result page. |
scrapedAt | string | Always | Time the row was written, in ISO UTC. |
error | string | On diagnostic rows | Human-readable diagnostic explanation. |
errorCode | string | On diagnostic rows | Stable machine-readable code, such as ACCESS_BOUNDARY. |
The example below is the complete saved diagnostic row from the 2026-10-25 run.
{"recordType": "run_diagnostic","targetType": "olx-listing","id": "diagnostic:ACCESS_BOUNDARY:https://www.olx.in/items/q-laptop","source": "olx-global","url": "https://www.olx.in/items/q-laptop","requestUrl": "https://www.olx.in/items/q-laptop","sourceUrl": "https://www.olx.in/items/q-laptop","finalUrl": "https://www.olx.in/items/q-laptop","httpStatus": 403,"pageType": "search","accessStatus": "access_boundary","sourceBlocked": true,"transport": "http","sourceTransport": "http","proxyUsed": true,"dataAvailable": false,"sourceType": "diagnostic","error": "OLX returned an anti-automation or JavaScript challenge; no bypass was attempted.","errorCode": "ACCESS_BOUNDARY","scrapedAt": "2026-10-25T21:08:41.140Z","searchUrl": "https://www.olx.in/items/q-laptop","pageUrl": "https://www.olx.in/items/q-laptop","searchQuery": "laptop","countryCode": "IN","pageNumber": 1}
Run summary
Run summary is stored separately from the dataset in the run's key-value store under OUTPUT.
| Field | Meaning |
|---|---|
recordType | Fixed summary discriminator: olx-global-run-summary. |
id | Fixed summary key: run-summary. |
status | success, partial, diagnostic_only, or empty; see the status table below. |
runState | stopped when a source was blocked, otherwise completed. |
diagnosticOnly | True when no listing row was saved and at least one diagnostic row was written. |
dataAvailable | True only when at least one listing was saved. |
itemCount | All dataset rows, including diagnostics. |
normalCount | Listing rows. |
recordCount | Listing rows; matches normalCount. |
listingCount | Listing rows; matches normalCount. |
resultCount | Listing rows; matches normalCount. |
diagnosticCount | Diagnostic rows written to the dataset. |
duplicateCount | Repeated listings removed. |
pageCount | Search, category, or listing pages processed. |
detailRequests | Public detail pages requested by deep scraping. |
attemptCount | Public requests attempted. |
requests | Request count; matches attemptCount in the saved run. |
failedPages | Pages that produced a diagnostic instead of usable data. |
blockedCount | Blocked or challenged source responses. |
noResultCount | Pages that completed without a matching listing. |
sourceCount | Number of source URLs inspected. |
sessionRotations | Proxy session changes made during the run. |
sourceTransport | http for live requests or fixture for a QA fixture. |
proxyRequested | Whether proxy use was requested in the input. |
proxyUsed | Whether any request actually used Apify Proxy. |
transportCounts | Request counts split into http and fixture. |
fixtureUsed | Whether a checked-in QA fixture supplied the page. |
fixturePath | Relative QA fixture path in current builds; absent from the saved example. |
maxItems | Listing-row limit applied to the run. |
maxPages | Page or supplied-URL cap applied to the run. |
completedAt | Time the summary was written, in ISO UTC. |
| Status | Meaning |
|---|---|
success | Listings were saved and no diagnostic row was written. |
partial | Listings were saved together with at least one diagnostic row. |
diagnostic_only | No listing was saved; one or more diagnostic rows explain the outcome. The saved 2026-10-25 run is this case. |
empty | No listing and no diagnostic was produced. |
Example OUTPUT from the saved run:
{"recordType": "olx-global-run-summary","id": "run-summary","status": "diagnostic_only","runState": "stopped","diagnosticOnly": true,"dataAvailable": false,"itemCount": 1,"normalCount": 0,"recordCount": 0,"listingCount": 0,"resultCount": 0,"diagnosticCount": 1,"duplicateCount": 0,"pageCount": 1,"detailRequests": 0,"attemptCount": 2,"requests": 2,"failedPages": 1,"blockedCount": 1,"noResultCount": 0,"sourceCount": 1,"sessionRotations": 1,"sourceTransport": "http","proxyRequested": true,"proxyUsed": true,"transportCounts": {"http": 2,"fixture": 0},"fixtureUsed": false,"maxItems": 3,"maxPages": 1,"completedAt": "2026-10-25T21:08:41.267Z"}
Coverage and limitations
The Actor reads public OLX search, category, and listing pages through bounded HTTP requests. It does not log in, solve CAPTCHA or JavaScript challenges, use private APIs, bypass access controls, or fabricate listing data. Built-in search mode constructs a country URL from searchQuery and countryCode; each OLX country site controls whether that route is publicly reachable, so a supplied searchUrl or categoryUrl is often the more predictable option. URL modes accept supported OLX country hosts only.
When a page is blocked, the Actor writes a run_diagnostic row and reports the outcome in OUTPUT; it does not convert the block into an empty successful result. That is why the saved 2026-10-25 run has a diagnostic row and no listing data. deepScraping adds detail requests and can populate description, seller, phone, images, and specifications, but those fields remain optional and are not inferred. fixturePath is for offline QA only: fixtureUsed and sourceTransport: "fixture" identify fixture output, which must not be treated as live OLX data.
Usage and support
Apify account billing for compute, network traffic, storage, and any selected proxy service applies. Start with a small maxItems and maxPages, keep deepScraping off, inspect the dataset and OUTPUT, then scale gradually. A diagnostic_only result means OLX denied or failed the request; changing to a reachable country URL or respecting the source is more useful than repeating the same target. See the Actor's Pricing tab for current account rates. Use the Actor Issues page to report a problem. Include the run ID, the input used, and the run summary; do not include tokens, cookies, or private data. This Actor is an independent community tool and is not affiliated with, endorsed by, or sponsored by OLX or its affiliates. Use it only for public data and in accordance with the source's terms, robots guidance, and applicable law. Public pages can contain personal information; use the output only for lawful purposes.