/api/v1/sync/snapshot endpoint downloads every current record in a named dataset in a single paginated response. Each snapshot response includes a version object with a cursor string that acts as a bookmark — after loading the initial snapshot, pass that cursor to /api/v1/sync/changes to receive only the records that changed since your last sync. This two-step pattern (snapshot once, then poll changes) keeps your CRM or quoting database up to date without re-downloading entire datasets on every run.
The endpoint supports conditional GET via the ETag / If-None-Match mechanism. If nothing has changed since your last snapshot, the API returns 304 Not Modified with an empty body, saving both bandwidth and API quota.
Request
Authentication
All requests must include your API key in thex-api-key header. The required access tier varies by dataset; most datasets require production tier.
Query Parameters
The dataset to snapshot. Must be one of the following keys:
| Key | Description |
|---|---|
finance_fees | Dealer-fee and finance-program rows used by quote tools |
finance_products | Finance product catalog |
finance_eligibility | Eligibility rules by trade, state, county, and measure |
equipment_pricing | Equipment catalog with pricing |
utility_territory | Utility territory boundary data |
electricity_rates | Electricity rate data by territory |
hvac_incentives | HVAC-specific rebate and incentive programs |
hvac_climate | HVAC climate context by county |
hvac_labor | HVAC labor adder records |
hvac_ahri_matches | AHRI-certified HVAC system match records |
Optional trade filter. When provided, only records for that trade category are returned. Must be one of
solar, hvac, roofing, plumbing, or electrical. Not all datasets carry trade-scoped records — for trade-agnostic datasets the parameter is accepted but has no filtering effect.Maximum number of records to return. The ceiling varies by dataset (up to
5000 for high-volume datasets like finance_fees). When omitted, the dataset’s default maximum is used. Lowering the limit is useful during development or when testing incremental sync without pulling full production volumes.Conditional GET (ETag)
Every200 response includes an ETag response header. Store that value and include it as If-None-Match on your next request. If the dataset version and limit parameters have not changed, the API returns 304 Not Modified with no body, and no quota is charged for the data transfer.
Response
Top-level
data envelope containing the snapshot payload.Examples
Response — 200 OK
Response — 304 Not Modified
WhenIf-None-Match matches the current ETag, the API returns an empty 304 response with no body.