OLX Listing Lookup: olx.pl scraper from $2/1k avatar

OLX Listing Lookup: olx.pl scraper from $2/1k

Pricing

from $1.52 / 1,000 listing returneds

Go to Apify Store
OLX Listing Lookup: olx.pl scraper from $2/1k

OLX Listing Lookup: olx.pl scraper from $2/1k

OLX.pl scraper by keyword: run a search on olx.pl, Poland's largest classifieds marketplace, and get one row per listing, including title, price, city, seller type, link. No login required. Pay per listing returned; empty searches are free.

Pricing

from $1.52 / 1,000 listing returneds

Rating

0.0

(0)

Developer

Adrian Voss

Adrian Voss

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

15 hours ago

Last modified

Share

You type a search the way you'd type it into OLX's own search box — "iphone", "rower gorski", "mieszkanie warszawa" — and this actor runs it against olx.pl's own search-results pages, Poland's largest classifieds marketplace, and returns one clean row per listing: title, price, city, seller type, and a permanent link.

OLX sits behind a CloudFront bot wall — a bare request gets a 403 "Request blocked" page, not the listings. This actor requests every search through Apify's UNBLOCKER proxy, which clears it cleanly (a real, server-rendered page comes back, no headless browser needed), so you never have to think about that yourself.

Who it's for

A reseller or arbitrage buyer watching one category (phones, bikes, electronics) for underpriced listings wants a live feed of what's actually posted right now on OLX, across many search terms at once, without refreshing OLX's own search page by hand. A market-research team tracking asking prices for a product category, or an apartment hunter scanning a city's rental listings, gets the same shape here: paste a list of search terms, get back a flat row per listing, and pay only for listings actually returned — a search that finds nothing costs nothing.

This actor is OLX's counterpart to leboncoin-listing-lookup (France) in this catalogue: both take a free-text search term rather than a specific listing URL or ID, and return every matching listing the site's own search turns up — for when you don't have specific ad links yet, only a category or keyword you're watching.

Why this one

  • Gets past OLX's CloudFront wall for you. A plain request returns an HTTP 403 "Request blocked" page — confirmed directly, not assumed. This actor routes every request through Apify's UNBLOCKER proxy group, which clears it cleanly: a normal 200 response with the full, real, server-rendered search page. No headless browser is needed once past that wall, since OLX's own listing data is already embedded in the HTML it sends back.
  • Reads OLX's own structured data, not scraped text. Every field here comes from the same __PRERENDERED_STATE__ JSON payload OLX's own app renders from — not regex'd out of visible page text, so prices, IDs, and location fields are exact, typed values rather than parsed strings.
  • Works across every OLX category, not just one. Electronics, vehicles, real estate, jobs, general goods — OLX's per-listing params vary by category (phone model and storage for a handset, mileage and fuel for a car), and this actor carries all of them through in a generic params object instead of hardcoding one category's fields and dropping the rest.
  • Never charged for a miss, or for a listing outside your price range. A search that finds nothing, or where every result falls outside your minPrice/maxPrice filter, still gets a row explaining what happened — and costs nothing. See "Pricing" below for the found-row rate.
  • Honest about what wasn't verified. This actor targets olx.pl specifically, not every OLX country site (see FAQ), and fetches one search page per query rather than claiming to page through every result; see "vs. alternatives" for what that trade-off costs you.

What you get

One row per listing by default. (Turn off "One row per listing" in the Input tab to get one row per search instead, with the whole listing list nested in listings.) Every row carries these fields:

FieldType / formatDescription
querytextThe search term you passed in, unchanged.
foundbooleantrue if the search returned at least one listing. false rows are never charged.
statustextOK, NOT_FOUND (no listings for that search), BAD_FORMAT (a blank line), or BLOCKED.
searchQuerytextThe search text actually sent to OLX.
listingCountnumberHow many listings this search returned after your price filters — this is exactly what you're charged for.
totalAvailablenumberOLX's own total-match count for this search.
truncatedbooleantrue if more listings were available than this actor's one-page fetch returned.
listingsarrayThe full listing list. Present in every row; it's what gets expanded into separate rows in "one row per listing" mode.
listingIdtextOLX's own numeric listing ID.
titletextListing title.
descriptiontextListing description (HTML stripped), truncated to 500 characters.
pricenumberPrice in PLN, or null for a free/price-on-request listing — see priceDisplay/isFree.
priceDisplaytextPrice exactly as OLX formats it, e.g. "2 599 zl".
currencytextCurrency code, typically PLN.
isFreebooleantrue for listings marked "free" rather than priced.
city / regiontextSeller's stated location, as OLX displays it.
isBusinessbooleantrue if the seller is a registered business account.
createdAtdate (ISO)When the listing was created, from OLX's own timestamp (this one does carry a timezone offset).
urllinkPermanent link to the listing on olx.pl.
imagelinkFirst photo URL.
photoCountnumberHow many photos the listing has.
paramsobjectEvery category-specific attribute OLX shows on the listing (phone model, vehicle mileage, apartment size, etc.) as a flat key/value object — see "Why this one".
scrapedAtdate (ISO)When this actor fetched the row.

A search that returns no listings comes back as a single found: false row with a status/message explaining why, and is never charged.

Pricing

  • Listing returned: $2 per 1,000 listings

Plus a $0.00005 start fee per run. Each event above is billed independently, only when it actually returns data — misses (found:false) are never charged.

Pay-per-event, per listing returned:

  • Listing returned: $2 per 1,000 listings, less on paid Apify plans.

Plus a $0.00005 start fee per run. Misses (found: false) are never charged.

You're charged per listing returned, not per search — a search that returns 40 listings costs forty, a search that returns none costs nothing, and a blank line costs nothing.

Getting past OLX's CloudFront wall needs Apify's UNBLOCKER proxy group, already configured by default — there's nothing for you to set up, but it is a real, metered cost on this actor's own side, which is reflected in the price: this is higher per row than a plain-HTTP classifieds actor like kleinanzeigen-listing-lookup, which needs no proxy at all.

1,000 listings through this actor: ~$2 if every search finds results, less on a paid Apify plan. Because you pay per listing, "Most listings to return per search" is your budget control: leave it at 52 and a ten-search run costs at most 520 listings' worth.

How to use

  1. In the Apify Console. Open the actor page and click Start — the searches field is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found.
  2. Via the API. Call it directly with a POST request — no Console needed once you have an API token:
    curl "https://api.apify.com/v2/acts/accountable_eel~olx-listing-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
    -X POST \
    -H "Content-Type: application/json" \
    -d '{"searches":["iphone"]}'
  3. On a schedule. Save this actor as an Apify Task with the input you want, then add a Schedule (hourly, daily, weekly) so it runs on its own — no server of your own required.

Paste one search per line:

iphone
rower gorski
mieszkanie warszawa

Narrow the results — applied here, to the listings after they arrive:

InputWhat it does
minPriceDrop listings priced below this (PLN).
maxPriceDrop listings priced above this (PLN).
maxListingsPerQueryMost listings to return per search. Default 52 — OLX's own per-page count.

Input

{
"searches": [
"iphone"
]
}

One search per line — any keywords, e.g. "iphone 14", "rower gorski", "mieszkanie warszawa". No login required. Accepted formats: iphone, rower gorski, mieszkanie warszawa.

Output

queryfoundstatussearchQuerylistingCounttotalAvailabletruncatedlistingslistingIdtitlepricecityregionisBusinesscreatedAturlscrapedAt
iphonetrueOKiphone521000true<all listings found (full list)>1096158760iphone 13 128gb Midnight 80%bateria730JasłoPodkarpackiefalse2026-09-04T18:14:22+02:00https://www.olx.pl/d/oferta/iphone-13-128gb-midnight-80-bateria-CID99-ID1cbmY0.html2026-09-08T17:45:29.232Z

A miss comes back as a row with "found": false and is never charged.

Use it from Clay, n8n, Make, or an AI agent

This actor runs synchronously over plain HTTP — call it directly from a script, a workflow tool, or an AI agent, no Apify Console needed once you have an API token.

curl "https://api.apify.com/v2/acts/accountable_eel~olx-listing-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
-X POST \
-H "Content-Type: application/json" \
-d '{"searches":["iphone"]}'

n8n. Add an HTTP Request node: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~olx-listing-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body Content Type JSON, JSON Body {"searches":["iphone"]} (swap in an expression from an earlier node for a real value).

Clay. Add an "HTTP API" column: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~olx-listing-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body {"searches":["{{search}}"]}, mapping the row's search into the searches array.

MCP. In Claude, Cursor, or any MCP client with the Apify MCP server, ask for "OLX.pl Scraper | Apify" — the agent will find and run this actor.

Tips

  • Run "Try it first" on a handful of searches you already know return results for, to sanity-check the shape before spending on a full list.
  • Keep maxListingsPerQuery at or below 52 (OLX's own per-page count) — this actor fetches one search page per query, so raising it above 52 has no effect until a future version adds paging.
  • Use minPrice/maxPrice to cut noise from a broad category search before you pay for rows you don't want, rather than filtering client-side after the fact.
  • params varies by category — inspect a few real rows for your search term before building a downstream schema around specific param keys, since a phone search and an apartment search return different keys.
  • isBusiness lets you split registered-business listings from private-seller ones if you only want one or the other.

vs. alternatives

What it costsWhat you getTrade-off
This actor (olx-listing-lookup)$0.002 per listing returned (less on paid Apify plans), $0.00005 actor start, nothing for a search that finds nothingOne row per OLX listing — title, price, city, business/private seller, and link — filtered by min/max priceOne search page per query (up to 52 listings); no paging past that yet. Targets olx.pl only — other OLX country sites (olx.com.br and others) are not independently verified (see FAQ).
solidcode/olx-brazil-scraperPay-per-result on Apify (58 u30, rated 5.00 on 2 reviews)Scrapes OLX Brazil (olx.com.br) search resultsA very thin review base (2 reviews) and covers Brazil, not Poland. This actor targets olx.pl, prices per listing, and reads OLX's own structured JSON rather than parsed HTML.
Doing it yourselfYour time + a CloudFront-clearing proxy, tracking OLX's own __PRERENDERED_STATE__ shape as it changes, and handling category-specific fields by handThe same dataThe CloudFront-clearing proxy wiring and the generic param handling this actor already does are the maintenance burden it absorbs.

Prices for third-party tools are their published figures as of September 2026 and are not tracked here — check the vendor before relying on the comparison.

FAQ

Why is a row empty, or why does found say false? Either the input line is blank (status: BAD_FORMAT), OLX/CloudFront blocked the request (status: BLOCKED, HTTP 403/429/503), the request failed after retries (status: REQUEST_FAILED), or the search genuinely has no matching listings right now (status: NOT_FOUND). Check the message column for the specific reason. None of these are billed.

Am I charged for a miss? No. You're only charged for listings actually returned. A blocked search, a search with zero matches, or a search where every result falls outside your price filter all produce a row (unless you turn on "Hide rows with no result") and none of them cost anything.

Does this work for OLX country sites other than Poland (olx.pl)? Not currently. This actor was built and live-verified against olx.pl only. OLX operates the same platform across many country sites (including olx.com.br, the incumbent competitor's focus), and they likely share this actor's __PRERENDERED_STATE__ shape, but that hasn't been independently confirmed — this actor deliberately doesn't claim coverage it hasn't verified.

Does this actor page through more than one screen of results? Not yet. Each search fetches OLX's first results page (up to 52 listings) through UNBLOCKER. totalAvailable still reports OLX's total-match count so you know how many more exist; truncated is true whenever there are more.

Does this handle CloudFront's block on OLX? Yes, automatically. Every request goes through Apify's UNBLOCKER proxy group by default — there's nothing for you to configure. If OLX still re-challenges a session, that shows up as a BLOCKED status on the affected search rather than a silent failure.

Do I need to configure proxies? No. UNBLOCKER is the default proxy group for this actor specifically, because a plain request to OLX is blocked by CloudFront. You don't need to change anything to use it.

Can I schedule this to re-check the same searches on a cadence? Yes — set up an Apify Task with a schedule (daily, weekly, whatever cadence fits) and point it at this actor with a saved input. Each run is a fresh fetch against OLX's live listings — handy for catching a new listing the moment it's posted.

Can an AI agent call this directly? Yes. It's registered on the Apify MCP server — an agent in Claude, Cursor, or another MCP client can find and run it by name ("OLX Listing Lookup | Apify"), or you can call the REST endpoint shown above from any script or workflow tool.