Listing Status Checker - Sold, Removed & Price Changes avatar

Listing Status Checker - Sold, Removed & Price Changes

Pricing

from $1.20 / 1,000 listing checks

Go to Apify Store
Listing Status Checker - Sold, Removed & Price Changes

Listing Status Checker - Sold, Removed & Price Changes

Is the listing still online? Paste ad URLs from ImmoScout24, Kleinanzeigen, Fotocasa, Vinted, SEEK or Welcome to the Jungle: get status (online, sold, reserved, removed, expired), current price and price change per URL. For CRM clean-up and price tracking. Refused checks are free.

Pricing

from $1.20 / 1,000 listing checks

Rating

0.0

(0)

Developer

Amit Aviv

Amit Aviv

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Listing Status Checker: Sold, Removed & Price Changes

Paste the URLs of property listings, classified ads or job ads you already have, and get one record per URL: is it still online, sold, reserved, removed or expired, what does it cost now, and how has the price changed since you last looked. Supported: ImmoScout24, Kleinanzeigen, Fotocasa, Vinted, SEEK and Welcome to the Jungle. Plain HTTP, no browser: a test list of 1,130 URLs from all six sites took two and a half minutes; you pay only for checks that returned a status, and a check the site refused is reported as unknown and not charged.

Built for:

  • Agencies and CRM owners: find the listings in your CRM or spreadsheet that are gone, sold or reserved, without re-scraping whole searches.
  • Price trackers and investors: re-check a watch list daily and get the price change per listing, in money and percent.
  • Job boards and aggregators: drop expired SEEK and Welcome to the Jungle ads from your index.

What you get

  • status: online, reserved, paused, sold, expired, removed, redirected, notFound or unknown, plus isOnline (true / false / null) and statusLabel, the site's own words ("Verkauft", "Vendu", "Expired", "archived" …).
  • saleConfirmed for sold: true when the site's own checkout marked the item sold (Vinted), false when the site only labels the ad (Kleinanzeigen shows "Verkauft" on every deleted goods ad), null for other statuses.
  • title, current price and currency, priceType (cold rent, sale, item price …), priceText as shown (salary text for job ads).
  • previousPrice (the one you gave, or the one the previous run saw), priceChanged, priceDelta, priceDeltaPercent; on Fotocasa also sitePriceDrop, the site's own "price lowered by" amount.
  • previousStatus, statusChanged, previousCheckedAt when you run the same list again (on by default).
  • Dates where the site shows them: publishedAt (Fotocasa, SEEK, Welcome to the Jungle), updatedAt (Welcome to the Jungle), expiresAt (SEEK), dateOnPage / dateOnPageText (Kleinanzeigen: posted or renewed; Vinted: "uploaded …" as worded).
  • sellerType (professional / private) and, for professionals, advertiserName when it is recognisably a business name (agency, company, shop): text after a dash (contact person or branch) is cut off ("Covivio Immobilien GmbH - Kathi Piaskowski" becomes "Covivio Immobilien GmbH", "LA CASA AGENCY - HOSTAFRANCS" becomes "LA CASA AGENCY"), and names the actor cannot tell from a person's are left null: personal names such as "Sara Fischer", but also some companies whose name has no legal form or trade word (e.g. "Althena"). For job ads, the employer.
  • Your own reference and the inputPosition of each URL, so you can join the output back to your list.
  • A run summary (OUTPUT_SUMMARY in the run's key-value store): checks per status and per portal, what was charged, which inputs were skipped and why, refused requests.

What it does not return: descriptions, photos, contact details, private sellers' names (unless you opt in, see Legal), anything behind a login. It does not search: you bring the URLs.

How to use

  1. Copy the listing URLs from your CRM, spreadsheet or browser.
  2. Paste them into Listing URLs, one per line. To compare prices, add the price you last saw after the URL: https://www.immobilienscout24.de/expose/134412431 700. Lines copied from a spreadsheet as CSV work too: https://www.immobilienscout24.de/expose/134412431,700,CRM-17.
  3. Press Start. Download the results from the Output tab (JSON, CSV, Excel) or read them from the API.
  4. To watch a list, save the input as a task and schedule it (daily, weekly). Each run reports what changed since the previous one.

Input

FieldTypeDefaultWhat it does
urlslist of textnone (give this or listings)One listing per line, optionally followed by the price you last saw and your own reference, separated by a space, comma, ; or tab. Text after the URL that is not a price is kept as your reference (the run summary warns). A URL given twice is checked once, with the price and reference from either line. URLs from other sites and search pages are skipped and listed in the run summary. Up to 50,000 per run.
listingsJSON listemptyThe same as objects, for exports: [{ "url": "…", "previousPrice": 700, "reference": "CRM-17" }].
compareWithPreviousRunyes/noyesRemember each listing's status and price and report changes in the next run.
memoryKeytextemptyRuns with the same name share one memory; use different names for different lists.
includePrivateSellerDatayes/nonoPrivate sellers' names, and professional account names that are a person's name (Kleinanzeigen, Fotocasa, ImmoScout24). Only with a lawful basis, see Legal.
proxyConfigurationproxyoffNot needed. Fotocasa is always checked through Apify Proxy (included in the price). Turning it on sends every check through Apify Proxy's datacenter addresses; residential groups are replaced by datacenter ones.

Accepted URL forms: immobilienscout24.de/expose/<id>, kleinanzeigen.de/s-anzeige/…/<id>-<cat>-<loc>, fotocasa.es/…/<id>/d, vinted.<country>/items/<id>… on Vinted's own sites (.fr, .de, .co.uk, .es, .it, .nl, .be, .pl, .pt, .at, .lt, .lu, .cz, .sk, .hu, .ro, .se, .dk, .fi, .gr, .hr, .ie, .si, .ee, .lv, .com), seek.com.au/job/<id> and seek.co.nz/job/<id>, welcometothejungle.com/<lang>/companies/<company>/jobs/<job>.

{
"urls": [
"https://www.immobilienscout24.de/expose/134412431 700 CRM-1",
"https://www.kleinanzeigen.de/s-anzeige/abus-kinderfahrradhelm-erdbeeren-45-50cm/3539529137-217-1590",
"https://www.fotocasa.es/es/comprar/vivienda/madrid-capital/aire-acondicionado-calefaccion-ascensor/188317693/d 685000",
"https://www.vinted.fr/items/10350170143-jupe-nike-pro",
"https://www.seek.com.au/job/94000123"
]
}

Example result

From run 1BeqJ5ffbgbxtwV8y on 2026-10-14 (the second run of an 18-URL test list that also contains the five above, with the same memory name as the run before it), unedited. The input gave 685,000 as the previous price; Fotocasa itself also shows a 10,000 drop:

{
"url": "https://www.fotocasa.es/es/comprar/vivienda/madrid-capital/aire-acondicionado-calefaccion-ascensor/188317693/d",
"inputPosition": 7,
"portal": "fotocasa",
"listingId": "188317693",
"reference": null,
"status": "online",
"isOnline": true,
"statusLabel": null,
"saleConfirmed": null,
"previousStatus": "online",
"statusChanged": false,
"title": "Piso en venta",
"price": 675000,
"currency": "EUR",
"priceType": "sale",
"priceText": null,
"previousPrice": 685000,
"previousPriceSource": "input",
"priceChanged": true,
"priceDelta": -10000,
"priceDeltaPercent": -1.46,
"sitePriceDrop": 10000,
"publishedAt": "2025-12-09T12:15:28.543Z",
"updatedAt": null,
"expiresAt": null,
"dateOnPage": null,
"dateOnPageText": null,
"sellerType": "professional",
"advertiserName": "Aproperties Real Estate Madrid",
"finalUrl": "https://www.fotocasa.es/es/comprar/vivienda/madrid-capital/aire-acondicionado-calefaccion-ascensor/188317693/d",
"httpStatus": 200,
"previousCheckedAt": "2026-10-14T16:36:46.420Z",
"checkedAt": "2026-10-14T16:36:59.148Z",
"checkId": "fotocasa:188317693",
"error": null
}

The same run, other URLs: an ImmoScout24 flat listed at 710.05 € cold rent against 700 given (priceDelta 10.05, priceDeltaPercent 1.44); a Kleinanzeigen flat at 1,522 € against 1,600 given (priceDelta -78, priceDeltaPercent -4.88); a Kleinanzeigen bike helmet the site shows as "Verkauft" (sold, saleConfirmed: false); a Kleinanzeigen flat the site now redirects to a category page (redirected); a SEEK ad with status "Expired"; Vinted items the site shows as "Vendu" (sold, saleConfirmed: true) with previousPrice taken from the run before (previousPriceSource: "previous run"). One of them showed "Réservé" (reserved) in a test earlier the same day. In an earlier test (run hLfTpdyVGskro8rO7), a Vinted item that had answered "not found" seven minutes before showed "Vendu", and came back with statusChanged: true, previousStatus: "notFound".

What each status means:

statusisOnlineMeaningWhere seen in tests
onlinetrueThe listing is live.all six sites
reservedtrueStill shown, but reserved for a buyer.Vinted ("Réservé")
pausedfalseThe advertiser paused the ad.Kleinanzeigen
soldfalseThe site says sold ("Verkauft", "Vendu"). saleConfirmed tells a sale through the site's checkout (Vinted, true) from a label on a deleted ad (Kleinanzeigen, false).Kleinanzeigen, Vinted
expiredfalseThe job ad ran out.SEEK
removedfalseThe site says deleted, deactivated or archived ("Nicht mehr verfügbar", "Verschenkt", "archived").Kleinanzeigen, Welcome to the Jungle
redirectedfalseThe site sends the URL to a search or category page instead of the listing.Kleinanzeigen
notFoundfalseThe site answers "not found" (ImmoScout24, SEEK, Welcome to the Jungle and Vinted say 404 or no such id; Fotocasa redirects with propertyNotFound). Sites do not tell a deleted listing from an id that never existed.all six sites
unknownnullThe site refused the request (403, 429 after retries) or could not be reached, redirected to a sign-in, consent or bot-check page or to another site, or the page could not be read; or the site kept refusing, so the URL was not tried (see Reliability). error says why. Not charged. Run the URL again later.run yjCezQ51k8axsztYE (a Fotocasa page that did not arrive in time: 5 records, 4 charged); run 80O93hw5avC9hdGO3 (sites unreachable); a real Fotocasa 403 reproduced outside Apify; offline tests

Fields the site does not provide for a listing are null, never missing.

Pricing

Pay per event: you pay for checks that returned a status, not for time or memory.

EventFreeBronzeSilverGold and above
Actor start (once per run, 512 MB)$0.0036$0.003$0.0027$0.0024
Listing check with a known status$0.0018$0.0015$0.00135$0.0012

Worked examples (Bronze):

  • 1,000 URLs, one run: 1,000 × $0.0015 + $0.003 = $1.503.

  • A list of 200 listings checked every day for 30 days: 30 × (200 × $0.0015 + $0.003) = $9.09.

  • 20 URLs where the site refuses 2 checks: 18 × $0.0015 + $0.003 = $0.030; the 2 come back as unknown.

  • A URL listed twice is checked and charged once. Skipped inputs (other sites, search pages) cost nothing.

  • The maximum total charge you set for a run is respected: the run checks what that pays for, stops, keeps the results and names the number of unchecked URLs in its status message (run G8htjUIBbuEoJw4v9: limit $0.0105 = start + 5 checks; 5 checked and charged, 13 not checked, run SUCCEEDED). A limit below the start fee plus one check fails at once (run i4aaZkNTQcURpyrbr).

Reliability and failure behaviour

What happenedRun statusStatus message (real examples)
Checks doneSucceededChecked 1130 listings: 991 online, 43 sold, 43 expired, 39 not found, 10 removed, 3 paused, 1 redirected away (gone) — 4 prices changed; 80 input entries ignored (see OUTPUT_SUMMARY)
Some checks refused by a siteSucceededChecked 1 listing: 1 online — 1 URL could not be checked (status "unknown", not charged: Fotocasa refused 1) (a real Fotocasa 403 on an address it refuses, reproduced outside Apify)
One site keeps refusingSucceededAfter 6 refused or failed checks in a row on one site (or 2 in a row with no success for 3 minutes), that site is given up for the run: its other URLs come back unknown, not tried and not charged, and the other sites finish. … — 30 URLs could not be checked (status "unknown", not charged: Fotocasa refused 6); Fotocasa kept refusing or failing, so 24 of its URLs were not tried; try again later (offline test)
Every check refused or no site reachableFailed, within about 2 minutes whatever the list sizeNo listing could be checked: Vinted refused every request; try again later. No checks were charged (the start fee applies). (offline test). Live, with an unreachable proxy country: 40 URLs, both sites given up after 6 checks each, FAILED after 118 s, nothing but the start charged (run 80O93hw5avC9hdGO3)
Nothing usable in the input (an empty list, or only unsupported URLs)Failed, in about a second; on purpose, so a scheduled run with an empty or broken list is noticed instead of succeeding with 0 recordsNothing to do: the input has no "urls". Add listing URLs to "urls", e.g. "https://www.immobilienscout24.de/expose/134412431". No checks were charged (the start fee applies).
Maximum charge reachedSucceededChecked 5 listings: 3 online, 1 sold, 1 not found — …; stopped at the maximum charge set for this run: 13 URLs not checked
Run timeout closeSucceeded… — stopped just before the run timeout: N URLs not checked; raise the timeout (offline test)
You abort the runAbortedAborted by the user after 810 charged checks (run 1R3nUsQWLUGthPUOh: 810 records, 810 charged)
  • Requests are retried on network errors, HTTP 429 and 5xx (3 to 6 times depending on the site, with increasing pauses); a refusal (403, 429) is retried on a new proxy address where a proxy is used.
  • Results are saved every 25 checks. A run that is aborted, times out or is restarted keeps what was checked and never checks or charges the same URL twice.
  • Measured on 2026-10-14 on the current build: every live test run that had URLs to check and reachable sites succeeded with no unknown record, and was charged exactly one check per record (9 runs, 2,091 checks, among them 1,130 URLs in one run, GTubuwHwcAJEXrqfR, 91 Fotocasa listings in 54 s, LVoxuClo7p9vln0yN, and an aborted run). One run had an unknown record (a Fotocasa page that did not arrive in time) and was charged for the other 4 only.

Limits

  • Speed at the default settings, measured in run U3Fq7Av5qOcT3qwp2 (all six sites in parallel, 1,130 URLs in 178 s; 147 s in run GTubuwHwcAJEXrqfR): ImmoScout24 about 500 a minute, Welcome to the Jungle about 780, SEEK about 150, Kleinanzeigen about 90, Fotocasa about 60, Vinted about 20 (Vinted pages are 2 MB and the site limits request rates, so Vinted checks are paced).
  • Large lists: with the default run timeout of one hour, plan for about 1,200 Vinted items, 3,600 Fotocasa listings or 5,000 Kleinanzeigen ads per run (ImmoScout24 and job ads go much faster). A run that reaches the timeout stops cleanly, keeps what it checked and names how many URLs were left; raise the timeout or split the list.
  • Fotocasa pages come through Apify Proxy, usually in 2-4 s but at times in up to about 45 s; a page that does not arrive in 60 s is asked for again on another address (up to 7 times) and then reported unknown, free.
  • A Vinted "not found" is not always final: an item that is being bought is hidden for a few minutes and then shows as sold. Seen once in testing.
  • ImmoScout24 is read through the API of its mobile app; ImmoScout24 does not say whether a missing listing was sold or rented, only that it is gone.
  • Kleinanzeigen calls every deleted goods ad "Verkauft" (sold), whatever the reason the advertiser deleted it; we report the site's word as sold with saleConfirmed: false.
  • A site that blocks for a while (rate limit, bot protection) is given up for the rest of the run after a few refused checks, so a blocked site cannot keep the run going until its timeout; those URLs are unknown and free. Run them again later.
  • Idealista, Leboncoin, Immowelt and other sites behind DataDome are not supported (they need a real browser, which would cost more than a check is worth).
  • Some fields are site-specific (see "What you get"); job ads have no price, only priceText.
  • advertiserName for professionals comes from a keyword filter (legal forms such as GmbH, AG, SE, S.L.; trade words such as Immobilien, inmobiliaria, Autohaus): agencies without such a word are left null (e.g. "Althena", "SPOT MUNICH"), and trade names that contain a person's name are kept ("Immobilien Fabian Schneider"). It is there to tell agencies apart, not as a complete company directory.
  • The charged-event counters shown on a run can lag for about a minute after it ends; read them again before comparing them with the dataset.

Watching a list: compare with the previous run

On by default. Every run remembers, per listing, the status, the price and when it was checked; the next run with the same Memory name fills previousStatus, statusChanged, previousCheckedAt and, if you gave no price in the input, previousPrice from it. A check that came back unknown leaves the old line untouched.

The memory is a key-value store named property-listing-status-checker-memory in your own account (one record per memory name, at most 100,000 listings, the longest unchecked forgotten first). Delete the store or change Memory name to start over. To be told about changes, add an integration to the scheduled task (email, Slack, webhook) and filter the dataset on statusChanged = true or priceChanged = true.

FAQ

Do I need a proxy? No. Fotocasa refuses datacenter addresses outside Apify, so Fotocasa URLs always go through Apify Proxy, at no extra charge to you.

Why is a URL skipped? It is from another site, it is a search or category page rather than one listing, or it is a duplicate. The run summary lists each skipped entry with the reason.

Can I run it from code? Yes: the API, the Apify clients for JavaScript and Python, Make, Zapier, n8n. The Output tab shows the URLs.

What happens when a site changes its pages? The affected checks come back as unknown with the reason in error, uncharged; if nothing at all can be checked, the run fails. Please report the run id under Issues.

This actor reads whether a public listing is still online and its price, as any visitor can see without logging in. It does not return private persons' personal data by default: for listings of private sellers the advertiser name is null (sellerType: "private"), phone numbers and e-mail addresses written into their titles are masked, and Vinted sellers' names are never read. For professional accounts only a name that is recognisably a business is returned: text after a dash (contact person or branch) is cut off, and names the actor cannot tell from a person's are left null, which also leaves out some real company names. Turn on Include private sellers' names only if you have a lawful basis under the GDPR (or your local law) to process them, for example for your own listings.

The sites' terms of use restrict automated access; you are responsible for how you use this actor and its output: respect the sites' terms, database rights and data-protection law in your country and the country of the data, and do not use the output for unsolicited marketing to individuals. If you are unsure, ask a lawyer before you build on it.

Changelog

  • 2026-10-14 0.1: first version: ImmoScout24, Kleinanzeigen, Fotocasa, Vinted, SEEK, Welcome to the Jungle; comparison with the previous run; a site that keeps refusing is given up for the run; CSV lines; saleConfirmed; business names only for professionals.

The scrapers by the same developer for the sites this actor checks. Use one to collect listing URLs from a search, then this actor to re-check those URLs cheaply on a schedule:

  • ImmoScout24 Scraper: rent and sale listings from immobilienscout24.de with cold and warm rent, size, rooms, address and coordinates.
  • Kleinanzeigen Scraper: ads in every category from kleinanzeigen.de, by search URL or keyword.
  • Fotocasa Scraper: sale and rent listings from fotocasa.es with price per m² and price drops.
  • Vinted Scraper: items with brand, size, condition and price from all of Vinted's country sites, with a new-items monitor.
  • SEEK Jobs Scraper: job ads from seek.com.au and seek.co.nz with salary, work type and listing date.

Support

Open an issue on the actor's Issues tab with the run id.