Authentication
Send an API key as a bearer token. The key must carry the links.edit permission; a key without it is refused with 403, not 404.
Where your organisation id goes
This endpoint takes org_id as a field in the JSON body.
Your organisation id is on the API keys screen in your dashboard, beside the key itself. It is the same id in every call you make.
Try it
Replace anything in angle brackets with your own values, and the key placeholder with a key from your dashboard.
curl -X POST https://api.zinndigital.com/v1/ai/images/library \
-H "Authorization: Bearer zdk_live_…" \
-H "Content-Type: application/json" \
-d '{ "prompt": <string> }'Signed in? The API console in your dashboard fills in your real organisation id and your own key, and runs the request against the live API so you can see the actual response. Open this endpoint in the API console
Details
Draws up to four images from the customer's own prompt and keeps them in their library for 90 days. Requires `links.edit`. ⭐ This is the door that makes image generation a product rather than a post decoration. Every other image operation needs a content post to exist first; a hosting customer who wants a hero picture for their homepage, a social card or a product shot has none and never will. Billing is the **one AI meter** — BYO key first, then Zinn® credits, then whatever the plan includes; there is no separate image SKU. ⛔ A suspended account or one with no active subscription is refused before anything is drawn (§2.46), with `AI_NOT_IN_GOOD_STANDING` rather than the top-up message: that one is fixed by settling the account, and offering a credit button there sends the customer to a screen that cannot help them. The response carries `unmet` — anything the chosen provider could not honour, in words for the customer. Nothing is silently dropped.
Request body
| Name | Type | Required | What it is |
|---|---|---|---|
prompt | string | Yes | Used **as written**, not rewritten into a template. The only thing added is an instruction to draw no lettering, because all three providers render garbled text when asked for w… |
shape | string<wide, standard, square> | No | ⛔ A word, not a pixel pair, and that is a portability property rather than a simplification: Google takes an aspect ratio and a size *bucket* and cannot be given `1536x864`; Ope… |
count | integer | No | ⛔ Bounded at 4 so one press cannot spend an unbounded amount of a customer's credit. Four is already more variations than anybody picks between. |
style | string | No | Appended to the prompt — "photographic, muted palette". |
provider | AiImageProvider | string<> | No | Leave empty to let the platform choose. |
model | string | No | A specific `model_id` to pin, or empty to follow the provider's default. |
org_id | Uuid | No | UUIDv7 identifier — sortable by creation time (docs/02 §8). |
Response
| Name | Type | Required | What it is |
|---|---|---|---|
data | GeneratedImage[] | Yes | — |
unmet | string[] | No | What the chosen provider could not honour, in words for the customer. ⛔ Present and empty rather than absent when everything was honoured. |
Errors this endpoint can return
401 · 403 · 422 · 429