The HomeQuotr REST API returns JSON pricing, history, contractor, peril, frequency, trade, city, and usage data across 8 endpoints, covering 100 U.S. cities and 6 trades. Fields are tier-gated per endpoint. Pricing is anchored to municipal building permit records, with the top metros refreshed weekly.
API Reference
Eight REST endpoints. JSON responses. Pricing, contractor, time-series, covered-peril, frequency, and metro data from 5.7M+ municipal permits across 100 U.S. cities.
Start with 500 free Sandbox calls each month, Dallas only. Corporate email required. Get API Key →
Authentication
Every request requires an API key passed in the X-API-Key header. Keys are scoped to your account and tied to a pricing tier.
hq_live_a1b2c3d4e5f6...hq_test_x9y8z7w6v5u4...X-API-Key: hq_live_a1b2c3d4e5f6...
Rate Limits
| Tier | Price | Per Minute | Per Month |
|---|---|---|---|
| Sandbox | Free → | 50 | 500 |
| Starter | $799/mo | 200 | 10,000 |
| Growth | $2,499/mo | 800 | 50,000 |
| Scale | $4,999/mo | 2,000 | 150,000 |
| Enterprise | $7,499/mo | 6,000 | Unlimited |
| Custom | $15,000+/mo | 6,000+ | Volume-negotiated |
HTTP Status Codes
| Code | Meaning | When |
|---|---|---|
| 200 | OK | Request succeeded |
| 400 | Bad Request | Invalid trade slug, city slug, or query parameter |
| 401 | Unauthorized | Missing or invalid API key |
| 403 | Forbidden | Endpoint not available on your tier |
| 429 | Rate Limited | Per-minute or monthly quota exceeded |
| 500 | Server Error | Unexpected internal failure |
Pricing data for a specific trade and city: median, range, percentiles, and permit count from municipal building permits. Field projection escalates by tier. See per-field badges below.
| Parameter | Type | Required | Description |
|---|---|---|---|
| trade | string | Required | Trade slug: hvac, roofing, electrical, plumbing, foundation, solar |
| city | string | Required | Metro slug (e.g., dallas, new-york) |
| include | string | Optional | Comma-separated: contractors and/or incentives (solar only) |
curl https://api.homequotr.com/v1/pricing/hvac/dallas \ -H "X-API-Key: hq_live_a1b2c3d4..."
// Enterprise-tier response. Lower tiers see a subset (field-gated per api-specification.md §9.1.2). { "data": { "median_price": 6100, "min_price": 2100, "max_price": 18200, "p25_price": 4300, "p75_price": 8600, "p90_price": 11400, "p95_price": 13900, "severity_distribution": [ { "bucket": 1, "min": 2100, "max": 3200, "count": 42 } ], "permit_count": 847, "permit_count_quality_score": 87, "source_attribution": "City of Dallas Building Safety Department", "scope": "city", // Growth+ only "confidence_interval_low": 5850, "confidence_interval_high": 6410, // Scale+ only "cpi_normalized_median": 6314, "material_cost_indexed_median": 6480, "labor_rate_msa_indexed_median": 6255, // Enterprise+ only "covered_peril_mapping": [ { "peril_type": "hail", "frequency_weight": 0.42, "severity_adjustment": 1.18, "source_reference": "NOAA SPC 2020-2024", "specificity_tier": "per_metro" } ], "frequency_estimate": { "lambda": 0.087, "ci_low": 0.078, "ci_high": 0.096, "observation_years": 12.3, "permit_count": 4844 } }, "meta": { "tier": "enterprise", "methodology_version": "hq_methodology_v1.0_2026", "last_updated": "2026-04-08", "data_source": "municipal_permits" } }
Response Shape
Each field carries a minimum tier. Lower tiers receive the field projection their plan unlocks. Sandbox keys see the Starter projection but only for Dallas.
| Field | Type | Min Tier | Description |
|---|---|---|---|
| median_price | integer | Sandbox+ | Median declared value from permits (USD) |
| min_price | integer | Sandbox+ | Lowest permit value in range (USD) |
| max_price | integer | Sandbox+ | Highest permit value in range (USD) |
| p25_price | integer | Sandbox+ | 25th percentile, lower quartile (USD) |
| p75_price | integer | Sandbox+ | 75th percentile, upper quartile (USD) |
| p90_price | integer | Sandbox+ | 90th percentile (USD) |
| p95_price | integer | Sandbox+ | 95th percentile (USD) |
| severity_distribution | array | Sandbox+ | Per-bucket histogram of permit values (10 or 20 bins) |
| permit_count | integer | Sandbox+ | Number of permits used in calculation |
| permit_count_quality_score | integer | Sandbox+ | Quality score 0 to 100 reflecting completeness and recency |
| source_attribution | string | Sandbox+ | Originating municipal authority for the permit set |
| last_updated | string | Sandbox+ | Date of last data refresh (ISO 8601) |
| date_range_start | string | Sandbox+ | Earliest permit date in the aggregate window (ISO 8601) |
| date_range_end | string | Sandbox+ | Latest permit date in the aggregate window (ISO 8601) |
| scope | string | Sandbox+ | Geographic scope of the aggregate: city, metro, or state |
| confidence_interval_low | integer | Growth+ | 95% CI lower bound on the median (USD) |
| confidence_interval_high | integer | Growth+ | 95% CI upper bound on the median (USD) |
| cpi_normalized_median | integer | Scale+ | Median normalized to current CPI (BLS CUUR0000SA0) |
| material_cost_indexed_median | integer | Scale+ | Median indexed to BLS PPI for construction materials |
| labor_rate_msa_indexed_median | integer | Scale+ | Median indexed to BLS QCEW MSA-level construction labor rate |
| covered_peril_mapping | array | Enterprise+ | Inline top-3 perils per metro and trade. Each entry: peril_type, frequency_weight, severity_adjustment, source_reference, specificity_tier (per_metro | climate_region | national_baseline) |
| frequency_estimate | object | Enterprise+ | Events per insured-home-year with 95% CI. Fields: lambda, ci_low, ci_high, observation_years, permit_count |
| custom_peril_taxonomy_id | string | Custom | Identifier for a customer-defined peril taxonomy |
| actuarial_review_letter_version | string | Custom | Version pin of the actuarial review letter backing the dataset |
include=incentives parameter is only available for the solar trade. It returns federal and state incentive data from DSIRE.Returns yearly and quarterly pricing trends with 95% confidence intervals on the median. Use this to build cost trajectory charts or detect market shifts. Scale+ adds CPI, material, and labor-rate normalized medians per row.
curl https://api.homequotr.com/v1/pricing/roofing/houston/history \ -H "X-API-Key: hq_live_a1b2c3d4..."
// Growth-tier response. Scale+ adds cpi / material / labor normalized medians per row. { "data": { "quarterly": [ { "period": "2024-Q1", "median": 11000, "permit_count": 892, "confidence_interval_low": 10620, "confidence_interval_high": 11380 } ], "yearly": [ { "period": "2024", "median": 11200, "permit_count": 3841, "confidence_interval_low": 10850, "confidence_interval_high": 11550 } ] }, "meta": { "tier": "growth", "methodology_version": "hq_methodology_v1.0_2026", "data_source": "municipal_permits" } }
Licensed contractors for a specific trade and city, sourced from state licensing boards.
| Parameter | Type | Required | Description |
|---|---|---|---|
| trade | string | Required | Trade slug |
| city | string | Required | Metro slug |
| status | string | Optional | Filter: active, expired, suspended |
| limit | integer | Optional | Results per page. Default: 25, max: 100 |
| offset | integer | Optional | Number of results to skip. Default: 0 |
curl https://api.homequotr.com/v1/contractors/hvac/chicago?status=active&limit=2 \ -H "X-API-Key: hq_live_a1b2c3d4..."
{ "data": [ { "name": "Midwest Comfort HVAC", "license_number": "IL-058-012345", "license_status": "active", "city": "Chicago", "state": "IL" } ], "pagination": { "total": 847, "limit": 2, "offset": 0 }, "meta": { "last_updated": "2026-04-08", "data_source": "state_licensing_boards" } }
Like what you see?
Start with 500 free Sandbox calls each month, Dallas only. Corporate email required.
Returns the six trades currently covered by HomeQuotr. Use this to dynamically populate trade selectors in your application.
curl https://api.homequotr.com/v1/trades \ -H "X-API-Key: hq_live_a1b2c3d4..."
{ "data": [ { "slug": "hvac", "name": "HVAC", "display_name": "HVAC" }, { "slug": "roofing", "name": "Roofing", "display_name": "Roofing" }, { "slug": "electrical", "name": "Electrical", "display_name": "Electrical" }, { "slug": "plumbing", "name": "Plumbing", "display_name": "Plumbing" }, { "slug": "foundation", "name": "Foundation", "display_name": "Foundation/Structural" }, { "slug": "solar", "name": "Solar", "display_name": "Solar" } ] }
All 100 metros with pricing data: slug, display name, state, tier, and population.
curl https://api.homequotr.com/v1/cities \ -H "X-API-Key: hq_live_a1b2c3d4..."
{ "data": [ { "slug": "new-york", "name": "New York", "state": "NY", "tier": "A", "population": 19979477 }, { "slug": "los-angeles", "name": "Los Angeles", "state": "CA", "tier": "A", "population": 12997353 } ], "meta": { "total": 100 } }
Your current billing period: calls used, calls remaining, quota, and overage count.
curl https://api.homequotr.com/v1/usage \ -H "X-API-Key: hq_live_a1b2c3d4..."
{ "data": { "calls_used": 3842, "calls_remaining": 1158, "quota": 5000, "overage_count": 0, "period_start": "2026-04-01", "period_end": "2026-04-30" } }
Covered-peril mapping for a metro. Returns the trades affected by a given peril (wind, hail, water, fire, freeze), the severity median and 95th percentile, and the frequency lambda with confidence interval.
curl https://api.homequotr.com/v1/peril/wind/dallas \ -H "X-API-Key: hq_live_a1b2c3d4..."
// Enterprise-tier response. Trade splits for a peril with per-trade frequency weight and severity adjustment. { "data": { "peril_type": "wind", "city": "Dallas", "state": "TX", "trade_splits": [ { "trade": "roofing", "trade_display_name": "Roofing", "sub_category": null, "frequency_weight": 0.55, "severity_adjustment": 1.22, "source_reference": "NOAA SPC 2020-2024", "effective_date": "2024-01-01", "specificity_tier": "per_metro" }, { "trade": "foundation", "trade_display_name": "Foundation", "sub_category": null, "frequency_weight": 0.20, "severity_adjustment": 1.05, "source_reference": "NOAA SPC 2020-2024", "effective_date": "2024-01-01", "specificity_tier": "per_metro" } ] }, "meta": { "tier": "enterprise", "methodology_version": "hq_methodology_v1.0_2026" } }
Frequency estimate for a trade in a metro, expressed as events per insured-home-year with a 95% CI on the lambda. Backed by a five-year observation window of municipal permit data.
curl https://api.homequotr.com/v1/frequency/hvac/dallas \ -H "X-API-Key: hq_live_a1b2c3d4..."
// Enterprise-tier response. Lambda + 95% CI on events per insured-home-year. { "data": { "trade": "hvac", "city": "dallas", "events_per_insured_home_year": 0.087, "poisson_lambda": 0.087, "ci_low": 0.078, "ci_high": 0.096, "permit_count": 4844, "estimated_households": 2680000, "observation_years": 12.3 }, "meta": { "tier": "enterprise", "methodology_version": "hq_methodology_v1.0_2026" } }
Underwriting-grade fields
Growth+Growth+ unlocks 95% confidence intervals on every median we publish. The bounds come from bootstrapped resampling of the underlying permit set, pinned to a methodology version so audit and rate-filing workstreams can cite a stable source.
confidence_interval_lowandconfidence_interval_highon every aggregatemethodology_versionpinned in the response meta block- History endpoint with quarterly and yearly CIs, suitable for trend-based loss-cost modeling
Designed for mid-market MGAs in specialty home lines and regional P&C carriers who need defensible inputs for rate filings without paying enterprise data-major prices.
Time-series normalization
Scale+Scale+ adds three normalized medians on top of the raw median, so you can compare a 2024 Dallas roof job to a 2026 Dallas roof job on the same real-dollar basis without writing your own deflator.
cpi_normalized_median, indexed to BLS CUUR0000SA0 (CPI-U All Items)material_cost_indexed_median, indexed to BLS PPI for construction materialslabor_rate_msa_indexed_median, indexed to BLS QCEW MSA-level construction labor rate
All three indexes refresh monthly off the BLS pipeline. Useful for back-testing reserves, normalizing claims-cost comparisons, and explaining year-over-year movement to underwriting committees.
Covered-peril and frequency
Enterprise+Enterprise+ unlocks the loss-cost building blocks. Severity comes from the pricing endpoints. Frequency comes from a five-year permit observation window normalized to insured-home-years. Together they produce a defensible expected-loss input.
covered_peril_mappinginline on the pricing endpoint, top-3 perils per metrofrequency_estimateinline (lambda + 95% CI) on the pricing endpoint- Dedicated
/v1/peril/:peril_type/:cityfor full per-peril detail - Dedicated
/v1/frequency/:trade/:cityfor trade-level frequency with observation window
Per the API anti-scraping rule (P6.5), peril and frequency endpoints never project below Enterprise tier and are subject to additional per-IP rate limiting at the gateway.
Custom taxonomies and actuarial review
CustomCustom tier ships two fields no other tier sees, plus a contractual deliverable: a signed actuarial review letter you can hand to your state regulator or reinsurance partner.
custom_peril_taxonomy_id, your peril definitions mapped to our permit dataactuarial_review_letter_version, version pin of the signed letter backing the dataset you receive- Quarterly methodology refresh with named-actuary sign-off (see methodology whitepaper, Actuarial Review section)
Pricing is volume-negotiated. Reach out via the contact link in the footer if your use case requires a bespoke peril taxonomy or a signed letter for a rate filing.
Error Reference
All errors return a consistent JSON envelope with a machine-readable code and a human-readable message.
| Error Code | HTTP Status | Description |
|---|---|---|
| invalid_trade | 400 | Trade slug not recognized. Must be one of the six supported trades. |
| invalid_city | 400 | City slug not recognized. Use /v1/cities for valid slugs. |
| invalid_parameter | 400 | Query parameter has an invalid value (e.g., non-integer limit). |
| missing_api_key | 401 | No X-API-Key header provided. |
| invalid_api_key | 401 | API key is malformed or does not exist. |
| tier_restricted | 403 | Endpoint requires a higher tier. Upgrade at /pricing. |
| rate_limit_exceeded | 429 | Per-minute or monthly quota exceeded. Check /v1/usage for current period. |
| internal_error | 500 | Unexpected server error. Retry with exponential backoff. |
{ "error": { "code": "invalid_trade", "message": "Trade 'windows' is not supported. Valid trades: hvac, roofing, electrical, plumbing, foundation, solar.", "status": 400 } }
Data sourced from municipal building permits for informational purposes. Not a substitute for professional estimates.