HVACDirect APIhvacdirect.com ↗
Access HVACDirect's HVAC catalog via API. Search products by keyword or model number, browse categories, retrieve specs, pricing, images, and accessories.
What is the HVACDirect API?
The HVACDirect API exposes 9 endpoints covering product search, category navigation, and detailed product data from hvacdirect.com's HVAC equipment catalog. Use get_product_specifications to pull technical spec sheets as key-value pairs, search_by_model_number to look up exact SKUs, or browse_category to paginate through category listings — all returning structured fields like price, sku, brand, rating, and image URLs.
curl -X GET 'https://api.parse.bot/scraper/d2d47dfb-b8e0-4aeb-8d1e-f8ac25696787/search_products?sort=relevency&query=thermostat' \ -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 hvacdirect-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.
"""HVAC Direct API — search products, browse categories, get full details."""
from parse_apis.hvac_direct_api import HVACDirect, Sort, NotFoundError_
client = HVACDirect()
# Search for products by keyword, sorted by price low-to-high
for product in client.productsummaries.search(query="thermostat", sort=Sort.PRICE_LOW_TO_HIGH, limit=3):
print(product.name, product.price, product.sku)
# Look up a specific model number
match = client.productsummaries.search_by_model(query="STN855W", limit=1).first()
if match:
# Navigate from summary to full product details
detail = match.details()
print(detail.name, detail.price, detail.stock_status)
print("Specs:", detail.specifications)
# Get pricing info (lightweight fetch)
pricing = detail.pricing()
print(pricing.price, pricing.old_price)
# List compatible accessories
for acc in detail.accessories.list(limit=3):
print(acc.name, acc.price)
# Browse a category
for item in client.productsummaries.browse(category="furnaces", limit=3):
print(item.name, item.price, item.url)
# Fetch a product directly by URL
try:
product = client.products.get(url="https://hvacdirect.com/aciq-7-day-programmable-thermostat-stn855w.html")
print(product.name, product.sku, product.description[:80])
except NotFoundError_ as exc:
print(f"Product not found: {exc}")
# List all top-level categories
for cat in client.categories.list(limit=5):
print(cat.name, cat.url, [s.name for s in cat.subcategories[:2]])
print("exercised: search / search_by_model / browse / details / pricing / accessories.list / products.get / categories.list")
Full-text search over the product catalog via FastSimon. Returns matching products sorted by relevance or price. For common search terms that map to categories, results come from the autocomplete API with a category_url field. All results are returned in a single page; upstream does not reliably support multi-page traversal.
| Param | Type | Description |
|---|---|---|
| sort | string | Sort order for results. |
| queryrequired | string | Search keyword (e.g. 'thermostat wifi', 'heat pump') |
{
"type": "object",
"fields": {
"page": "integer current page number",
"items": "array of product summary objects with name, sku, price, sale_price, url, image, brand, review_score, review_count",
"total": "integer total number of matching products",
"category_url": "string (optional) category URL when search term maps to a category"
},
"sample": {
"data": {
"page": 1,
"items": [
{
"sku": "TL04-1",
"url": "https://hvacdirect.com/aciq-tl04-1-smart-thermostat-24v-ha-hb-compatible.html",
"name": "ACiQ TL04-1 Smart Thermostat",
"brand": null,
"image": "https://assets.instantsearchplus.com/thumbs/hvacdirect.com/d62c3ff4cb27174c1f05dcf41b05581a",
"price": "179.99",
"sale_price": "0.00",
"review_count": 9,
"review_score": 91
}
],
"total": 161,
"category_url": "https://hvacdirect.com/heating/furnace-accessories/thermostats.html"
},
"status": "success"
}
}About the HVACDirect API
Search and Discovery
The search_products endpoint accepts a query string and an optional sort parameter (relevency, price_min_to_max, or price_max_to_min), returning paginated results with fields including name, sku, price, sale_price, brand, review_score, and review_count. When a search term maps directly to a category, results include a category_url field pointing to the matching category. For SKU or model-number lookups, search_by_model_number targets exact matches and falls back to full-text search if no exact result is found.
Category Browsing
get_categories returns the full site navigation tree — main categories with nested subcategories and their URL slugs. Those slugs feed into browse_category, which accepts a category slug (e.g. air-conditioner-condensers) and an optional page integer for pagination. The endpoint returns items arrays with name, url, price, image, and sku. Note that not every slug from get_categories is guaranteed to return products; subcategory-level slugs are the reliable inputs.
Product Detail Endpoints
Four endpoints operate on a specific product URL. get_product_details returns the fullest picture: name, brand, price, old_price, description, images, rating, review_count, and sku. get_product_pricing is a lighter call returning only sku, price, and old_price. get_product_specifications returns dynamic key-value pairs drawn from the product's spec sheet — fields vary by product type (e.g., BTU rating, SEER rating, voltage). get_product_images returns an array of full-resolution image URLs. get_product_accessories returns an accessories array with name, url, and price for compatible add-ons listed on the product page.
The HVACDirect API is a managed, monitored endpoint for hvacdirect.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when hvacdirect.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 hvacdirect.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 price-comparison tool for HVAC equipment using
get_product_pricingacross multiple model numbers. - Populate a contractor quoting app with technical specs via
get_product_specificationsfor a given unit URL. - Create a model-number lookup service for field technicians using
search_by_model_number. - Aggregate category-level inventory snapshots with
browse_categoryfor air conditioner condensers or furnaces. - Track sale prices and discount depth by comparing
priceandold_pricefields fromget_product_details. - Generate accessory upsell recommendations in an e-commerce integration using
get_product_accessories. - Sync HVAC product listings into an internal procurement catalog using
get_categoriesto walk the full site taxonomy.
| 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 | 100 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 HVACDirect have an official developer API?+
What does `get_product_specifications` actually return, and does it have consistent fields across products?+
Does `browse_category` work with any slug from `get_categories`?+
get_categories endpoint returns both top-level and subcategory slugs, but only subcategory-level slugs reliably return product listings in browse_category. Top-level category slugs may return null totals or empty item arrays. Use subcategory URLs from the nested subcategories array for reliable results.Does the API expose customer review text or just aggregate ratings?+
review_score and review_count from search endpoints, and rating (as a percentage string) plus review_count text from get_product_details. Individual review text is not included. You can fork this API on Parse and revise it to add a dedicated reviews endpoint that retrieves per-review content.