Skip to main content
The /api/v1/quote-context endpoint is the primary entry point for building home-service quotes. Rather than stitching together five or six separate API calls, you send one GET request and receive finance options, equipment records, incentive eligibility, climate context, labor adders, permit requirements, and utility territory resolution in a single response. Every response also includes a coverage object that summarizes how many quote-safe records were returned and surfaces any data gaps or unresolved requirements so your quoting tool can decide whether it has enough information to present a price.

Request

GET https://homeservicedata.com/api/v1/quote-context

Authentication

All requests must include your API key in the x-api-key header. This endpoint requires a production access tier.

Query Parameters

Trade & Geography

trade
string
default:"solar"
The home-service vertical to scope the response. Defaults to solar when omitted.Allowed values: solar, hvac, roofing, plumbing, electrical.
state
string
Two-letter U.S. state code (e.g. GA, CA, TX). Used to filter finance products, incentives, permits, and climate records to the given state. Must be exactly two uppercase letters; otherwise a 400 is returned.
county
string
County name (e.g. Fulton, Los Angeles). The County suffix is stripped automatically before matching. Used alongside state for climate, permit, and finance-eligibility filtering.
county_fips
string
Five-digit FIPS code for the county (e.g. 13121). Alternative to county when you have a FIPS code available. Used for climate context lookups.
city
string
City name. Used to filter permit records when state or county is also provided.
address
string
Full postal address (street, city, state, ZIP). Maximum 300 characters. When provided, the API resolves utility territory for the address and includes the result in context.utility_territory_resolution. The raw address is never stored — only the resolution result is retained. Triggering utility territory resolution consumes from a separate rate-limit budget; see the note below.

Finance Filters

financier
string
Filter finance products to a specific lender by slug (e.g. goodleap, mosaic). The value is slugified before matching.
payment_type
string
Filter finance products by payment type (e.g. loan, lease, ppa).
term_months
integer
Filter finance products by loan term in months. Must be a valid integer.
finance_limit
integer
default:"25"
Maximum number of finance records to return. Minimum 1, maximum 100.

Equipment Filters

equipment_category
string
Filter the equipment catalog to a specific category.Allowed values: module, inverter, roofing, hvac, product.
manufacturer
string
Filter equipment records by manufacturer name.
sku
string
Filter equipment records by SKU.
equipment_id
string
HVAC equipment ID. When provided, the API fetches equipment-specific incentive context and uses the equipment’s measure_key to scope incentive and finance-eligibility lookups (unless measure is also explicitly supplied).
equipment_limit
integer
default:"25"
Maximum number of equipment records to return. Minimum 1, maximum 100.

Context Filters

utility
string
Utility name for incentive lookup (e.g. Georgia Power). Used to scope incentive records to a specific utility provider.
measure
string
Measure key for incentive and finance-eligibility filtering (e.g. air_source_heat_pump, rooftop_solar). When omitted and equipment_id is provided, the measure is inferred from the equipment record. For trade=hvac with no equipment_id, defaults to air_source_heat_pump.
context_limit
integer
default:"10"
Maximum number of records to return per context category (climate, incentives, labor adders, permits, finance eligibility). Minimum 1, maximum 50. Also caps utility territory matches at 10.

The address field is used only for utility territory resolution during the current request. It is never persisted, logged, or associated with your API key. The inputs.address_redacted field in the response is a boolean that confirms whether an address was supplied — the address itself is not echoed back.
Always inspect the coverage.warnings[] array in every response. Warnings indicate data gaps such as no finance rows matching the requested trade, missing climate context due to absent geography inputs, or a utility territory resolution that did not reach quote-safe status. A 200 status with an empty finance array and warnings present means the response is incomplete for quoting purposes.
For trade=hvac, always include at least state and county (or county_fips) to receive climate context records. Without geography, the climate array will be empty and a warning will be added to coverage.warnings.

Response

data
object
Top-level data envelope containing the full quote context bundle.

Examples

curl -G https://homeservicedata.com/api/v1/quote-context \
  -H "x-api-key: YOUR_API_KEY" \
  --data-urlencode "trade=hvac" \
  --data-urlencode "state=GA" \
  --data-urlencode "county=Fulton" \
  --data-urlencode "measure=air_source_heat_pump"

Response

{
  "data": {
    "trade": "hvac",
    "inputs": {
      "state": "GA",
      "county": "Fulton",
      "county_fips": null,
      "city": null,
      "utility": null,
      "measure": "air_source_heat_pump",
      "address_redacted": false,
      "financier": null,
      "payment_type": null,
      "term_months": null,
      "equipment_category": null,
      "manufacturer": null,
      "sku": null,
      "equipment_id": null
    },
    "coverage": {
      "finance_records": 18,
      "equipment_records": 25,
      "equipment_total_available": 142,
      "context_records": {
        "climate": 3,
        "incentives": 5,
        "labor_adders": 4,
        "permits": 2,
        "finance_eligibility": 6,
        "utility_territory": 0
      },
      "quote_safe_summary": {
        "finance": { "total": 18, "quote_safe": 16, "not_quote_safe": 2 },
        "equipment": { "total": 25, "quote_safe": 22, "not_quote_safe": 3 },
        "climate": { "total": 3, "quote_safe": 3, "not_quote_safe": 0 },
        "incentives": { "total": 5, "quote_safe": 4, "not_quote_safe": 1 },
        "labor_adders": { "total": 4, "quote_safe": 4, "not_quote_safe": 0 },
        "permits": { "total": 2, "quote_safe": 2, "not_quote_safe": 0 },
        "finance_eligibility": { "total": 6, "quote_safe": 6, "not_quote_safe": 0 },
        "utility_territory": { "total": 0, "quote_safe": 0, "not_quote_safe": 0 }
      },
      "unresolved_requirements": [],
      "warnings": []
    },
    "finance": [ /* finance product records */ ],
    "equipment": [ /* equipment catalog records */ ],
    "context": {
      "equipment_incentive_context": null,
      "climate": [ /* climate context records */ ],
      "incentives": [ /* incentive records */ ],
      "labor_adders": [ /* labor adder records */ ],
      "permits": [ /* permit records */ ],
      "finance_eligibility": [ /* eligibility records */ ],
      "utility_territory_resolution": null
    }
  },
  "error": null,
  "meta": null
}