Returns upfront rebates and ongoing (DR/VPP) programs available to a residential customer at a given location, across all electrification-relevant technologies (solar, battery, EV, heat pump, water heater, insulation, appliance, etc.).
The response includes:
upfront[]— at-purchase rebates and tax credits, ordered by confidence + provider preference + max amountongoing[]— recurring/performance programs (demand response, VPP, time-of-use bonuses)totals— estimated dollar values whensystem_costand/orsystem_size_kware providedmeta— debug info: which aggregators expanded the result, confidence floor used
Aggregator expansion: when the customer's utility belongs to one or more aggregators (Mass Save, TVA EnergyRight, Energize CT, etc.), programs administered by those aggregators are automatically included. Same routing applies to ongoing programs (aggregator_id, installer_service_eids scoping for installer-VPPs like Sunrun-SCE).
Confidence filtering: by default only HIGH records surface. Pass min_confidence: 'MEDIUM' (or lower) to opt in to less-certain records. Confidence reflects whether the record is authority-confirmed (HIGH) versus hint-only from third-party databases like DSIRE (MEDIUM). The VERIFIED tier was historically present but consolidated into HIGH in May 2026 — VERIFIED is still accepted as a valid min_confidence for backwards compatibility but produces the same set as HIGH.
Why a record matched (provider_type): in location mode a record is returned for the resolved utility_eid when
utility— the record belongs to that utility (eid match).provideris the customer's utility.aggregator— the eid is on the roster of the aggregator that runs the program (Mass Save, Efficiency Vermont, Energize CT, TVA EnergyRight, CCAs …). The aggregators used are listed inmeta.aggregators_expanded.provideris the aggregator, not the customer's utility.state/iso— statewide program instate.local— county/city program instate, scoped by county (seezipcode/county_fips/county).installer— installer-run program (e.g. a VPP) instate, optionally limited to the utilities it serves.non-profit— non-profit program administrator. This is a routing type, not a statement about tax status: Mass Save and Efficiency Vermont are legally non-profits but are typedaggregator.federal— always returned.
Eligibility filtering is server-side. Send the household's situation (house_type, occupancy, construction, income_status, ami_pct, targets, is_rural, is_dac) and records it cannot claim are removed — there is no need to re-implement this client-side. Rules:
- Silent = permissive. A null /
[]eligibility field means the program does not constrain that axis — not "unknown, exclude". Such records match any household value. - AND-narrowing. A record must pass every axis you send. Sending more fields only ever removes records the household genuinely can't get.
- Demographic targeting is opt-in. Without
targets, senior/veteran/… programs are returned to everyone; withtargets, class-restricted programs the household doesn't match are dropped. - The applied filter is echoed in
meta.eligibility_filter.
Which text field to show:
summary(upfront and ongoing) — one-line headline of the program.amount.tier_notes— the step schedule the headline amount flattens (size / efficiency / income tiers). Show it under the amount when present.eligibility.description— the conditions to qualify, in the authority's words.evidence_quote— verbatim text from the source page that proves the amount. Render it behind a "where does this come from?" affordance next to theurl, never as body prose.
Deprecated fields (still returned, will be removed after notice): eligibility.efficiency_requirement (use equipment.certifications / equipment.min_specs), eligibility.enrollment_required (use equipment.pairing_requirements), amount.max_per_unit, and ongoing[].eligibility.audience.
| Time | Status | User Agent | |
|---|---|---|---|
Retrieving recent requests… | |||
500Internal server error
