Kinoseed

Endpoints

Jobs

Every image or video run is a job. Read it to see where it is, hold the read open until it finishes, list what the account has made, or delete it from the library.

Statuses

StatusMeaning
queuedAccepted and charged; waiting for the provider to pick it up.
runningThe provider is working on it. progress moves from 0 towards 100.
completedDone. output holds the URLs and completedAt is set. Final.
failedThe provider refused or failed the run. error says why in plain words, and the credits are back. Final.

Waiting for a result

Each read advances the job against the provider, so polling alone is enough: read it until it is final. To be told instead, register a webhook. Add ?wait=N (1 to 50 seconds) and the server holds the response, checking every 3 seconds, and answers as soon as the job is final or the time is up. One request a minute per job is then all a script needs.

Images are usually final inside one 50-second wait. Videos take one to several minutes: loop the wait. Without wait, poll no faster than every 3 seconds. Set your HTTP client's timeout above 50 seconds.

Refunds

A failed run is refunded automatically, in full, the moment it fails. The job shows it: credits.charged is what the run cost when it started and credits.refunded is what came back, so a failed job reads { "charged": N, "refunded": N }. A completed job has refunded: 0. There is nothing to claim and nothing to call.

Read a job

get/api/v1/jobs/{id}

Bearer keyjobs:readgetJob

One job, advanced against the provider on each read. With ?wait=N (1 to 50 seconds) the response is held until the job finishes or the time is up, polling every 3 seconds. Needs jobs:read.

# Hold the response up to 50 seconds while the job runs.
curl "https://kinoseed.app/api/v1/jobs/JOB_ID?wait=50" \
  -H "Authorization: Bearer ks_live_YOUR_KEY"

Parameters

NameInTypeRequiredDescription
idpathstringyesThe job id returned when it was created.
waitqueryintegernoHold the response up to this many seconds while the job is still running.1 to 50

Responses

StatusBodyMeaning
200JobThe job.
400ErrorEnvelopewait is out of range.
401ErrorEnvelopeMissing, invalid or revoked key.
403ErrorEnvelopeThe key lacks jobs:read.
404ErrorEnvelopeNo job with this id belongs to this account.
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)

List jobs

get/api/v1/jobs

Bearer keyjobs:readlistJobs

The account's jobs, newest first, including runs started in the web app. Page with cursor from nextCursor. Needs jobs:read.

Newest first, up to 100 a page. Pass nextCursor back as cursor for the next page; it is null on the last one.

curl "https://kinoseed.app/api/v1/jobs?limit=20&status=completed&kind=video" \
  -H "Authorization: Bearer ks_live_YOUR_KEY"

Parameters

NameInTypeRequiredDescription
limitqueryintegerno1 to 100
statusqueryJobStatusno
kindquery"image" | "video"no
cursorquerystringno

Responses

StatusBodyMeaning
200JobsListResponseA page of jobs.
400ErrorEnvelopeA query parameter is out of range.
401ErrorEnvelopeMissing, invalid or revoked key.
403ErrorEnvelopeThe key lacks jobs:read.
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
jobsJob[]
nextCursorstring | null

Delete a job

delete/api/v1/jobs/{id}

Bearer keyjobs:writedeleteJob

Remove a job from the account's library. Credits are not affected: a refused run was already refunded, a finished one was delivered. Needs jobs:write.

curl -X DELETE https://kinoseed.app/api/v1/jobs/JOB_ID \
  -H "Authorization: Bearer ks_live_YOUR_KEY"

Parameters

NameInTypeRequiredDescription
idpathstringyesThe job id returned when it was created.

Responses

StatusBodyMeaning
200JobDeleteResponseDeleted.
401ErrorEnvelopeMissing, invalid or revoked key.
403ErrorEnvelopeThe key lacks jobs:write.
404ErrorEnvelopeNo job with this id belongs to this account.
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
deletedtrue

For the job as an object, every field, see Job in the reference.