Upload File
Store a file and return a short-lived URL to pass in a model’s input.
Free, and available on an empty API wallet — funding is enforced when you
submit a generation, not when you upload its inputs. GET /v3/balance
reports what the wallet holds.
Returns 402 while uploads are paused, which happens when your recent requests were all refused for insufficient funds. Adding funds to the API wallet resumes them.
Authorizations
Primary scheme: Authorization: Key <key_id>:<secret>.
Body
The file to upload.
Response
Successful Response
POST /v3/files result. The presigned url is the file handle:
pass it as {"source": "url", "url": <url>} in any media input the
model's schema advertises (image / end_image / images /
audio / video) on submit.
Presigned GET URL for the stored bytes — the handle itself. Pass it back verbatim, query string included: a modified URL is not recognised as your handle and is rejected as an external URL.
MIME type sniffed from the uploaded bytes; the request's own Content-Type and filename are never trusted. Decides which media inputs will accept this handle.
ISO-8601 instant url stops being accepted — one hour after upload. Submitting with a lapsed handle is a 400 with reason: "expired", not a fetch failure; upload the file again for a fresh handle. The stored object is deleted separately by a bucket lifecycle policy about a day after upload, so treat re-uploading, not re-presigning, as the remedy.