/v1/images, /v1/videos, /v1/audio) returns the same object, and
GET /v1/generations/{id} returns its current state.
Status
type is the media kind (image, video, audio). Each output carries an asset_id: pass it
as a reference input (first_frame, reference_images, motion_video, …) to build on it in the
next generation without uploading anything.
Polling
PollGET /v1/generations/{id} every 2–5 seconds and back off a little on each round. Images
usually finish in under a minute; video can take a few minutes depending on the model and
duration. Polling counts against your per-key rate limit, so a 2-second interval is plenty.
Output URLs point at Ekly’s storage and are not permanent. Download the file promptly or copy it
to your own bucket; do not store the URL as the asset.
Idempotency
Send anIdempotency-Key header (up to 128 characters) with every submit. If the request is
retried with the same key and the same body, you get the original generation back and nothing is
charged again. The same key with a different body returns 409 conflict, which protects you
from accidentally reusing a key across unrelated requests. Keys never expire and are scoped to
your organization.
The body field idempotency_key does the same thing; if you send both, they must match or the
request is rejected with 422.
Listing
GET /v1/generations lists generations created by the key’s creator in your organization,
newest first. Page with next_cursor → ?after=, and filter by status, type, model or
created_after. Cursors stay valid while new generations arrive.