API Overview
The Zandovi public API lets you generate personalized images from your saved templates directly from your own code — e-commerce platforms, email systems, print-on-demand workflows, and automations.
The API is render-focused: you design and save templates in the app, then call the API to produce images. Each generate call returns the image bytes directly (not a link to a hosted file).
Base URL
Section titled “Base URL”https://app.zandovi.com/api/v1All endpoints are HTTPS-only and versioned under /api/v1.
What you can do
Section titled “What you can do”| Capability | Endpoint | Notes |
|---|---|---|
| List your projects | GET /projects | Paginated |
| List templates in a project | GET /projects/{projectId}/templates | Paginated |
| Inspect a template’s variables | GET /templates/{templateId} | Use this to discover what to send |
| Generate an image | POST /templates/{templateId}/generate | Returns binary image data |
Templates are authored visually in the app — the public API is read-and-generate only. Bulk/batch generation is not part of the public API; render in bulk by looping the generate endpoint, or use the in-app batch tools.
Authentication
Section titled “Authentication”Every request is authenticated with an API key sent in the X-Api-Key header:
X-Api-Key: your_api_keySee Authentication for how to create and manage keys.
Request format
Section titled “Request format”- Send
Content-Type: application/jsonfor request bodies. - All timestamps in responses are ISO 8601 in UTC:
2026-06-17T10:00:00Z. - Template and project IDs are UUIDs, e.g.
019463b8-1234-7890-abcd-ef1234567890.
Response format
Section titled “Response format”GETendpoints return JSON.POST /generatereturns the raw image bytes with the matchingContent-Type(image/png,image/jpeg,image/webp, orapplication/pdf) and aContent-Disposition: attachmentheader — write the response body straight to a file or stream it onward.
Errors
Section titled “Errors”Error responses use RFC 9457 application/problem+json:
{ "type": "about:blank", "title": "Variable validation failed", "status": 400, "code": "VALIDATION_ERROR", "detail": "Required variable 'discount_code' was not supplied.", "requestId": "req_01J9Z..."}See Errors, quotas & rate limits for the full status-code and error-code reference.
Status codes
Section titled “Status codes”| Code | Meaning |
|---|---|
200 | Success (image or JSON) |
400 | Validation error — missing or invalid variables / body |
401 | Missing or invalid API key |
404 | Template or project not found / not accessible |
429 | Monthly quota or rate limit exceeded |
502 / 503 | Rendering service error / temporarily unavailable |
Quotas & rate limits
Section titled “Quotas & rate limits”Image generation consumes your organization’s monthly render quota. Every generate response carries X-Quota-Limit, X-Quota-Remaining, and X-Quota-Reset headers, and requests are additionally subject to a short-term rate limit. See Errors, quotas & rate limits.
Versioning
Section titled “Versioning”The API is versioned in the URL (/api/v1). Backwards-incompatible changes ship under a new version; we aim to keep a previous version available for at least 6 months after a new one is released.