Kinoseed

Endpoints

Images

One call starts an image run: a prompt, optionally reference images, and how many pictures you want back. The job finishes in seconds and carries the image URLs.

How it works

  • Pick a model from Models (or GET /models?kind=image). Without one the run uses seedream-5-lite.
  • count asks for several images in one run; the price multiplies by it.
  • referenceImageUrls takes up to eight public https URLs, or URLs from POST /files. Anything private or plain http is refused with unsafe_url before anything is charged.
  • The answer is a 201 job in queued or running. Follow it with GET /jobs/{id}?wait=50; the URLs land in output.imageUrls.
  • metadata (up to 16 strings) comes back on the job untouched, for your own order or user ids.

Generate images

post/api/v1/images

Bearer keyimages:generatecreateImage

Start an image run. The price is quoted from the model and count, charged before the provider is called, and refunded in full if the provider refuses. Reference images must be public https URLs or URLs returned by POST /files. Needs images:generate.

curl -X POST https://kinoseed.app/api/v1/images \
  -H "Authorization: Bearer ks_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: order-1042-hero" \
  -d '{
    "prompt": "a ceramic mug on a sunlit desk, product photo",
    "model": "nano-banana-pro",
    "aspect": "1:1",
    "count": 2
  }'

Parameters

NameInTypeRequiredDescription
Idempotency-KeyheaderstringnoAny string of your choosing, up to 255 characters. A retry with the same key and body returns the first response (with Idempotent-Replayed: true) instead of starting and charging a second run. Kept for 24 hours.up to 255 characters

Request body

application/json

FieldTypeRequiredDescription
promptstringyesup to 4000 characters
modelstringnoAn image model id from GET /models. Defaults to the catalog default.
aspectstringnoe.g. "1:1"
countintegernoImages per run; the price multiplies.1 to 8
referenceImageUrlsstring (uri)[]noup to 8 items
seedintegerno
metadataRecord<string, string>noUp to 16 string values the caller wants back on the job.

Responses

StatusBodyMeaning
200JobThe provider refused the request at submission. The Job has status failed, error says why, and credits.refunded equals credits.charged: nothing was spent.
201JobThe image run was started and charged. Poll GET /jobs/{id} (or use ?wait=) until status is completed or failed.
400ErrorEnvelopeBody failed validation (invalid_request), the model is not in the catalog (unknown_model), or a URL is not public https (unsafe_url).
401ErrorEnvelopeMissing, invalid or revoked key.
402ErrorEnvelopeThe balance does not cover the quote; details has needed, balance and topUpUrl.
403ErrorEnvelopeThe key lacks the images:generate scope.
409ErrorEnvelopeA request with this Idempotency-Key is still being processed.
422ErrorEnvelopeThis Idempotency-Key was already used with a different body.
429ErrorEnvelopeOver a rate budget; see Retry-After. Also too_many_running when the account already has 5 runs in progress.

Response fields

The 200 body.

FieldTypeDescription
idstring
kind"image" | "video"
statusJobStatus
progressinteger0 to 100
modelstring
promptstring
creditsobject
credits.chargedinteger
credits.refundedinteger
outputobject
output.videoUrlstring | null
output.imageUrlsstring[]
output.thumbUrlstring | null
errorstring | nullIn the customer's words; null unless failed.
metadataRecord<string, string> | null
createdAtstring (date-time)
completedAtstring (date-time) | null
linksobject
links.selfstring (uri)
links.webstring (uri)