OLX Public Classified Listing Scraper avatar

OLX Public Classified Listing Scraper

Pricing

from $2.99 / 1,000 listings

Go to Apify Store
OLX Public Classified Listing Scraper

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

w3crawler

Maintained by Community

Actor stats

0

Bookmarked

4

Total users

2

Monthly active users

5 days ago

Last modified

Categories

Security

Limited permissions

Share

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

  1. Open the Actor Store page and select Try for free or open the Input tab.
  2. Choose a mode. For search, set searchQuery and countryCode. For searchUrl, categoryUrl, or adUrl, supply the matching public URL field; the country is inferred from the URL.
  3. Keep maxItems and maxPages small for the first run. Enable deepScraping only if you need seller and description detail.
  4. 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 a run_diagnostic row and dataAvailable: 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.

FieldTypeRequired?DefaultMeaning
modestring enumOptionalsearchInput type: search, adUrl, searchUrl, or categoryUrl.
searchQuerystringOptionaliphoneSearch term for built-in search mode; combined with countryCode. Use a search URL for a custom market view.
countryCodestring enumOptionalINTwo-letter country code used by built-in search mode to select the OLX country site. URL modes infer the country from the URL.
adUrlsstring arrayOptionalNot suppliedPublic listing URLs from supported OLX country sites. up to 100 items.
searchUrlstringOptionalNot suppliedFull public OLX country search URL. 1–2000 characters.
categoryUrlstringOptionalNot suppliedFull public OLX country category URL. 1–2000 characters.
maxItemsintegerOptional50Maximum number of items to scrape. 1–100.
deepScrapingbooleanOptionalfalseEnable deep scraping to extract detailed ad information including seller info, description, location, etc.
proxyConfigurationobjectOptional{"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.
maxPagesintegerOptional5Safety cap on public search/category pages. 1–10.
timeoutMsintegerOptional30000Maximum time to wait for each public response. 5000–60000.
maxBytesintegerOptional5000000Safety limit for each public response. 1000–10000000.
requestDelayMsintegerOptional250Optional bounded delay between public requests.
maxRequestRetriesintegerOptional1Retry budget for transient public-request failures. 0–3.
fixturePathstringOptionalNot suppliedOptional 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.

FieldTypeAvailabilityMeaning
recordTypestring enumAlwaysolx-global-listing for a listing row or run_diagnostic for a run outcome.
targetTypestring enumAlwaysAlways olx-listing.
idstringAlwaysListing ID, or diagnostic:<errorCode>:<url> on a diagnostic row.
sourcestringAlwaysSource label, olx-global.
dataAvailablebooleanAlwaysTrue only when usable public listing data is present.
verifiedbooleanOn listing rowsTrue when the row came from an observed public OLX listing source.
verificationStatusstringOn listing rowspublic_listing for a normal listing row.
accessStatusstringAlwayspublic_page for a listing, access_boundary for a blocked response.
sourceBlockedbooleanAlwaysWhether the public request hit an access boundary.
transportstring enumAlwayshttp for live requests or fixture for a QA fixture.
sourceTransportstring enumAlwaysTransport that supplied the row; http or fixture.
proxyUsedbooleanAlwaysWhether Apify Proxy routing was used.
requestUrlstringAlwaysPublic URL requested for the row.
finalUrlstringAlwaysFinal public URL observed after redirects.
httpStatusintegerAlwaysHTTP status observed for the request.
pageTypestringAlwaysPublic page type, such as search, category, or detail.
sourceTypestring enumOn diagnostic rowsdiagnostic marker.
listingIdstringOn listing rowsPublic listing identifier.
titlestringOn listing rowsListing headline.
pricestringOn listing rowsDisplayed price text when the listing shows a price.
priceAmountnumberWhen a numeric price is publishedParsed price amount.
currencystringWhen a price is publishedCurrency for the parsed amount.
descriptionstringWhen deepScraping is enabled and publishedPublic listing description.
locationstringOn listing rowsPublic locality or seller area.
datestringWhen publishedListing date label from the source.
sellerstringWhen deepScraping is enabled and publishedPublic seller label.
phonestringWhen deepScraping is enabled and publishedPublic phone value on the listing.
postedstringWhen publishedRaw posted-date text from the source.
urlstringAlwaysPublic listing URL, or the blocked source URL on a diagnostic row.
imagestringWhen publishedLead image URL that passed the OLX asset-host boundary.
imagesstring arrayWhen publishedPublic image URLs that passed the OLX asset-host boundary.
imageCountintegerWhen images are publishedNumber of normalized images, or the source media count.
videoCountintegerWhen publishedSource video count or normalized video count.
specsobjectWhen deepScraping is enabled and publishedUp to 100 public specification entries with string values.
featuredbooleanWhen publishedWhether the source marks the listing as featured.
countryCodestringAlwaysCountry selected for search or inferred from the supplied URL.
searchQuerystringWhen built-in search is usedSearch term used to build the URL.
searchUrlstringAlwaysSearch or category URL tied to the row.
sourceUrlstringAlwaysSource URL requested for the row.
pageUrlstringAlwaysPage associated with the row.
detailUrlstringWhen a detail page is followedPublic ad-detail URL.
pageNumberintegerAlwaysOne-based page number.
itemPositionintegerOn listing rowsOne-based position on the result page.
scrapedAtstringAlwaysTime the row was written, in ISO UTC.
errorstringOn diagnostic rowsHuman-readable diagnostic explanation.
errorCodestringOn diagnostic rowsStable 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.

FieldMeaning
recordTypeFixed summary discriminator: olx-global-run-summary.
idFixed summary key: run-summary.
statussuccess, partial, diagnostic_only, or empty; see the status table below.
runStatestopped when a source was blocked, otherwise completed.
diagnosticOnlyTrue when no listing row was saved and at least one diagnostic row was written.
dataAvailableTrue only when at least one listing was saved.
itemCountAll dataset rows, including diagnostics.
normalCountListing rows.
recordCountListing rows; matches normalCount.
listingCountListing rows; matches normalCount.
resultCountListing rows; matches normalCount.
diagnosticCountDiagnostic rows written to the dataset.
duplicateCountRepeated listings removed.
pageCountSearch, category, or listing pages processed.
detailRequestsPublic detail pages requested by deep scraping.
attemptCountPublic requests attempted.
requestsRequest count; matches attemptCount in the saved run.
failedPagesPages that produced a diagnostic instead of usable data.
blockedCountBlocked or challenged source responses.
noResultCountPages that completed without a matching listing.
sourceCountNumber of source URLs inspected.
sessionRotationsProxy session changes made during the run.
sourceTransporthttp for live requests or fixture for a QA fixture.
proxyRequestedWhether proxy use was requested in the input.
proxyUsedWhether any request actually used Apify Proxy.
transportCountsRequest counts split into http and fixture.
fixtureUsedWhether a checked-in QA fixture supplied the page.
fixturePathRelative QA fixture path in current builds; absent from the saved example.
maxItemsListing-row limit applied to the run.
maxPagesPage or supplied-URL cap applied to the run.
completedAtTime the summary was written, in ISO UTC.
StatusMeaning
successListings were saved and no diagnostic row was written.
partialListings were saved together with at least one diagnostic row.
diagnostic_onlyNo listing was saved; one or more diagnostic rows explain the outcome. The saved 2026-10-25 run is this case.
emptyNo 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.