StreetEasy API endpoint
Searches public sale listings with location, status, sale type, price, bedroom, bathroom, square-footage, carrying cost, building age, school, ZIP, keyword, building type, amenity, pet, open-house, virtual-tour, transit, and sort filters. Obtain area IDs from /streeteasy/areas. When sale_status is omitted, active, preview, and coming_soon listings are included.
/streeteasy/sales/searchMCP tool: streeteasy_sales_search
Query parameters:
area_id is required and repeatable. Each value must exist in the live /streeteasy/areas catalog.sale_status may be repeated and accepts active, preview, coming_soon, in_contract, sold, and unavailable. The values map to StreetEasy's ACTIVE, PREVIEW, COMING_SOON, IN_CONTRACT, SOLD, and NO_LONGER_AVAILABLE. When omitted, active, preview, and coming-soon listings are searched. The public UI's “Active or in contract” option sends ACTIVE, IN_CONTRACT, PREVIEW, and COMING_SOON; callers can request exact statuses by repeating this parameter.sale_type may be repeated and accepts sponsor_unit, foreclosure, resale, and restricted_sale.page is a 1-based page number; default 1.per_page is from 1 to 500; default 500.sort accepts default, newest, recently_updated, price_desc, price_asc, largest, or smallest; default default. The UI labels map respectively to Default (se_score), Newest (listed_desc), Recently updated (interesting_desc), Most expensive (price_desc), Least expensive (price_asc), Largest (sqft_desc), and Smallest (sqft_asc). Each value was selected in StreetEasy's live sort dialog.min_price and max_price bound sale price. The UI presets available to either control are 100000, 150000, 200000, 250000, 300000, 400000, 500000, 600000, 700000, 800000, 900000, 1000000, 1250000, 1500000, 1750000, 2000000, 2250000, 2500000, 2750000, 3000000, 3500000, 4000000, 4500000, 5000000, 6000000, 7000000, 8000000, 9000000, 10000000, 12000000, 14000000, 16000000, 20000000, 25000000, and 30000000.min_bedrooms and max_bedrooms bound bedrooms. The UI options are Any, Studio, 1, 2, 3, and 4+; use zero for Studio and 4 as the lower bound for 4+.min_bathrooms and max_bathrooms bound bathrooms. The UI's preset choices are 1, 1.5, 2, and 3 or more.min_sqft and max_sqft bound square footage. The UI presets are 500, 600, 700, 800, 900, 1000, 1250, 1500, 2000, 2500, 3000, 3500, 4000, and 5000 square feet or more.min_maintenance and max_maintenance bound monthly maintenance. min_monthly_taxes and max_monthly_taxes bound monthly property taxes. Values are dollar amounts; both lower and upper bounds are supported.min_price_per_sqft and max_price_per_sqft bound price per square foot. include_unknown_price_per_sqft=true also includes listings for which StreetEasy has no price-per-square-foot value.min_year_built and max_year_built bound the building year. prewar=true selects prewar buildings.development accepts the verified value pre_construction, which selects pre-construction developments.income_restricted=true selects income-restricted listings.school_id may be repeated to filter by the numeric ID exposed when selecting a school in StreetEasy's search UI. The public UI currently supplies these IDs dynamically; the API does not yet expose a standalone school-ID catalog.zip_code accepts exactly five digits. keywords matches listing description text and accepts 1–200 non-whitespace characters.building_type may be repeated and accepts condo, co-op, house, and multifamily.amenity may be repeated for must-have amenities. Every listed value is required: washer_dryer, dishwasher, private_outdoor_space, central_air, furnished, fireplace, loft, city_view, garden_view, park_view, skyline_view, water_view, elevator, doorman, laundry, gym, parking, shared_outdoor_space, pool, pied_a_terre, childrens_playroom, smoke_free, and storage.optional_amenity may be repeated for nice-to-have amenities. Results may omit these preferences; it accepts the same 23 values listed for amenity.pets_allowed, open_house, tour_3d, and video_tour are booleans. Open house means an event within the next seven days.transit_line may be repeated and accepts 1, 2, 3, 4, 5, 6, 7, A, C, E, B, D, F, M, G, N, Q, R, W, J, Z, L, S, HBLR, and PATH.Each result edge includes type, the edge kind (for example, OrganicSaleEdge).
The response envelope contains search.criteria, totalCount, and edges. Each sale edge's
node contains the sale-card fields selected by the public query, including price, saleType,
offMarketAt, furnished, and the property address/unit fields. Sale nodes do not include the
rental-only totalMonthlyPrice, status, or tier fields.
Example:
GET /api/v1/streeteasy/sales/search?area_id=201&area_id=401&sale_status=active&sale_status=coming_soon&sort=newest&min_bathrooms=3&building_type=condo&amenity=washer_dryer&optional_amenity=dishwasher&transit_line=1
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| area_id | array<integer> | Yes | StreetEasy area ID from /streeteasy/areas; repeat for multiple areas Repeat this query parameter for multiple values. | 100 | |
| sale_status | array<string> | No | active | Sale status; repeat for multiple. Defaults to active, preview, and coming_soon. Allowed values: active, preview, coming_soon, in_contract, sold, unavailable. Repeat this query parameter for multiple values. | |
| sale_type | array<string> | No | Sale type; repeat for multiple. Allowed values: sponsor_unit, foreclosure, resale, restricted_sale. Repeat this query parameter for multiple values. | ||
| page | integer | No | 1-based result page | ||
| per_page | integer | No | Results per page, 1-500 | ||
| sort | string | No | default, newest, recently_updated, price_desc, price_asc, largest, or smallest Allowed values: default, newest, recently_updated, price_desc, price_asc, largest, smallest. | ||
| min_price | integer | No | Minimum sale price | ||
| max_price | integer | No | Maximum sale price | ||
| min_bedrooms | integer | No | Minimum bedrooms; zero means studio | ||
| max_bedrooms | integer | No | Maximum bedrooms | ||
| min_bathrooms | number | No | Minimum bathrooms | ||
| max_bathrooms | number | No | Maximum bathrooms | ||
| min_sqft | integer | No | Minimum square footage | ||
| max_sqft | integer | No | Maximum square footage | ||
| min_maintenance | integer | No | Minimum monthly maintenance fee | ||
| max_maintenance | integer | No | Maximum monthly maintenance fee | ||
| min_monthly_taxes | integer | No | Minimum monthly property taxes | ||
| max_monthly_taxes | integer | No | Maximum monthly property taxes | ||
| min_price_per_sqft | integer | No | Minimum price per square foot | ||
| max_price_per_sqft | integer | No | Maximum price per square foot | ||
| include_unknown_price_per_sqft | boolean | No | Include listings with unknown price per square foot | ||
| min_year_built | integer | No | Minimum building year built | ||
| max_year_built | integer | No | Maximum building year built | ||
| prewar | boolean | No | Set true to select prewar buildings | ||
| development | string | No | New development filter Allowed values: pre_construction. | ||
| income_restricted | boolean | No | Set true to select income-restricted homes | ||
| school_id | array<integer> | No | StreetEasy school ID selected by the public search UI; repeat for multiple schools Repeat this query parameter for multiple values. | ||
| zip_code | string | No | Five-digit ZIP code | ||
| keywords | string | No | Listing-description keyword filter | ||
| building_type | array<string> | No | Building type Allowed values: condo, co-op, house, multifamily. Repeat this query parameter for multiple values. | ||
| amenity | array<string> | No | Amenity filter; repeat for multiple Allowed values: washer_dryer, dishwasher, private_outdoor_space, central_air, furnished, fireplace, loft, city_view, garden_view, park_view, skyline_view, water_view, elevator, doorman, laundry, gym, parking, shared_outdoor_space, pool, pied_a_terre, childrens_playroom, smoke_free, storage. Repeat this query parameter for multiple values. | ||
| optional_amenity | array<string> | No | Nice-to-have amenity; results may omit these. Repeat for multiple. Allowed values: washer_dryer, dishwasher, private_outdoor_space, central_air, furnished, fireplace, loft, city_view, garden_view, park_view, skyline_view, water_view, elevator, doorman, laundry, gym, parking, shared_outdoor_space, pool, pied_a_terre, childrens_playroom, smoke_free, storage. Repeat this query parameter for multiple values. | ||
| pets_allowed | boolean | No | Require pets allowed | ||
| open_house | boolean | No | Require open house within the next seven days | ||
| tour_3d | boolean | No | Require a 3D tour | ||
| video_tour | boolean | No | Require a video tour | ||
| transit_line | array<string> | No | Nearby transit line; repeat for multiple Allowed values: 1, 2, 3, 4, 5, 6, 7, A, C, E, B, D, F, M, G, N, Q, R, W, J, Z, L, S, HBLR, PATH. Repeat this query parameter for multiple values. | ||
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/streeteasy/sales/search?area_id=100&sale_status=active&sale_type=sponsor_unit&page=1&sort=default&include_unknown_price_per_sqft=true&prewar=true&development=pre_construction&income_restricted=true&building_type=condo&amenity=washer_dryer&optional_amenity=washer_dryer&pets_allowed=true&open_house=true&tour_3d=true&video_tour=true&transit_line=1" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"search": {
"criteria": "area:201,401|status:open"
},
"totalCount": 302,
"edges": [
{
"type": "OrganicSaleEdge",
"node": {
"id": "1234567",
"areaName": "Astoria",
"bedroomCount": 2,
"buildingType": "CONDO",
"fullBathroomCount": 3,
"price": 1195000,
"saleType": "RESALE",
"street": "30-55 Example Avenue",
"unit": "5A",
"urlPath": "/building/example/5a"
}
}
]
}
}Request schema
No body schema
Response schema
#/definitions/streeteasy.SaleSearch
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| edges | array | No | ||||
| edges[].node | streeteasy.SaleListing | No | ||||
| edges[].node.advertisedOnSe | boolean | No | ||||
| edges[].node.areaName | string | No | ||||
| edges[].node.bedroomCount | integer | No | ||||
| edges[].node.buildingType | string | No | ||||
| edges[].node.fullBathroomCount | integer | No | ||||
| edges[].node.furnished | boolean | No | ||||
| edges[].node.geoPoint | streeteasy.GeoPoint | No | ||||
| edges[].node.geoPoint.latitude | number | No | ||||
| edges[].node.geoPoint.longitude | number | No | ||||
| edges[].node.id | string | No | ||||
| edges[].node.isPremiumHdpEnabled | boolean | No | ||||
| edges[].node.leadMedia | streeteasy.LeadMedia | No | ||||
| edges[].node.leadMedia.photo | streeteasy.Photo | No | ||||
| edges[].node.leadMedia.photo.key | string | No | ||||
| edges[].node.offMarketAt | string | No | ||||
| edges[].node.price | number | No | ||||
| edges[].node.saleType | string | No | ||||
| edges[].node.sourceGroupLabel | string | No | ||||
| edges[].node.street | string | No | ||||
| edges[].node.unit | string | No | ||||
| edges[].node.urlPath | string | No | ||||
| edges[].type | string | No | ||||
| search | object | No | ||||
| search.criteria | string | No | ||||
| totalCount | integer | No |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 429 | Too Many Requests | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/streeteasy/sales/search?area_id=100&sale_status=active&sale_type=sponsor_unit&page=1&sort=default&include_unknown_price_per_sqft=true&prewar=true&development=pre_construction&income_restricted=true&building_type=condo&amenity=washer_dryer&optional_amenity=washer_dryer&pets_allowed=true&open_house=true&tour_3d=true&video_tour=true&transit_line=1" \
-H "x-api-key: $CRAWLORA_API_KEY"