Endpoint
Authentication
Requires a validx-api-key header. The search endpoint checks dataset-level access for each result type and only returns records from datasets your key is entitled to. If your key has no entitlement for a given type, results of that type are silently omitted rather than rejected with a 403.
Query Parameters
The search query string. Minimum 2 characters after trimming whitespace and control characters. Matched against titles, SKUs, manufacturer names, program names, and other text fields depending on the result type. Maximum 120 characters; longer values are truncated.
Restrict results to a single trade vertical. One of:
solar, hvac, roofing, plumbing, electrical, context. Omit to search all trades.Restrict results to a single record type. One of:
Aliases like
| Value | Alias(es) | Description |
|---|---|---|
equipment | hardware | Equipment and hardware catalog records |
price | — | Market price observations |
finance | — | Finance fee / dealer fee programs |
finance_eligibility | eligibility | Finance product eligibility rules |
incentive | — | Incentive programs (tax credits, rebates) |
utility | — | Utility providers and service territories |
permit | — | Permit assumptions and jurisdiction authorities |
labor | — | Labor adder catalog entries |
source_document | source, sources, documents | Ingested source files and data sheets |
dataset | sync | Published dataset manifests |
hardware and eligibility are normalized automatically.Filter results by their
quote_safe flag. Pass true to return only records approved for customer-facing quotes. Pass false to return only records that are not yet approved. Omit to return both. Must be the literal string true or false.Maximum number of results to return. Minimum
1, maximum 50, default 24. The API may return fewer results if deduplication or access filtering reduces the set.Result Ranking
Results are scored before being returned. The ranking algorithm rewards:- Exact title matches (highest weight)
- Title prefix matches
- Title substring matches
- Subtitle and metadata matches (lower weight)
- Number of matched fields
quote_safe: truerecords- Higher
confidencevalues (high>medium)
equipment → price → finance → finance_eligibility → incentive → utility → permit → labor → source_document → dataset.
Request Examples
TypeScript example
Response
A successful response returns an array of result objects indata. The meta field is null for the search endpoint — pagination is not supported; use the limit parameter to control result count.
Result Object Fields
The record type. One of
equipment, price, finance, finance_eligibility, incentive, utility, permit, labor, source_document, dataset.The unique identifier for the record within its type. Stable across requests.
The primary display label — SKU for equipment, program name for finance and incentive records, utility name for utility records, and so on.
A secondary label providing additional context — manufacturer for equipment, financier name for finance, authority name for permits, etc.
null if not applicable.The trade vertical the record belongs to (
solar, hvac, roofing, plumbing, electrical, or context). null for records that are not trade-scoped.The dashboard category this record belongs to (e.g.
equipment, financing, incentives, permits, labor). Suitable for building navigation links.A deep-link path into the Home Service Data dashboard for this record. Useful for linking users directly to the source.
Whether this record has passed all validation checks and is approved for use in customer-facing quotes.
null for record types (such as source documents and datasets) that do not carry this signal.Data confidence tier:
high, medium, or low. null for record types that do not carry this signal.The UUID of the source document this record was ingested from.
null if the record was not derived from a tracked source file.ISO 8601 timestamp of the most recent source verification.
null if no verification date is recorded.A list of outstanding issues that prevent this record from being fully
quote_safe. An empty array means no issues. Examples: "polygon-backed territory not loaded", "source document needs review".A compact, human-readable summary string formatted for display in search results — for example
"$1,240" for equipment, "2.99% / 300mo / 39% fee" for finance, or "active" for incentives.The names of the database fields that the query string matched in this record. Useful for highlighting matched text in a search UI.
Errors
| Status | Message | Cause |
|---|---|---|
400 | Query parameter 'q' is required (min 2 characters). | q parameter missing or shorter than 2 characters |
400 | Unsupported trade "…". Use solar, hvac, roofing, plumbing, electrical, or context. | trade value not in the allowed set |
400 | Unsupported type. Use equipment, price, finance, … | type value not in the allowed set |
400 | Invalid quote_safe. Use true or false. | quote_safe is not the literal string true or false |
401 | Missing x-api-key header. | No API key provided |
401 | Invalid API key. | Key not found or revoked |
If the search index is unavailable, the API falls back to direct per-table queries. All result types are searched in parallel and results are merged client-side. This fallback is transparent — you will still receive results, though response time may be slightly higher.