richmondamerican.com APIwww.richmondamerican.com ↗
Access floor plans and move-in ready home listings from Richmond American Homes community pages, including plan names, lot IDs, types, and listing URLs.
curl -X GET 'https://api.parse.bot/scraper/42c19201-00d7-4cd7-a551-37d7fe4f48ca/get_community_listings?community_url=%2Fcalifornia%2Flos-angeles-new-homes%2Fvalencia%2Fesprit-at-valencia%2F' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed Python client. Install the CLI, sign in, then pull this API’s generated client:
pip install parse-sdk parse login parse add --marketplace richmondamerican-com-api
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.
"""
Richmond American Homes API Client
Extracts floor plan and move-in ready home listings from Richmond American Homes communities.
Get your API key from: https://parse.bot/settings
"""
import os
import requests
from typing import Optional, Any
from dataclasses import dataclass
@dataclass
class ListingInfo:
"""Represents a single home listing."""
plan_name: str
listing_type: str
community_name: str
builder_name: str
listing_url: str
lot_id: Optional[str] = None
square_footage: Optional[int] = None
bedrooms: Optional[int] = None
bathrooms: Optional[int] = None
class ParseClient:
"""Client for Richmond American Homes API via Parse.bot"""
def __init__(self, api_key: Optional[str] = None):
"""
Initialize the Parse API client.
Args:
api_key: API key for authentication. If not provided, reads from PARSE_API_KEY env var.
"""
self.base_url = "https://api.parse.bot"
self.scraper_id = "42c19201-00d7-4cd7-a551-37d7fe4f48ca"
self.api_key = api_key or os.getenv("PARSE_API_KEY")
if not self.api_key:
raise ValueError("API key required. Pass api_key or set PARSE_API_KEY environment variable.")
def _call(self, endpoint: str, method: str = "POST", **params) -> dict[str, Any]:
"""
Make an API request to Parse.bot.
Args:
endpoint: The endpoint name (e.g., "get_community_listings")
method: HTTP method ("GET" or "POST")
**params: Query/body parameters
Returns:
Response JSON as dictionary
Raises:
requests.RequestException: If the API request fails
"""
url = f"{self.base_url}/scraper/{self.scraper_id}/{endpoint}"
headers = {
"X-API-Key": self.api_key,
"Content-Type": "application/json"
}
try:
if method == "GET":
response = requests.get(url, headers=headers, params=params, timeout=30)
else: # POST
response = requests.post(url, headers=headers, json=params, timeout=30)
response.raise_for_status()
return response.json()
except requests.RequestException as e:
raise Exception(f"API request failed: {str(e)}")
def get_community_listings(self, community_url: str) -> dict[str, Any]:
"""
Get floor plans and move-in ready homes for a Richmond American Homes community.
Args:
community_url: URL path of the community (e.g., "/california/los-angeles-new-homes/valencia/esprit-at-valencia/")
Returns:
Dictionary containing community info and listings
"""
return self._call(
"get_community_listings",
method="GET",
community_url=community_url
)
def parse_listings(response: dict) -> list[ListingInfo]:
"""
Parse API response and convert to ListingInfo objects.
Args:
response: API response dictionary
Returns:
List of ListingInfo objects
"""
listings = []
if response.get("status") != "success" or not response.get("data"):
return listings
data = response["data"]
for listing in data.get("listings", []):
listings.append(ListingInfo(
plan_name=listing.get("plan_name", "Unknown"),
listing_type=listing.get("type", "unknown"),
community_name=listing.get("community_name", ""),
builder_name=listing.get("builder_name", ""),
listing_url=listing.get("listing_url", ""),
lot_id=listing.get("lot_id"),
square_footage=listing.get("square_footage"),
bedrooms=listing.get("bedrooms"),
bathrooms=listing.get("bathrooms")
))
return listings
if __name__ == "__main__":
# Initialize client
client = ParseClient()
# Community URLs to check
communities = [
"/california/los-angeles-new-homes/valencia/esprit-at-valencia/",
"/colorado/denver-new-homes/castle-rock/ascent-at-castle-rock/",
]
all_listings = []
print("=" * 70)
print("Richmond American Homes Listings Inventory")
print("=" * 70)
# Fetch listings for each community
for community_url in communities:
print(f"\nFetching listings for: {community_url}")
print("-" * 70)
try:
response = client.get_community_listings(community_url)
if response.get("status") != "success":
print(f" ⚠ Failed to fetch: {response.get('error', 'Unknown error')}")
continue
data = response.get("data", {})
community_name = data.get("community_name", "Unknown")
builder_name = data.get("builder_name", "Richmond American Homes")
total_listings = data.get("total_listings", 0)
print(f" Builder: {builder_name}")
print(f" Community: {community_name}")
print(f" Total Listings: {total_listings}")
# Parse listings
listings = parse_listings(response)
all_listings.extend(listings)
# Group by plan and type
plan_summary = {}
for listing in listings:
key = f"{listing.plan_name} ({listing.listing_type})"
plan_summary[key] = plan_summary.get(key, 0) + 1
print("\n Plan Summary:")
for plan_type, count in sorted(plan_summary.items()):
plan_name, lst_type = plan_type.rsplit(" (", 1)
lst_type = lst_type.rstrip(")")
type_label = "Move-In Ready" if lst_type == "move_in_ready" else "Plan to Build"
print(f" • {plan_name}: {count} {type_label}")
# Show example move-in ready homes
qmi_homes = [l for l in listings if l.listing_type == "move_in_ready"]
if qmi_homes:
print("\n Sample Move-In Ready Homes:")
for home in qmi_homes[:3]:
lot_info = f" (Lot: {home.lot_id})" if home.lot_id else ""
print(f" • {home.plan_name}{lot_info}")
if len(qmi_homes) > 3:
print(f" ... and {len(qmi_homes) - 3} more")
except Exception as e:
print(f" ❌ Error: {str(e)}")
# Summary statistics
print("\n" + "=" * 70)
print("SUMMARY")
print("=" * 70)
print(f"Communities checked: {len(communities)}")
print(f"Total listings found: {len(all_listings)}")
plan_to_build = [l for l in all_listings if l.listing_type == "plan_to_build"]
move_in_ready = [l for l in all_listings if l.listing_type == "move_in_ready"]
print(f" • Plans to Build: {len(plan_to_build)}")
print(f" • Move-In Ready: {len(move_in_ready)}")
# Unique plans
unique_plans = set(l.plan_name for l in all_listings)
print(f"\nUnique floor plans discovered: {len(unique_plans)}")
for plan in sorted(unique_plans)[:5]:
count = sum(1 for l in all_listings if l.plan_name == plan)
print(f" • {plan}: {count} listings")
if len(unique_plans) > 5:
print(f" ... and {len(unique_plans) - 5} more plans")Get floor plans and move-in ready (QMI) homes for a Richmond American Homes community. Returns builder name, community name, plan names, listing types, lot IDs, and listing URLs discovered from the site's XML sitemaps. Numeric details (square footage, bedrooms, bathrooms, prices) are not available as the site loads them exclusively through Blazor Server WebSocket.
| Param | Type | Description |
|---|---|---|
| community_urlrequired | string | URL path of the Richmond American community page, e.g. /california/los-angeles-new-homes/valencia/esprit-at-valencia/. Must match the path structure used on richmondamerican.com. |
{
"type": "object",
"fields": {
"listings": "array of listing objects with builder_name, community_name, plan_name, type, listing_url, and optionally lot_id",
"location": "object containing city, state, zip_code, street, latitude, longitude when available",
"builder_name": "string",
"community_url": "string",
"community_name": "string",
"total_listings": "integer"
},
"sample": {
"data": {
"listings": [
{
"type": "plan_to_build",
"bedrooms": null,
"bathrooms": null,
"plan_name": "Nathanson",
"qmi_price": null,
"listing_url": "https://www.richmondamerican.com/california/los-angeles-new-homes/valencia/esprit-at-valencia/nathanson/",
"builder_name": "Richmond American Homes",
"community_name": "Esprit at Valencia",
"square_footage": null,
"starting_price": null
},
{
"type": "move_in_ready",
"lot_id": "33650000-0003",
"bedrooms": null,
"bathrooms": null,
"plan_name": "Nathanson",
"qmi_price": null,
"listing_url": "https://www.richmondamerican.com/california/los-angeles-new-homes/valencia/esprit-at-valencia/nathanson/33650000-0003/",
"builder_name": "Richmond American Homes",
"community_name": "Esprit at Valencia",
"square_footage": null,
"starting_price": null
}
],
"location": {},
"builder_name": "Richmond American Homes",
"community_url": "https://www.richmondamerican.com/california/los-angeles-new-homes/valencia/esprit-at-valencia/",
"community_name": "Esprit at Valencia",
"total_listings": 25
},
"status": "success"
}
}About the richmondamerican.com API
The Richmond American Homes API provides 1 endpoint — get_community_listings — that returns all floor plan and move-in ready (QMI) listings for a given community page, exposing up to 7 fields per listing including builder name, community name, plan name, listing type, lot ID, and direct listing URL, plus a location object with city, state, ZIP, street, and coordinates when available.
What the API Returns
The get_community_listings endpoint accepts a community_url path — for example, /california/los-angeles-new-homes/valencia/esprit-at-valencia/ — and returns a structured response covering all discoverable listings for that Richmond American Homes community. Each listing object includes builder_name, community_name, plan_name, type (distinguishing floor plan templates from quick move-in homes), listing_url, and optionally lot_id where applicable. The top-level response also includes total_listings and community_url for easy reference.
Location Data
When available, the response includes a location object containing city, state, zip_code, street, latitude, and longitude. This lets you geocode communities, plot them on a map, or filter by geographic area without a secondary geocoding call.
Listing Types and Coverage
The type field differentiates between standard floor plan listings (configurable home designs offered by the community) and QMI (quick move-in) homes that are already built or near completion and assigned a specific lot_id. Note that numeric details such as square footage, bedroom count, bathroom count, and pricing are not currently returned by this endpoint — the response focuses on identifiers, types, and URLs.
Scope and Input
The API is scoped to individual community pages on richmondamerican.com. You supply the URL path of a specific community, and the response reflects the listings tied to that community. To cover multiple communities across a region or state, you would call the endpoint once per community URL.
The richmondamerican.com API is a managed, monitored endpoint for www.richmondamerican.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when www.richmondamerican.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 www.richmondamerican.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?+
- Aggregate new construction inventory across Richmond American communities for a real estate search portal
- Monitor when new QMI (move-in ready) lots appear in a specific community using lot_id tracking
- Map Richmond American communities by geocoordinates from the location object for a homebuyer search tool
- Compare available floor plan names across multiple communities in the same metro area
- Feed listing URLs into a downstream scraper or notification system when new plan types appear
- Build a lead-generation tool that surfaces communities with active QMI inventory for buyers seeking fast closings
| 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 | 250 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 Richmond American Homes offer an official developer API?+
How does the get_community_listings endpoint distinguish floor plans from move-in ready homes?+
type field that separates standard floor plan listings from QMI (quick move-in) homes. QMI listings also carry an optional lot_id field identifying the specific lot, which floor plan listings typically do not have.Does the API return pricing, square footage, bedroom counts, or other numeric home details?+
Can I retrieve listings for multiple communities in a single request?+
community_url parameter. To cover multiple communities, you call the endpoint once per community URL. You can fork this API on Parse and revise it to add a batch endpoint that accepts multiple community paths.