pulte.com APIwww.pulte.com ↗
Access Pulte Homes community floor plans and Quick Move-In inventory via API. Returns plan details, QMI home listings, and community metadata by community ID.
curl -X GET 'https://api.parse.bot/scraper/e8ec1397-4efb-456e-8214-b6668c0e4f74/get_community_plans?community_id=211654' \ -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 pulte-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.
"""
Pulte Homes API Client
Retrieve home floor plans and Quick Move-In inventory for Pulte Homes communities.
Get your API key from: https://parse.bot/settings
"""
import os
import requests
from typing import Any, Optional
class ParseClient:
"""Client for interacting with the Pulte Homes API via Parse."""
def __init__(self, api_key: Optional[str] = None):
"""
Initialize the Parse API client.
Args:
api_key: API key for authentication. If not provided, uses PARSE_API_KEY env var.
"""
self.base_url = "https://api.parse.bot"
self.scraper_id = "e8ec1397-4efb-456e-8214-b6668c0e4f74"
self.api_key = api_key or os.getenv("PARSE_API_KEY")
if not self.api_key:
raise ValueError(
"API key must be provided or set in PARSE_API_KEY environment variable"
)
def _call(
self, endpoint: str, method: str = "POST", **params: Any
) -> dict[str, Any]:
"""
Make a request to the Parse API.
Args:
endpoint: The endpoint name (e.g., 'get_community_plans')
method: HTTP method ('GET' or 'POST')
**params: Query/body parameters for the request
Returns:
Response JSON as a dictionary
"""
url = f"{self.base_url}/scraper/{self.scraper_id}/{endpoint}"
headers = {"X-API-Key": self.api_key, "Content-Type": "application/json"}
if method.upper() == "GET":
response = requests.get(url, headers=headers, params=params, timeout=30)
elif method.upper() == "POST":
response = requests.post(url, headers=headers, json=params, timeout=30)
else:
raise ValueError(f"Unsupported HTTP method: {method}")
response.raise_for_status()
return response.json()
def get_community_plans(self, community_id: str) -> dict[str, Any]:
"""
Retrieve all home floor plans and QMI inventory homes for a Pulte community.
Args:
community_id: Numeric Pulte community identifier from the community page URL.
Returns:
Dictionary containing community_id, community_name, home_plans, qmi_homes,
total_plans, and total_qmi.
"""
return self._call("get_community_plans", method="GET", community_id=community_id)
def main():
"""Main function demonstrating a practical workflow with the Pulte Homes API."""
# Initialize the client
client = ParseClient()
# Define a list of community IDs to check
community_ids = ["211654"]
print("=" * 70)
print("PULTE HOMES INVENTORY SEARCH")
print("=" * 70)
all_communities_data = []
for community_id in community_ids:
try:
print(f"\nFetching data for community ID: {community_id}")
print("-" * 70)
# Get community plans and QMI inventory
response = client.get_community_plans(community_id)
# Verify successful response
if response.get("status") != "success":
print(f"Error: API returned status '{response.get('status')}'")
continue
data = response.get("data", {})
all_communities_data.append(data)
# Display community information
print(f"Community: {data.get('community_name')}")
print(f"Total Plans: {data.get('total_plans')}")
print(f"Total QMI Homes: {data.get('total_qmi')}")
# Process and display home plans
home_plans = data.get("home_plans", [])
if home_plans:
print(f"\n Available Floor Plans ({len(home_plans)}):")
print(" " + "-" * 66)
for idx, plan in enumerate(home_plans, 1):
print(f"\n {idx}. {plan.get('plan_name', 'Unknown')}")
print(f" Plan ID: {plan.get('plan_id')}")
print(f" Square Feet: {plan.get('square_feet'):,}")
print(
f" Bedrooms: {plan.get('bedrooms')} | Bathrooms: {plan.get('bathrooms')}"
)
price = plan.get("price")
print(
f" Price: {f'${price:,.0f}' if price else 'Contact for pricing'}"
)
print(f" URL: {plan.get('listing_url')}")
# Process QMI homes
qmi_homes = data.get("qmi_homes", [])
if qmi_homes:
print(f"\n Quick Move-In (QMI) Homes ({len(qmi_homes)}):")
print(" " + "-" * 66)
for idx, home in enumerate(qmi_homes, 1):
print(f"\n {idx}. {home.get('home_name', 'QMI Home')}")
print(f" Home ID: {home.get('home_id')}")
print(
f" Bedrooms: {home.get('bedrooms')} | Bathrooms: {home.get('bathrooms')}"
)
print(f" Status: {home.get('status')}")
else:
print("\n No Quick Move-In homes currently available.")
except requests.exceptions.RequestException as e:
print(f"Error fetching community {community_id}: {e}")
except Exception as e:
print(f"Unexpected error for community {community_id}: {e}")
# Summary statistics
print("\n" + "=" * 70)
print("SUMMARY")
print("=" * 70)
total_communities = len(all_communities_data)
total_all_plans = sum(c.get("total_plans", 0) for c in all_communities_data)
total_all_qmi = sum(c.get("total_qmi", 0) for c in all_communities_data)
print(f"Communities Analyzed: {total_communities}")
print(f"Total Floor Plans: {total_all_plans}")
print(f"Total QMI Homes Available: {total_all_qmi}")
if total_all_plans > 0:
print("\nTop opportunities for buyers:")
all_plans = []
for community in all_communities_data:
for plan in community.get("home_plans", []):
all_plans.append(
{
"community": community.get("community_name"),
"plan_name": plan.get("plan_name"),
"bedrooms": plan.get("bedrooms"),
"bathrooms": plan.get("bathrooms"),
"sqft": plan.get("square_feet"),
}
)
# Group by bedroom count
bedrooms_groups = {}
for plan in all_plans:
bed_count = plan["bedrooms"]
if bed_count not in bedrooms_groups:
bedrooms_groups[bed_count] = []
bedrooms_groups[bed_count].append(plan)
for bed_count in sorted(bedrooms_groups.keys()):
plans = bedrooms_groups[bed_count]
print(
f"\n {bed_count}-Bedroom Plans: {len(plans)} available"
if bed_count
else f"\n Plans: {len(plans)} available"
)
print("\n" + "=" * 70)
if __name__ == "__main__":
main()Retrieves all home floor plans and QMI inventory homes for a Pulte community.
| Param | Type | Description |
|---|---|---|
| community_idrequired | string | Numeric Pulte community identifier from the community page URL. |
{
"type": "object",
"fields": {
"qmi_homes": "array",
"total_qmi": "integer",
"home_plans": "array",
"total_plans": "integer",
"community_id": "string",
"community_name": "string"
},
"sample": {
"data": {
"qmi_homes": [],
"total_qmi": 0,
"home_plans": [
{
"type": "home_plan",
"price": null,
"plan_id": 700853,
"bedrooms": 4,
"bathrooms": 4,
"plan_name": "Plan 1",
"listing_url": "https://www.pulte.com/homes/california/orange-county/irvine/eclipse-at-luna-park-211654/plan-1-700853",
"square_feet": 4005,
"builder_name": "Pulte",
"community_name": "Eclipse At Luna Park"
}
],
"total_plans": 3,
"community_id": "211654",
"community_name": "Eclipse At Luna Park"
},
"status": "success"
}
}About the pulte.com API
The Pulte Homes API exposes floor plan and Quick Move-In (QMI) inventory data for Pulte communities through a single endpoint, get_community_plans, returning up to 10 response fields including home plan arrays, QMI home arrays, and community metadata. Pass a numeric community ID to retrieve every available floor plan and move-in-ready home in that community in one call.
What the API Returns
The get_community_plans endpoint accepts a single required parameter — community_id, a numeric string taken from the Pulte community page URL — and returns a structured response covering both floor plan offerings and current QMI inventory. The top-level response fields include community_id, community_name, home_plans (an array of available floor plan configurations), total_plans (count of those plans), qmi_homes (an array of Quick Move-In homes ready for near-term purchase), and total_qmi (count of QMI listings).
Floor Plans vs. QMI Homes
The home_plans array covers the configurable options Pulte offers in a community — these represent design options buyers can still customize before construction. The qmi_homes array is distinct: these are already-built or nearly-complete homes with fixed specs that can close quickly. Tracking both arrays together gives a complete picture of what a community currently offers at any given time.
Practical Scope
Each request targets one community, identified by its numeric ID. To cover multiple Pulte communities, make one call per community_id. The API does not require any account credentials on the caller's side. Community IDs are stable numeric identifiers found in the path segment of Pulte community URLs (for example, 211654 in the sample URL above).
The pulte.com API is a managed, monitored endpoint for www.pulte.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when www.pulte.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.pulte.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?+
- Monitor QMI inventory changes across multiple Pulte communities by comparing
total_qmiover time. - Build a community comparison tool using
home_plansandtotal_plansto show plan counts side-by-side. - Alert prospective buyers when new Quick Move-In homes appear in the
qmi_homesarray for a target community. - Aggregate floor plan availability across all Pulte communities in a region by iterating community IDs.
- Feed
community_nameand plan data into a CRM to track buyer interest against active inventory. - Track how many floor plan options remain available in a community as it approaches sellout using
total_plans.
| 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 Pulte Homes offer an official developer API?+
What does the `qmi_homes` array contain, and how is it different from `home_plans`?+
qmi_homes lists Quick Move-In homes — units that are already built or nearly complete and available for a faster close. home_plans lists the floor plan configurations the community offers for new builds, which buyers may still be able to customize. The two arrays are separate, and total_qmi and total_plans give the respective counts for each.Can I look up communities by state, city, or zip code rather than by community ID?+
community_id parameter only; there is no geographic search or browse endpoint. You can fork this API on Parse and revise it to add a geographic lookup or community search endpoint.Does the API return pricing, square footage, or bedroom counts for floor plans or QMI homes?+
home_plans and qmi_homes as arrays, but detailed sub-fields like pricing, square footage, or bedroom count are not enumerated in the current response schema. You can fork this API on Parse and revise it to surface those sub-fields from the arrays.