kw APIkw.com ↗
Search real estate listings on kw.com by geographic boundary. Retrieve pricing, address, images, status, and property details via a single endpoint.
What is the kw API?
The kw.com API provides access to Keller Williams real estate listings through 1 endpoint, search_listings, which returns up to 50 properties per page including pricing, address, images, listing status, and geometry data. Queries are scoped to a geographic boundary using kw.com's boundary identifier system, making it straightforward to pull listings for specific regions, metro areas, or international markets like México.
curl -X GET 'https://api.parse.bot/scraper/6c0967b3-68a2-4deb-a02a-d43684ad2a95/search_listings?sort_by=listingUpdateDate&boundary_id=1030721389347824&sort_direction=asc&listing_category=sale' \ -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 kw-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.
"""Walkthrough: Keller Williams Listings SDK — search listings by region."""
from parse_apis.kw_com_api import (
KellerWilliams, ListingCategory, SortBy, SortDirection, InputFormatInvalid,
)
client = KellerWilliams()
# Search for-sale listings in México (boundary_id from kw.com URL), newest first.
for listing in client.listings.search(
boundary_id="1030721389347824",
listing_category=ListingCategory.SALE,
sort_by=SortBy.LISTING_DATE,
sort_direction=SortDirection.DESC,
page_size=10,
limit=5,
):
addr = listing.address
sale_price = listing.pricing.sale.amount
print(
f"{addr.display_address} | {listing.property_type} | "
f"${sale_price} | {listing.facets.bedrooms}bd/{listing.facets.bathrooms}ba"
)
# Drill into the first rental listing for detailed fields.
try:
rental = client.listings.search(
boundary_id="invalid!!",
listing_category=ListingCategory.RENT,
limit=1,
).first()
except InputFormatInvalid as e:
print(f"Bad input: {e.message}")
rental = None
else:
pass # rental found
# Retry with a valid boundary
if rental is None:
rental = client.listings.search(
boundary_id="1030721389347824",
listing_category=ListingCategory.RENT,
limit=1,
).first()
if rental is not None:
print(f"\nRental: {rental.address.display_address}")
print(f" Listed: {rental.listing_date}")
print(f" Images: {len(rental.images)}")
if rental.price_history:
latest = rental.price_history[0]
print(f" Current price: {latest.current_list_price}")
if rental.virtual_tours:
print(f" Virtual tour: {rental.virtual_tours[0].url}")
print("\nexercised: listings.search (sale + rent)")
Search real estate listings within a geographic boundary on kw.com. Returns paginated results sorted by the chosen criteria. Each page returns up to 50 listings with full property details including pricing, address, facets, images, and status. The boundary_id identifies a geographic region (country, state, city, neighborhood, etc.) used by kw.com's search system.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination (1-indexed). |
| sort_by | string | Field to sort results by. |
| page_size | integer | Number of listings per page (1-50). |
| boundary_idrequired | string | Geographic boundary identifier used by kw.com (e.g. '1030721389347824' for México). Obtainable from kw.com search URLs. |
| sort_direction | string | Sort direction. |
| listing_category | string | Listing category filter. |
{
"type": "object",
"fields": {
"page": "current page number",
"has_more": "boolean indicating whether more pages are available",
"listings": "array of listing objects with full property details including pricing, address, facets, images, geometry, and status",
"page_size": "number of results per page",
"total_count": "total number of listings matching the query"
},
"sample": {
"data": {
"page": 1,
"has_more": true,
"listings": [
{
"id": "2149160051947828",
"facets": {
"lotSize": {
"value": 150,
"unitType": "SQ_MT"
},
"bedrooms": 2,
"homeSize": {
"value": 90.81,
"unitType": "SQ_MT"
},
"bathrooms": 2
},
"images": [
"https://storage.googleapis.com/attachment-listing-prod-5af4/2000032982/listing/f7ddd19613f89a8974cbff27/da1o56lpq4ac70pflb30.jpg"
],
"is_vow": false,
"mls_id": "KWW_KWMX",
"address": {
"city": "Mexicali",
"state": "Baja California",
"unitNo": null,
"country": "MEX",
"zipcode": null,
"streetNo": null,
"streetName": "Campeche",
"displayAddress": "Campeche 1015, Mexicali, Baja California 21120",
"primaryAddress": "Campeche 1015",
"secondaryAddress": "Mexicali, Baja California 21120"
},
"pricing": {
"rent": {
"amount": 2650000,
"currency": "MXN"
},
"sale": {
"amount": 2650000,
"currency": "MXN"
},
"sold": {
"amount": null,
"currency": "MXN"
}
},
"courtesy": null,
"geometry": {
"type": "Point",
"coordinates": [
-115.4914057,
32.653297
]
},
"url_path": "/property/Campeche-1015-Mexicali-Baja-California-21120/2149160051947828",
"close_date": null,
"mls_number": "O0-14056709",
"open_house": null,
"description": "Casa nueva de 2 recámaras con amplio Roof Top...",
"open_houses": null,
"listing_date": "2026-08-17T21:14:38.318Z",
"price_history": [
{
"type": "listed",
"percentChange": null,
"priceUpdatedAt": "1787008246000",
"daysSinceUpdate": null,
"currentListPrice": 2650000,
"previousListPrice": null,
"isMostRecentChange": false
}
],
"property_type": "Single Family Detached",
"virtual_tours": [],
"listing_status": "active",
"requires_login": false,
"compliance_info": null,
"mls_list_status": null,
"has_virtual_tour": false,
"listing_category": "sale",
"energy_grade_level": null,
"listing_publish_date_time": null
}
],
"page_size": 5,
"total_count": 5468
},
"status": "success"
}
}About the kw API
What the API Returns
The search_listings endpoint queries active real estate listings on kw.com within a defined geographic region. Each response includes a listings array where every listing object carries full property details: pricing, street address, property facets (such as bed/bath counts and square footage), images, geometry coordinates, and listing status. The response also surfaces total_count, has_more, page, and page_size fields to support reliable pagination across large result sets.
Filtering and Sorting
The endpoint accepts a boundary_id (required) to define the geographic scope — for example, 1030721389347824 corresponds to México. Optional parameters include listing_category to filter by property type, sort_by and sort_direction to control result ordering, and page_size (1–50) alongside page for pagination. These controls let you walk through hundreds or thousands of listings in a given boundary in consistent, predictable batches.
Coverage and Scope
kw.com lists properties across Keller Williams' international network, so boundary identifiers can represent regions well beyond the United States. The geometry field on each listing enables map-based rendering or spatial analysis. Images are included directly in the listing object, reducing the need for secondary lookups to display property photos. The has_more boolean makes it simple to detect when additional pages exist without comparing counts manually.
The kw API is a managed, monitored endpoint for kw.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when kw.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 kw.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 map view of for-sale properties in a given metro area using the geometry and address fields
- Track listing price changes over time by polling total_count and pricing fields for a fixed boundary_id
- Aggregate property facets (beds, baths, square footage) across a region for market analysis
- Display a paginated property search UI using page, page_size, and has_more response fields
- Filter listings by listing_category to separate residential from commercial inventory
- Compile image galleries for property listings using the images field without additional lookups
- Compare listing density across multiple geographic boundaries using total_count per boundary_id
| 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.