POST /api/crexi/properties/search
Price: 20 credits
Search Crexi commercial properties for sale. Returns listing cards with id, name, status, property type, asking price, price per sqft, NOI, square footage, brokerage, image, latitude/longitude and property_url. Filter by property type and subtype, price, cap rate, square footage, price per sqft, acreage, units, occupancy, remaining lease term, lease structure, tenancy, tenant brand, tenant credit, class, listing status, opportunity zone, broker co-op, broker id and a geographic bounding box.
Search Crexi commercial real estate for sale. Each item has id (use it with the properties details endpoint), name, status, property_types, asking_price, price_per_sqft, net_operating_income, square_footage, brokerage_name, image, location (city, state_code, latitude, longitude) and property_url. Use property_types/subtypes to restrict asset class, min_price/max_price, min_cap_rate/max_cap_rate, tenants for a national brand (e.g. Starbucks), and latitude_min/latitude_max/longitude_min/longitude_max for a map bounding box.
access-token string requiredtimeout integer — Max scrapping execution timeout (in seconds) (default: 300; min: 20; max: 1500)property_types array nullable — Property types to include (one of: "Retail", "Multifamily", "Office", "Industrial", "Hospitality", "Mixed Use", "Land", "Self Storage", "Mobile Home Park", "Senior Living", "Special Purpose", "Note/Loan", "Business for Sale")subtypes array nullable — Property subtypes to include (e.g. 'Gas Station', 'Warehouse', 'Apartment Building')keywords string nullable — Free-text keywords to match in the listingmin_price number nullable — Minimum asking price (USD) (min: 0)max_price number nullable — Maximum asking price (USD) (min: 0)exclude_unpriced boolean — Exclude listings without a published asking price (default: false)min_cap_rate number nullable — Minimum cap rate (percent, e.g. 8 for 8%) (min: 0)max_cap_rate number nullable — Maximum cap rate (percent, e.g. 8 for 8%) (min: 0)min_sqft integer nullable — Minimum building square footage (min: 0)max_sqft integer nullable — Maximum building square footage (min: 0)min_price_per_sqft number nullable — Minimum price per square foot (min: 0)max_price_per_sqft number nullable — Maximum price per square foot (min: 0)min_acres number nullable — Minimum lot size in acres (min: 0)max_acres number nullable — Maximum lot size in acres (min: 0)min_units integer nullable — Minimum number of units (min: 0)max_units integer nullable — Maximum number of units (min: 0)unit_type string nullable — What the unit count refers to (used with min_units/max_units) (one of: "Units", "Keys", "Beds", "Pads", "Pumps")min_occupancy number nullable — Minimum occupancy percentage (min: 0; max: 100)max_occupancy number nullable — Maximum occupancy percentage (min: 0; max: 100)min_remaining_term_years number nullable — Minimum remaining lease term in years (min: 0)max_remaining_term_years number nullable — Maximum remaining lease term in years (min: 0)lease_types array nullable — Lease structures to include (one of: "Net", "NNN", "Absolute Net", "Gross", "Modified", "Ground")tenancies array nullable — Tenancy types to include (one of: "Vacant", "Single", "Multi")tenants array nullable — National tenant brand names to match (e.g. 'Starbucks', 'CVS Pharmacy')tenant_credits array nullable — Tenant credit profiles to include (one of: "Credit Rated", "Corporate Guarantee", "Franchisee", "No Credit Rating")class_types array nullable — Building class types to include (one of: "A", "B", "C", "D")statuses array nullable — Listing statuses to include (one of: "Contract Pending", "Under Contract")broker_ids array nullable — Restrict to listings from these Crexi broker idsin_opportunity_zone boolean nullable — Only listings located in an Opportunity Zonebroker_co_op boolean nullable — Only listings offering a broker co-oplatitude_min number nullable — South edge of a bounding box filter (min: -90; max: 90)latitude_max number nullable — North edge of a bounding box filter (min: -90; max: 90)longitude_min number nullable — West edge of a bounding box filter (min: -180; max: 180)longitude_max number nullable — East edge of a bounding box filter (min: -180; max: 180)sort_order string — Field to sort results by (default: "rank"; one of: "rank", "price", "capRate", "sqFt", "units", "activatedOn", "updatedOn", "createdOn")sort_direction string — Sort direction (default: "Descending"; one of: "Ascending", "Descending")count integer required — Max number of listings to return (min: 1; max: 1500)@type string (default: "CrexiPropertyCard")id integer requiredname string nullabledescription string nullablestatus string nullableplatform string nullableproperty_types array (default: [])asking_price number nullableprice_per_sqft number nullablesquare_footage integer nullablenet_operating_income number nullablelease_term_years number nullableremaining_term_years number nullableinvestment_type string nullablelot_size_acres number nullableprice_per_acre number nullablebrokerage_name string nullablebroker_logo string nullableis_in_opportunity_zone boolean nullableis_new boolean nullablehas_video boolean nullablehas_virtual_tour boolean nullablehas_om boolean nullablehas_flyer boolean nullableimage_count integer nullablegallery_item_count integer nullableoffers_due_at integer nullableactivated_at integer nullableupdated_at integer nullableimage string nullablealias string nullableproperty_url string nullablelocation object nullable@type string (default: "CrexiLocation")address string nullablecity string nullablecounty string nullablestate_code string nullablestate_name string nullablezip string nullablelatitude number nullablelongitude number nullablefull_address string nullable422 — The request body did not validate Check the fields against this schema. A URN with the wrong prefix is the most common cause.408 — The request ran past its time limit Raise `timeout` in the request body, up to the maximum this endpoint documents. Lowering `count` or turning off the `with_*` flags also helps, because less work finishes sooner.412 — The entity was not found, or a precondition failed Retrying will not help: either the entity does not exist, or the input points at a different one.429 — Too many requests: a rate limit or a usage window is exhausted When the response carries an X-Retry-After header, wait that many seconds and retry: the same number is in the body as `detail.retry_after`, and the limit clears once that window passes. The message in the body names the limit that was hit.500 — Something broke on our side Retrying will not help. If it keeps happening, send us the X-Request-ID from the response headers.529 — Rate limit reached, or the endpoint is overloaded Wait at least 30 seconds, then retry.X-Error — Error message text (present only on error)X-Request-ID — Unique request identifierX-Execution-Time — Execution time in secondsX-Result-Count — How many records the body carries. 0 means an empty result, which is a normal answer and not by itself an error. A non-zero count can come back together with X-Error when the failure happened partway through — read this header and X-Error independently.X-Total-Available-Results — How many records exist for this query, when the endpoint can say. On a `dry_run` request this is the answer and the body is empty. It saturates: the endpoint's documented maximum means 'at least that many', any smaller number is exact.X-Warning — Present when the request body carried keys this endpoint does not document. They were ignored, so any filter you meant to apply through them did not apply. Check the spelling against this schema and retry.X-Retry-After — Seconds to wait before retrying. Present only on 429.