CBRE APIcbre.com ↗
Search and extract CBRE US commercial real estate listings by location, type, and transaction. Get pricing, broker contacts, spaces, and coordinates.
What is the CBRE API?
The CBRE API exposes 7 endpoints covering US commercial real estate listings on cbre.com, including sale and lease inventory with normalized address, coordinates, pricing, broker contacts, and subdivided space details. The search_properties endpoint accepts bounding-box, radius, and free-text location filters simultaneously with property-type, size, and transaction-type constraints, returning up to 10,000 candidate listings per filtered query with accurate pagination.
curl -X GET 'https://api.parse.bot/scraper/eee95c27-9fe9-4347-a798-32cfc2ce7122/search_properties?page=1&sort=desc%28Common.LastUpdated%29&location=New+York%2C+NY%2C+USA&max_size=50000&min_size=1000&page_size=24&property_type=Office&transaction_type=lease' \ -H 'X-API-Key: $PARSE_API_KEY'
Search CBRE US commercial listings. One record per property listing (a parent listing may contain several spaces, returned inline). Filters combine with AND: transaction_type (sale returns only listings marked for sale, lease-only listings are never mixed in; a listing marketed for both sale and lease has transaction_types ['sale','lease']), status, property types (OR across property_type + property_types), state, one geographic filter, size and disclosed-price bounds. Geographic precedence: bbox > latitude/longitude/radius_miles > location; state always ANDs with the geographic filter. radius_miles is a straight-line (as-the-crow-flies) distance in statute miles approximated by a 36-point circle, not a driving distance. location text (city, ZIP, state, address) is geocoded to its bounding viewport; text the geocoder cannot place returns a stale_input error instead of a nationwide result set. Disclosed asking price means a positive stated sale-price amount; contact-broker and zero/absent values are unpriced and are excluded whenever min_price or max_price is set unless include_unpriced=true. Size and price bounds are inclusive and evaluated over the whole matching result set before paging, so total_matches, has_more and page tiling stay accurate; this costs two round trips and is capped at 10000 candidate listings (truncated=true when the source held more). Without size/price bounds the call is a single round trip. Results default to newest-updated first. page_size accepts 1-100. Each item in properties is the raw source record; listings holds the normalized record for the same item in the same order (listing_id, listing_url, address, coordinates, asking_price with currency, status, transaction_types, building/lot area with units, photos, brochures, agents, update dates). Zoning, parking, dimensions and marketing text are source-reported listing information, not verified facts. Fields not published by the source (parcel IDs, structured zoning, stories, occupancy, auction bids/deadlines) are not returned.
| Param | Type | Description |
|---|---|---|
| bbox | string | Bounding box as 'south,west,north,east' in decimal degrees (WGS84). Takes precedence over coordinate radius and location. |
| page | integer | 1-based page number over the filtered result set. |
| sort | string | Source sort expression; the default orders by most recently updated first. |
| state | string | 2-letter US state code (e.g. NJ) applied to the listing address; ANDs with any geographic filter. |
| status | string | Listing status filter applied by the source. Omit to return all statuses. |
| latitude | number | Center latitude in decimal degrees for a straight-line radius search; requires longitude and radius_miles. |
| location | string | Free-text place to search near: city ('Midland Park, NJ'), 5-digit ZIP, state name or full address. Geocoded to the place's bounding viewport. Ignored when bbox or coordinate radius is supplied. |
| max_size | number | Inclusive maximum property size in sqft. |
| min_size | number | Inclusive minimum property size in sqft (total size, falling back to minimum available size). |
| longitude | number | Center longitude in decimal degrees for a straight-line radius search; requires latitude and radius_miles. |
| max_price | number | Inclusive maximum disclosed asking price. Setting it excludes unpriced listings unless include_unpriced=true. |
| min_price | number | Inclusive minimum disclosed asking price in the listing's currency (USD on this site). Setting it excludes unpriced listings unless include_unpriced=true. |
| page_size | integer | Listings per page, 1-100. |
| radius_miles | number | Straight-line (great-circle, not road/driving) radius in statute miles around latitude/longitude; must be > 0. |
| property_type | string | Single property type code. Combined (OR) with property_types when both are given. Unrecognized codes return a stale_input error listing the accepted codes. |
| property_types | string | Comma-separated PropertyType codes matched with OR semantics, e.g. Office,Retail. Aliases Hotel, Medical, Data Center, Flex and Specialty are mapped to the site codes. |
| include_unpriced | boolean | Only meaningful when min_price or max_price is set: true also returns listings with no disclosed asking price (contact broker, zero placeholder, absent); they never satisfy a price bound on their own. |
| transaction_type | string | 'sale' = listings offered for sale only (no lease-only listings); 'lease' = listings offered for lease; 'allTypes' = both. When omitted, lease listings are returned. |
{
"type": "object",
"fields": {
"page": "integer page returned",
"has_more": "boolean, true when a later page exists",
"listings": "array of normalized records aligned with properties: listing_id, listing_url, address{line1,line2,city,state,postal_code,country,formatted}, latitude, longitude, property_type, property_subtype, transaction_types[], status, asking_price, asking_price_currency, price_on_application, building_area{value,units}, lot_area{value,units}, year_built, parking{ratio,ratio_per,external_spaces,internal_spaces}, loading_docks, loading_doors, lease_rate_type, lease_types[], headline, description, location_description, highlights[], photos[{caption,url}], brochures[{name,url,external,access}], website, agents[{name,email,phone,office}], brokerage, is_parent, space_count, created_date, last_updated, source_last_updated; missing values are null",
"page_size": "integer page size applied",
"truncated": "boolean, true when size/price filtering could only evaluate the first 10000 candidate listings",
"properties": "array of raw source listing records (Common.* / Dynamic.* fields: address, agents, aspects, charges, photos, sizes, spaces, primary key)",
"total_matches": "integer count of listings matching every filter (source total, or exact local count when size/price bounds are used)",
"returned_count": "integer number of listings on this page",
"geo_filter_mode": "string bbox|radius|location or null when no geographic filter was applied",
"geocoded_location": "string place the location text resolved to, null when location was not used"
},
"sample": {
"data": {
"page": 1,
"has_more": false,
"listings": [
{
"agents": [
{
"name": "John Doe",
"email": "[email protected]",
"phone": "+1 (555) 012-3456",
"office": "New Jersey - East Brunswick"
}
],
"photos": [
{
"url": "https://www.cbre.com/resources/fileassets/US-SMPL-179394/52a56d16/01bef103-c795-4e8a-a5b9-7db6186b0639_Photo_1_large.jpg",
"caption": "Bldg Photo"
}
],
"status": null,
"address": {
"city": "Manchester Township",
"line1": null,
"line2": "123 Main St",
"state": "NJ",
"country": "US",
"formatted": "123 Main St, Manchester Township, NJ, 08759",
"postal_code": "08759"
},
"parking": {
"ratio": 0,
"ratio_per": 0,
"external_spaces": 0,
"internal_spaces": 0
},
"website": "http://www.cbre.com/123mainst",
"headline": "For Sale or Build to Suit Opportunity | Manchester",
"latitude": 40.022726,
"lot_area": null,
"brochures": [],
"brokerage": "CBRE",
"is_parent": true,
"longitude": -74.266299,
"highlights": [
"2.39 AC Available"
],
"listing_id": "US-SMPL-179394",
"year_built": null,
"description": null,
"lease_types": [],
"listing_url": "https://www.cbre.com/properties/properties-for-lease/commercial-space/details/US-SMPL-179394/123-main-st-manchester-township-nj-08759",
"space_count": 0,
"asking_price": 600000,
"created_date": "2025-06-02",
"last_updated": "2026-02-26T15:28:11.9984287Z",
"building_area": null,
"loading_docks": 0,
"loading_doors": 0,
"property_type": "Office",
"lease_rate_type": null,
"property_subtype": null,
"transaction_types": [
"sale"
],
"source_last_updated": "2026-02-26",
"location_description": null,
"price_on_application": false,
"asking_price_currency": "USD"
}
],
"page_size": 50,
"truncated": false,
"properties": [
{
"Common.Agents": [
{
"Common.AgentName": "John Doe",
"Common.AgentOffice": "New Jersey - East Brunswick",
"Common.EmailAddress": "[email protected]",
"Common.TelephoneNumber": "+1 (555) 012-3456"
}
],
"Common.Photos": [],
"Common.Aspects": [
"isSale"
],
"Common.Charges": [
{
"Common.Amount": 600000,
"Common.PerUnit": "Whole",
"Common.Interval": "Once",
"Common.AmountKind": "Value",
"Common.ChargeKind": "SalePrice",
"Common.CurrencyCode": "USD",
"Common.OnApplication": false
}
],
"Common.Created": "2025-06-02",
"Common.Brochures": [],
"Common.UsageType": "Office",
"Common.Coordinate": {
"lat": 40.022726,
"lon": -74.266299
},
"Common.Highlights": [],
"Common.PrimaryKey": "US-SMPL-179394",
"Dynamic.SalePrice": 460829.49,
"Common.LastUpdated": "2026-02-26T15:28:11.9984287Z",
"Common.ActualAddress": {
"Common.Line1": " ",
"Common.Line2": "123 Main St",
"Common.Region": "NJ",
"Common.Country": "US",
"Common.PostCode": "08759",
"Common.Locallity": "Manchester Township"
},
"Common.FloorsAndUnits": [],
"Common.SourceLastupdated": "2026-02-26"
}
],
"total_matches": 2,
"returned_count": 2,
"geo_filter_mode": null,
"geocoded_location": null
},
"status": "success"
}
}About the CBRE API
Search and Filter Commercial Listings
The search_properties endpoint is the primary entry point. It accepts a bbox (south,west,north,east decimal degrees), a coordinate radius via latitude, longitude, and radius_miles, or a free-text location string (city, ZIP, state, or full address) that gets geocoded by the source. Geographic filters take precedence in a defined order: bbox overrides radius, which overrides location. You can layer in state, status, transaction_type (sale vs. lease), one or more property_types, min_size/max_size in sqft, and asking-price bounds. The truncated flag in the response tells you when size or price filtering could only evaluate the first 10,000 candidates. Each page returns total_matches, returned_count, has_more, and page_size so pagination is unambiguous.
Normalized Records and Raw Source Data
Every search response returns two parallel arrays: listings (normalized records) and properties (raw source fields). The normalized listing object includes listing_id, listing_url, a structured address object, latitude/longitude, property_type, transaction_types, status, asking_price, asking_price_currency, size_sqft, photo URLs, and a brokers array. The raw properties array carries Common.* and Dynamic.* source fields like Common.Agents, Common.Photos, Common.Charges, Common.Highlights, Common.LeaseTypes, and Common.ActualAddress. get_property_detail retrieves the complete record for a single listing by its stable property_id (e.g. US-SMPL-173239).
Specialized Endpoints
search_properties_for_lease and search_properties_for_sale are convenience wrappers that fix the transaction type and accept a free-text location and optional property_type. These return the same dual-array response shape as search_properties. Note that sale inventory on CBRE is sparse: many location/property-type combinations legitimately return zero results.
get_property_spaces extracts floor and unit subdivisions within a listing — subdivision name, area, status, lease type, and availability — useful when a parent listing contains multiple leasable units. get_agent_contact returns agent names, emails, phone numbers, and office locations for a given property. get_property_pricing returns the charges array (kind, currency, interval, amount, contact-broker flag), asking_price, asking_price_currency, price_on_application boolean, lease_types, and transaction_types — without needing to pull the full detail record.
The CBRE API is a managed, monitored endpoint for cbre.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when cbre.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official cbre.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a commercial property map using
bboxgeographic filters andlatitude/longitudefields from search results. - Monitor asking prices for industrial listings in a specific state using
state,property_type, andasking_pricefields. - Aggregate broker contact data across a market area with
get_agent_contactkeyed onlisting_idfrom search results. - Enumerate available sublease units in a building using
get_property_spacesand filteringlease_typesfor 'SubLease'. - Screen properties by size before pulling full detail by combining
min_size/max_sizefilters withsize_sqftin normalized listings. - Track listing status changes (available, undercontract, unavailable) using
Common.Statusviaget_property_detail. - Identify off-market or price-on-application listings using the
price_on_applicationboolean fromget_property_pricing.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does CBRE have an official public developer API?+
How does `search_properties` handle geographic filtering, and can I combine multiple filter types?+
bbox string ('south,west,north,east'), a coordinate radius (requires latitude, longitude, and radius_miles), and a free-text location string that resolves to a place. When more than one is supplied, bbox takes precedence over radius, which takes precedence over location. You can stack any geographic mode with state, property_types, transaction_type, min_size/max_size, and price bounds — all filters combine with AND. The geocoded_location field in the response confirms what place the location string resolved to.What does `get_property_pricing` return for listings where the price is not disclosed?+
asking_price will be null and price_on_application will be true for listings the source marks as 'contact broker'. The charges array still appears with its entries, but the amount field for those entries will reflect the contact-broker flag rather than a stated figure. sale_price is a separately normalized figure from the source and may also be null when no price is disclosed.Does the API cover CBRE listings outside the United States?+
state parameter accepts 2-letter US state codes, and listing addresses return US-format fields. You can fork this API on Parse and revise it to target CBRE's international listing inventory if your use case requires non-US markets.Are historical or sold listings accessible through the API?+
status filter. A full archive of sold or expired listings is not currently accessible. You can fork the API on Parse and revise it to collect and persist historical snapshots if you need longitudinal records.