CBRE APIcbre.com ↗
Search CBRE commercial property listings by location, type, and transaction. Access pricing, agent contacts, available spaces, and floor details via 7 endpoints.
What is the CBRE API?
The CBRE API provides 7 endpoints for searching and extracting commercial real estate listings from cbre.com. The search_properties endpoint accepts filters for location, transaction type (lease or sale), property type, and size range, returning paginated results with addresses, agent info, photos, and available space data. Focused endpoints like get_property_spaces and get_agent_contact let you pull specific slices without fetching a full property detail record.
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'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace cbre-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""
CBRE Properties API – Search and analyze commercial real estate listings.
Get your API key from: https://parse.bot/settings
"""
from parse_apis.cbre_properties_api import CBRE, TransactionType, PropertyType, PropertyNotFound
cbre = CBRE(api_key="YOUR_API_KEY")
# Search for office properties for lease in New York
for prop in cbre.properties.search(
location="New York, NY, USA",
transaction_type=TransactionType.LEASE,
property_type=PropertyType.OFFICE,
limit=5,
):
print(prop.primary_key, prop.usage_type, prop.created)
# Convenience method: search for sale properties in LA
for prop in cbre.properties.search_for_sale(
location="Los Angeles, CA, USA",
property_type=PropertyType.INDUSTRIAL,
limit=3,
):
print(prop.primary_key, prop.usage_type)
# Drill into one property's sub-resources
prop = cbre.properties.search_for_lease(
location="Chicago, IL, USA",
property_type=PropertyType.RETAIL,
limit=1,
).first()
if prop:
# Get available spaces within the property
for space in prop.spaces.list(limit=3):
print(space.identifier, space.status, space.area_sqft)
# Get agent contact info
for agent in prop.agents.list(limit=3):
print(agent.name, agent.email, agent.phone)
# Get pricing details
pricing = prop.pricing.get()
print(pricing.lease_types, pricing.sale_price)
# Typed error handling for a nonexistent property
try:
detail = cbre.properties.get(primary_key="US-NONEXISTENT-999")
print(detail.primary_key, detail.usage_type)
except PropertyNotFound as exc:
print(f"Property not found: {exc.property_id}")
print("exercised: search / search_for_sale / search_for_lease / spaces.list / agents.list / pricing.get / properties.get")
Search for commercial real estate properties with filters for location, transaction type (lease/sale), property type, and size. Returns paginated results sorted by last updated date by default. Each property includes address, agents, photos, sizes, highlights, and available spaces. Paginates via integer page counter.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination (1-based). |
| sort | string | Sort order expression. Default is desc(Common.LastUpdated). |
| location | string | Location string for geographic filtering. Geocoded to a bounding polygon internally. |
| max_size | number | Maximum size in sqft for client-side filtering. |
| min_size | number | Minimum size in sqft for client-side filtering. |
| page_size | integer | Number of results per page. |
| property_type | string | Property type filter. Accepted values include 'Office', 'Retail', 'Industrial', 'Multifamily', 'Land', 'Hotel', 'Healthcare'. |
| transaction_type | string | Transaction type filter. Accepted values: 'lease', 'sale', 'allTypes'. When omitted, defaults to lease listings. |
{
"type": "object",
"fields": {
"properties": "array of property objects with address, agents, aspects, charges, photos, sizes, and primary key",
"total_matches": "integer total number of matching properties",
"returned_count": "integer number of properties in this page"
},
"sample": {
"data": {
"properties": [
{
"Common.Agents": [
{
"Common.AgentName": "John Doe",
"Common.AgentOffice": "New Jersey - Saddle Brook",
"Common.EmailAddress": "[email protected]",
"Common.TelephoneNumber": "+1 (555) 012-3456"
}
],
"Common.Aspects": [
"isLetting"
],
"Common.Charges": [],
"Common.Created": "2026-05-28",
"Common.UsageType": "Office",
"Common.LeaseTypes": [
"LeaseHold"
],
"Common.PrimaryKey": "US-SMPL-205000",
"Common.ActualAddress": {
"Common.Line1": "Glenpointe Centre West",
"Common.Line2": "500 Frank W Burr Boulevard",
"Common.Region": "NJ",
"Common.Country": "US",
"Common.PostCode": "07666",
"Common.Locallity": "Teaneck"
},
"Common.FloorsAndUnits": [
{
"Common.Areas": [
{
"Common.Area": 15131,
"Common.Units": "sqft"
}
],
"Common.Unit.Status": "Available",
"Common.SubdivisionName": [
{
"Common.Text": "3rd Floor",
"Common.CultureCode": "en-US"
}
]
}
]
}
],
"total_matches": 131,
"returned_count": 24
},
"status": "success"
}
}About the CBRE API
Search and Filter Commercial Listings
The search_properties endpoint is the primary entry point. Pass location (a free-text string such as 'Chicago, IL, USA'), transaction_type ('lease', 'sale', or 'allTypes'), property_type (one of 'Office', 'Retail', 'Industrial', 'Multifamily', 'Land', 'Hotel'), and optional min_size/max_size in square feet. Results are paginated via page and page_size and include total_matches, returned_count, and an array of property objects carrying Common.Prim — the primary key used by all detail endpoints. Convenience wrappers search_properties_for_lease and search_properties_for_sale lock transaction_type to the respective value if you don't need to vary it at call time.
Property Detail and Space Breakdown
get_property_detail takes a property_id (e.g. 'US-SMPL-205000') and returns the full record: Common.ActualAddress (Line1, Line2, Locality, Region, PostCode, Country), Common.Agents, Common.Photos with images at multiple breakpoints, Common.Highlights, Common.LeaseTypes, and Common.FloorsAndUnits. If you only need space-level data — subdivision names, individual unit areas, availability status, and lease types — get_property_spaces returns just that array, avoiding the overhead of a full detail call.
Agent Contacts and Pricing
get_agent_contact returns structured agent records per property: name, email, direct phone, and office location. get_property_pricing returns the charges array (each entry has kind, currency, interval, and amount), an array of lease_types such as 'LeaseHold' or 'SubLease', and a sale_price field that is null on lease-only listings. Note that many lease listings have empty charges — CBRE frequently omits asking rates from public listing data and requires direct agent contact for pricing.
Coverage Notes
Inventory skews heavily toward the United States. Sale listings (search_properties_for_sale) are sparser than lease listings across most markets and property types. Results are sorted by last-updated date by default; a custom sort expression can be passed to search_properties to override this. All detail endpoints require a valid property_id from a prior search call — there is no endpoint to enumerate all properties without a location or type filter.
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 search tool filtered by city, property type, and minimum square footage using
search_properties. - Aggregate broker contact lists for a target market by looping
get_agent_contactacross search results. - Monitor available office or industrial space in a given metro area by polling
search_properties_for_leaseon a schedule. - Extract floor and unit availability for specific buildings with
get_property_spacesto power a vacancy dashboard. - Pull asking rents and lease types from
get_property_pricingto compare lease terms across properties in a submarket. - Enrich a CRM with full address, highlight text, and photos from
get_property_detailfor shortlisted properties. - Screen sale listings by size range and property type using
search_properties_for_salewithmin_size/max_sizefilters.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does CBRE have an official public developer API?+
What does `get_property_pricing` actually return, and how reliable is the pricing data?+
get_property_pricing returns a charges array where each entry includes kind, currency, interval, and amount, plus a lease_types array and a sale_price field. In practice, CBRE omits asking rates from many public listings, so the charges array is frequently empty even for active lease properties. The sale_price field is populated more consistently on for-sale listings.Does the API cover CBRE listings outside the United States?+
Can I retrieve historical listing data or track when a property was first listed?+
How does pagination work in `search_properties`?+
page (integer, 1-based) and page_size (number of results per page) as query parameters. The response includes total_matches so you can calculate how many pages exist. The default sort is last-updated descending; pass a sort expression to override it.