# CommercialCafe Commercial Real Estate Scraper (`parseforge/commercialcafe-scraper`) Actor

Scrape office, retail, industrial, flex, and land listings from CommercialCafe with address, size, asking rent or sale price, year built, broker, and image gallery.

- **URL**: https://apify.com/parseforge/commercialcafe-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** Real estate, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $93.75 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

![ParseForge Banner](https://raw.githubusercontent.com/ParseForge/apify-assets/main/banner.jpg)

## 🏢 CommercialCafe Scraper

> 🚀 **Track US and Canadian commercial real estate listings in seconds.** Pull office, retail, industrial, flex, and land records straight from CommercialCafe with addresses, asking rents, building stats, and broker contacts. No CSV exports, no copy-paste, no missed listings.

> 🕒 **Last updated:** 2026-05-09 · **📊 30 fields** per listing · **🇺🇸🇨🇦 US + Canada** · **🏬 8 property types** · **🛡️ Cloudflare-safe** by default

The **CommercialCafe Scraper** turns CommercialCafe.com search pages into structured JSON. CommercialCafe is one of the largest free commercial real estate listing networks in North America, run by Yardi (the same group behind RENTCafe and PointToPoint). Point this Actor at a city, state, or property-type search URL and it walks every result page, opens each property's detail view, and pulls down the full listing record. Each row carries a clean street address with city, state, ZIP and country codes, the geographic coordinates for mapping, the property type and class, building size and year built, the number of stories, available space ranges, asking rent or sale price, the listing broker and brokerage, plus a deep image gallery for previews and slide decks.

The Actor handles the full **US + Canada** geography (50 states, DC, Puerto Rico, all 13 Canadian provinces and territories), filters by **8 property types** (office, retail, industrial, flex, land, special purpose, multifamily, coworking), and toggles between for-lease and for-sale inventory. Pages are loaded through stealth Firefox over Apify residential proxies so Cloudflare's challenge layer stays out of the way. Output drops directly into spreadsheets, BI tools, or your real-estate pipeline. Use it to monitor new listings every morning, build cap-rate and rent-comp datasets across markets, feed broker-prospecting workflows, or track tenant-improvement opportunities by submarket and asset class.

| 🎯 Target Audience | 💡 Primary Use Cases |
|---|---|
| Commercial real estate brokers, leasing specialists, asset managers, tenant-rep advisors, acquisitions analysts, market researchers, PropTech builders | Daily new-listing alerts, lease comp building, rent-trend analysis by submarket, broker-prospecting lists, cap-rate research, market-share tracking, investor pipeline feeds |

---

### 📋 What the CommercialCafe Scraper does

Five extraction modes from a single Actor:

- 🔎 **Geo-and-type search builder.** Pick a country, state, city, property type, and lease-or-sale filter and the Actor builds the matching CommercialCafe URL automatically.
- 🔗 **Custom search URLs.** Paste any fully formed CommercialCafe listing URL (filters, sorts, advanced parameters) and skip the builder.
- 📑 **Deep pagination.** Walks every result page in sequence until coverage saturates or `maxItems` is reached.
- 🧱 **Stable property IDs.** Each record keys to CommercialCafe's internal numeric Property ID, so daily re-runs deduplicate cleanly.
- 🖼️ **Detail-page enrichment.** Opens each property page to capture broker details, full description, building stats, geo coordinates, and the full image gallery. Disable with `fetchDetails=false` for fast metadata-only pulls.

Each record carries 30 fields including the canonical listing URL, building name and street address, city / state / postal code / country, neighborhood and submarket label, latitude and longitude, property type, listing type (for-lease vs for-sale), asking rent (raw + numeric + unit) or asking sale price, building size, available-space range with parsed min and max, year built and renovated, building class (A / B / C), number of stories, lot size, parking, listing broker name and brokerage company, plus the photo gallery.

> 💡 **Why it matters:** Most commercial brokers spend the first hour of every morning reloading CommercialCafe pages, copy-pasting addresses and rents into spreadsheets, and reconciling duplicates by hand. This Actor turns that morning ritual into a scheduled job that lands fresh records in your pipeline before standup, so the analyst time goes into deal work, not data entry.

---

### 🎬 Full Demo

_🚧 Coming soon: a 3-minute walkthrough from sign-up to a downloaded dataset._

---

### ⚙️ Input

<table>
<thead>
<tr><th>Input</th><th>Type</th><th>Default</th><th>Behavior</th></tr>
</thead>
<tbody>
<tr><td><code>startUrls</code></td><td>array</td><td>1 sample URL</td><td>CommercialCafe listing search URLs. Each is walked end-to-end, paginating until exhausted or <code>maxItems</code> is hit. When set, the geo / type fields below are ignored.</td></tr>
<tr><td><code>maxItems</code></td><td>integer</td><td><code>10</code></td><td>Records returned per run. Free plan caps at 10 (preview), paid plan at 1,000,000.</td></tr>
<tr><td><code>country</code></td><td>string</td><td><code>"us"</code></td><td>Country to search in. <code>us</code> or <code>ca</code>. Used only when <code>startUrls</code> is empty.</td></tr>
<tr><td><code>state</code></td><td>string</td><td>(empty)</td><td>Two-letter state (US) or province (Canada) code, lowercase. Examples: <code>ny</code>, <code>ca</code>, <code>tx</code>, <code>fl</code>, <code>on</code>, <code>bc</code>.</td></tr>
<tr><td><code>city</code></td><td>string</td><td>(empty)</td><td>City slug, lowercase, hyphens for spaces. Examples: <code>new-york</code>, <code>los-angeles</code>, <code>san-francisco</code>. Leave empty for state-wide.</td></tr>
<tr><td><code>propertyType</code></td><td>string</td><td><code>"all"</code></td><td>One of <code>all</code>, <code>office</code>, <code>industrial</code>, <code>retail</code>, <code>flex</code>, <code>land</code>, <code>special-purpose</code>, <code>multifamily</code>, <code>coworking</code>.</td></tr>
<tr><td><code>listingType</code></td><td>string</td><td><code>"all"</code></td><td>Filter lease vs sale. <code>all</code>, <code>for-lease</code>, or <code>for-sale</code>.</td></tr>
<tr><td><code>fetchDetails</code></td><td>boolean</td><td><code>true</code></td><td>Open each property's detail page to capture broker contacts, full description, image gallery, geo. Disable for fast metadata-only pulls.</td></tr>
<tr><td><code>useResidentialProxy</code></td><td>boolean</td><td><code>true</code></td><td>Route traffic through Apify residential proxies. Recommended (and on by default) because CommercialCafe is fronted by Cloudflare.</td></tr>
<tr><td><code>proxyCountry</code></td><td>string</td><td><code>"US"</code></td><td>Country code for the residential proxy IP pool. Match the listing country.</td></tr>
</tbody>
</table>

**Example: 200 office listings in Manhattan.**

```json
{
    "country": "us",
    "state": "ny",
    "city": "new-york",
    "propertyType": "office",
    "listingType": "for-lease",
    "maxItems": 200
}
````

**Example: industrial properties for sale across Texas using a custom URL.**

```json
{
    "startUrls": [
        { "url": "https://www.commercialcafe.com/industrial/us/tx/?listingType=for-sale" }
    ],
    "maxItems": 500,
    "fetchDetails": true,
    "proxyCountry": "US"
}
```

> ⚠️ **Good to Know:** CommercialCafe sits behind Cloudflare's managed challenge layer. Keep `useResidentialProxy` on and match `proxyCountry` to the listing geography (US for US listings, CA for Canada). Datacenter proxies are blocked. Detail pages are opened sequentially with small randomized delays so a 10-listing run takes about a minute and a 200-listing run takes 15-20 minutes.

***

### 📊 Output

A clean dataset, one row per property, ready for spreadsheets, BI tools, or your data warehouse.

#### 🧾 Schema

| Field | Type | Example |
|---|---|---|
| 🖼️ `imageUrl` | string | `https://cdn.commercialcafe.com/images/.../1.jpg` |
| 🏷️ `title` | string | `69 Mercer Street` |
| 🔗 `url` | string | `https://www.commercialcafe.com/commercial-property/us/ny/new-york/69-mercer-street/` |
| 🆔 `propertyId` | string | `841305` |
| 📮 `address` | string | `69 Mercer Street` |
| 🏙️ `city` | string | `New York` |
| 🗺️ `state` | string | `NY` |
| 🌍 `country` | string | `US` |
| 📬 `postalCode` | string | `10012` |
| 🏘️ `neighborhood` | string | `SoHo` |
| 🏢 `propertyType` | string | `Mixed Use - Office / Retail` |
| 📜 `listingType` | string | `for-lease` |
| 💵 `askingPrice` | number | `2750000` |
| 💲 `askingRent` | string | `$73.04/SF/YR` |
| 🔢 `askingRentNumeric` | number | `73.04` |
| 📐 `rentUnit` | string | `SF/YR` |
| 📏 `buildingSize` | number | `15000` |
| 📦 `availableSpace` | string | `1,596 - 5,200 SF (5 spaces)` |
| ⬇️ `minSpaceAvailable` | number | `1596` |
| ⬆️ `maxSpaceAvailable` | number | `5200` |
| 📅 `yearBuilt` | integer | `1890` |
| 🛠️ `yearRenovated` | integer | `2018` |
| 🏷️ `buildingClass` | string | `B` |
| 🏗️ `stories` | integer | `7` |
| 📐 `lotSize` | string | `0.05 Acre` |
| 🅿️ `parking` | string | `Surface, 12 spaces` |
| 📍 `latitude` | number | `40.7226320` |
| 📍 `longitude` | number | `-74.0005640` |
| 📝 `description` | string | `Welcome to 69 Mercer Street, an exceptional property...` |
| 👤 `brokerName` | string | `John Pasquale` |
| 🏢 `brokerCompany` | string | `Pep Real Estate LLC` |
| ☎️ `brokerPhone` | string | `(212) 555-0142` |
| 🖼️ `images` | array | `["https://cdn.commercialcafe.com/.../1.jpg", ...]` |
| 🕒 `scrapedAt` | string | `2026-05-09T01:55:24.310Z` |
| ❌ `error` | string | populated only if a record could not be scraped |

#### 📦 Sample records

<details>
<summary><b>Typical for-lease listing (multi-tenant office building)</b></summary>

```json
{
  "imageUrl": "https://cdn.commercialcafe.com/images/D5003275-2B90-4C90-A336-9D3B78811FFC/8C9833AD3AE847A79857493ABB93F22E.jpg",
  "title": "69 Mercer Street",
  "url": "https://www.commercialcafe.com/commercial-property/us/ny/new-york/69-mercer-street/",
  "propertyId": "841305",
  "address": "69 Mercer Street",
  "city": "New York",
  "state": "NY",
  "country": "US",
  "postalCode": "10012",
  "neighborhood": "SoHo",
  "propertyType": "Mixed Use - Office / Retail",
  "listingType": "for-lease",
  "askingRent": "$73.04/SF/YR",
  "askingRentNumeric": 73.04,
  "rentUnit": "SF/YR",
  "buildingSize": 15000,
  "availableSpace": "1,596 - 5,200 SF (5 spaces)",
  "minSpaceAvailable": 1596,
  "maxSpaceAvailable": 5200,
  "yearBuilt": 1890,
  "buildingClass": "B",
  "stories": 7,
  "latitude": 40.722632,
  "longitude": -74.000564,
  "description": "Welcome to 69 Mercer Street, an exceptional property located in the heart of SoHo, between Spring Street and Broome Street. This stunning cast-iron building seamlessly combines classic New York City architecture with modern designs...",
  "brokerName": "John Pasquale",
  "brokerCompany": "Pep Real Estate LLC",
  "images": ["https://cdn.commercialcafe.com/images/D5003275-2B90-4C90-A336-9D3B78811FFC/...jpg", "https://cdn.commercialcafe.com/images/62B0CA4A-DD9B-4C44-8AFB-4088D54327EA/...jpg"],
  "scrapedAt": "2026-05-09T01:55:24.310Z"
}
```

</details>

<details>
<summary><b>Edge case (full-building lease quoted in $/month)</b></summary>

```json
{
  "imageUrl": "https://cdn.commercialcafe.com/images/B99237C5-270C-438C-8FCD-93AB00DF8C03/1.jpg",
  "title": "54 Crosby St",
  "url": "https://www.commercialcafe.com/commercial-property/us/ny/new-york/54-crosby-st/",
  "propertyId": "2130902",
  "address": "54 Crosby St",
  "city": "New York",
  "state": "NY",
  "country": "US",
  "postalCode": "10012",
  "neighborhood": "SoHo",
  "propertyType": "Mixed Use - Office / Retail",
  "listingType": "for-lease",
  "askingRent": "$55k/MO For Full Building",
  "askingRentNumeric": 55,
  "buildingSize": 8000,
  "availableSpace": "1,900 - 6,100 SF (2 spaces)",
  "minSpaceAvailable": 1900,
  "maxSpaceAvailable": 6100,
  "yearBuilt": 1900,
  "buildingClass": "B",
  "stories": 5,
  "lotSize": "0.05 Acre",
  "latitude": 40.722168,
  "longitude": -73.99871,
  "brokerName": "John Pasquale",
  "brokerCompany": "Pep Real Estate LLC",
  "scrapedAt": "2026-05-09T01:55:32.083Z"
}
```

</details>

<details>
<summary><b>Sparse single-tenant retail building (no class, no lot size)</b></summary>

```json
{
  "imageUrl": "https://cdn.commercialcafe.com/images/.../327-douglass.jpg",
  "title": "327 Douglass Street",
  "url": "https://www.commercialcafe.com/commercial-property/us/ny/brooklyn/327-douglass-street/",
  "propertyId": "2386054",
  "address": "327 Douglass Street",
  "city": "Brooklyn",
  "state": "NY",
  "country": "US",
  "postalCode": "11217",
  "neighborhood": "Gowanus",
  "propertyType": "Retail - Street Retail",
  "listingType": "for-lease",
  "askingRent": "$40.00/SF/YR",
  "askingRentNumeric": 40,
  "rentUnit": "SF/YR",
  "buildingSize": 6000,
  "availableSpace": "6,000 SF",
  "minSpaceAvailable": 6000,
  "maxSpaceAvailable": 6000,
  "yearBuilt": 1931,
  "buildingClass": null,
  "stories": 1,
  "latitude": 40.6798098,
  "longitude": -73.9823142,
  "brokerName": "John Pasquale",
  "brokerCompany": "Pep Real Estate LLC",
  "scrapedAt": "2026-05-09T01:55:49.466Z"
}
```

</details>

***

### ✨ Why choose this Actor

| | Capability |
|---|---|
| 🛡️ | **Cloudflare-safe by default.** Stealth Firefox + Apify residential proxies. No "Just a moment" pages, no manual challenge solving. |
| 📐 | **Parsed numeric fields.** Rent, building size, available space ranges, lat/long all returned as numbers and ready for sorting and analytics, plus the original display strings. |
| 🗺️ | **Geo-coded out of the box.** Latitude and longitude on every record so you can drop the dataset onto a map without a separate geocoding step. |
| 🆔 | **Stable property IDs for clean reruns.** Daily snapshots dedupe on CommercialCafe's internal Property ID, not fuzzy address matching. |
| 🏬 | **Eight property type filters.** Office, retail, industrial, flex, land, special purpose, multifamily, coworking, each as a first-class input. |
| 🇺🇸🇨🇦 | **US + Canada coverage.** All 50 states, DC, Puerto Rico, plus 13 Canadian provinces and territories, no extra setup. |
| 🖼️ | **Image galleries included.** Every listing returns its full photo set, ready for slide decks, dashboards, and broker outreach. |

> 📊 In our cloud verification run, **5 of 5 sampled listings** returned with complete title, address, geo coordinates, asking rent, building size, year built, and broker, plus 23-50 images each.

***

### 📈 How it compares to alternatives

| Approach | Cost | Coverage | Refresh | Filters | Setup |
|---|---|---|---|---|---|
| Manual copy-paste | Hours/week | One market at a time | Stale by 9am | None | None |
| Paid CRE data subscriptions | $500-$5,000/mo | National | Daily | Rich | Sales call required |
| In-house headless browser | Engineer time | Whatever you build | Whatever you schedule | Whatever you build | Build + maintain |
| Generic web scraper templates | Low | None for CommercialCafe | None | None | DIY |
| Other community scrapers | Free / freemium | Inconsistent | Often broken | Limited | Variable |
| **⭐ CommercialCafe Scraper** *(this Actor)* | Apify usage only | US + Canada, 8 property types | On demand or scheduled | 8 property types, lease/sale, geo | One JSON input |

The trade-off is straightforward: paid data feeds give you years of history and proprietary datasets, this Actor gives you the public listing layer fresh, in your shape, on your schedule, for the price of a few minutes of compute.

***

### 🚀 How to use

1. ✨ **Create a free Apify account.** Sign up at [console.apify.com](https://console.apify.com/sign-up?fpr=vmoqkp).
2. 🧭 **Open the Actor.** Find the CommercialCafe Scraper in the [Apify Store](https://apify.com/parseforge) and click *Try for free*.
3. 📝 **Configure your search.** Either paste a CommercialCafe URL into `startUrls` or pick a country / state / city / property type from the form. Set `maxItems` and hit *Start*.
4. ⏳ **Wait for the run.** A 10-listing preview takes about a minute. A few hundred records typically finishes in under 30 minutes.
5. ⬇️ **Export the dataset.** Download as JSON, CSV, Excel, or wire the dataset URL into your warehouse, BI tool, or downstream broker pipeline.

> ⏱️ **Total time:** about three minutes from sign-up to your first downloaded CSV.

***

### 💼 Business use cases

<table>
<tr>
<td width="50%">

#### 🏘️ Commercial brokers

- Daily new-listing alerts in your top markets
- Lease-comp datasets for client tour books
- Submarket rent benchmarks for BOV decks
- Cold-prospect lists segmented by asset class

</td>
<td width="50%">

#### 🧑‍💼 Tenant-rep advisors

- Live availability inventory across submarkets
- Asking-rent ranges for negotiation playbooks
- Building age and class filters for client preferences
- Side-by-side suite comparisons in seconds

</td>
</tr>
<tr>
<td width="50%">

#### 💰 Acquisitions and capital markets

- Cap-rate research feeds for underwriting
- Tracking of stalled or relisted assets
- Owner / brokerage market-share analysis
- Pipeline triggers when new for-sale stock hits

</td>
<td width="50%">

#### 🏢 PropTech and analytics teams

- Reference data for CRE platforms and apps
- Geo-coded inventory for map UIs
- Training data for valuation and matching models
- Competitive monitoring for portfolio products

</td>
</tr>
</table>

***

### 🌟 Beyond business use cases

Data like this powers more than commercial workflows. The same structured records support research, education, civic projects, and personal initiatives.

<table>
<tr>
<td width="50%">

#### 🎓 Research and academia

- Empirical datasets for papers, thesis work, and coursework
- Longitudinal studies tracking changes across snapshots
- Reproducible research with cited, versioned data pulls
- Classroom exercises on data analysis and ethical scraping

</td>
<td width="50%">

#### 🎨 Personal and creative

- Side projects, portfolio demos, and indie app launches
- Data visualizations, dashboards, and infographics
- Content research for bloggers, YouTubers, and podcasters
- Hobbyist collections and personal trackers

</td>
</tr>
<tr>
<td width="50%">

#### 🤝 Non-profit and civic

- Transparency reporting and accountability projects
- Advocacy campaigns backed by public-interest data
- Community-run databases for local issues
- Investigative journalism on public records

</td>
<td width="50%">

#### 🧪 Experimentation

- Prototype AI and machine-learning pipelines with real data
- Validate product-market hypotheses before engineering spend
- Train small domain-specific models on niche corpora
- Test dashboard concepts with live input

</td>
</tr>
</table>

***

### 🔌 Automating CommercialCafe Scraper

Run the Actor on a schedule, trigger it from an API call, or wire it into your data pipeline.

- **Node.js:** [`apify-client`](https://docs.apify.com/api/client/js) handles auth, run-and-wait, dataset pagination.
- **Python:** [`apify-client` for Python](https://docs.apify.com/api/client/python) gives you the same flow from a notebook or pipeline.
- **REST docs:** the [Apify API reference](https://docs.apify.com/api/v2) covers run-sync, async start, dataset export, and webhook callbacks.

For recurring runs, use Apify [Schedules](https://docs.apify.com/platform/schedules) to fire the Actor every morning before standup, every hour during a market push, or weekly for trend dashboards. Combine with [Webhooks](https://docs.apify.com/platform/integrations/webhooks) to push fresh records into Slack, Airtable, or your CRM the moment a run finishes.

***

### ❓ Frequently Asked Questions

<details>
<summary>📍 <b>Which countries are covered?</b></summary>

The United States (50 states, DC, Puerto Rico) and Canada (all 13 provinces and territories). The `country` and `state` inputs accept ISO codes for both.

</details>

<details>
<summary>🛡️ <b>How does the Actor get past the Cloudflare challenge?</b></summary>

The Actor uses a stealth Firefox build over Apify residential proxies. Both are on by default. Datacenter proxies are blocked by the site, so leave `useResidentialProxy` enabled.

</details>

<details>
<summary>🏬 <b>Which property types can I filter on?</b></summary>

Eight types: office, retail, industrial, flex, land, special purpose, multifamily, and coworking. Set `propertyType` or use a CommercialCafe URL that already includes the type folder.

</details>

<details>
<summary>📊 <b>How many listings can I pull in one run?</b></summary>

Free plan caps at 10 records per run as a preview. Paid plans go up to 1,000,000 records per run. Adjust `maxItems` to suit your batch size.

</details>

<details>
<summary>🔗 <b>Can I pass my own CommercialCafe search URL?</b></summary>

Yes. Drop any CommercialCafe listing URL into `startUrls` and it overrides the country / state / city / property-type form. Useful if you've already filtered the search in a browser.

</details>

<details>
<summary>⏱️ <b>How long does a typical run take?</b></summary>

About a minute for 10 records, 5-10 minutes for 100, and 15-20 minutes for several hundred. Detail pages are opened sequentially with small randomized delays to keep CommercialCafe happy.

</details>

<details>
<summary>🧱 <b>How are duplicates handled across daily reruns?</b></summary>

Each record carries CommercialCafe's internal numeric Property ID. Use that as the key when merging new pulls into your warehouse so the same listing reconciles cleanly across snapshots.

</details>

<details>
<summary>🖼️ <b>Are images included?</b></summary>

Yes. Every record includes a primary `imageUrl` plus an `images` array with the full photo gallery (up to 50 photos), pulled from the property detail page.

</details>

<details>
<summary>💼 <b>Can I use this data commercially?</b></summary>

You can use the output for internal commercial analysis, broker prospecting, and product features. Always check CommercialCafe's terms of service before redistributing the data publicly or republishing photos.

</details>

<details>
<summary>💰 <b>Do I need a paid Apify plan?</b></summary>

No. A free account works for the 10-record preview. Bigger pulls and scheduled runs need a paid plan. See [Apify pricing](https://apify.com/pricing) for tiers.

</details>

<details>
<summary>🛠️ <b>What if a run fails?</b></summary>

CommercialCafe occasionally throttles or rotates its anti-bot rules. Retry the run, swap `proxyCountry` to better match the listing geography, and confirm the URL still resolves in a browser. If it still fails, [open the contact form](https://tally.so/r/BzdKgA) and we'll investigate.

</details>

<details>
<summary>⚖️ <b>Is scraping CommercialCafe legal?</b></summary>

The Actor reads only public listing pages, the same content any browser sees without authentication. Public-data scraping is broadly permitted, but laws vary by jurisdiction and platform terms of service evolve. Review CommercialCafe's terms and your local rules before running at scale, especially for redistribution.

</details>

***

### 🔌 Integrate with any app

- [**Make**](https://apify.com/integrations/make) - drop CommercialCafe rows into Airtable, Google Sheets, or Slack with no code.
- [**Zapier**](https://apify.com/integrations/zapier) - chain runs into HubSpot, Salesforce, Pipedrive, and 5,000+ other apps.
- [**n8n**](https://apify.com/integrations/n8n) - build self-hosted broker pipelines with custom branching logic.
- [**LangChain**](https://docs.apify.com/platform/integrations/langchain) - use listings as a tool in your AI agents and RAG pipelines.
- [**Webhooks**](https://docs.apify.com/platform/integrations/webhooks) - push fresh records to your warehouse or CRM the moment a run completes.
- [**REST API**](https://docs.apify.com/api/v2) - call the Actor directly from any language, get back JSON or CSV.

***

### 🔗 Recommended Actors

- [**🏠 Zillow Scraper**](https://apify.com/parseforge/zillow-scraper) - residential listings, perfect companion when your CRE pipeline also touches mixed-use buildings.
- [**🏢 James Edition Real Estate Scraper**](https://apify.com/parseforge/james-edition-real-estate-scraper) - luxury and trophy real estate listings worldwide.
- [**🌳 LandWatch Scraper**](https://apify.com/parseforge/landwatch-scraper) - rural land, ranches, and undeveloped acreage across the US.
- [**🚛 CommercialTruckTrader Scraper**](https://apify.com/parseforge/commercialtrucktrader-scraper) - sister vertical for fleet and commercial vehicle inventory.
- [**🏷️ Auction.com Property Scraper**](https://apify.com/parseforge/auction-com-property-scraper-ppe) - distressed and foreclosure inventory for opportunistic acquisitions.

> 💡 **Pro Tip:** browse the complete [ParseForge collection](https://apify.com/parseforge) for more real estate, business intelligence, and lead-generation actors.

***

**🆘 Need Help?** [**Open our contact form**](https://tally.so/r/BzdKgA) and we'll get back within one business day.

***

> ⚖️ **Disclaimer:** This Actor scrapes only publicly available listing data from CommercialCafe.com. ParseForge is not affiliated with, endorsed by, or sponsored by CommercialCafe or Yardi Systems. Verify each record against the source before relying on it for legal, financial, or transactional decisions, and always review CommercialCafe's terms of service and your local laws before running at scale or redistributing the data.

# Actor input Schema

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

Listing search URLs from CommercialCafe (e.g. https://www.commercialcafe.com/commercial-real-estate/us/ny/new-york/). If provided, the country/state/city/propertyType filters below are ignored.

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

Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000

## `country` (type: `string`):

Country to search in. Used only when no Start URLs are provided.

## `state` (type: `string`):

Two-letter state (US) or province (Canada) code, lowercase. Examples: ny, ca, tx, fl for US; on, bc, ab, qc for Canada.

## `city` (type: `string`):

City slug, lowercase, hyphens for spaces. Examples: new-york, los-angeles, san-francisco. Leave empty to search the entire state.

## `propertyType` (type: `string`):

Filter listings by property type. Leave on "all" to include every category.

## `listingType` (type: `string`):

Filter by lease vs. sale listings.

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

If enabled, the scraper visits each property's detail page to capture extra fields (broker info, full description, amenities, floors, year built, full image gallery). Disabling speeds up runs but returns only the fields visible on the listing card.

## `useResidentialProxy` (type: `boolean`):

Route traffic through Apify residential proxies. Recommended (and on by default) because CommercialCafe is protected by Cloudflare.

## `proxyCountry` (type: `string`):

Country for the residential proxy IP pool. Match the country of the listings you're scraping for best results.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.commercialcafe.com/commercial-real-estate/us/ny/new-york/"
    }
  ],
  "maxItems": 10,
  "country": "us",
  "propertyType": "all",
  "listingType": "all",
  "fetchDetails": true,
  "useResidentialProxy": true,
  "proxyCountry": "US"
}
```

# Actor output Schema

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

Table view of the most useful listing fields.

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

Complete dataset with every extracted field.

# 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 = {
    "startUrls": [
        {
            "url": "https://www.commercialcafe.com/commercial-real-estate/us/ny/new-york/"
        }
    ],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/commercialcafe-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 = {
    "startUrls": [{ "url": "https://www.commercialcafe.com/commercial-real-estate/us/ny/new-york/" }],
    "maxItems": 10,
}

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

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

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

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.commercialcafe.com/commercial-real-estate/us/ny/new-york/"
    }
  ],
  "maxItems": 10
}' |
apify call parseforge/commercialcafe-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=parseforge/commercialcafe-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "CommercialCafe Commercial Real Estate Scraper",
        "description": "Scrape office, retail, industrial, flex, and land listings from CommercialCafe with address, size, asking rent or sale price, year built, broker, and image gallery.",
        "version": "0.1",
        "x-build-id": "UIHSChQde24ju5G7X"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/parseforge~commercialcafe-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-parseforge-commercialcafe-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/parseforge~commercialcafe-scraper/runs": {
            "post": {
                "operationId": "runs-sync-parseforge-commercialcafe-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/parseforge~commercialcafe-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-parseforge-commercialcafe-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "Listing search URLs from CommercialCafe (e.g. https://www.commercialcafe.com/commercial-real-estate/us/ny/new-york/). If provided, the country/state/city/propertyType filters below are ignored.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxItems": {
                        "title": "Max Items",
                        "minimum": 1,
                        "maximum": 1000000,
                        "type": "integer",
                        "description": "Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000"
                    },
                    "country": {
                        "title": "Country",
                        "enum": [
                            "us",
                            "ca"
                        ],
                        "type": "string",
                        "description": "Country to search in. Used only when no Start URLs are provided.",
                        "default": "us"
                    },
                    "state": {
                        "title": "State / Province",
                        "enum": [
                            "al",
                            "ak",
                            "az",
                            "ar",
                            "ca",
                            "co",
                            "ct",
                            "de",
                            "fl",
                            "ga",
                            "hi",
                            "id",
                            "il",
                            "in",
                            "ia",
                            "ks",
                            "ky",
                            "la",
                            "me",
                            "md",
                            "ma",
                            "mi",
                            "mn",
                            "ms",
                            "mo",
                            "mt",
                            "ne",
                            "nv",
                            "nh",
                            "nj",
                            "nm",
                            "ny",
                            "nc",
                            "nd",
                            "oh",
                            "ok",
                            "or",
                            "pa",
                            "ri",
                            "sc",
                            "sd",
                            "tn",
                            "tx",
                            "ut",
                            "vt",
                            "va",
                            "wa",
                            "wv",
                            "wi",
                            "wy",
                            "dc",
                            "pr",
                            "ab",
                            "bc",
                            "mb",
                            "nb",
                            "nl",
                            "ns",
                            "nt",
                            "nu",
                            "on",
                            "pe",
                            "qc",
                            "sk",
                            "yt"
                        ],
                        "type": "string",
                        "description": "Two-letter state (US) or province (Canada) code, lowercase. Examples: ny, ca, tx, fl for US; on, bc, ab, qc for Canada."
                    },
                    "city": {
                        "title": "City",
                        "type": "string",
                        "description": "City slug, lowercase, hyphens for spaces. Examples: new-york, los-angeles, san-francisco. Leave empty to search the entire state."
                    },
                    "propertyType": {
                        "title": "Property Type",
                        "enum": [
                            "all",
                            "office",
                            "industrial",
                            "retail",
                            "flex",
                            "land",
                            "special-purpose",
                            "multifamily",
                            "coworking"
                        ],
                        "type": "string",
                        "description": "Filter listings by property type. Leave on \"all\" to include every category.",
                        "default": "all"
                    },
                    "listingType": {
                        "title": "Listing Type",
                        "enum": [
                            "all",
                            "for-lease",
                            "for-sale"
                        ],
                        "type": "string",
                        "description": "Filter by lease vs. sale listings.",
                        "default": "all"
                    },
                    "fetchDetails": {
                        "title": "Fetch Details",
                        "type": "boolean",
                        "description": "If enabled, the scraper visits each property's detail page to capture extra fields (broker info, full description, amenities, floors, year built, full image gallery). Disabling speeds up runs but returns only the fields visible on the listing card.",
                        "default": true
                    },
                    "useResidentialProxy": {
                        "title": "Use Residential Proxy",
                        "type": "boolean",
                        "description": "Route traffic through Apify residential proxies. Recommended (and on by default) because CommercialCafe is protected by Cloudflare.",
                        "default": true
                    },
                    "proxyCountry": {
                        "title": "Proxy Country",
                        "enum": [
                            "US",
                            "CA",
                            "GB",
                            "DE",
                            "FR",
                            "AU"
                        ],
                        "type": "string",
                        "description": "Country for the residential proxy IP pool. Match the country of the listings you're scraping for best results.",
                        "default": "US"
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
