ai

POST /v1/ai/images/credentials

Store an image-provider key for this organization.

All ai endpoints

All developer docs →

Authentication

Send an API key as a bearer token. The key must carry the billing.payment.manage 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/credentials \
  -H "Authorization: Bearer zdk_live_…" \
  -H "Content-Type: application/json" \
  -d '{ "provider": <AiImageProvider>, "api_key": <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

Puts the key in Vault and records a pointer. Any existing live key for the same provider is revoked in the same transaction. ⭐ The key is tested immediately, by generating a real image, and the result is on the response. An auth probe is green against a model id that no longer exists, so the only check worth returning is one that actually draws something. A key that does not work is still stored and still a 201 — the row records last_check_ok: false and the provider's own words in last_check_error, because "we saved it and it does not work" is the successful outcome of this request and a 4xx would leave the screen unable to say why. Requires billing.payment.manage.

Request body

NameTypeRequiredWhat it is
providerAiImageProviderYesAn image-generation provider. ⛔ Deliberately a different enum from the text provider on AiCredential: Anthropic publishes no image model and xAI publishes no text model we…
api_keystringYesThe key itself. Written straight to Vault and never returned.
labelstringNo—
org_idUuidNoUUIDv7 identifier — sortable by creation time (docs/02 §8).

Response

NameTypeRequiredWhat it is
idUuidYesUUIDv7 identifier — sortable by creation time (docs/02 §8).
providerAiImageProviderYesAn image-generation provider. ⛔ Deliberately a different enum from the text provider on AiCredential: Anthropic publishes no image model and xAI publishes no text model we…
labelstringYes—
verified_atobjectNoThe last time a real image generation on this key succeeded. ⛔ null means never proven, not broken. Moved only by a generation, never by a cheap auth probe: a probe proves…
last_checked_atobjectNoThe last time any check ran, pass or fail. Separate from verified_at so "we have not looked recently" is distinguishable from "we looked and it failed".
last_check_okobjectNo—
last_check_errorstringNoThe provider's own words when the last check failed. Empty otherwise.
broken_sinceobjectNoWhen the key first failed after last passing, or null if it is not currently broken. ⭐ This is what makes "notify on transition to broken, never per check" possible — a key…
last_used_atobjectNo—
created_atstringYes—

Errors this endpoint can return

401 · 403 · 422 · 429