# Cushman & Wakefield Scraper - Commercial Property Listings (`recordsdata/cushmanwakefield-scraper`) Actor

Scrape cushmanwakefield.com, Cushman & Wakefield's commercial real estate listings in 33 countries: office, industrial, retail and land for lease or sale with size, price, coordinates, photos, available spaces and brochures, plus city offices and MarketBeat reports. Export JSON, CSV or Excel.

- **URL**: https://apify.com/recordsdata/cushmanwakefield-scraper.md
- **Developed by:** [RecordsData](https://apify.com/recordsdata) (community)
- **Categories:** Real estate, Lead generation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $22.00 / 1,000 property listing (full details)s

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

![RecordsData](https://api.apify.com/v2/key-value-stores/AAm3a1h3Z9nYfrvh9/records/banner?v=3)

## Cushman & Wakefield Scraper: Commercial Property Listings, Offices and Market Reports

> Cushman & Wakefield Scraper is an Apify Actor that extracts commercial real estate from cushmanwakefield.com, the property portal of Cushman & Wakefield, in 33 countries. It covers about 18,000 offices, warehouses, factories, retail units and land plots for lease or sale, each with size in m2 and sq ft, rent or sale price, coordinates, photos, available spaces and brochures. It also returns the firm's city offices and its MarketBeat research reports. No login, browser or proxy setup needed. Pay per result.

Export the result as JSON, CSV, Excel, XML or HTML, or read it through the Apify API.

### What can you scrape from Cushman & Wakefield?

- **Detailed listings (`listing-detail`)**: one row per listing page, with the deal, property type, building class, rent or price, rate type, address, coordinates, built and available area in m2 and sq ft, year built, description, amenities, photos, brochures, available spaces and agency data.
- **Fast listings (`listing`)**: one row per listing address from the site sitemap or from a search card, with title or address facts, type, change date and the price a search card shows.
- **City offices (`office`)**: about 260 city office pages with address, phone, opening hours and description.
- **Market reports (`report`)**: research pages, including the quarterly MarketBeat reports, with market, segment, period, key takeaways and section headings.

### Why use this Cushman & Wakefield scraper?

- **The whole catalog, not a search window**: listings mode reads the sitemaps the site publishes, about 13,370 English addresses for lease and 4,820 for sale, newest first.
- **33 countries in one Actor**: the United States, Canada, Australia, Thailand, Brazil, Vietnam, Belgium, Indonesia, India, Singapore, Mexico, the United Kingdom and more. Sizes come in m2 and sq ft, and the currency is kept as published.
- **Four record types**: full listings, fast address-level rows, city offices and MarketBeat research.
- **Honest about missing values**: when a listing says "Contact us for pricing", `priceOnRequest` is `true` and no number is invented.
- **Monitor mode**: a scheduled run returns only rows it has not delivered before.

### How to scrape Cushman & Wakefield in four steps

1. Open the Actor on Apify and choose **What to collect**, usually `listings`.
2. Pick a country, a deal type and a property type, and optionally name places such as `denver`, `colorado`, `toronto` or `bangkok`.
3. Add a size range or a changed-since date, set **Maximum items** and click **Start**.
4. Download the dataset from the **Storage** tab. To watch a market, turn on **Only new results**, give it a **Monitor name** and schedule the Actor.

### Input

The form has 19 fields. All of them:

| Field | Type | Default | Meaning |
|---|---|---|---|
| `mode` | string | `listings` | What to collect: `listings`, `urls`, `offices` or `reports` |
| `maxItems` | integer | 50 | Maximum rows (free plans: 10) |
| `countries` | array | `united-states` | Country sites to read |
| `operation` | string | `any` | Deal type: `any`, `rent` or `sale` |
| `propertyTypes` | array | empty | Property type groups such as office, industrial and warehouse, retail, land, other |
| `locations` | array | empty | Places matched against the words of each listing address, such as a city or a state |
| `minAreaM2` / `maxAreaM2` | integer | none | Size range in m2 |
| `startUrls` | array | empty | Listing, search, city office or report pages for `urls` mode |
| `modifiedSince` | string | empty | Only listings the site changed since this date |
| `reportType` | string | `any` | `any` or `marketbeat` |
| `fetchDetails` | boolean | true | Open every listing for full rows; off gives the faster address-level list |
| `includeContactDetails` | boolean | false | Add broker and author names, titles and business phones |
| `includeRaw` | boolean | false | Add the raw site data |
| `onlyNew` | boolean | false | Monitor mode: skip rows already delivered |
| `stateKey` / `resetSeen` | string / boolean | empty / false | Monitor name, and a reset |
| `maxScan` | integer | 1000 | Maximum pages to open |
| `maxConcurrency` | integer | 3 | Parallel requests |
| `proxyConfiguration` | object | none | Proxy, not needed |

Input for office space for rent in Denver:

```json
{
  "mode": "listings",
  "countries": ["united-states"],
  "operation": "rent",
  "propertyTypes": ["office"],
  "locations": ["denver"],
  "maxItems": 50
}
```

### What data do you get from Cushman & Wakefield?

Every row has a `recordType`: `listing-detail`, `listing`, `office` or `report`. Fields without a value are left out, never filled with `null`. The dataset schema holds 76 columns, and a detailed listing carries 20 to 48 fields. Every row names its `country` as an ISO code.

#### Listing rows (`listing-detail` and `listing`)

| Field | Type | Example |
|---|---|---|
| `listingId`, `propertyId` | string | `s41477s122169256-l`, `265379` |
| `url`, `title` | string | the listing page, `Four Gateway Centre` |
| `operation`, `status`, `propertyType`, `propertyGroup` | string | `rent`, `Available`, `Office`, `office` |
| `buildingClass`, `isSublease` | string, boolean | `Class B`, `false` |
| `price`, `priceMax`, `pricePerM2` | number | `24`, `258.33` |
| `currency`, `priceUnit`, `priceBasis`, `rentPeriod`, `rateType` | string | `USD`, `SF`, `per-area`, `year`, `NNN` |
| `priceOnRequest` | boolean | `true` when the site says "Contact us for pricing" |
| `address`, `city`, `region`, `postalCode` | string | `4400 Kittredge Street, #40`, `Denver`, `CO`, `80239` |
| `latitude`, `longitude` | number | `39.775864`, `-104.800301` |
| `areaBuilt`, `areaAvailable`, `areaLand` | number | `5756.09` m2 |
| `areaBuiltSqft`, `areaAvailableSqft` | number | `61958`, `16123` |
| `yearBuilt`, `clearHeight`, `loadingDocks`, `driveInDoors` | number or string | `2001`, `6` |
| `availabilities`, `availabilityCount` | array, number | one entry per suite or floor with size, rent and rate type |
| `description`, `amenities`, `images`, `brochures` | text, array | listing text, photo links, PDF links |
| `agencyName`, `agencyUrl`, `brokerCount` | string, number | `Cushman & Wakefield`, the country site, `3` |
| `publishedAt`, `updatedAt`, `scrapedAt` | string | `2026-10-24`, `2026-10-24T22:39:12Z` |

#### Office rows (`office`)

| Field | Type | Example |
|---|---|---|
| `officeId` | string | the office identifier |
| `title`, `url` | string | office name, office page |
| `address`, `city`, `country` | string | office address, city, ISO country code |
| `phone` | string | the office business phone |
| `openingHours` | string | opening hours text |

#### Report rows (`report`)

| Field | Type | Example |
|---|---|---|
| `reportType` | string | `marketbeat` |
| `market`, `marketSegment` | string | city or market, property sector |
| `period` | string | quarter of the report |
| `keyTakeaways` | array | the report's main points |
| `sections` | array | section headings |
| `reportUrl`, `authorCount` | string, number | report link, number of authors |

#### Sample output

A real `listing-detail` row (office building for lease, Denver), shortened:

```json
{
  "recordType": "listing-detail",
  "title": "Four Gateway Centre",
  "listingId": "s41477s122169256-l",
  "country": "US",
  "operation": "rent",
  "propertyType": "Office",
  "price": 24,
  "currency": "USD",
  "rateType": "NNN",
  "pricePerM2": 258.33,
  "address": "4400 Kittredge Street, #40",
  "city": "Denver",
  "region": "CO",
  "latitude": 39.775864,
  "longitude": -104.800301,
  "areaBuilt": 5756.09,
  "yearBuilt": 2001,
  "agencyName": "Cushman & Wakefield",
  "scrapedAt": "2026-10-27T06:16:18.168Z"
}
```

### Pricing

Pay per result, no monthly fee. Rates are in USD per result on the Free tier.

| Event | Charged for | Per result | Per 1,000 |
|---|---|---|---|
| Listing detail record | One listing opened on its own page | $0.022 | $22.00 |
| Listing record | One address-level or search-card listing | $0.0088 | $8.80 |
| Office record | One city office page | $0.0132 | $13.20 |
| Report record | One research or MarketBeat page | $0.022 | $22.00 |

Worked examples: 1,000 detailed listings cost $22.00. 1,000 address-level listings (with **Open every listing** off) cost $8.80. All 260 city offices cost 260 x $0.0132 = $3.43. A mixed run of 500 detailed and 500 address-level listings costs $11.00 + $4.40 = $15.40. Error rows, empty searches and rows skipped by monitor mode are never charged.

### How does it compare with other commercial real estate scrapers?

Read on 2026-11-03 in the Apify Store: no other Actor reads cushmanwakefield.com. The commercial real estate Actors that exist cover other portals with a different inventory.

| | Cushman & Wakefield Scraper | Other Actors |
|---|---|---|
| Actors | This one | misterkhan/loopnet-scraper, scrapers_lat/crexi-scraper, studio-amba/loopnet-scraper |
| Site | cushmanwakefield.com, 33 countries | LoopNet and Crexi, mostly the United States |
| Extra data | City offices and MarketBeat reports | Listings and broker data |

Those Actors read other sites and do not return these rows. Choose this Actor when you need Cushman & Wakefield's own listings, its offices abroad or its MarketBeat reports as structured data. The alternative is a manual export from the site or a generic browser scraper that you maintain yourself.

### Is it legal to scrape Cushman & Wakefield? Limits and responsible use

The Actor reads public pages that need no login and follows the robots.txt rules of the site. The site terms reserve the rights to its content and limit automated use, so check the site terms before republishing commercially, and use the data in line with the privacy law that applies to you. Photos and documents are returned as links, never downloaded.

Limits:

- Only English pages (the `/en/` section) are read. People pages and downloadable contact cards are never read.
- A few large cities have their search page blocked in robots.txt; for those, use listings mode with a place.
- Some listings show no price or no size. A few countries, such as Thailand and Japan, publish listing pages without a facts table, so only text, location and photos come back there.
- Brokers and report authors are individuals, so their names are returned only when you turn on **Include contact details**.

### Use with AI agents (MCP)

Connect the Apify MCP server to Claude, Cursor or another MCP client and this Actor appears as a tool: `https://mcp.apify.com?tools=RecordsData/cushmanwakefield-scraper`.

Example prompt: "Get 30 industrial listings for lease in Brazil from cushmanwakefield.com with details, sort them by available area and tell me which ones show a rent."

### Run it from code

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });
const run = await client.actor('RecordsData/cushmanwakefield-scraper').call({ mode: 'listings', countries: ['united-states'], operation: 'rent', locations: ['denver'], maxItems: 20 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, items[0].title, items[0].price);
```

Python client, Make, Zapier, n8n, webhooks, Google Sheets and Apify schedules also work.

### Frequently Asked Questions

#### Which data can I scrape from Cushman & Wakefield?

Commercial listings for lease and sale: office, industrial, warehouse, factory, retail, land and more. Each detailed listing includes the address, coordinates, size in m2 and sq ft, rent or price when published, the description, photos, brochures and the spaces a building offers. The Actor also reads the firm's city office pages and its MarketBeat and other insight reports.

#### How do I scrape Cushman & Wakefield listings for one city?

Add the city to **Places**, for example `denver`, `houston`, `toronto` or `bangkok`, and pick the country. Listings mode matches the words of each listing address, so a state name such as `colorado` also works. Add a property type group and a deal type to narrow the result further.

#### How many listings can one run return?

There is no search-window ceiling. Listings mode reads the site's full sitemaps, which hold about 13,370 English addresses for lease and 4,820 for sale, and the United States alone has about 8,780 for lease. With **Open every listing** on, each row needs one page request, so a large run takes time. The Actor keeps to about two requests per second for all workers together.

#### Why do some rows have no rent or sale amount?

Many listings show "Contact us for pricing" instead of a figure. The Actor then sets `priceOnRequest` to `true` and never invents a number. Multi-space buildings keep the rent of each space in `availabilities`. A few countries, such as Thailand and Japan, publish listing pages without a facts table, so size and amount stay empty there and only text, location and photos are returned.

#### Which countries are covered?

Thirty-three country sites of Cushman & Wakefield, from the United States, Canada and Mexico to Australia, India, Singapore, Thailand, Vietnam, the Netherlands and Brazil. Only the English pages are read. Every row has `country` as an ISO code, and descriptions keep the original text of the site. Pick one or several countries in the input.

#### What is the difference between listing, listing-detail, office and report rows?

`listing-detail` rows open the listing page and carry the full data. `listing` rows come from the sitemap address or a search card: title or address facts, type, change date and, for search cards, the amount shown. `office` rows are city office pages with address, phone and opening hours. `report` rows are research pages with the market, segment, period and key takeaways.

#### Does it return names, phones or e-mails?

By default only business data: the company name and website and the number of brokers on a listing. Brokers and report authors are individuals, so their name, job title and business phone are returned only when you turn on **Include contact details**. Office rows hold the office's business phone.

#### How do I get only new listings?

Turn on **Only new results** and give the search a **Monitor name**. The next run skips rows it already delivered, and you are not charged for skipped ones. A listing the site changed since is delivered again. Schedule the Actor daily for an alert feed, and use **Forget seen results** when you want to start over from zero.

#### How much does a run cost?

The Actor is billed per result, with a separate event for each kind of row. A detailed listing costs $0.022, so 1,000 cost $22.00. An address-level listing costs $0.0088, so 1,000 cost $8.80. An office costs $0.0132 and a report $0.022. Error rows, empty searches and monitor skips are never charged.

#### Do I need a proxy or an API key?

No. The pages answer plain requests from Apify servers, and in cloud test runs the site refused none of the requests. The Actor retries a refusal with a pause, and only if the site keeps refusing does it switch to the Apify datacenter proxy. You only need an Apify account, and the free plan returns up to 10 items per run.

#### What happens if my input is wrong or nothing matches?

A wrong value, such as an unknown country, a bad date or an address that is not on cushmanwakefield.com, ends the run as succeeded with one free error row that says what to fix. A search with no matches ends as succeeded with no rows. Neither is charged. Paid plans return up to 1,000,000 items per run.

### Support

Questions, a missing field or a feature request: contact.punkrecordsdata@gmail.com.

This Actor is an independent tool and is not affiliated with, endorsed by or sponsored by Cushman & Wakefield. Cushman & Wakefield is a trademark of its owner.

Last updated: 2026-11-03

# Actor input Schema

## `mode` (type: `string`):

Properties for rent or sale = the commercial listings catalog (most common). Pages you paste = specific Cushman & Wakefield links. City offices = address, phone and hours of each office. Market reports = MarketBeat and other research pages.

## `maxItems` (type: `integer`):

Stops after this many rows, for example 50. Free Apify plans are capped at 10 items per run.

## `countries` (type: `array`):

Which country sites to read, for example United States. Listings default to the United States (about two thirds of the catalog). In offices and reports modes, empty means every country.

## `operation` (type: `string`):

Rent / lease, sale, or both.

## `propertyTypes` (type: `array`):

Office, industrial, retail, land or other. Empty means all types.

## `locations` (type: `array`):

For example denver, colorado, toronto, sydney. Matches the words in listing addresses (properties) or the city in the page address (offices, reports). Empty means no place filter.

## `minAreaM2` (type: `integer`):

Only listings with at least this many square meters, for example 1000.

## `maxAreaM2` (type: `integer`):

Only listings with at most this many square meters, for example 5000.

## `startUrls` (type: `array`):

One link per line: listing, search, city office or /insights/ report pages. English pages only. Example: https://www.cushmanwakefield.com/en/united-states/properties/lease/search/office

## `reportType` (type: `string`):

All insights, or only the quarterly MarketBeat reports.

## `modifiedSince` (type: `string`):

Only pages changed on or after this date, for example 2026-10-01. Empty means no date limit.

## `fetchDetails` (type: `boolean`):

On: full description, photos, available spaces, amenities, brochures and exact size and price. Costs one extra page read per listing. Off: one fast row per listing with address-level facts.

## `includeContactDetails` (type: `boolean`):

Adds the brokers on each listing (name, title, office, business phone) and report authors. These are individuals, so it is off by default.

## `includeRaw` (type: `boolean`):

Adds the unprocessed detail fields of the page that have no column of their own. For power users.

## `onlyNew` (type: `boolean`):

Skips rows delivered by an earlier run of the same search. A listing the site changed since is delivered again. Memory is stored in your own Apify account.

## `stateKey` (type: `string`):

One name per saved search, for example us-office-denver. Empty derives one from your search.

## `resetSeen` (type: `boolean`):

Clears the memory so everything counts as new.

## `maxScan` (type: `integer`):

Stops the run after this many pages whatever the number of items. Raise it for deep scans with strict area filters.

## `maxConcurrency` (type: `integer`):

Pages opened in parallel. All requests share one pace of about two per second to respect the site, so this only hides waiting time (the site answers in 2 to 8 seconds).

## `proxyConfiguration` (type: `object`):

Optional. Empty means direct requests, which work. If the site keeps refusing a connection, the actor switches to the Apify datacenter proxy on its own.

## Actor input object example

```json
{
  "mode": "listings",
  "maxItems": 10,
  "countries": [
    "united-states"
  ],
  "operation": "any",
  "propertyTypes": [],
  "locations": [
    "denver"
  ],
  "minAreaM2": 0,
  "maxAreaM2": 0,
  "startUrls": [
    "https://www.cushmanwakefield.com/en/united-states/properties/lease/search/office"
  ],
  "reportType": "any",
  "modifiedSince": "",
  "fetchDetails": true,
  "includeContactDetails": false,
  "includeRaw": false,
  "onlyNew": false,
  "stateKey": "",
  "resetSeen": false,
  "maxScan": 1000,
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

Key fields per row

## `fullData` (type: `string`):

Complete dataset with all fields

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "maxItems": 10,
    "countries": [
        "united-states"
    ],
    "locations": [
        "denver"
    ],
    "minAreaM2": 0,
    "maxAreaM2": 0,
    "startUrls": [
        "https://www.cushmanwakefield.com/en/united-states/properties/lease/search/office"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("recordsdata/cushmanwakefield-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "maxItems": 10,
    "countries": ["united-states"],
    "locations": ["denver"],
    "minAreaM2": 0,
    "maxAreaM2": 0,
    "startUrls": ["https://www.cushmanwakefield.com/en/united-states/properties/lease/search/office"],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("recordsdata/cushmanwakefield-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "maxItems": 10,
  "countries": [
    "united-states"
  ],
  "locations": [
    "denver"
  ],
  "minAreaM2": 0,
  "maxAreaM2": 0,
  "startUrls": [
    "https://www.cushmanwakefield.com/en/united-states/properties/lease/search/office"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call recordsdata/cushmanwakefield-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,recordsdata/cushmanwakefield-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/6UpOA3AqZprla9xDf/builds/fpO8Ko1wxUf0RlMqh/openapi.json
