Skip to main content
The /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 the x-api-key header. The required access tier varies by dataset; most datasets require production tier.

Query Parameters

string
required
The dataset to snapshot. Must be one of the following keys:
string
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.
integer
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)

Every 200 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

object
Top-level data envelope containing the snapshot payload.

Examples

Response — 200 OK

Response — 304 Not Modified

When If-None-Match matches the current ETag, the API returns an empty 304 response with no body.

Next Steps

Once you have a snapshot cursor, use Sync Changes to poll for incremental updates without re-downloading the full dataset.