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

2

Total users

1

Monthly active users

5 days ago

Last modified

Categories

Share

What does OLX Public Classified Listing Scraper do?

OLX Public Classified Listing Scraper collects classified listings that are exposed on supported public OLX country sites. It can build a keyword search, crawl a supplied public search or category URL, or inspect supplied public listing URLs. Optional deep scraping follows search results to collect additional public detail fields.

The Actor uses bounded direct HTTP requests by default and can use standard Apify Proxy when explicitly configured. It does not log in, solve CAPTCHA or JavaScript challenges, use private APIs, bypass access controls, or fabricate listing data. A blocked, empty, malformed, or failed response becomes a structured diagnostic row.

Why use OLX Public Classified Listing Scraper?

Use it for public-market inventory research, price comparisons, regional supply checks, lead discovery, and scheduled monitoring across multiple OLX country domains. The output keeps normal listings separate from diagnostics and records the country, source URL, transport, proxy state, and page position needed for downstream review.

The Actor supports these public OLX roots through the countryCode search mode or by URL validation: olx.in, olx.pl, olx.ua, olx.com.br, olx.com.pk, olx.co.id, olx.com.ar, olx.com.tr, olx.pt, olx.kz, olx.ro, olx.bg, olx.ba, olx.uz, olx.lk, olx.ph, olx.co.ke, olx.co.za, olx.com.eg, olx.com.ng, olx.com.gh, olx.com.tn, olx.ma, and olx.dz.

What data can OLX Public Classified Listing Scraper extract?

Normal records are emitted only when the public response supplies an identifiable listing ID, title, and listing URL. Optional fields appear only when exposed by the source; missing seller, phone, price, image, or specification fields are not inferred.

FieldTypeMeaning
recordTypestringolx-global-listing for a listing or run_diagnostic for an operational outcome.
targetTypestringolx-listing.
id / listingIdstringStable row identity and public listing identifier.
sourcestringolx-global.
dataAvailablebooleanWhether usable public listing data is present.
verified / verificationStatusboolean / stringWhether the row came from an observed public listing (public_listing).
accessStatus / sourceBlockedstring / booleanObserved access state and whether a source boundary was hit.
transport / sourceTransportstringhttp for live requests or fixture for an explicitly supplied QA fixture.
proxyUsedbooleanWhether Apify Proxy supplied the request.
requestUrl / finalUrlURIPublic request and final response URLs.
httpStatusintegerObserved HTTP status, when available.
pageType / sourceTypestringsearch or detail; diagnostics use sourceType: "diagnostic".
price / priceAmount / currencystring / number / stringDisplayed price, parsed amount, and currency when available.
title / urlstring / URIListing headline and public listing URL.
description / locationstringPublic description and locality.
date / postedstringPublic listing date or posted text when exposed.
seller / phonestringPublic seller label or phone value when exposed.
image / imagesURI / URI arrayPublic image URLs that pass the supported OLX asset-host boundary.
imageCount / videoCountintegerMedia counts when available or derived from normalized images.
specsobjectUp to 100 public specification entries with string values.
featuredbooleanWhether the source marks the listing as featured.
countryCodestringCountry inferred from the public OLX root or selected for search.
searchQuerystringBuilt-in search query context.
searchUrl / sourceUrl / pageUrl / detailUrlURISearch, source, page, and optional detail provenance.
pageNumber / itemPositionintegerOne-based page and result position.
scrapedAtdate-timeTime the Actor normalized the row.
error / errorCodestringDiagnostic explanation and stable machine-readable code.

How to scrape OLX public listings

  1. Open the Actor in Apify Console and select the Input tab.
  2. Choose a mode and complete the fields required by that mode.
  3. Set maxItems, maxPages, deepScraping, and the request controls for the intended run size.
  4. Click Save & Run. The Actor sends bounded public requests and stops when the limits or a source boundary are reached.
  5. Open the Dataset tab for listing and diagnostic rows. Open the Key-value store tab and select OUTPUT_SUMMARY for the run summary.
  6. Use the API tab or the Apify API documentation for integrations and scheduling.

In built-in search mode, the Actor constructs a country-aware keyword route. Poland uses the public /oferty/q-<term>/ route; other configured roots use their public /items/q-<term> route. In URL modes, the supplied URL determines the country and must be HTTPS on a supported OLX root.

How much will it cost to scrape OLX public listings?

Apify account billing for compute, network traffic, storage, and any selected proxy service applies. This repository does not promise a fixed dollar-per-1,000-record price; check the current Apify pricing and the Actor’s Pricing tab before production use. Direct HTTP is the default. A configured proxy can add account-specific proxy costs.

The runtime bounds are:

  • At most 100 normal listing rows per run (maxItems).
  • At most 10 search/category pages (maxPages).
  • A 5,000–60,000 ms timeout per public request (timeoutMs).
  • A 1,000–10,000,000 byte response limit (maxBytes).
  • At most three retries per request (maxRequestRetries).
  • At most 100 supplied listing URLs in adUrls.

Deep scraping adds one public detail request per accepted search listing and may increase compute, request, and proxy usage. A diagnostic-only run can complete as an Apify run, but it is not evidence that listing data was collected.

Input

The input is a JSON object. Unknown keys, explicit null values, invalid types, unsupported country codes, unsafe URLs, and missing mode-specific values are rejected. mode, searchQuery, and countryCode default only when omitted; an explicitly blank mode or country code is not silently replaced.

InputType and boundsDefaultDescription
modeenum: search, searchUrl, categoryUrl, adUrlsearchSelects built-in keyword search, supplied search URL, supplied category/city URL, or supplied listing URLs.
searchQuerystring, maximum 300 charactersiphoneBuilt-in search term. Required to be non-blank in search mode.
countryCodeenum: IN, PL, UA, BR, PK, ID, AR, TR, PT, KZ, RO, BG, BA, UZ, LK, PH, KE, ZA, EG, NG, GH, TN, MA, DZINCountry root for built-in search. searchUrl and categoryUrl infer the country from the supplied URL; adUrl infers it per listing URL.
adUrlsarray of at most 100 HTTPS strings, each maximum 2,000 characters[]Public listing URLs required by adUrl mode. Duplicates are removed.
searchUrlHTTPS supported-OLX URL, maximum 2,000 charactersomittedPublic search URL required by searchUrl mode.
categoryUrlHTTPS supported-OLX URL, maximum 2,000 charactersomittedPublic category or city URL required by categoryUrl mode.
maxItemsinteger, 1–10050Maximum normal listing rows.
maxPagesinteger, 1–105Maximum public source pages or URLs visited; it also caps the number of supplied adUrls processed in one run.
deepScrapingbooleanfalseFollows accepted search results to public detail pages for richer fields. It is ignored for an explicit fixture and is not needed for adUrl mode.
proxyConfigurationobjectomitted/directOptional standard Apify Proxy configuration. Credentials are resolved by the SDK.
timeoutMsinteger, 5,000–60,00030,000Per-request timeout in milliseconds.
maxBytesinteger, 1,000–10,000,0005,000,000Maximum response size accepted for parsing.
requestDelayMsinteger, 0–10,000250Bounded delay before retries or detail requests.
maxRequestRetriesinteger, 0–31Retry budget for transient and access-boundary responses. Proxy sessions rotate between retry attempts when a proxy is configured.
fixturePathrelative .html, .htm, .json, or .txt path, maximum 260 charactersomittedExplicit checked-in QA fixture; never an implicit fallback for failed live access.

Built-in search input

{
"mode": "search",
"searchQuery": "laptop",
"countryCode": "IN",
"maxItems": 10,
"maxPages": 2
}

Supplied URL input

{
"mode": "searchUrl",
"searchUrl": "https://www.olx.in/items/q-laptop",
"maxItems": 25,
"deepScraping": true
}

Direct listing input

{
"mode": "adUrl",
"adUrls": ["https://www.olx.in/item/laptop-thinkpad-iid-123456789"],
"deepScraping": true
}

Proxy input

{
"mode": "search",
"searchQuery": "iphone",
"countryCode": "IN",
"maxItems": 10,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["StaticUS3"],
"apifyProxyCountry": "US"
}
}

Explicit local QA fixture input

{
"mode": "search",
"searchQuery": "laptop",
"countryCode": "IN",
"maxItems": 5,
"maxPages": 1,
"fixturePath": "test/fixtures/global.html"
}

fixturePath is for deterministic repository validation only. It must be supplied explicitly and is not a production data source.

Output

The Dataset contains normalized public listing rows and separate run_diagnostic rows when an operational condition prevents reliable extraction. The Actor also writes the same summary object to OUTPUT and OUTPUT_SUMMARY in the default key-value store.

Normal listing record

{
"recordType": "olx-global-listing",
"targetType": "olx-listing",
"id": "123456789",
"listingId": "123456789",
"source": "olx-global",
"dataAvailable": true,
"verified": true,
"verificationStatus": "public_listing",
"accessStatus": "public_page",
"sourceBlocked": false,
"transport": "http",
"sourceTransport": "http",
"proxyUsed": false,
"title": "Laptop ThinkPad T14",
"price": "₹45,000",
"priceAmount": 45000,
"currency": "INR",
"location": "Mumbai",
"seller": "Example seller",
"url": "https://www.olx.in/item/laptop-thinkpad-iid-123456789",
"image": "https://images.olx.in/images/laptop.jpg",
"images": ["https://images.olx.in/images/laptop.jpg"],
"imageCount": 1,
"featured": false,
"countryCode": "IN",
"searchQuery": "laptop",
"searchUrl": "https://www.olx.in/items/q-laptop",
"sourceUrl": "https://www.olx.in/items/q-laptop",
"pageUrl": "https://www.olx.in/items/q-laptop",
"pageNumber": 1,
"itemPosition": 1,
"scrapedAt": "2026-09-09T00:00:00.000Z"
}

Deep-scraping fallback

When a search listing is valid but its optional detail request is blocked or fails, the Actor retains the verified base search record and emits a separate detail diagnostic. It does not discard the listing or fill missing detail fields with guesses:

{
"recordType": "olx-global-listing",
"targetType": "olx-listing",
"id": "123456789",
"listingId": "123456789",
"source": "olx-global",
"dataAvailable": true,
"verified": true,
"verificationStatus": "public_listing",
"accessStatus": "public_page",
"sourceBlocked": false,
"transport": "http",
"sourceTransport": "http",
"proxyUsed": false,
"title": "Laptop ThinkPad T14",
"url": "https://www.olx.in/item/laptop-thinkpad-iid-123456789",
"searchUrl": "https://www.olx.in/items/q-laptop",
"scrapedAt": "2026-09-09T00:00:00.000Z"
}

Access diagnostic

{
"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",
"finalUrl": "https://www.olx.in/items/q-laptop",
"httpStatus": 403,
"pageType": "search",
"accessStatus": "access_boundary",
"sourceBlocked": true,
"transport": "http",
"sourceTransport": "http",
"proxyUsed": false,
"dataAvailable": false,
"sourceType": "diagnostic",
"countryCode": "IN",
"searchQuery": "laptop",
"error": "OLX returned an anti-automation or JavaScript challenge; no bypass was attempted.",
"errorCode": "ACCESS_BOUNDARY",
"scrapedAt": "2026-09-09T00:00:00.000Z"
}

Other stable diagnostic codes include NO_RESULTS, RATE_LIMITED, PROXY_ERROR, REQUEST_TIMEOUT, REQUEST_FAILED, HTTP_ERROR, REDIRECT_OFF_HOST, NON_TEXT_RESPONSE, RESPONSE_TOO_LARGE, EMPTY_RESPONSE, PARSE_FAILED, DETAIL_FAILED, and FIXTURE_READ_FAILED.

OUTPUT_SUMMARY

OUTPUT and OUTPUT_SUMMARY contain the same JSON object. normalCount, recordCount, listingCount, and resultCount count normal listing rows; diagnosticCount counts diagnostic rows. attemptCount and requests count live request attempts, while transportCounts shows live versus explicit-fixture transport.

{
"recordType": "olx-global-run-summary",
"id": "run-summary",
"status": "partial",
"runState": "stopped",
"diagnosticOnly": false,
"dataAvailable": true,
"itemCount": 3,
"normalCount": 2,
"recordCount": 2,
"listingCount": 2,
"resultCount": 2,
"diagnosticCount": 1,
"duplicateCount": 0,
"pageCount": 2,
"detailRequests": 2,
"attemptCount": 2,
"requests": 2,
"failedPages": 1,
"blockedCount": 1,
"noResultCount": 0,
"sourceCount": 1,
"sessionRotations": 0,
"maxItems": 50,
"maxPages": 5,
"fixtureUsed": false,
"fixturePath": null,
"sourceTransport": "http",
"transportCounts": { "http": 2, "fixture": 0 },
"proxyRequested": false,
"proxyUsed": false,
"completedAt": "2026-09-09T00:00:00.000Z"
}

Possible status values are success, partial, diagnostic_only, and empty. runState: "stopped" indicates that a source boundary ended traversal; a completed diagnostic-only run still does not mean data was collected.

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

Tips and advanced options

Choose the smallest useful mode

Use search for a keyword on a configured country root, searchUrl for a source URL you already know, categoryUrl for browse pages, and adUrl for direct public listings. For URL modes, the URL itself is authoritative for country selection; do not pair a URL from one country with a different countryCode expectation.

Direct, proxy, and retry behavior

Direct HTTP is the default. With useApifyProxy: true, the Actor uses a consistent session name for the run and rotates the session between retry attempts after retryable access or transport failures. The Dataset exposes only boolean proxy provenance; proxy URLs and credentials are never written to records or logs. Proxy authentication failures are reported as PROXY_ERROR and are not treated as source data.

Deep scraping and fallback behavior

deepScraping: true follows accepted search results to public detail pages. A detail failure produces a diagnostic while preserving the base search row. Deep scraping is skipped for explicit fixtures so local tests remain deterministic, and it is unnecessary for adUrl mode because those URLs are already detail targets.

Local validation

From the Actor directory, run npm ci, then npm run check. The checked-in test/fixtures/global.html fixture exercises the active src/run.js entrypoint only when fixturePath is explicitly supplied. A fixture pass proves parser and contract behavior; it is not proof that any OLX site is accessible from Apify Cloud.

FAQ, support, and responsible use

Why did the run return only diagnostics?

The source may return a rate limit, login wall, JavaScript challenge, empty markup, unsupported response, proxy-authentication failure, or HTTP error. Inspect errorCode, httpStatus, accessStatus, sourceBlocked, transport, and proxyUsed, then review the run log. Do not interpret a diagnostic-only run as successful extraction.

Does this Actor bypass login, CAPTCHA, or anti-bot controls?

No. It uses ordinary public HTTP and fails closed at access boundaries. It does not use stealth browsing, CAPTCHA solving, credentialed sessions, private endpoints, or fabricated fallback records.

API and Issues

Use the Actor’s API tab or the Apify API documentation for programmatic access. Report reproducible software issues through the Actor’s Issues tab and include the run ID, mode, and diagnostic code. Do not include proxy credentials or private user data in an issue.

This Actor is an independent community tool and is not affiliated with, endorsed by, or sponsored by OLX or its affiliates. Use only publicly exposed listing information, respect each OLX site’s terms, robots or access policies, rate limits, and applicable law. Comply with relevant privacy, consumer-protection, copyright, and data-protection requirements. Do not use the Actor to collect private information, evade access controls, harass people, or make decisions that require protected or sensitive personal data. You are responsible for confirming that your collection and downstream use are lawful.

The source implementation and contract checks are available in the project files. Run npm run check before publishing changes.