Skip to main content
Every submit endpoint (/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

Poll GET /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 an Idempotency-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.