20% off your first month

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 as model when you generate.
  • name and maker.
  • kind: video, image, audio, 3d or world.
  • credits and unit: the price, in credits for each unit. The unit is 5s clip for most video (the price of 5 seconds at the lowest quality; longer clips and higher quality cost more), image for images, model for 3D, world for Worlds, minute for a voiceover or ElevenLabs Music, second for Sonilo’s music and clip for a fixed-length video such as Wan 2.2 Fast or a whole song from Lyria.
  • maxSeconds: the longest it makes, or null.
  • qualities: available quality choices as {id, label} objects. Send the id as quality when generating; show the label to 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" and effectsCredits, 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:

  • id and name.
  • kind: video, image, audio, 3d or world.
  • source: upload, generated, export or import.
  • mime, bytes, width, height and seconds (null where they don’t apply).
  • status: uploading, processing, ready or failed.
  • 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 true or false.
  • field.<key>=__filled lists files where it’s filled in, and field.<key>=__empty files 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.

Still stuck?

A real person in Melbourne will write back, usually within one business day.

Contact support