Quickstart
From no key to a verified call, and then to a sync that keeps itself up to date.
- 1Mint a key
In the portal, open Settings → Developers and create a key. Give it only the scopes the integration needs — a key that can read leads and nothing else is a key that can never write a price by accident.
The secret is shown once. We store a SHA-256 hash of it, so it cannot be produced again; put it straight into your secret store.
- 2Check what it can do
GET /meneeds no scope. It answers with the account, the key's scopes, and the rate budget actually in force — size your importer against those numbers rather than against the ones on this site.curl https://api.zinevu.com/api/public/v1/me \ -H "Authorization: Bearer $ZINEVU_API_KEY"Response{ "data": { "account": { "id": 42, "name": "Valk Veranda", "currency": "EUR", "country": "NL", "language": "nl" }, "key": { "name": "ERP import", "prefix": "zv_live_8f14", "scopes": ["leads:read", "prices:read", "prices:write"], "expires_at": null, "last_used_at": "2026-09-23T08:11:02+00:00" }, "limits": { "tier": "paid", "per_minute": 60, "per_day": 10000, "write_per_minute": 10, "write_per_day": 500, "max_page_size": 100 } }, "meta": { "message": "OK" }} - 3Read something real
Lists are cursor-paginated and carry no total. Follow
meta.next_cursoruntil it comes backnull.curl "https://api.zinevu.com/api/public/v1/leads?limit=25&status=requested" \ -H "Authorization: Bearer $ZINEVU_API_KEY" - 4Turn it into a sync
Store the timestamp of the newest record you have seen and pass it back as
updated_since. That is the whole incremental sync — no diffing, no full re-read, and an unparseable value is refused rather than ignored.# Everything that changed since the last run, page by page.curl "https://api.zinevu.com/api/public/v1/leads?updated_since=2026-09-01T00:00:00Z&limit=100" \ -H "Authorization: Bearer $ZINEVU_API_KEY" - 5Stop polling
Once the read side works, subscribe to the events you care about and let us call you. Webhooks are signed, so verify every delivery before you trust it.
Skip the typing#
Every endpoint on this site is in the Postman collection, generated from the router so it cannot describe something we do not have. Import it, set base_url and api_key, and start with a dry run.
Download the Postman collection
A price write replaces the grid it addresses, and every write takes ?dry_run=1. Use a code of your own for the first experiment — example_roof, not the code your catalogue already quotes from.
Read on#
- Authentication — scopes, rotation, and the difference between rotating and revoking.
- Conventions — the envelope, ids versus codes, timestamps and money.
- Importing prices — the one guide to read before writing anything.