Base URL and authentication
https://api.leap.energy in production, https://api.staging.leap.energy in staging. Send your Leap API key as a Bearer token:
Choosing an endpoint
All three return the same result. They differ in what you send and what they change.
Call Look up for a new customer. Call Refresh to re-run as-is, to add a device to a customer you already know, or to fill in details as you learn them: purchase price, install date, permit status. Call Override to correct the customer record itself, such as a wrong address or a teardown and reinstall.
A lookup for a customer who already exists sets nothing new. If an entry names an installation that customer doesn’t have, Leap skips it, returns it in
devices_ignored[], and still answers the eligibility question with a 200. Send new installations to Refresh instead, and check devices_ignored[] before you record a device as registered.
Sending data as you learn it
Most of what a program asks about arrives after the first lookup. Send what you hold at quote time on Look up, and the rest on Refresh as you learn it. Both take the same keys, listed in the Requirements reference. Refresh merges what you send, stores it, and re-runs eligibility in the same call. Setcreate_application so the customer’s application picks the values up too.
When a call is refused
Override is a pre-submission correction, so Leap refuses it rather than destroy something you didn’t name. A409 means nothing changed on either side: the address already belongs to another of your customers, an application has already been filed with a program administrator, the customer is shared across organizations, or the reference_id belongs to another partner. Read error_code, fix the cause, and retry.
A 502 needs more care. GEOCODING_* and CONNECT_RESET_UNAVAILABLE changed nothing and are safe to retry. The CONNECT_RESET_FAILED, CONNECT_RESET_REJECTED, and CONNECT_RESET_REFUSED_AFTER_REBUILD codes mean the rebuild committed here but Connect didn’t confirm its side. Retrying can overlap a reset that is still running and destroy the customer’s Connect records. Contact Leap support instead. Each response spells this out in its own description.
Reading the results
Leap evaluates each device against each tier’s requirements, and every requirement reports a status:IGNORED is not a rejection. A tier whose only open items are IGNORED still counts toward incentive_summary, so the summary is the customer’s potential value, not a guaranteed amount. Supply the missing facts later and the checks resolve. To quote conservatively, sum only the tiers whose device_results[].status is COMPLETED.
Each check also carries expected_values, actual_value, and operator, which together say what the program wanted and what the customer has. Build a “what’s missing” list from those rather than from parsing reason, which is display copy Leap rewords. The code says what kind of requirement it is: see Eligibility check codes.
A tier identifies itself with tier_id, which is stable across relabeling. tier_name is the customer-facing label and is present only when the program’s spec sets one, so show tier_name when it exists and key on tier_id.
Leap names utility, state, and market programs; your partner offer uses the name you set in the portal.
How cost-based programs are priced
Some programs pay a percentage of what the customer spent. Others cap a flat amount at system cost. Either way, the amount depends on the cost Leap resolves for each device. Two keys carry cost, both on the installation:customer_device.purchase_price: the equipment only.customer_device.installation_cost: labor, materials, and permits.
details object on the matching customer_devices[] entry. When you don’t, Leap estimates the cost from the device catalog and from typical costs for that category and state.
A percentage program pays min(rate × cost, cap), summed over the devices that passed the tier. A flat rate capped at system cost pays the lesser of the two. A $1,500 installation incentive against a $1,000 actual cost pays $1,000.
See the Requirements reference for both keys and their value forms.