OLX New Listing Alert: Watch a Saved Search, No Login
Pricing
from $3.04 / 1,000 new ad returneds
OLX New Listing Alert: Watch a Saved Search, No Login
OLX new listing alert: schedule a keyword search and get back only the ads posted since the last run, one row each, for olx.pl, olx.pt, olx.ro, olx.bg and olx.ua. The first run seeds silently so day one is not a flood. No login. A run with no new ads is free.
Pricing
from $3.04 / 1,000 new ad returneds
Rating
0.0
(0)
Developer
Adrian Voss
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
This is an alert, not a search dump. Give it a keyword search, put it on a schedule, and every run returns only the ads posted since the last run — one row each. The first run seeds silently, so day one is not a flood of everything already on OLX. A run where nothing new was posted returns a single summary row and costs you the start fee alone.
The general-purpose OLX Listing Scraper can do this too, but it ships as a full-search scraper: you have to turn monitoring on, turn silent seeding on, and decide what to do about price drops and disappeared listings. Here that is the default and the only thing the actor is shaped for. If you want everything an OLX search returns — every current listing, price-drop tracking, the sold signal with sell-through rate, raw seller names — use the parent actor instead; it is listed under Related actors at the bottom.
Who it's for
- Deal hunters and resellers on a hot search ("iPhone 14", "rower gorski") who want the ad within minutes of it going up, not within a day.
- Anyone replacing OLX's own saved-search emails with something that lands in a spreadsheet, a channel or a bot instead of an inbox.
- Automations. One row per new ad, straight into Google Sheets, n8n, Make, Zapier or your own script. Nothing to deduplicate: the actor has already removed everything it showed you before.
What this does that a plain OLX search doesn't
| Plain search | This actor | |
|---|---|---|
| Rows you get back | every match, every run | only the ads posted since last time |
| First run | every current listing, billed | seeded silently, free |
| Deduplication | yours to do | already done |
| Cost of a quiet run | you pay for every row again | start fee only |
| "How old is this ad?" | createdAt only | changeType, isNew, firstSeenAt as well |
How the watchlist works
Each search line becomes a watchlist. The actor remembers every OLX listing ID it has returned, in your own account's storage.
- First run. Banks every current listing silently. One summary row,
monitorStatus: FIRST_RUN, no charge. (Turn Seed silently off if you would rather have the current state of the search as your first result set, and are happy to pay for it.) - Every run after. An ad comes back only when its OLX listing ID has never been returned by
this watchlist. The row carries
changeType: new,isNew: trueandfirstSeenAt. - A quiet run. Nothing posted since last time, so you get one row with
monitorStatus: NO_NEW_ROWSandlistingCount: 0.
Two schedules with different countries or price filters keep separate memories. Give a Watchlist name to pin one memory across a settings change, or to have two schedules share one.
Want price cuts on ads you have already seen? Turn on Also return price drops on ads you have
already seen and set a minimum percentage. Those rows arrive marked changeType: price-drop.
Countries
Five OLX country sites, picked with one dropdown: olx.pl (Poland, the default and the largest), olx.pt (Portugal), olx.ro (Romania), olx.bg (Bulgaria) and olx.ua (Ukraine). Prices come back in that country's own currency (PLN, EUR, RON, BGN, UAH), and each country keeps its own watchlist memory even when two schedules share a name.
What you get
One row per new ad:
- The ad —
listingId,title,price,currency,city,region,country,url. - The seller —
isBusiness,sellerType, and a hashedsellerHashso you can spot the same reseller across listings. No names, no phone numbers, no chat flags. - Timing —
createdAtandpostedAtfrom OLX, plusfirstSeenAt,changeTypeandisNewfrom the watchlist. - The search —
searchQuery,listingCount,totalAvailable,truncated,newCount,monitorStatus,medianPriceandmedianPriceCurrency, so every row tells you whether this ad is cheap for the search it came from.
Price
- New ad returned: $4 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.
- New ads: $4 per 1,000 rows returned, plus a $0.00005 start fee per run.
- A quiet run costs the start fee only. No new ads means no rows, and no rows means no charge — even though the actor still fetched and compared every page.
- The first run is free while Seed silently is on, however many listings it banks.
- A search that returns nothing, or a country that refuses the run, is never billed.
Worked example. One watchlist checked every 15 minutes on a search where about 10 new ads appear a day: 10 × 30 = 300 rows a month, about $1.20 plus 2,880 start fees ($0.14) — roughly $1.34 a month. Checking more often costs almost nothing; what you pay for is ads.
How to use
- In the Apify Console. Open the actor page and click Start — the
searchesfield is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found. - 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-new-listing-alert/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"searches":["iphone 14"]}'
- 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.
Tips:
- Check often, it is nearly free. A run with no new ads costs $0.00005. Every 10 to 15 minutes is a reasonable cadence for a competitive search.
- One search per line, not one giant query. Each line keeps its own memory, so "iphone 14" and "iphone 15" never contaminate each other.
- Use price filters to cut noise, not the keyword.
minPriceandmaxPriceare applied before billing, so an ad outside your range never costs you a row. includeKeywordsandexcludeKeywordsalso match before billing — "uszkodzony" or "na czesci" inexcludeKeywordskeeps broken items out for free.
How to filter
Every filter below is optional and off by default — leave it out and you get the exact same new-ad
alerts as before. minPrice/maxPrice already existed; this section adds cities,
includeKeywords and excludeKeywords. availability and sortBy are not offered on this actor:
OLX has no reserved/sold state to report (only a delta-derived "gone", which is not a sale), and
alerts are always newest-first by construction.
1. Only new ads in Warsaw, price capped:
{"searches": ["iphone 14"],"country": "pl","cities": ["warszawa"],"maxPrice": 3000}
cities is a case-insensitive "contains" match against the ad's own city/region — leave it empty
to watch every location.
2. Broken or for-parts phones excluded:
{"searches": ["iphone 14"],"excludeKeywords": ["uszkodzony", "na czesci"]}
A title containing any of these is dropped before billing, so a broken listing never costs you a row.
3. Only listings whose title mentions "pro" or "max":
{"searches": ["iphone 14"],"includeKeywords": ["pro", "max"]}
includeKeywords keeps a listing only if its title contains at least one of the words — combine it
with excludeKeywords to both require and forbid terms in the same run.
Input
{"searches": ["iphone 14"]}
One search per line: any keywords, e.g. "iphone 14", "rower gorski", "mieszkanie warszawa". Each line becomes a watchlist: the first run remembers what is already on OLX, and every run after it returns only the ads posted since. No login required. Pick the OLX country below (Poland by default). Accepted formats: iphone, rower gorski, mieszkanie warszawa.
Sample output
| query | found | status | searchQuery | listingCount | totalAvailable | truncated | newCount | priceDropCount | goneCount | monitorStatus | sellThroughRate | medianPrice | medianPriceCurrency | listings | listingId | title | price | currency | city | region | country | isBusiness | sellerType | sellerHash | isPromoted | createdAt | postedAt | changeType | isNew | previousPrice | priceDropPct | firstSeenAt | lastSeenAt | daysListed | url | listingStatus | scrapedAt |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| iphone 14 | true | OK | <gone since last run (delisted, most often sold)> | <monitoring status (quiet / seeded runs)> | <sell-through rate, watchlist lifetime (0-1)> | <median price of the search (local currency)> | <all new ads found (full list)> | <price (local currency)> | <seller type (business / private)> | <seller code (hashed, no name)> | <promoted / sponsored listing> | <posted (olx timestamp)> | <new / price-drop / gone / seen> | <is this listing new?> | <price drop %> | <days listed (first to last seen)> | <status (marketplace-filters standard: available/reserved/sold)> | 1970-01-01T00:00:00.000Z |
A real row from the live smoke test (iphone 14, olx.pl, 5 ads checked, 2026-09-26). This is what
run one looks like with Seed silently on: the watchlist is banked, nothing is charged, and alerts
start next run.
{"query": "iphone 14","found": true,"status": "OK","searchQuery": "iphone 14","listingCount": 0,"totalAvailable": 1000,"truncated": true,"newCount": 0,"priceDropCount": 0,"goneCount": 0,"monitorStatus": "WATCHLIST_SEEDED","sellThroughRate": 0,"medianPrice": 1349.5,"medianPriceCurrency": "PLN","scrapedAt": "2026-09-26T00:07:19.619Z"}
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-new-listing-alert/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"searches":["iphone 14"]}'
n8n. Add an HTTP Request node: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~olx-new-listing-alert/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body Content Type JSON, JSON Body {"searches":["iphone 14"]} (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-new-listing-alert/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 New Listing Alert: Only Ads Posted Since Last Run" — the agent will find and run this actor.
For a channel or an inbox, add an integration on the Task: trigger on "Apify: run succeeded" in n8n,
Make or Zapier and read the run's dataset. Setting What a quiet run writes is not offered here, so
a quiet run always leaves one summary row with listingCount: 0 — filter on listingCount > 0 in
your workflow to skip it.
vs. alternatives
- OLX's own saved-search email alerts. Free, but they land in an inbox, cannot be filtered properly, and cannot feed a spreadsheet or a bot.
- A general OLX scraper. Returns every match every run. You pay for the same unchanged listings again and again, and you diff them yourself.
- The parent actor, OLX Listing Scraper.
Same engine, everything switched on: every current listing, price-drop tracking, the sold signal
(
changeType: gone,gonePresumedSold, days listed) with a watchlist sell-through rate, and raw seller names on request. Use it when you want the whole search; use this one when you want what's new.
Data & privacy
- No login, no cookies, no account. There is no input field that could take an OLX session, and none is needed: everything here comes from OLX's public search results.
- No seller names or contact details. This variant does not offer the parent's raw-seller-info
switch, so
sellerNameis not returned at all. OLX's own API exposes phone and chat contact flags; this actor never reads or outputs them. - The watchlist memory holds listing IDs and prices only, in your own account's storage, and only for the watchlists you run.
FAQ
Nothing came back on the first run. Is it broken?
No, that is the design. The first run banks what is already on OLX silently and returns one summary
row (monitorStatus: FIRST_RUN). Alerts start from the second run. Turn Seed silently off to get
the current state of the search instead.
How does it know an ad is new? By OLX's own listing ID. An ad is new the first time this watchlist returns that ID — so a relisted item with a fresh ID counts as new, and an edited ad does not.
Can I get price drops as well? Yes — turn on Also return price drops on ads you have already seen and set the minimum percentage.
Does it tell me when something sold? No. Disappeared-listing detection lives in the parent actor; this one is about ads appearing. See Related actors.
How often should I run it? Every 10 to 15 minutes for a competitive search, hourly otherwise. A run that finds nothing costs the start fee alone.
Which countries? olx.pl, olx.pt, olx.ro, olx.bg and olx.ua — one dropdown, Poland by default.
Related actors
- OLX Listing Scraper: Poland Classifieds Data
— the parent, and the full-capability version: every current listing on a search, price-drop
tracking, the sold signal with
gonePresumedSold, days listed and watchlist sell-through rate, raw seller names on request, and the same five countries. - Vinted Price Monitor — the price-drop half of the same idea, on Vinted, with Discord, Slack and Telegram delivery.
- Kleinanzeigen Search: New Listing & Price Alerts — the same monitoring idea on Germany's biggest classifieds site.