List models and your Library
GET /api/v1/models for model ids and prices, GET /api/v1/media for your files.
Both need a workspace API key as Authorization: Bearer sk_live_…, and answer JSON.
Models
GET https://shotz.co/api/v1/models
Answers {"models": […]}, the models a prompt can start. Tools that work on a clip you already have, and talking avatars, aren’t in it. Each model has:
id: what to send asmodelwhen you generate.nameandmaker.kind:video,image,audio,3dorworld.creditsandunit: the price, in credits for each unit. The unit is5s clipfor most video (the price of 5 seconds at the lowest quality; longer clips and higher quality cost more),imagefor images,modelfor 3D,worldfor Worlds,minutefor a voiceover or ElevenLabs Music,secondfor Sonilo’s music andclipfor a fixed-length video such as Wan 2.2 Fast or a whole song from Lyria.maxSeconds: the longest it makes, ornull.qualities: available quality choices as{id, label}objects. Send theidasqualitywhen generating; show thelabelto people, since it identifies upscaled outputs where relevant. An empty list means the model has no quality choice.upscaledQualities, when present: the quality ids produced by upscaling rather than native generation.soundKind: "effects"andeffectsCredits, when present: the model supports explicitly requested sound effects and ambience, with that additional credit cost per take. This is separate from native audio and does not provide dialogue or lip sync.
credits is the base price, not a full table of quality prices. A generation's response reports the total actually charged for its selected settings and takes.
Your Library
GET https://shotz.co/api/v1/media
Answers {"media": […], "next": …}, the workspace’s files, newest first. Deleted files aren’t included. Each file has:
idandname.kind:video,image,audio,3dorworld.source:upload,generated,exportorimport.mime,bytes,width,heightandseconds(nullwhere they don’t apply).status:uploading,processing,readyorfailed.created: when it was added.url: a download link to the original file that works for at least an hour.fields: the file’s Library fields by key, for example{"sku": "4410", "status": "Approved", "channels": ["Shopify"]}. A field with nothing in it isn’t there.{}when none are filled in.
It returns 50 files at a time. Add ?limit= for up to 100.
Find files by their fields
Add field.<key>=<value> to list only the files whose field has that value, using the field’s key: its name when it was made, in lower case with underscores, like sku or product_name. Renaming a field keeps its key. Use several to narrow further: GET /api/v1/media?field.sku=4410&field.status=Approved.
- A text or number field matches its value exactly.
- A pick-one field matches one of its choices, in any case. A pick-several field matches files that have that choice among theirs.
- A yes or no field takes
trueorfalse. field.<key>=__filledlists files where it’s filled in, andfield.<key>=__emptyfiles where it isn’t.
A key the workspace has no field for, or a value that doesn’t fit its field (a choice it doesn’t have, words in a number field), is a 400 saying what’s wrong.
More files
When there are more, next is a date. Send it back as before to get the next page, for example GET /api/v1/media?before=2026-10-01T09:30:00Z, and keep going until next is null. before must be a timestamp like next; anything else is a 400.
A real person in Melbourne will write back, usually within one business day.