Gambar, video, musik, dan suara
Kunci yang Anda gunakan untuk teks juga membuat gambar, video, musik, dan suara, serta mengubah rekaman menjadi teks, dari saldo yang sama. Pilih model di tabel model (atau ?type=image, ?type=music, ?type=audio); halaman setiap model menunjukkan harga, jenis, dan contoh permintaan yang berfungsi.
| Anda ingin | Rute | Gambar sumber dimasukkan ke |
|---|---|---|
| Gambar baru dari prompt | POST /v1/images/generations |
(tidak ada) |
| Gambar yang diedit | POST /v1/images/edits |
image (atau image_url, input_images, images) |
| Video dari prompt | POST /v1/video/generations |
(tidak ada) |
| Video yang dimulai dari gambar | POST /v1/video/generations |
image_url (bingkai pertama); end_image_url untuk bingkai terakhir |
| Video dari gambar referensi | POST /v1/video/generations |
input_images dengan "role": "reference" |
| Jawaban teks tentang gambar | POST /v1/chat/completions |
bagian image_url di messages[].content |
| Musik | POST /v1/music/generations |
(tidak ada) |
| Suara dari teks | POST /v1/audio/speech |
(tidak ada) |
| Teks dari rekaman | POST /v1/audio/transcriptions |
(tidak ada; rekaman dimasukkan ke file) |
Gambar sumber adalah tautan https://, URI data: (data:image/png;base64,iVBORw0…) atau base64 biasa dari PNG, JPEG, atau WebP, hingga 8 per permintaan. Rute gambar juga menerima unggahan multipart (di bawah). Tautan harus berupa tautan https:// publik; tautan http:// ditolak. Tautan yang mengalihkan (misalnya https://picsum.photos/640/360) akan diikuti, hingga 5 kali dan hanya ke tautan https:// publik lainnya, dan model akan mendapatkan tautan tujuan akhirnya. Tautan yang tidak mengarah ke gambar, atau mengalihkan ke tempat yang tidak dapat kami gunakan, akan ditolak dengan 400 invalid_image_url sebelum ada yang ditahan atau dikenakan biaya. Gambar yang dikirim secara inline membuat permintaan lebih besar: jaga agar ukurannya di bawah 10 MB, atau kirim tautan.
Dalam pesan obrolan (image_url di messages[].content), tautan (https:// atau http://) dibuka oleh UberLLM dan dikirim ke model sebagai URL data:, karena sebagian besar model visi hanya menerima itu. Setiap gambar dapat berukuran hingga 20 MB (40 MB per permintaan), dan pengalihan diikuti hingga 5 kali, hanya ke alamat publik. Model Gemini mendapatkan tautan apa adanya. Tautan yang tidak mengarah ke gambar akan ditolak dengan 400 invalid_image_url, dan tidak ada biaya yang dikenakan.
Buat gambar
Gambar akan muncul di jawaban.
curl https://api.uberllm.dev/v1/images/generations \
-H "Authorization: Bearer $UBERLLM_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "venice/z-image-turbo", "prompt": "a red apple on a white table", "n": 1, "size": "1024x1024"}'
{ "created": 1792429247, "data": [{ "url": "https://api.uberllm.dev/v1/media/artifacts/<id>/0" }],
"usage": { "cost_usd": 0.0099, "max_cost_usd": 0.0109 } }
usage.cost_usd adalah biaya gambar (juga di header X-UberLLM-Cost-USD). Dalam jawaban langka di mana harga belum diketahui, biayanya adalah null. Anda membayar sesuai yang ditagihkan penyedia, tidak pernah lebih dari max_cost_usd, yaitu jumlah yang ditahan untuk itu.
response_format secara default adalah url, baik untuk /v1/images/generations maupun /v1/images/edits. Kirim "response_format": "b64_json" untuk mendapatkan gambar di dalam jawaban sebagai gantinya. Ketika model mengembalikan gambar itu sendiri, UberLLM menyimpannya sebagai file akun Anda selama 24 jam dan menjawab dengan tautannya (https://api.uberllm.dev/v1/files/file_…/content), yang juga berfungsi sebagai gambar sumber untuk pengeditan selanjutnya. Unduh URL dengan kunci yang sama:
curl -L -o image.png -H "Authorization: Bearer $UBERLLM_API_KEY" \
"https://api.uberllm.dev/v1/media/artifacts/<id>/0"
n adalah 1 hingga 10.
Edit Gambar
Gunakan model yang mengedit (ID-nya biasanya berakhiran -edit) dan kirim gambar sumber di image:
curl https://api.uberllm.dev/v1/images/edits \
-H "Authorization: Bearer $UBERLLM_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "google/nano-banana-pro-edit", "prompt": "make the sky a sunset",
"image": "https://example.com/skyline.png"}'
Gambar yang sama dapat dimasukkan sebagai:
"image": "data:image/png;base64,iVBORw0…""image_url": "https://…""input_images": ["https://…", "https://…"]: yang pertama adalah gambar yang akan diedit, sisanya adalah referensi. Sebuah entri juga bisa berupa{"url": "…", "role": "reference"}."images": [{"image_url": "https://…"}], bentuk yang dikirim oleh OpenAI SDK
Base64 biasa juga berfungsi, dan "input_image" dibaca sebagai "image".
Atau unggah file, seperti dengan edit gambar OpenAI:
curl https://api.uberllm.dev/v1/images/edits \
-H "Authorization: Bearer $UBERLLM_API_KEY" \
-F model=google/nano-banana-pro-edit -F prompt="make the sky a sunset" \
-F [email protected]
Edit tanpa gambar sumber akan ditolak dengan 400 image_required. Masker (inpainting) tidak didukung.
Unggah gambar sekali
Unggah gambar ke /v1/files dan gunakan dalam permintaan sebanyak yang Anda inginkan
selama 24 jam, alih-alih mengirimkannya di setiap permintaan:
curl https://api.uberllm.dev/v1/files \
-H "Authorization: Bearer $UBERLLM_API_KEY" \
-F [email protected]
{ "id": "file_3f9c…", "object": "file", "bytes": 482113, "content_type": "image/png",
"filename": "skyline.png", "created_at": 1792540800, "expires_at": 1792627200,
"url": "https://api.uberllm.dev/v1/files/file_3f9c…/content" }
Kemudian masukkan ID-nya, atau url, di mana pun gambar sumber digunakan: "image": "file_3f9c…",
"image": {"file_id": "file_3f9c…"}, "image_url": "file_3f9c…", entri dari
input_images, atau bingkai awal video. Hanya akun Anda yang dapat menggunakan file-nya.
- PNG, JPEG, WebP, GIF, HEIC atau AVIF, masing-masing hingga 10 MB, maksimal 500 disimpan per akun pada satu waktu.
- Disimpan selama 24 jam, lalu dihapus.
GET /v1/files/{id}menjelaskan satu,GET /v1/files/{id}/contentmengunduhnya,DELETE /v1/files/{id}menghapusnya sekarang.
Buat video
Sebuah video membutuhkan waktu satu menit atau lebih, jadi ini adalah sebuah pekerjaan: mulai, periksa, unduh.
1. Mulai
curl https://api.uberllm.dev/v1/video/generations \
-H "Authorization: Bearer $UBERLLM_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"model": "fal-ai/vidu/q3/text-to-video/turbo", "prompt": "a red ball bouncing on green grass",
"duration_seconds": 5, "models": ["fal-ai/kling-video/v3/standard/text-to-video"]}'
models bersifat opsional: model cadangan dicoba secara berurutan hanya jika model pertama tidak memiliki penyedia gratis saat ini, sehingga momen sibuk tidak menggagalkan permintaan Anda (lihat Model cadangan). Video di atas membutuhkan waktu sekitar satu menit dan biayanya sekitar $0.33.
Untuk memulai dari sebuah gambar, gunakan model image-to-video dan tambahkan image_url:
-d '{"model": "bytedance/seedance-2-0-image-to-video", "prompt": "slow push-in as the waves roll",
"image_url": "https://example.com/first-frame.png", "duration_seconds": 5}'
Model yang memadukan dua gambar juga membutuhkan end_image_url (bingkai terakhir). Model image-to-video atau reference-to-video yang tidak dapat membuat video dari teks saja akan ditolak dengan 400 image_required jika permintaan tidak memiliki gambar, sebelum biaya apa pun dikenakan. Model reference-to-video mengambil gambar di input_images:
-d '{"model": "pixverse/pixverse-c1-reference-to-video", "prompt": "the cat walks across the room",
"input_images": [{"url": "https://example.com/cat.png", "role": "reference"}],
"aspect_ratio": "16:9", "duration_seconds": 5}'
Bidang lain, jika model menawarkannya: resolution (480p, 720p, 1080p…), aspect_ratio (16:9, 9:16, 1:1…) dan audio (true / false; model tanpa pengaturan suara tidak akan dikirimi ini dan akan membuat klip seperti biasa). Model reference-to-video membutuhkan bentuk, jadi ketika Anda tidak menyertakan aspect_ratio, itu akan dikirim sebagai 16:9 (atau bentuk pertama model jika tidak membuat 16:9); schema model menunjukkan default tersebut. Pilihan setiap model tercantum oleh GET /v1/models/<model id> (lihat Opsi setiap model).
Setiap model hanya membuat panjang klip, resolusi, dan bentuk tertentu. Permintaan untuk yang tidak dibuatnya akan ditolak dengan pesan yang mencantumkan yang dibuatnya, sebelum biaya apa pun dikenakan.
HTTP 202:
{
"id": "6f1c…",
"object": "media.job",
"kind": "video",
"status": "queued",
"model": "fal-ai/vidu/q3/text-to-video/turbo",
"estimated_cost_usd": 0.32725,
"estimated_cost_usdc": "327250",
"max_cost_usd": 0.359975,
"max_cost_usdc": "359975",
"poll_url": "/v1/video/generations/6f1c…",
"cancel_url": "/v1/video/generations/6f1c…"
}
model adalah model yang mengambil pekerjaan (cadangan dari models ketika yang pertama tidak bisa). Biaya yang berakhir di _usdc adalah dalam sepersejuta dolar (327250 = $0.33). estimated_cost_usd adalah harga terdaftar dari apa yang Anda minta: angka yang sama validate dan POST /v1/quote menjawab sebagai cost_usd. Ini adalah harga model sekarang dikalikan detik (pada resolusi yang diminta), gambar, atau unit lainnya. Pekerjaan ditagih sesuai dengan yang dibebankan penyedia, yang bisa lebih atau kurang. max_cost_usd adalah jumlah yang ditahan dari saldo Anda untuk pekerjaan tersebut: angka yang sama saat berjalan dan setelah selesai, dan jumlah maksimum yang akan ditagihkan untuk pekerjaan tersebut. Model video yang harganya per second ditagih per detik klip; yang harganya per job biayanya sebesar itu per video.
2. Periksa setiap 5–10 detik:
curl -H "Authorization: Bearer $UBERLLM_API_KEY" \
https://api.uberllm.dev/v1/video/generations/<job id>
HTTP 202 saat pekerjaan berjalan, HTTP 200 setelah selesai:
{
"id": "6f1c…",
"status": "succeeded",
"results": [{ "artifact_index": 0, "url": "https://api.uberllm.dev/v1/media/artifacts/6f1c…/0",
"content_type": "video/mp4", "duration_seconds": 5 }],
"usage": { "cost_usdc": "40000", "cost_usd": 0.04 }
}
Model melaporkan biaya pasti pekerjaan sedikit setelah file siap, biasanya dalam 30 detik. Sampai saat itu, pekerjaan succeeded menunjukkan "usage": { "cost_usd": null, "cost_pending": true }; tanyakan lagi beberapa detik kemudian. Jika biaya belum muncul dalam 30 menit, pekerjaan akan ditagih dengan harga terdaftar (estimated_cost_usd) dan usage.cost_note menyatakan demikian.
3. Unduh
curl -L -o video.mp4 -H "Authorization: Bearer $UBERLLM_API_KEY" \
https://api.uberllm.dev/v1/media/artifacts/<job id>/0
Minta untuk menghentikan pekerjaan yang tidak lagi Anda butuhkan: DELETE /v1/video/generations/<job id>. Kami meminta penyedia untuk menghentikannya; pekerjaan yang sudah dibuat akan ditagih seperti biasa, dan yang dihentikan akan berakhir canceled dan tidak dikenakan biaya.
Model video Fal
Model-model yang ID-nya dimulai dengan fal-ai/ berjalan di Fal, di bawah harga Fal sendiri:
Anda membayar harga Fal dikurangi diskon dari penjual Fal termurah di
marketplace saat ini (diskon 15% untuk 30 Oktober 2026; diskon 25% kapan pun penjual tersebut
menjual). Harga ditentukan oleh apa yang Anda minta — detik × tarif untuk
resolusi, dan apakah klip memiliki suara — jadi biaya pekerjaan diketahui saat
dimulai dan estimated_cost_usd adalah persis apa yang ditagihkan. Pekerjaan yang gagal
tidak dikenakan biaya. Menghentikan pekerjaan adalah upaya terbaik: jika Fal sudah membuat klipnya,
itu akan ditagihkan.
curl https://api.uberllm.dev/v1/video/generations \
-H "Authorization: Bearer $UBERLLM_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "fal-ai/wan/v2.7/text-to-video", "prompt": "a woman twirls at a garden party at night",
"duration_seconds": 15, "resolution": "720p", "aspect_ratio": "9:16"}'
Harga Fal sendiri per detik (milik Anda adalah ini dikurangi diskon langsung;
halaman setiap model, GET /v1/models dan POST /v1/quote menunjukkan harga persisnya sekarang):
| Model | Durasi (dtk) | Harga Fal per detik, mulai dari |
|---|---|---|
fal-ai/wan/v2.7/text-to-video, …/image-to-video |
2–15 | 720p $0.10 · 1080p $0.15 |
fal-ai/kling-video/v3/standard/text-to-video, …/image-to-video |
3–15 | $0.084 · dengan suara $0.126 |
fal-ai/kling-video/v3/pro/text-to-video, …/image-to-video |
3–15 | $0.112 · dengan suara $0.168 |
fal-ai/kling-video/o3/standard/text-to-video, …/image-to-video |
3–15 | $0.084 · dengan suara $0.112 |
fal-ai/kling-video/v2.6/pro/text-to-video, …/image-to-video |
5, 10 | $0.07 · dengan suara $0.14 |
fal-ai/veo3.1/fast, fal-ai/veo3.1/fast/image-to-video |
4, 6, 8 | 720p/1080p $0.10 · dengan suara $0.15 · 4k $0.30 |
fal-ai/veo3.1, fal-ai/veo3.1/image-to-video |
4, 6, 8 | 720p/1080p $0.20 · dengan suara $0.40 · 4k $0.40 |
fal-ai/veo3.1/lite |
4, 6, 8 | 720p $0.03 · dengan suara $0.05 · 1080p $0.05 |
fal-ai/ltx-2.3/text-to-video/fast, …/image-to-video/fast |
6, 8, 10 | 1080p $0.06 · 1440p $0.12 · 2160p $0.24 |
fal-ai/ltx-2.3/text-to-video |
6, 8, 10 | 1080p $0.08 |
fal-ai/minimax/hailuo-02/standard/text-to-video, …/image-to-video |
6, 10 | 768P $0.045 · 512P (gambar) $0.017 |
fal-ai/vidu/q3/text-to-video/turbo, …/image-to-video/turbo |
1–16 | 360p/540p $0.035 · 720p/1080p $0.077 |
fal-ai/vidu/q3/text-to-video, …/image-to-video |
1–16 | 360p/540p $0.07 · 720p/1080p $0.154 |
Setiap harga adalah harga Fal sendiri; diskon akan diterapkan saat pekerjaan dimulai. Jika
penjual termurah menolak pekerjaan, penjual yang lebih mahal akan mengerjakannya dan pekerjaan
akan ditagihkan dengan harga penjual tersebut, tidak pernah lebih dari estimated_cost_usd pada balasan.
Beberapa model biaya kami lebih rendah dari yang tertera pada diskon penjual. Setiap 6 jam kami
membandingkan apa yang marketplace tagihkan kepada kami untuk setiap model selama 7 hari
terakhir dengan harga Fal untuk pekerjaan yang sama. Model dengan setidaknya 20 pekerjaan dalam waktu
tersebut kemudian dihargai berdasarkan bagian riil tersebut ditambah 5%, jika itu lebih rendah. Halaman model,
/v1/models dan tagihan semuanya menggunakan harga yang sama. Jika angka tersebut lebih dari
3 hari, diskon penjual berlaku lagi.
Bidang-bidang ini milik kami: duration_seconds, resolution, aspect_ratio, audio
dan image_url (atau input_images). Ejaan Fal sendiri (duration,
generate_audio, start_image_url) juga berfungsi. Kling, Veo, dan Kling 2.6 menambahkan suara
kecuali Anda mengirim "audio": false.
Status Pekerjaan
status |
HTTP | Arti |
|---|---|---|
queued |
202 | Diterima, menunggu model untuk memulainya |
running |
202 | Sedang dibuat; progress berubah dari 0 menjadi 1 saat model melaporkannya |
succeeded |
200 | Selesai; unduh results[].url |
failed |
200 | Tidak dibuat. error.message menjelaskan alasannya; error.retryable menyatakan apakah mencoba lagi bisa berhasil |
canceled |
200 | Dihentikan sebelum dibuat |
expired |
200 | Tidak selesai tepat waktu |
Keenam ini adalah satu-satunya nilai. failed, canceled, dan expired tidak dikenakan biaya. Sebuah DELETE adalah permintaan untuk berhenti, bukan janji: pekerjaan yang tetap diselesaikan oleh penyedia berakhir succeeded dan ditagih.
Momen sibuk akan dicoba ulang untuk Anda. Ketika tidak ada penyedia yang bebas untuk membuat video Anda, atau salah satu terlalu sibuk saat ini, UberLLM memulai pekerjaan lagi dengan sendirinya, hingga dua kali lagi dalam 10 menit. Ini mempertahankan id pekerjaan yang sama dan biaya maksimum yang sama. Pekerjaan hanya memakan waktu sedikit lebih lama. Anda melihat failed hanya ketika setiap percobaan gagal, dan pekerjaan yang gagal tidak dikenakan biaya.
Menunggu. Kirim callback_url dan kami akan memberitahu Anda kapan pekerjaan berakhir (lihat Callbacks), atau tanyakan URL polling setiap 5–10 detik. Sebagian besar video membutuhkan waktu 1–5 menit; beberapa pekerjaan yang panjang atau 4K membutuhkan waktu lebih lama. Anda tidak perlu terus-menerus menanyakan tagihan untuk diselesaikan: pekerjaan yang tidak diperiksa siapa pun tetap diselesaikan dan ditagih (atau dikembalikan dananya) oleh UberLLM, dan ditampilkan di Dashboard → Activity.
Panggilan Balik
Tambahkan callback_url ke pekerjaan video atau musik: sebuah tautan https:// di host publik.
Ketika pekerjaan telah selesai sepenuhnya, UberLLM mengirimkan POST ke sana dengan JSON
yang dikembalikan oleh GET pada pekerjaan tersebut.
{ "model": "kling/kling-o3", "prompt": "a red ball bouncing", "duration_seconds": 5,
"callback_url": "https://your-app.example/uberllm/jobs" }
- Kapan. Sekali, ketika pekerjaan telah selesai dan tagihannya final:
succeededdenganusage.cost_usddiatur (tidak pernahcost_pending), ataufailed,canceledatauexpired(biaya 0). Ini tidak dikirim lagi ketika biaya tiba, karena hanya dikirim setelahnya. Denganoutput_upload_urljuga, panggilan balik datang setelah unggahan selesai, jadioutput_upload.statussudahdeliveredataufailed. - Header.
Content-Type: application/json,UberLLM-Event: job.succeeded(ataujob.failed,job.canceled,job.expired),UberLLM-Event-Id: <job id>:<status>danUberLLM-Signature: t=<unix seconds>,v1=<hex>. - Percobaan Ulang. Jawab dengan 2xx apa pun dalam 15 detik. Jawaban lain, atau tidak ada jawaban, akan dicoba lagi setelah 30 detik, 2 menit, 10 menit, 30 menit dan 2 jam, kemudian dihentikan. Anda masih dapat melakukan polling pekerjaan kapan saja.
- Pengulangan. Sebuah pesan dapat tiba lebih dari sekali (misalnya ketika jawaban Anda hilang). ID acara tetap sama, jadi abaikan yang sudah Anda tangani.
- Status. Pekerjaan menunjukkan bagaimana hasilnya:
"callback": { "status": "delivered", "attempts": 1, "http_status": 200, "delivered_at": 1792540990 }.statusadalahpending,deliveredataufailed(denganerrordalam kata-kata biasa). - Tautan harus
https://di host publik, tanpa nama pengguna atau kata sandi di dalamnya. Ini tidak pernah ditampilkan kembali dan dihapus setelah panggilan balik berakhir.webhook_urldibaca sebagai bidang yang sama. Gambar dan ucapan tidak menerimanya: mereka kembali dalam jawaban itu sendiri.
Periksa tanda tangan
Setiap pesan ditandatangani dengan rahasia webhook akun Anda. Temukan di Dashboard → API keys → Webhook signing secret; itu dibuat pertama kali Anda membukanya, dan Ganti rahasia menukarnya sekaligus.
v1 adalah hex HMAC-SHA256 dari <t>.<raw body>, dikunci dengan seluruh rahasia
(whsec_…). Hitung itu di atas byte mentah yang Anda terima (sebelum mengurai JSON),
bandingkan dalam waktu konstan, dan tolak t yang lebih dari 5 menit.
Node.js (Express):
import crypto from "node:crypto";
import express from "express";
const app = express();
const SECRET = process.env.UBERLLM_WEBHOOK_SECRET; // whsec_…
app.post("/uberllm/jobs", express.raw({ type: "application/json" }), (req, res) => {
const header = req.get("UberLLM-Signature") || "";
const parts = Object.fromEntries(header.split(",").map((p) => p.split("=", 2)));
const expected = crypto.createHmac("sha256", SECRET)
.update(`${parts.t}.`).update(req.body).digest("hex");
const ok = parts.v1 && parts.v1.length === expected.length &&
crypto.timingSafeEqual(Buffer.from(parts.v1), Buffer.from(expected)) &&
Math.abs(Date.now() / 1000 - Number(parts.t)) < 300;
if (!ok) return res.status(400).send("bad signature");
const job = JSON.parse(req.body);
// Drop a repeat: req.get("UberLLM-Event-Id") is the same each time.
console.log(job.id, job.status, job.usage?.cost_usd);
res.sendStatus(204);
});
Python (Flask):
import hashlib, hmac, os, time
from flask import Flask, request, abort
app = Flask(__name__)
SECRET = os.environ["UBERLLM_WEBHOOK_SECRET"].encode() # whsec_…
@app.post("/uberllm/jobs")
def uberllm_job():
raw = request.get_data() # the raw bytes, before any JSON parsing
parts = dict(p.split("=", 1) for p in request.headers.get("UberLLM-Signature", "").split(",") if "=" in p)
expected = hmac.new(SECRET, parts.get("t", "").encode() + b"." + raw, hashlib.sha256).hexdigest()
if not hmac.compare_digest(parts.get("v1", ""), expected) or abs(time.time() - int(parts.get("t", "0"))) > 300:
abort(400)
job = request.get_json()
# Drop a repeat: request.headers["UberLLM-Event-Id"] is the same each time.
print(job["id"], job["status"], job.get("usage", {}).get("cost_usd"))
return "", 204
Peringatan ke webhook
Email peringatan juga dapat dikirim ke webhook: atur tautan di bawah
Dashboard → Credits → For developers: also send alerts to a webhook,
atau PUT /api/v1/billing/alerts {"alerts_webhook_url": "https://…"} (null mematikannya).
Pesan-pesan ditandatangani, dicoba ulang, dan diidentifikasi dengan cara yang sama seperti panggilan balik.
Isinya adalah:
{ "id": "evt_…", "object": "event", "type": "balance.low", "created": 1792540990,
"data": { "balance_usd": 4.2, "threshold_usd": 5, "message": "Your balance is $4.20, below the $5.00 you set. Requests stop once it runs out.",
"add_credits_url": "https://uberllm.dev/dashboard/credits" } }
balance.low: saldo jatuh di bawah jumlah yang Anda tetapkan untuk email saldo rendah. Dikirim sekali setiap kali jatuh di bawah; tidak ada yang dikirim sampai Anda menetapkan jumlah.hold.not_released: uang yang disisihkan untuk pekerjaan masih ditahan lebih dari 15 menit setelah pekerjaan berakhir.data.jobsmencantumkannya (id,kind,model,ended_at,held_usd) dandata.held_usdadalah totalnya. Uang itu masih milik Anda dan tim kami telah diberitahu.
Berapa lama file disimpan
Unduh hasilnya segera setelah dibuat:
- File video dan musik disimpan selama sekitar 3 jam setelah pekerjaan selesai.
- Tautan gambar ke
/v1/media/artifacts/…disimpan selama sekitar 15 menit; tautan gambar ke/v1/files/…selama 24 jam. Minta"response_format": "b64_json"untuk mendapatkan gambar di dalam jawaban dan menyimpannya sendiri. - Gambar yang Anda unggah ke
/v1/filesdisimpan selama 24 jam.
Setelah itu, unduhan akan menjawab 404 artifact_expired.
Kirim hasil ke penyimpanan Anda sendiri
Tambahkan output_upload_url ke pekerjaan video atau musik: tautan https:// yang menerima HTTP PUT, seperti tautan unggah S3, R2 yang sudah ditandatangani atau Google Cloud Storage. Ketika pekerjaan berhasil, UberLLM mengunggah file ke sana dengan tipe kontennya. Untuk pekerjaan yang membuat beberapa file, kirim output_upload_urls, satu tautan per file secara berurutan (maksimal 4).
{ "model": "kling/kling-o3", "prompt": "a red ball bouncing", "duration_seconds": 5,
"output_upload_url": "https://my-bucket.s3.amazonaws.com/ball.mp4?X-Amz-Signature=…" }
Status pekerjaan kemudian memiliki output_upload:
"output_upload": { "status": "delivered", "attempts": 1, "delivered_at": 1792540990,
"files": [{ "artifact_index": 0, "http_status": 200, "bytes": 5242880 }] }
statusadalahpendingsampai unggahan selesai, kemudiandeliveredataufailed(denganerrordalam kata-kata biasa).- Unggahan yang gagal dicoba lagi setelah 30 detik, 2, 10 dan 30 menit, kemudian ditandai
failed; file masih dapat diunduh dariresults[].urlselama disimpan. Buat tautan berlaku setidaknya selama satu jam. - Tautan harus
https://di host publik, tanpa nama pengguna atau kata sandi di dalamnya. Tautan tidak pernah ditampilkan kembali, dan dihapus setelah unggahan selesai. - Gambar tidak menerimanya: gambar kembali dalam jawaban itu sendiri.
Musik
Tiga langkah yang sama di /v1/music/generations. curl -OJ menyimpan treknya dengan nama file yang kita kirimkan.
Ucapan
Teks masuk, file audio keluar sebagai jawaban.
curl https://api.uberllm.dev/v1/audio/speech \
-H "Authorization: Bearer $UBERLLM_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "x-ai/tts-xai-v1", "input": "Hello from UberLLM."}' \
-o speech.mp3
Anda juga bisa mengirim voice, response_format (misalnya mp3 atau wav) dan speed.
Setiap model memiliki suaranya sendiri (GET /v1/models/{id} mencantumkannya). Dengan
best-price:speech atau fastest:speech Anda tidak tahu sebelumnya model mana yang digunakan,
jadi suara disesuaikan dengannya: suara yang dimiliki model dipertahankan, nama-nama OpenAI dipetakan ke
suara model yang cocok jika ada (alloy → af_alloy), dan suara lain apa pun, atau
tidak ada, akan mendapatkan suara pertama model. Saat Anda menyebutkan nama model, suara Anda dikirim apa adanya.
Ini ditagih per 1K karakter input yang dimulai. Jawabannya adalah file audio;
header X-UberLLM-Cost-USD menyatakan biayanya, dan X-Request-Id adalah ID permintaan
seperti yang tercantum di Aktivitas. "validate": true, max_cost, metadata, models dan
provider.max_price berfungsi seperti pada gambar (lihat Apa yang Anda bayar).
Ubah rekaman menjadi teks
Kirim rekaman sebagai formulir dengan file dan model:
curl https://api.uberllm.dev/v1/audio/transcriptions \
-H "Authorization: Bearer $UBERLLM_API_KEY" \
-F model=venice/whisper-large-v3 \
-F [email protected]
{ "text": "Hello from UberLLM.", "duration": 4.2,
"usage": { "type": "duration", "seconds": 5, "cost_usd": 0.00055, "max_cost_usd": 0.00726 } }
usage.cost_usd adalah biayanya (juga di header X-UberLLM-Cost-USD, satu-satunya
tempat untuk jawaban text, srt dan vtt). Kolom kami sendiri juga masuk dalam formulir, dan
tidak pernah dikirim ke model: -F max_cost=0.10, -F "metadata[project]=podcast",
-F validate=true.
Anda juga bisa mengirim language, prompt, temperature dan response_format: json
(standar), atau text, srt atau vtt untuk mendapatkan teks biasa kembali. Ini ditagih per menit
audio. File bisa berukuran hingga 40 MB. Formatnya (mp3, wav, ogg, flac, m4a/mp4,
webm, aac) dibaca dari rekaman itu sendiri, bukan nama filenya, jadi unggahan
bernama tmp123.out akan berfungsi.
Dengan OpenAI SDK
from openai import OpenAI
client = OpenAI(base_url="https://api.uberllm.dev/v1", api_key="<your UberLLM key>")
speech = client.audio.speech.create(model="x-ai/tts-xai-v1", voice="eve", input="Hello from UberLLM.")
speech.write_to_file("speech.mp3")
with open("speech.mp3", "rb") as f:
text = client.audio.transcriptions.create(model="venice/whisper-large-v3", file=f)
print(text.text)
Apa yang Anda bayar
- Harga dari apa yang dibuat: apa yang ditagihkan penyedia, tanpa biaya UberLLM. Jawaban gambar atau transkripsi dan pekerjaan yang selesai menanggungnya sebagai
usage.cost_usd(dolar AS); setiap jawaban yang menghasilkan sesuatu juga menanggungnya di header responsX-UberLLM-Cost-USD(untuk ucapan, header adalah satu-satunya tempat, karena jawabannya adalah file audio). Ini ditampilkan di Dashboard → Activity. Sisa penahanan akan dikembalikan. - Tidak ada biaya untuk pekerjaan yang
failed,canceledatauexpired, atau untuk permintaan gambar, ucapan, atau transkripsi yang gagal. - Penjual termurah yang membuat persis apa yang Anda minta. Banyak model gambar dan video memiliki lebih dari satu penjual; setiap permintaan akan dikirim ke yang termurah yang dapat membuatnya dengan pengaturan Anda, dan ke yang lain jika yang pertama tidak dapat menerimanya. Daftar model dan setiap halaman model menunjukkan harga di penjual termurah yang aktif saat ini.
- Lihat saldo Anda dan apa yang ditahan dengan
GET /v1/balance(di bawah).
Periksa harga sebelum Anda mengeluarkan biaya
Tambahkan "validate": true ke permintaan gambar, video, musik, atau ucapan apa pun (untuk transkripsi, kirim validate=true sebagai form field dengan rekaman). Permintaan diperiksa seolah-olah nyata (model, opsi, gambar sumber), tidak ada yang dibuat dan tidak ada yang ditagihkan, dan HTTP 200 menyatakan berapa biayanya pada harga yang tertera (cost_usd, harga yang ditampilkan di halaman model; Anda membayar apa yang ditagihkan penyedia, yang bisa berbeda) dan apa yang ditahan saat berjalan (max_cost_usd, jumlah maksimum yang ditagihkan):
{ "object": "quote", "model": "bytedance/seedance-2-0-image-to-video", "kind": "video",
"valid": true, "cost_usd": 0.2117, "max_cost_usd": 0.4235, "unit": "second", "units": 5, "duration_seconds": 5,
"note": "Nothing was charged. …" }
Jika penjual model membutuhkan pengaturan yang Anda lewatkan (model referensi-ke-video membutuhkan aspect_ratio), default yang dikirimkan akan ditampilkan pada skema model dan dalam kutipan sebagai defaults_applied, contohnya "defaults_applied": {"aspect_ratio": "16:9"}.
Permintaan yang akan ditolak, ditolak dengan cara yang sama, beserta alasannya.
Tahan harga selama 15 menit
POST /v1/quote mengambil body yang sama dengan permintaan gambar, video, musik, atau ucapan dan menjawab dengan biaya yang tertera (cost_usd), apa yang ditahan saat berjalan (max_cost_usd, jumlah maksimum yang ditagihkan) dan quote_id (untuk transkripsi, kirim model dan duration_seconds; transkripsi itu sendiri tidak memerlukan quote_id, gunakan max_cost untuk membatasinya):
curl https://api.uberllm.dev/v1/quote \
-H "Authorization: Bearer $UBERLLM_API_KEY" -H "Content-Type: application/json" \
-d '{"model": "kling/kling-o3", "prompt": "a red ball bouncing", "duration_seconds": 5}'
{ "object": "quote", "id": "6f1c…", "quote_id": "6f1c…", "model": "kling/kling-o3",
"kind": "video", "cost_usd": 0.225, "max_cost_usd": 0.495, "unit": "job", "units": 1,
"expires_at": 1792541700, "note": "Nothing was charged. …" }
Kirim permintaan yang sama dengan "quote_id": "6f1c…" dalam 15 menit dan akan ditagihkan sesuai yang ditagihkan penyedia, paling banyak max_cost_usd; jika apa yang harus ditahan saat dimulai melebihi max_cost_usd, itu akan dibatalkan tanpa biaya. Tidak ada yang ditagihkan atau ditahan untuk kutipan itu sendiri.
- Satu kutipan memulai satu permintaan. Menggunakannya lagi akan menjawab
409 quote_used; pekerjaan yang tidak pernah mencapai model akan mengembalikan kutipan. - Permintaan harus meminta hal yang sama: model yang sama dan pengaturan yang sama (prompt, ukuran, durasi klip, gambar sumber …). Hal lain akan ditolak dengan
400 quote_mismatch.max_cost,metadata, danoutput_upload_urlmungkin berbeda. - Setelah 15 menit, itu akan menjawab
400 quote_expired. Model chat ditagih per token dan tidak memiliki kutipan: batasi denganprovider.max_price.
Model fallback dan batas harga
"models": ["model-b", "model-c"] menamai model yang akan dicoba secara berurutan ketika yang pertama tidak dapat dilayani saat ini (no_available_provider) atau melebihi provider.max_price Anda. Penolakan lainnya akan segera dijawab. model dari jawaban menamai model yang membuatnya (jawaban ucapan adalah file audio itu sendiri: Activity menunjukkan modelnya). Permintaan dengan quote_id tidak memerlukan models, dan transkripsi juga tidak.
"provider": {"max_price": 0.05} adalah biaya maksimum satu unit (harga model unit: gambar, detik, megapixel, menit, 1K karakter, atau permintaan) dalam dolar AS. Model di atasnya akan ditolak dengan 400 max_price_exceeded, dan permintaan tidak akan pernah ditagih melebihi max_price kali unitnya. Opsi provider lainnya ditolak dengan 400 unsupported_routing_option, karena pilihan penjual untuk permintaan media tidak dapat diarahkan per permintaan.
"model": "best-price:image" (atau image-edit, text-to-video, image-to-video, music, speech, transcription) memilih model aktif termurah untuk pekerjaan tersebut; fastest: yang tercepat terukur. Lihat Model aliases.
Tags
"metadata": {"project": "spring-ads"} (hingga 16 nilai teks) disimpan bersama pekerjaan, dikembalikan pada statusnya, ditampilkan di Activity dan dalam ekspor CSV, dan tidak pernah dikirim ke model. Pada transkripsi, kirimkan sebagai form fields: -F "metadata[project]=spring-ads". Lihat Tags.
Tetapkan batas maksimum
Kirim "max_cost" (dolar AS, contohnya 0.50) dengan permintaan gambar, video, musik, atau ucapan apa pun (form field pada transkripsi). Jika biayanya bisa lebih dari itu, akan ditolak dengan 400 max_cost_too_low dan tidak ada yang ditagihkan. Untuk pekerjaan video atau musik, batas maksimum yang tepat ditetapkan saat pekerjaan dimulai; jika kemudian melebihi max_cost Anda, pekerjaan akan dibatalkan tanpa biaya. Dengan "validate": true, kutipan menambahkan within_max_cost.
Coba lagi tanpa membayar dua kali
Kirim header Idempotency-Key (string unik apa pun hingga 255 karakter, seperti UUID) saat Anda memulai pekerjaan video atau musik. Jika koneksi Anda terputus dan Anda mengirim permintaan yang sama lagi dengan key yang sama dalam 24 jam, Anda akan mendapatkan pekerjaan yang sama kembali alih-alih yang kedua. Key yang sama dengan permintaan yang berbeda akan ditolak dengan 409 idempotency_key_reused. Permintaan gambar, ucapan, dan transkripsi tidak memerlukan key: yang gagal tidak ditagihkan, jadi kirimkan lagi.
Saldo Anda
curl -H "Authorization: Bearer $UBERLLM_API_KEY" https://api.uberllm.dev/v1/balance
{ "balance_usd": 12.40, "held_usd": 0.35, "available_usd": 12.05 }
held_usd disisihkan untuk permintaan yang masih berjalan; akan kembali (dikurangi biaya sebenarnya) setelah selesai. available_usd adalah yang dapat digunakan permintaan baru.
Opsi setiap model
GET /v1/models?type=image (atau video, music, speech, transcription,
audio untuk keduanya, chat, all; beberapa digabungkan dengan koma; tanpa
type daftar tersebut hanya berisi model chat) mencantumkan model-model yang bisa Anda panggil sekarang, masing-masing dengan type-nya,
endpoints untuk mengirimkannya, dan pricing-nya. GET /v1/models/<model id> memberikan satu
model, dan untuk model media, sebuah objek parameters: Skema JSON dari badan permintaan
dengan panjang klip, resolusi, rasio aspek, dan ukuran yang diterimanya, serta
gambar sumber yang dibutuhkannya.
curl -H "Authorization: Bearer $UBERLLM_API_KEY" \
https://api.uberllm.dev/v1/models/pixverse/pixverse-c1-reference-to-video
pricing memiliki usd (harga tertinggi satu unit saat ini) dan list_usd (
harga sendiri dari pembuat model); model chat memiliki input_usd, output_usd, dan
harga list_ mereka per 1M tokens.
Kesalahan
| HTTP | kode | arti |
|---|---|---|
| 400 | wrong_endpoint |
misalnya model gambar dikirim ke /v1/video/generations, model chat dikirim ke rute gambar, atau model ucapan dikirim ke /v1/audio/transcriptions; pesan menyebutkan jalur yang benar. Tidak ada biaya yang dikenakan, dan Aktivitas mencatatnya sebagai ditolak |
| 400 | invalid_request |
permintaan salah (pesan menyebutkan alasannya, misalnya durasi yang tidak ditawarkan model atau gambar sumber yang hilang) |
| 400 | image_required |
edit, atau model gambar-ke-video atau referensi-ke-video, tanpa gambar sumber |
| 400 | max_cost_too_low |
biayanya bisa lebih dari max_cost Anda; tidak ada biaya yang dikenakan |
| 409 | idempotency_key_reused |
Idempotency-Key itu digunakan untuk permintaan yang berbeda |
| 400 | quote_mismatch / quote_expired |
permintaan bukan yang dikutip, atau kutipan sudah lebih dari 15 menit |
| 404 | quote_not_found |
tidak ada kutipan seperti itu di akun Anda |
| 409 | quote_used |
kutipan itu sudah memulai permintaan |
| 400 | max_price_exceeded |
biaya model per unit lebih mahal dari provider.max_price Anda |
| 400 | unsupported_routing_option |
opsi provider selain max_price |
| 404 | file_not_found |
tidak ada file terunggah seperti itu di akun Anda, atau sudah kedaluwarsa |
| 413 | file_too_large |
unggah lebih dari 10 MB |
| 429 | too_many_files |
500 unggahan sudah disimpan; hapus beberapa atau tunggu hingga kedaluwarsa |
| 503 | files_unavailable |
unggahan tidak tersedia saat ini |
| 413 | request_too_large |
permintaan melebihi batas ukuran (40 MB); kirim gambar sebagai tautan https:// dan bagi rekaman panjang |
| 402 | insufficient_credits |
saldo Anda tidak dapat menutupi biaya maksimum pekerjaan; pesan menyebutkan berapa yang dibutuhkan |
| 404 | model_not_found / not_found |
tidak ada model seperti itu, atau tidak ada pekerjaan seperti itu di akun Anda |
| 404 | artifact_expired |
file tidak lagi disimpan (lihat di atas) |
| 429 | rate_limited |
tunggu beberapa detik di Retry-After (beberapa detik jika tidak ada), lalu coba lagi; X-RateLimit-Remaining menunjukkan berapa banyak permintaan yang tersisa menit ini |
| 503 | no_available_provider |
tidak ada penjual yang bisa membuatnya saat ini; UberLLM sudah mencoba yang lain. Pesan menyebutkan model sejenis yang berfungsi sekarang |