Properstar – Global Property Listings, URLs & Agency Data avatar

Properstar – Global Property Listings, URLs & Agency Data

Pricing

from $1.50 / 1,000 results

Go to Apify Store
Properstar – Global Property Listings, URLs & Agency Data

Properstar – Global Property Listings, URLs & Agency Data

Extract property listings from Properstar across global domains like .com, .co.uk, .ch, and .fr. Use search pages, listing URLs, or agency pages. Returns prices, multilingual descriptions, photos, floor plans, GPS coordinates, and agency details via Properstar’s data service.

Pricing

from $1.50 / 1,000 results

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

0

Monthly active users

12 hours ago

Last modified

Share

Properstar Scraper

Extract property listings from Properstar across every country domain (.com, .co.uk, .ch, .fr, and more) in one actor. Paste a search results page, a single listing page, or an agency page, and get clean, structured records with prices, full multilingual descriptions, photos, floor plans, GPS coordinates, and agency details. The actor talks to Properstar's own data service, so it is fast, stable, and far cheaper to run than page-by-page scrapers.

Why this scraper

  • 30+ fields per listing, more than comparable tools on the Store.
  • Works on any Properstar country domain, auto-detected from the URL you paste.
  • Three input shapes in one actor: search pages, single listings, and agency or agent pages.
  • Multilingual titles and descriptions captured per language, not just one.
  • Full geo data (latitude, longitude, postcode, city, country) on every record.
  • Photos, floor plans, property type, rooms, bedrooms, bathrooms, living and land area in both m2 and square feet.
  • Optional full detail mode adds amenities, view types, construction year, and floor.
  • Cost optimised: the heavy data pull runs over the low-cost connection pool, so a typical run is a fraction of the price of browser-based scrapers.

Data you get

Sample shape: values are illustrative placeholders, not from a live listing.

FieldExample
id"100000001"
url"https://www.properstar.co.uk/listing/100000001"
transactionType"Sell"
type"Apartment"
subType"Penthouse"
title"Sample listing title"
description"Full description text appears here."
titleByLanguage{ "en": "Sample listing title" }
price1000000
currency"GBP"
livingAreaSqm120
landAreaSqm0
livingAreaSqft1291
rooms4
bedrooms3
bathrooms2
floor"3"
constructionYear2020
address"Sample Street 1"
city"London"
postcode"SW1"
countryISO"GB"
latitude51.5000
longitude-0.1200
pictures["https://images.example.com/0001.jpg"]
picturesCount12
floorPlans["https://images.example.com/plan-0001.jpg"]
amenities["Balcony", "Parking"]
views["City"]
status"Published"
energyRating"C"
co2Rating"B"
agencyId1000000
agencyName"Sample Agency"
agencyStatistics{ "numberOfListings": 0 }
publicationDate"2026-01-01T00:00:00Z"
changeType (incremental mode only)"NEW"
changedFields (incremental mode only)["price"]
firstSeenAt (incremental mode only)"2026-01-01T00:00:00.000Z"
lastSeenAt (incremental mode only)"2026-01-02T00:00:00.000Z"

How to use

Basic search page:

{
"startUrls": ["https://www.properstar.co.uk/united-kingdom/london/buy/apartment-house"],
"maxItems": 50,
"proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}

Search page with refinement filters:

{
"startUrls": ["https://www.properstar.com/spain/barcelona/buy/apartment-house"],
"transactionType": "buy",
"propertyTypes": ["apartment"],
"minPrice": 300000,
"maxPrice": 800000,
"minBedrooms": 2,
"maxItems": 200
}

Single listing with full detail (amenities, views, year, floor):

{
"startUrls": ["https://www.properstar.co.uk/listing/100000001"]
}

Agency inventory:

{
"startUrls": ["https://www.properstar.co.uk/agency/sample-agency/1000000"],
"maxItems": 100
}

Multiple URLs in one run:

{
"startUrls": [
"https://www.properstar.com/france/paris/rent/apartment",
"https://www.properstar.ch/switzerland/geneva/buy/house"
],
"maxItems": 300
}

Input parameters

ParameterTypeDefaultDescription
startUrlsarrayrequiredProperstar search, listing, or agency URLs from any country domain.
transactionTypestring"any"Refine search URLs to "buy" or "rent". "any" keeps the URL setting.
propertyTypesarray[]Restrict to apartment, house, land, commercial, office, parking, building, room.
minPrice / maxPriceintegernonePrice range in the selected currency.
minBedrooms / maxBedroomsintegernoneBedroom range.
luxuryOnlybooleanfalseOnly listings flagged as luxury.
enrichDetailbooleanfalseFetch each listing's detail page for amenities, views, year, floor.
maxItemsinteger20Maximum listings across all URLs. 0 = unlimited.
maxPagesPerUrlinteger(empty)Maximum result pages per search/agency URL (25 listings per page). Leave empty to walk every result page (the walk still stops at the site's own ~2000-listing retrievable ceiling).
maxResidentialMbinteger0Soft cap on Residential traffic before downgrading to the cheaper pool. 0 = no cap.
proxyobjectResidentialConnection settings. Pick a country to pin the exit region.
resumeFromRunIdstring(empty)A previous run ID or dataset ID to continue a full-catalogue walk across separate runs. Listings already collected there (matched by id) are skipped, so this run only saves the new ones.
incrementalModebooleanfalseTurn on for recurring monitoring of the same startUrls/filters. Only NEW, UPDATED, and REAPPEARED listings are returned after the first run.
stateKeystring(empty)Name an incremental-mode monitoring campaign, or share state deliberately across differently-configured runs. Auto-derived from startUrls + filters + enrichDetail when empty.
emitUnchangedbooleanfalseIncremental mode only. Also return (and bill) listings with no change, marked UNCHANGED.
emitExpiredbooleanfalseIncremental mode only. Also return (and bill) listings no longer found, marked EXPIRED — only when the run fully scanned every tracked URL.

Resuming a full-catalogue walk

For an unbounded pull (maxPagesPerUrl empty, maxItems: 0), two things protect a long run:

  • resumeFromRunId lets you continue in a brand-new run: paste the ID of a previous run (or its dataset), and this run skips every listing id already saved there, appending only new listings.
  • A checkpoint is saved automatically as the run progresses. If the run is interrupted by an Apify platform migration or you click Resurrect on a failed run, it picks back up from where it left off in the same run, without re-saving (or re-charging for) listings it already collected. No input is needed for this; it's automatic.

Incremental mode — recurring monitoring

A different workflow from Resume above: instead of continuing one specific interrupted run, Incremental mode re-runs the same startUrls and filters on a schedule (e.g. daily) and tells you only what changed, using state the actor keeps for you.

  • The first run for a given startUrls/filter/enrichDetail combination returns every listing marked changeType: "NEW".
  • Later runs return only NEW, UPDATED (with changedFields listing exactly what changed), and REAPPEARED listings by default. Turn on emitUnchanged to also get UNCHANGED rows, or emitExpired to also get EXPIRED rows for listings that disappeared.
  • EXPIRED detection only fires when the run fully scanned every tracked URL — it is skipped (with a log line explaining why) on a resumeFromRunId run, a run capped by maxItems, or a run where a page/connection was rejected mid-scan, since none of those prove a listing is actually gone.
  • State is namespaced per distinct startUrls + filter + enrichDetail combination automatically, so two different searches never mix baselines. Set stateKey to name a campaign explicitly or to share state across a deliberately different configuration.
  • emitUnchanged and emitExpired both return — and bill — extra rows; leave them off for the leanest "just tell me what's new" feed.

Send results into your apps (MCP connectors)

Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape — the Apify dataset is never changed.

What gets written to the connector: a condensed, human-readable summary of each record — not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.

  1. Authorize a connector once under Apify → Settings → Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
  3. For Notion, also set notionParentPageUrl to the page where items should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

Output example

Sample shape: values are illustrative placeholders, not from a live listing.

{
"id": "100000001",
"url": "https://www.properstar.co.uk/listing/100000001",
"class": "PropertyListing",
"transactionType": "Sell",
"type": "Apartment",
"subType": "Penthouse",
"title": "Sample listing title",
"description": "Full description text appears here.",
"titleByLanguage": { "en": "Sample listing title" },
"descriptionByLanguage": { "en": "Full description text appears here." },
"price": 1000000,
"currency": "GBP",
"livingAreaSqm": 120,
"livingAreaSqft": 1291,
"rooms": 4,
"bedrooms": 3,
"bathrooms": 2,
"floor": "3",
"constructionYear": 2020,
"address": "Sample Street 1",
"city": "London",
"postcode": "SW1",
"countryISO": "GB",
"latitude": 51.5000,
"longitude": -0.1200,
"pictures": ["https://images.example.com/0001.jpg"],
"picturesCount": 12,
"floorPlans": ["https://images.example.com/plan-0001.jpg"],
"amenities": ["Balcony", "Parking"],
"views": ["City"],
"agencyId": 1000000,
"agencyName": "Sample Agency",
"agencySlug": "sample-agency",
"agencyStatistics": { "numberOfListings": 0 },
"publicationDate": "2026-01-01T00:00:00Z"
}

Plan requirement

The one-time connection setup needs a Residential proxy, which is included on the Apify Starter plan and above. The bulk data extraction then runs automatically over the lower-cost connection pool to keep your costs down. On the free plan the connection setup may not complete, so a paid plan is recommended. Pick a proxy country to pin the exit region, or leave it unset to rotate automatically.