Dokumentasi
Panduan YupiAI Gateway
Hubungkan aplikasi Anda dengan Quick Setup atau panduan manual per aplikasi, buat dan edit gambar atau video lewat API di bagian Gambar & video, ubah teks menjadi suara atau rekaman menjadi teks di bagian Audio, lalu baca saldo, pemakaian, dan biaya per request di bagian Usage & billing. Konfigurasi aplikasi terakhir diperiksa 15 Agustus 2026; referensi Usage & billing 13 September 2026; referensi gambar dan video 24 September 2026; referensi audio 25 September 2026.
01. Pengenalan
Dasar API YupiAI
YupiAI menyediakan satu gateway untuk aplikasi yang memakai API OpenAI, OpenAI Responses, atau Anthropic Messages. Gunakan alamat endpoint yang sesuai dengan aplikasi.
API key baru diawali yupi_ai_. Key lama yang diawali rk_live_ tetap berlaku di semua endpoint tanpa perubahan konfigurasi.
Key yang sama membaca saldo (GET /v1/credits), informasi key (GET /v1/key), dan statistik pemakaian (GET /v1/usage). Setiap response inference menyertakan jumlah token dan kredit yang ditagih. Lihat Quick start usage & billing.
Endpoint Anthropic tidak memakai /v1
Uji koneksi
Request berikut memeriksa API key, saldo, endpoint, dan Model ID sekaligus.
curl https://gateway.euphy.cloud/v1/chat/completions \
-H "Authorization: Bearer yupi_ai_xxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"model": "yupiai-glm5.2",
"messages": [{ "role": "user", "content": "Balas: koneksi berhasil" }]
}'02. Quick Setup
Tutorial Quick Setup
Installer memandu Anda melalui pengaturan di terminal. Setiap perubahan tetap memerlukan pilihan atau persetujuan Anda.
macOS atau Linux
curl -fsSL https://gateway.euphy.cloud/install.sh | bashWindows
irm https://gateway.euphy.cloud/install.ps1 | iexTempel API key lengkap
Pilih aplikasi
Pilih model
Baca ringkasan hasil
Tinjau skrip sebelum menjalankan
Unduh skrip, baca isinya dengan editor teks, lalu jalankan file lokal.
curl -fsSL https://gateway.euphy.cloud/install.sh -o /tmp/yupiai-install.sh
less /tmp/yupiai-install.sh
bash /tmp/yupiai-install.shInvoke-WebRequest https://gateway.euphy.cloud/install.ps1 -OutFile "$env:TEMP\yupiai-install.ps1"
notepad "$env:TEMP\yupiai-install.ps1"
& "$env:TEMP\yupiai-install.ps1"Uninstall dan reset
Uninstaller melepas YupiAI dari aplikasi Anda atau mengembalikan konfigurasi ke keadaan semula sebelum setup ulang, misalnya setelah mengganti API key.
curl -fsSL https://gateway.euphy.cloud/uninstall.sh | bashirm https://gateway.euphy.cloud/uninstall.ps1 | iexPilih tingkat pembersihan
Pilih aplikasi
Konfirmasi
Buka terminal baru
Uninstaller hanya membuang entri YupiAI di konfigurasi tiap aplikasi dan variabel environment yang ditulis installer. Aplikasi seperti Claude Code, Codex, dan Continue tetap terpasang beserta pengaturan Anda.
Sebelum menulis file konfigurasi, uninstaller menyalinnya ke <file>.bak-YYYYmmdd-HHMMSS di folder yang sama. Untuk memulihkan, salin kembali file itu ke nama aslinya. Pengecualiannya auth.json di OpenCode dan Kilo Code serta kilo.db di Kilo Code. File tersebut tidak disalin agar API key YupiAI tidak tertinggal di backup; yang dihapus hanya entri YupiAI, key provider lain tetap ada.
Untuk melihat perubahan tanpa menerapkannya, jalankan mode dry-run:
curl -fsSL https://gateway.euphy.cloud/uninstall.sh -o /tmp/yupiai-uninstall.sh
bash /tmp/yupiai-uninstall.sh --all --dry-runInvoke-WebRequest https://gateway.euphy.cloud/uninstall.ps1 -OutFile "$env:TEMP\yupiai-uninstall.ps1"
& "$env:TEMP\yupiai-uninstall.ps1" -All -DryRun03. Model
Model dan Model ID
Katalog model dan tarifnya ada di halaman tersendiri, satu lembar data per model. Salin Model ID sesuai yang ditampilkan di sana.
Setiap lembar data memuat tarif terdaftar per kelas token, tarif efektif per beban kerja, batas akses per paket, dan potongan konfigurasi untuk tiap aplikasi. Model gambar dan video ada di tab Gambar dan Video pada katalog yang sama, dengan tarif per gambar, per megapiksel, atau per detik; cara memanggilnya ada di bagian Gambar & video.
Buka katalog model04. Integrasi
Codex & Claude Code
Codex memakai Responses API, sedangkan Claude Code memakai Anthropic Messages. Ikuti konfigurasi yang sesuai.
Codex CLI, IDE extension, dan desktop
Daftarkan YupiAI di config.toml, lalu simpan API key sebagai environment variable.
Referensi: Referensi konfigurasi Codex
Edit file ~/.codex/config.toml pada macOS/Linux atau %USERPROFILE%\.codex\config.toml pada Windows.
model = "yupiai-glm5.2"
model_provider = "yupiai"
[model_providers.yupiai]
name = "YupiAI Gateway"
base_url = "https://gateway.euphy.cloud/v1"
env_key = "YUPIAI_API_KEY"
env_key_instructions = "Masukkan API key YupiAI yang diawali yupi_ai_"
requires_openai_auth = false
supports_websockets = false
wire_api = "responses"export YUPIAI_API_KEY="yupi_ai_xxxxxxxxxxxxxxxx"
codex[Environment]::SetEnvironmentVariable("YUPIAI_API_KEY", "yupi_ai_xxxxxxxxxxxxxxxx", "User")
# Tutup dan buka kembali terminal, lalu jalankan:
codexClaude Code CLI & extension
Arahkan Anthropic Messages ke host gateway YupiAI.
Referensi: Panduan LLM gateway Claude Code
Edit ~/.claude/settings.json dan gabungkan nilai berikut ke object yang sudah ada.
{
"env": {
"ANTHROPIC_BASE_URL": "https://gateway.euphy.cloud",
"ANTHROPIC_AUTH_TOKEN": "yupi_ai_xxxxxxxxxxxxxxxx",
"ANTHROPIC_MODEL": "yupiai-glm5.2",
"ANTHROPIC_CUSTOM_MODEL_OPTION": "yupiai-glm5.2",
"ANTHROPIC_CUSTOM_MODEL_OPTION_NAME": "YupiAI yupiai-glm5.2",
"ANTHROPIC_DEFAULT_SONNET_MODEL": "yupiai-glm5.2",
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "yupiai-glm5.2",
"ENABLE_TOOL_SEARCH": "false"
}
}Jangan gunakan format OpenAI di Claude Code
05. Integrasi
Cline, Roo Code & Kilo Code
Ketiga aplikasi mendukung provider OpenAI-compatible. Gunakan Base URL yang berakhir dengan /v1 dan Model ID dari katalog model.
Cline
Pilih OpenAI Compatible dari halaman provider, lalu verifikasi koneksi.
Referensi: Panduan OpenAI Compatible Cline
Buka Cline → Settings → API Provider. Isi nilai di atas, biarkan Azure Identity nonaktif, lalu klik Verify.
Roo Code
Buat API Configuration Profile dengan provider OpenAI Compatible.
Referensi: Panduan OpenAI Compatible Roo Code
Buka pengaturan provider
Pilih OpenAI Compatible
Masukkan Model ID
Tool calling wajib
Kilo Code CLI
Daftarkan provider custom di konfigurasi global yang dipercaya, bukan di file proyek.
Referensi: Dokumentasi konfigurasi Kilo CLI
Edit ~/.config/kilo/kilo.jsonc. Referensi environment variable hanya diproses dari konfigurasi global yang dipercaya. Simpan API key ke YUPIAI_API_KEY di shell yang menjalankan Kilo; tanpa variabel itu, Kilo mengirim request tanpa API key.
{
"$schema": "https://app.kilo.ai/config.json",
"model": "yupiai/yupiai-glm5.2",
"provider": {
"yupiai": {
"npm": "@ai-sdk/openai-compatible",
"name": "YupiAI Gateway",
"options": {
"apiKey": "{env:YUPIAI_API_KEY}",
"baseURL": "https://gateway.euphy.cloud/v1"
},
"models": {
"yupiai-glm5.2": {
"name": "YupiAI yupiai-glm5.2",
"tool_call": true
}
}
}
}
}06. Integrasi
Agent lokal
Gunakan format konfigurasi resmi setiap aplikasi. Mulai dari satu model, lalu uji koneksi sebelum menambahkan model lain.
Continue
Tambahkan model provider OpenAI ke config.yaml schema v1.
Referensi: Referensi config.yaml Continue
name: YupiAI
version: 1.0.0
schema: v1
models:
- name: YupiAI yupiai-glm5.2
provider: openai
model: yupiai-glm5.2
apiBase: https://gateway.euphy.cloud/v1
apiKey: yupi_ai_xxxxxxxxxxxxxxxx
roles:
- chat
- edit
- apply
capabilities:
- tool_useSimpan file, lalu gunakan pemilih model Continue untuk memilih nama YupiAI yang baru ditambahkan.
OpenClaw
Tambahkan provider melalui models.providers, lalu pilih model dengan format provider/model.
Referensi: Referensi model provider OpenClaw
Simpan API key ke environment variable, lalu gabungkan blok berikut ke ~/.openclaw/openclaw.json.
{
models: {
mode: "merge",
providers: {
yupiai: {
baseUrl: "https://gateway.euphy.cloud/v1",
apiKey: "${YUPIAI_API_KEY}",
api: "openai-completions",
models: [{ id: "yupiai-glm5.2", name: "YupiAI yupiai-glm5.2" }]
}
}
},
agents: {
defaults: {
model: { primary: "yupiai/yupiai-glm5.2" },
models: { "yupiai/yupiai-glm5.2": {} }
}
}
}openclaw config validate
openclaw models set yupiai/yupiai-glm5.2
openclaw models listHermes Agent
Gunakan provider custom OpenAI-compatible.
Referensi: Dokumentasi provider Hermes Agent
Cara paling aman adalah menjalankan hermes model, pilih Custom Endpoint, lalu isi Base URL, key, dan model. Konfigurasi file ekuivalennya:
model:
default: "yupiai-glm5.2"
provider: "custom"
base_url: "https://gateway.euphy.cloud/v1"
api_key: "yupi_ai_xxxxxxxxxxxxxxxx"Batas context Hermes
Goose
Buat custom provider. Nilai base_url harus berupa endpoint chat/completions lengkap.
Referensi: Panduan custom provider Goose
Buat file yupiai.json di folder ~/.config/goose/custom_providers/. Di Windows gunakan %APPDATA%\Block\goose\config\custom_providers\.
{
"name": "yupiai",
"engine": "openai",
"display_name": "YupiAI Gateway",
"description": "YupiAI OpenAI-compatible gateway",
"api_key_env": "YUPIAI_API_KEY",
"base_url": "https://gateway.euphy.cloud/v1/chat/completions",
"models": [{ "name": "yupiai-glm5.2" }],
"supports_streaming": true,
"requires_auth": true
}export YUPIAI_API_KEY="yupi_ai_xxxxxxxxxxxxxxxx"
goose session start --provider yupiaiOpenHands
Isi provider, model, API key, dan Base URL melalui Settings.
Referensi: Dokumentasi LLM OpenHands
Buka Settings → LLM. Isi provider, model, dan key; buka Advanced untuk Base URL. OpenHands menggunakan LiteLLM, sehingga prefix openai/ pada model diperlukan untuk endpoint OpenAI-compatible.
07. Integrasi
Aplikasi chat
LibreChat dan Chatbox mendukung endpoint OpenAI-compatible. Perhatikan perbedaan antara API Host dan API Path.
LibreChat
Daftarkan YupiAI sebagai custom endpoint di librechat.yaml.
Referensi: Referensi custom endpoint LibreChat
YUPIAI_API_KEY=yupi_ai_xxxxxxxxxxxxxxxxversion: 1.3.5
cache: true
endpoints:
custom:
- name: "YupiAI"
apiKey: "${YUPIAI_API_KEY}"
baseURL: "https://gateway.euphy.cloud/v1"
models:
default: ["yupiai-glm5.2"]
fetch: true
titleConvo: true
titleModel: "yupiai-glm5.2"
modelDisplayLabel: "YupiAI"Untuk Docker, mount librechat.yaml ke container API, lalu restart LibreChat. Opsi fetch: true mengambil katalog model dari YupiAI.
Chatbox
Isi API Host dan API Path secara terpisah agar /v1 tidak ditulis dua kali.
Referensi: Panduan provider Chatbox
Buka Settings → Model Provider → Add. Setelah menyimpan provider dan model, klik Check untuk menguji koneksi.
08. Gambar
Buat gambar
Kirim prompt, terima gambar sebagai base64. Endpoint ini juga tersedia di /v1/images/generations, jalur yang dipakai OpenAI SDK images.generate(), sehingga SDK itu cukup diarahkan ke base URL YupiAI.
Model yang dipakai harus menghasilkan gambar. Cari Model ID di katalog model pada tab Gambar, atau lewat GET /v1/images/models.
curl -sS https://gateway.euphy.cloud/v1/images \
-H "Authorization: Bearer $YUPIAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "image-model-id",
"prompt": "kucing oranye tidur di ambang jendela, cahaya pagi",
"n": 1,
"aspect_ratio": "16:9"
}' > response.json
# Simpan gambar pertama
jq -r '.data[0].b64_json' response.json | base64 --decode > gambar.pngParameter
- modelstringwajib
- Model ID gambar.
- promptstringwajib
- Deskripsi gambar, maksimal 32.000 karakter.
- ninteger
- Jumlah gambar, 1 sampai batas model (maksimal 10). Penyedia bisa mengembalikan lebih sedikit; yang ditagih hanya gambar yang diterima.
- sizestring
- Tier ukuran (512, 1K, 2K, 4K) atau piksel WIDTHxHEIGHT, misalnya 1536x1024. width dan height diterima sebagai bentuk lain dari size.
- resolutionstring
- 512, 1K, 2K, atau 4K.
- aspect_ratiostring
- Rasio W:H, misalnya 16:9 atau 1:1.
- qualitystring
- auto, low, medium, high, xhigh, atau max, sesuai yang didukung model.
- output_formatstring
- png, jpeg, webp, atau svg.
- output_compressioninteger
- 0 sampai 100, untuk jpeg dan webp.
- backgroundstring
- auto, transparent, atau opaque. transparent membutuhkan output_format png atau webp.
- seedinteger
- Untuk hasil yang bisa diulang, bila model mendukungnya.
- input_referencesarray
- Gambar referensi untuk edit lewat JSON: [{ "type": "image_url", "image_url": { "url": "https://..." } }]. URL harus https atau http publik, atau data URL base64.
- streamboolean
- Kirim gambar parsial lewat Server-Sent Events, hanya pada model yang mendukung streaming. Model lain menjawab biasa.
- response_formatstring
- Hanya b64_json. Gateway tidak menyimpan gambar, jadi tidak ada URL.
- negative_prompt, guidance, stepsstring, number
- Diteruskan ke penyedia model yang menerimanya; ditolak bila tidak ada yang menerima.
- provider.optionsobject
- Parameter khusus penyedia: { "<provider_slug>": { ... } }.
Parameter yang diterima berbeda per model. Parameter yang tidak dikenal, atau tidak didukung model, ditolak dengan 400 yang menyebut namanya, sebelum kredit ditahan.
Response
{
"created": 1790000000,
"data": [
{
"b64_json": "iVBORw0KGgoAAAANSUhEUgAA",
"media_type": "image/png"
}
],
"usage": {
"prompt_tokens": 0,
"completion_tokens": 0,
"total_tokens": 0,
"cost": 40000,
"cost_details": {
"billing_source": "provider_cost",
"is_estimate": false,
"reserved_credits": 42000
},
"balance": {
"before": 10000000,
"after": 9960000,
"reserved_credits": 42000
}
}
}- data[].b64_jsonstring
- Gambar dalam base64.
- data[].media_typestring
- Format gambar, misalnya image/png.
- usage.costnumber
- Kredit yang ditagih untuk request ini.
- usage.cost_detailsobject
- billing_source, is_estimate, dan reserved_credits (kredit yang ditahan sebelum generasi).
- usage.balanceobject
- Saldo sebelum dan sesudah request.
- x-yupiai-request-idheader
- Id request, bisa dipakai di GET /v1/generation?id=.
Sumber tagihan
- provider_costnormal
- Tagihan adalah biaya generasi yang dilaporkan penyedia, dalam kredit.
- estimateestimasi
- Biaya dari penyedia tidak tersedia. Tagihan dihitung dari tarif model dan tidak pernah melebihi kredit yang ditahan. is_estimate bernilai true.
- not_billedgratis
- Generasi gagal atau ditolak dan tidak ditagih. Kredit yang ditahan kembali penuh.
- pendingsementara
- Tagihan final belum ditetapkan. Nilai cost sementara; cek lagi lewat GET /v1/generation?id=.
Streaming
Dengan "stream": true pada model yang mendukungnya, response berupa Server-Sent Events: beberapa event image_generation.partial_image berisi pratinjau, lalu satu image_generation.completed berisi gambar akhir dan usage dalam kredit, lalu data: [DONE]. Pratinjau tidak ditagih.
Request yang aman diulang
09. Gambar
Edit gambar
Unggah satu atau beberapa gambar beserta instruksi, terima gambar hasil edit. Bentuk request-nya multipart/form-data, sama dengan OpenAI SDK images.edit().
Hanya model yang menerima gambar masukan. Di katalog, model ini tertulis bisa edit, beserta batas jumlah gambarnya.
curl -sS https://gateway.euphy.cloud/v1/images/edits \
-H "Authorization: Bearer $YUPIAI_API_KEY" \
-F model="image-model-id" \
-F prompt="ganti latar menjadi pantai saat senja" \
-F "image[]=@produk.png" \
-F "image[]=@logo.png" > response.json
jq -r '.data[0].b64_json' response.json | base64 --decode > hasil.pngField form
- modeltextwajib
- Model ID yang bisa edit gambar.
- prompttextwajib
- Instruksi edit, maksimal 32.000 karakter.
- imagefilewajib
- Gambar yang diedit. Untuk beberapa gambar, ulangi field image[] (atau image). Batas jumlahnya mengikuti model, maksimal 16.
- n, size, resolution, aspect_ratio, quality, output_format, output_compression, background, seedtext
- Sama dengan POST /v1/images. Angka dikirim sebagai teks, misalnya n=2.
- streamtext
- true atau false, untuk model yang mendukung streaming.
- response_formattext
- Hanya b64_json.
- negative_prompt, guidance, stepstext
- Diteruskan ke penyedia model yang menerimanya.
Batasan file
File harus PNG, JPEG, atau WebP. Jenisnya dibaca dari isi file, bukan dari nama atau Content-Type yang dikirim. Total unggahan maksimal 20 MB per request; kompres gambar besar sebelum dikirim. Gambar masukan ikut ditagih bila tarif model mencantumkannya.
mask tidak didukung
Response-nya sama dengan Buat gambar. Endpoint ini hanya menerima multipart; body JSON dijawab 415 unsupported_media_type. Untuk edit lewat JSON, kirim gambar sebagai input_references ke POST https://gateway.euphy.cloud/v1/images.
10. Video
Buat video
Pembuatan video berjalan di latar belakang. Kirim request, simpan id job, pantau statusnya, lalu unduh video setelah selesai.
Buat job
Pantau status
Unduh hasil
# 1. Buat job
curl -sS https://gateway.euphy.cloud/v1/videos \
-H "Authorization: Bearer $YUPIAI_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: video-senja-001" \
-d '{
"model": "video-model-id",
"prompt": "ombak pelan di pantai saat senja, kamera bergerak ke kiri",
"duration": 8,
"resolution": "1080p",
"aspect_ratio": "16:9"
}'
# 2. Pantau status dengan id dari langkah 1
curl -sS https://gateway.euphy.cloud/v1/videos/ID_JOB -H "Authorization: Bearer $YUPIAI_API_KEY"
# 3. Unduh setelah status completed
curl -sS -o video.mp4 "https://gateway.euphy.cloud/v1/videos/ID_JOB/content?index=0" \
-H "Authorization: Bearer $YUPIAI_API_KEY"Parameter
- modelstringwajib
- Model ID video.
- promptstring
- Deskripsi video. Wajib, kecuali request membawa frame_images atau input_references.
- durationinteger
- Durasi dalam detik, salah satu yang didukung model. Bila kosong, gateway memakai default_duration model, jadi harga sudah pasti sebelum job berjalan.
- resolutionstring
- Misalnya 720p atau 1080p, sesuai model.
- aspect_ratiostring
- Misalnya 16:9 atau 9:16.
- sizestring
- Piksel WIDTHxHEIGHT, misalnya 1280x720.
- frame_imagesarray
- Frame awal atau akhir: [{ "type": "image_url", "image_url": { "url": "..." }, "frame_type": "first_frame" }]. first_frame atau last_frame, masing-masing sekali.
- input_referencesarray
- Referensi gambar, video, atau audio (image_url, video_url, audio_url).
- generate_audioboolean
- Minta audio, pada model yang bisa menghasilkannya.
- seedinteger
- Untuk hasil yang bisa diulang, bila model mendukungnya.
- previous_job_idstring
- Melanjutkan video milik Anda yang sudah completed, dari model yang sama.
- provider.optionsobject
- Parameter khusus penyedia.
Status job
- pending
- Job sudah diterima dan menunggu diproses.
- in_progress
- Video sedang dibuat.
- completed
- Selesai. unsigned_urls berisi URL unduhan. usage muncul setelah tagihan final; bila belum ada, cek lagi sebentar kemudian.
- failed
- Gagal. Field error berisi alasannya.
- cancelled
- Dibatalkan penyedia.
- expired
- Tidak selesai dalam batas waktu penyedia.
{
"id": "gen-vid-1790000000-Ab3dEf9hIjKlMnOp",
"polling_url": "https://gateway.euphy.cloud/v1/videos/gen-vid-1790000000-Ab3dEf9hIjKlMnOp",
"status": "pending"
}{
"id": "gen-vid-1790000000-Ab3dEf9hIjKlMnOp",
"polling_url": "https://gateway.euphy.cloud/v1/videos/gen-vid-1790000000-Ab3dEf9hIjKlMnOp",
"status": "completed",
"unsigned_urls": [
"https://gateway.euphy.cloud/v1/videos/gen-vid-1790000000-Ab3dEf9hIjKlMnOp/content?index=0"
],
"usage": {
"cost": 3200000,
"cost_details": {
"billing_source": "provider_cost",
"is_estimate": false
}
}
}{
"id": "gen-vid-1790000000-Ab3dEf9hIjKlMnOp",
"polling_url": "https://gateway.euphy.cloud/v1/videos/gen-vid-1790000000-Ab3dEf9hIjKlMnOp",
"status": "failed",
"usage": {
"cost": 0,
"cost_details": {
"billing_source": "not_billed",
"is_estimate": false
}
},
"error": "Video generation failed"
}Tagihan video
Kredit ditahan saat job dibuat, sesuai durasi dan resolusi yang diminta. Tagihan final ditetapkan satu kali saat job berakhir, berapa kali pun status dipantau. Job yang gagal, dibatalkan, atau kedaluwarsa tanpa biaya dari penyedia tidak ditagih, dan kredit yang ditahan kembali penuh.
Simpan video segera
Kirim ulang POST /v1/videos dengan Idempotency-Key yang sama saat koneksi terputus: jawabannya job yang sama, tanpa render dan tagihan kedua. Id job milik akun lain dijawab 404, sama seperti id yang tidak ada.
11. Model
Model gambar dan video
Dua endpoint ini mendaftar model yang bisa dipanggil API key Anda, beserta parameter yang diterima dan tarifnya dalam kredit.
Model gambar: capabilities (image_generation, image_editing, streaming), supported_parameters, dan pricing dalam kredit per unit.
Model video: capabilities, supported_durations, default_duration, supported_resolutions, supported_aspect_ratios, generate_audio, dan pricing_skus dalam kredit.
GET https://gateway.euphy.cloud/v1/models juga menyertakan capabilities untuk setiap model. Tarif yang sama tampil di katalog model pada tab Gambar dan Video.
endpoint per kemampuan
- text
- /v1/chat/completions, /v1/messages, /v1/responses
- image_generation
- POST /v1/images
- image_editing
- POST /v1/images/edits, atau POST /v1/images dengan input_references
- video_generation
- POST /v1/videos
- speech_generation
- POST /v1/audio/speech
- transcription
- POST /v1/audio/transcriptions
- audio_input, audio_output
- /v1/chat/completions dengan input_audio, atau modalities ["text", "audio"]
Model yang dipanggil di endpoint yang tidak dilayaninya dijawab 400 unsupported_capability, dan pesannya menyebut endpoint yang benar. Tidak ada kredit yang dipotong.
12. Error
Error gambar dan video
Amplop error sama dengan endpoint lain. Semua error sebelum kredit ditahan tidak memotong saldo.
status · code
- 400 · unsupported_capability
- Model tidak menghasilkan output yang diminta, misalnya model teks di /v1/images atau model tanpa gambar masukan di /v1/images/edits.
- 400 · unsupported_parameter
- Parameter tidak dikenal atau tidak didukung model (termasuk mask). error.param menyebut namanya.
- 400 · invalid_parameter
- Nilai parameter tidak valid, misalnya durasi yang tidak didukung atau jumlah gambar di atas batas model.
- 400 · missing_required_parameter
- model, prompt, atau image tidak dikirim.
- 400 · invalid_image_typeedits
- File bukan PNG, JPEG, atau WebP.
- 400 · invalid_multipartedits
- Body multipart/form-data rusak atau terlalu banyak field.
- 413 · request_too_large
- Body terlalu besar. Untuk edits, total unggahan maksimal 20 MB.
- 415 · unsupported_media_typeedits
- Body bukan multipart/form-data.
- 402 · insufficient_quota
- Saldo tidak cukup untuk kredit yang harus ditahan.
- 404 · not_foundvideo
- Job tidak ada pada akun ini.
- 409 · idempotent_replay
- Idempotency-Key sudah dipakai untuk request gambar yang sama.
- 409 · idempotency_key_reused
- Idempotency-Key sudah dipakai untuk request dengan isi berbeda.
- 409 · idempotent_request_in_progressvideo
- Request dengan key itu masih diproses. Ulangi sesuai retry-after.
- 409 · generation_not_readyvideo
- Video belum selesai; pantau status dulu.
- 410 · content_expiredvideo
- File video sudah tidak tersedia di penyedia.
- 429 · rate_limit_exceeded
- Terlalu banyak request atau polling. Ikuti header retry-after.
- 429 · provider_rate_limited
- Penyedia sedang membatasi request. Tidak ada kredit yang dipotong.
- 502 · generation_failed
- Penyedia tidak mengembalikan hasil. Tidak ditagih kecuali penyedia menagih generasinya.
- 502 / 504 · provider_error, provider_timeout
- Penyedia gagal atau tidak menjawab. Bila penyedia mungkin masih bekerja, kredit tetap ditahan sampai hasilnya pasti, lalu dikembalikan bila tidak ditagih.
- 503 · provider_unavailable, model_pricing_unavailable
- Model sementara tidak bisa dilayani. Ulangi beberapa saat lagi.
{
"error": {
"message": "Model image-model-id tidak mendukung edit gambar. Gunakan endpoint /v1/images. Tidak ada kredit yang dipotong.",
"type": "invalid_request_error",
"param": "model",
"code": "unsupported_capability"
}
}13. Audio
Teks ke suara
Kirim teks, terima audio mentah dalam mp3 atau pcm. Jalur dan bentuk request sama dengan audio.speech.create() di OpenAI SDK, jadi SDK itu cukup diarahkan ke base URL YupiAI.
Model harus menghasilkan suara. Daftar model, pilihan suara, dan tarifnya ada di GET /v1/audio/models atau katalog model pada tab Audio.
curl -sS https://gateway.euphy.cloud/v1/audio/speech \
-H "Authorization: Bearer $YUPIAI_API_KEY" \
-H "Content-Type: application/json" \
-D headers.txt \
--output suara.mp3 \
-d '{
"model": "tts-model-id",
"input": "Selamat pagi, pesanan Anda sudah dikirim.",
"voice": "ID_SUARA",
"response_format": "mp3"
}'
# Request id untuk mengecek tagihan final
grep -i x-yupiai-request-id headers.txtParameter
- modelstringwajib
- Model ID text-to-speech.
- inputstringwajib
- Teks yang diucapkan, maksimal 10.000 karakter per request. Pecah teks yang lebih panjang.
- voicestring
- ID suara. Model yang punya daftar suara (voices di GET /v1/audio/models) hanya menerima suara dari daftar itu. Sebagian penyedia mewajibkan voice.
- response_formatstring
- mp3 atau pcm. Bila tidak dikirim, penyedia memakai pcm. OpenAI SDK tidak mengirim field ini secara default, jadi tulis response_format secara eksplisit.
- speednumber
- 0.25 sampai 4. Hanya dipakai model yang mendukungnya; model lain mengabaikannya.
- input_referencesarray
- Kloning suara, khusus model dengan voice_cloning: satu part input_audio berisi sampel suara (base64 atau data URI, maksimal 15 MB) dan paling banyak satu part text berisi transkripnya.
- provider.optionsobject
- Parameter khusus penyedia, dikelompokkan per slug penyedia, misalnya gaya bicara. Maksimal 8 KB.
Respons
Body berisi byte audio apa adanya dari penyedia, tanpa JSON dan tanpa konversi format. Content-Type bernilai audio/mpeg untuk mp3, atau audio/pcm;rate=24000;channels=1 untuk pcm (16-bit little-endian). Header x-yupiai-request-id adalah id yang diterima GET https://gateway.euphy.cloud/v1/generation?id=.
Memutar pcm
Respons audio tidak membawa biaya. Penyedia mencatat biayanya beberapa detik setelah audio selesai, lalu gateway menagih angka itu. Cek tagihan final lewat GET https://gateway.euphy.cloud/v1/generation?id=REQUEST_ID.
14. Audio
Transkripsi
Ubah rekaman menjadi teks. Endpoint ini menerima upload multipart seperti audio.transcriptions.create() di OpenAI SDK, dan JSON dengan audio base64.
multipart/form-data dengan field file (maksimal 25 MB), atau JSON dengan input_audio (body maksimal 16 MB).
curl -sS https://gateway.euphy.cloud/v1/audio/transcriptions \
-H "Authorization: Bearer $YUPIAI_API_KEY" \
-F model="stt-model-id" \
-F language="id" \
-F file=@rekaman.mp3Parameter
- modelstringwajib
- Model ID transkripsi.
- filefilemultipart
- Satu file audio, maksimal 25 MB. Format dibaca dari isi file; nama file dan tipe MIME dari klien diabaikan.
- input_audioobjectJSON
- { "data": base64, "format": "wav" }. Data URI juga diterima. Format dibaca dari isi audio, jadi format yang salah tulis tetap terkirim dengan benar.
- languagestring
- Kode ISO-639-1, misalnya id atau en. Bila kosong, penyedia mendeteksi bahasa sendiri.
- temperaturenumber
- 0 sampai 1.
- response_formatstring
- json (default) atau verbose_json. verbose_json menambah language, duration, segments, dan words bila penyedia mendukungnya. text, srt, dan vtt tidak didukung penyedia.
- timestamp_granularitiesarray
- word dan/atau segment. Hanya berlaku dengan verbose_json. Di multipart, kirim sebagai timestamp_granularities[].
- promptstring
- Diterima agar kode OpenAI SDK tetap jalan, tetapi tidak diteruskan karena penyedia mengabaikannya.
- provider.optionsobjectJSON
- Parameter khusus penyedia per slug, misalnya diarisasi pembicara.
Format yang didukung: wav, mp3, flac, m4a, ogg (opus atau vorbis), webm, dan aac. Penyedia menghentikan pemrosesan setelah sekitar 60 detik, jadi rekaman yang sangat panjang lebih aman dipecah.
Respons
usage.cost adalah kredit yang ditagih. usage.seconds atau usage.input_tokens dan usage.output_tokens berasal dari penyedia, sesuai cara model itu ditarif.
{
"text": "Selamat pagi, ini adalah uji coba suara singkat.",
"usage": {
"seconds": 3.92,
"cost": 13.0536,
"cost_details": {
"billing_source": "provider_cost",
"is_estimate": false,
"reserved_credits": 138.888889
},
"balance": {
"before": 1000000,
"after": 999986.9464,
"reserved_credits": 138.888889
}
}
}{
"text": "Hello there, this is a short speech test for the gateway.",
"usage": {
"total_tokens": 48,
"input_tokens": 33,
"output_tokens": 15,
"cost": 116.25,
"cost_details": {
"billing_source": "provider_cost",
"is_estimate": false,
"reserved_credits": 267.5
},
"balance": {
"before": 1000000,
"after": 999883.75,
"reserved_credits": 267.5
}
}
}15. Audio
Audio di chat
Model chat tertentu bisa mendengar audio dan menjawab dengan suara lewat /v1/chat/completions. Lihat capabilities.audio_input dan capabilities.audio_output di GET /v1/models.
Audio sebagai input
Tambahkan part input_audio di pesan user. Audio dikirim sebagai base64 beserta formatnya; URL audio tidak didukung penyedia.
{
"model": "chat-audio-model-id",
"messages": [{
"role": "user",
"content": [
{ "type": "text", "text": "Ringkas isi rekaman ini." },
{ "type": "input_audio", "input_audio": { "data": "UklGRiQA...", "format": "wav" } }
]
}]
}Jawaban berupa suara
Kirim modalities: ["text", "audio"] dan audio: { voice, format } dengan format wav, mp3, flac, opus, aac, atau pcm16. Penyedia hanya mengirim audio lewat stream, jadi stream: true wajib. Potongan audio datang di choices[0].delta.audio.data (base64) dan teksnya di delta.audio.transcript. Output audio hanya tersedia di endpoint ini, tidak di /v1/messages atau /v1/responses.
import base64
import os
from openai import OpenAI
client = OpenAI(base_url="https://gateway.euphy.cloud/v1", api_key=os.environ["YUPIAI_API_KEY"])
stream = client.chat.completions.create(
model="chat-audio-model-id",
modalities=["text", "audio"],
audio={"voice": "alloy", "format": "pcm16"},
stream=True,
messages=[{"role": "user", "content": "Sapa pelanggan dengan ramah."}],
)
pcm = bytearray()
for chunk in stream:
if chunk.choices:
audio = getattr(chunk.choices[0].delta, "audio", None) or {}
if audio.get("data"):
pcm += base64.b64decode(audio["data"])
if chunk.usage:
print("kredit:", chunk.usage.cost)
open("jawaban.pcm", "wb").write(pcm)16. Audio
Tagihan audio
Audio ditagih sebesar biaya yang dilaporkan penyedia, dalam kredit. Satuan tarifnya berbeda per model: karakter atau token untuk suara, detik audio atau token untuk transkripsi.
Alur tagihan
Sebelum request dikirim, gateway menahan kredit dari tarif model: panjang teks untuk teks ke suara, dan durasi yang dibaca dari file audio untuk transkripsi. Durasi dibaca dari isi file, bukan dari keterangan klien, dan tidak pernah dianggap lebih pendek dari yang dimungkinkan ukuran file. Transkripsi ditahan minimal 10 detik karena sebagian penyedia menagih minimal 10 detik per request.
Setelah request selesai, tagihan adalah biaya yang dilaporkan penyedia untuk request itu, dan sisa kredit yang ditahan kembali ke saldo. Request yang gagal atau ditolak tanpa biaya tidak ditagih. Bila klien memutus stream suara di tengah jalan, tagihan mengikuti biaya yang dicatat penyedia: nol bila audio belum dibuat.
Untuk audio di chat, token audio masuk dan keluar dihitung penyedia dengan tarif audio model, dan usage.cost di akhir stream adalah tagihannya.
usage.cost_details.billing_source
- provider_costnormal
- Tagihan adalah biaya yang dilaporkan penyedia untuk request itu, dalam kredit.
- estimateestimasi
- Biaya dari penyedia tidak pernah tersedia. Tagihan dihitung dari durasi atau jumlah karakter yang diukur penyedia dan tarif model, tidak pernah melebihi kredit yang ditahan, dan ditandai is_estimate true.
- not_billedgratis
- Request gagal atau ditolak penyedia tanpa biaya. Kredit yang ditahan kembali penuh.
- pendingsementara
- Biaya final belum tercatat. Cek lagi lewat GET /v1/generation?id=.
GET https://gateway.euphy.cloud/v1/generation?id= menampilkan modality: "audio" dan usage_details: jumlah detik audio, karakter, atau token audio yang diukur penyedia. Tab Log di dashboard menampilkan angka yang sama.
Model audio
Model teks ke suara dan transkripsi yang bisa dipanggil API key Anda: type, endpoint, voices, voice_cloning, response_formats atau input_formats, dan pricing dalam kredit per satuan. Tambahkan ?type=speech atau ?type=transcription untuk menyaring.
17. Audio
Error audio
Amplop error sama dengan endpoint lain. Semua error sebelum kredit ditahan tidak memotong saldo.
status · code
- 400 · unsupported_capability
- Model tidak melayani endpoint ini, misalnya model transkripsi di /v1/audio/speech, atau model chat tanpa output audio yang diminta menjawab dengan suara.
- 400 · unsupported_parameter
- Parameter tidak didukung, misalnya response_format wav di speech, srt di transkripsi, instructions, stream_format, atau stream pada transkripsi. error.param menyebut namanya.
- 400 · invalid_parameter
- Nilai tidak valid: voice di luar daftar model, speed, language, temperature, timestamp_granularities tanpa verbose_json, atau output audio di chat tanpa stream: true.
- 400 · missing_required_parameter
- model, input, file, atau input_audio tidak dikirim.
- 400 · invalid_audio
- Isi file bukan audio yang dikenali, atau base64 rusak.
- 400 · unsupported_audio_formattranskripsi
- File audio dikenali tetapi formatnya tidak diterima penyedia transkripsi, misalnya AIFF.
- 400 · invalid_multipart
- Body multipart rusak, field teks berisi file, atau terlalu banyak field.
- 413 · request_too_large
- Upload lebih dari 25 MB, body JSON lebih dari 16 MB, atau sampel suara lebih dari 15 MB.
- 415 · unsupported_media_typetranskripsi
- Body bukan multipart/form-data atau JSON.
- 402 · insufficient_quota
- Saldo tidak cukup untuk kredit yang harus ditahan.
- 403 · model_not_found, model_not_permitted
- Model tidak terdaftar, tidak aktif, atau di luar tier Anda.
- 409 · idempotent_replay
- Idempotency-Key sudah dipakai untuk request yang sama. Gateway tidak menyimpan audio atau transkrip; kirim key baru.
- 409 · idempotency_key_reused
- Idempotency-Key sudah dipakai untuk request dengan isi berbeda.
- 429 · rate_limit_exceeded, provider_rate_limited
- Terlalu banyak request, di gateway atau di penyedia. Ikuti header retry-after. Tidak ada kredit yang dipotong.
- 502 · generation_failed
- Penyedia menjawab tanpa audio atau tanpa transkrip. Tidak ditagih kecuali penyedia menagihnya.
- 502 / 504 · provider_error, provider_timeout
- Penyedia gagal atau tidak menjawab. Bila penyedia mungkin sudah memproses, kredit tetap ditahan sampai hasilnya pasti, lalu dikembalikan bila tidak ditagih.
- 503 · provider_unavailable, model_pricing_unavailable
- Model sementara tidak bisa dilayani, atau tarifnya belum tersinkron. Ulangi beberapa saat lagi.
{
"error": {
"message": "voice nova tidak tersedia untuk model ini. Contoh yang tersedia: af_heart, am_adam. Daftar lengkap ada di GET /v1/audio/models.",
"type": "invalid_request_error",
"param": "voice",
"code": "invalid_parameter"
}
}Retry yang aman
18. Quick start
Quick start usage & billing
Alur dasar dari request pertama sampai laporan pemakaian. Semua endpoint di bagian ini memakai API key yang sama dengan inference, hanya membaca data milik akun pemilik key, dan tidak memotong kredit.
Siapkan API key
Kirim request inference
Baca token dan kredit dari response
Cek saldo
Ambil statistik
# 1. Kirim request, simpan header dan body
curl -sS -D headers.txt https://gateway.euphy.cloud/v1/chat/completions \
-H "Authorization: Bearer $YUPIAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "model": "yupiai-glm5.2", "messages": [{ "role": "user", "content": "Halo" }] }' \
| tee response.json
# 2. Kredit yang ditagih ada di usage.cost, request id di header
grep -i x-yupiai-request-id headers.txt
# 3. Saldo saat ini
curl -sS https://gateway.euphy.cloud/v1/credits -H "Authorization: Bearer $YUPIAI_API_KEY"
# 4. Statistik 30 hari terakhir
curl -sS https://gateway.euphy.cloud/v1/usage -H "Authorization: Bearer $YUPIAI_API_KEY"19. Kredit
Token vs kredit
Token adalah satuan data yang diproses model. Kredit adalah satuan tagihan YupiAI. Setiap request dilaporkan dalam keduanya.
Dua satuan
- Token
- Dihitung provider dengan tokenizer model. Empat kelas: input baru, tulis cache, baca cache, dan output (termasuk reasoning). Gateway tidak mengubah angka token.
- Kredit
- Satuan saldo. Nilai dan pemakaian kredit dapat berbeda tergantung model yang digunakan serta pola penggunaan masing-masing user. Pemakaian dihitung berdasarkan jumlah token yang diproses dan harga atau multiplier token pada setiap model. Multiplier di katalog dinyatakan dalam kredit per token. Semua nominal di API dalam kredit.
Rumus harga token
Setiap model punya empat multiplier yang tercantum di katalog. Keempatnya di-snapshot ke reservasi saat request dibuat, sehingga perubahan tarif tidak memengaruhi request yang sedang berjalan.
harga_token = (token_input_baru × input_multiplier)
+ (token_tulis_cache × cache_creation_multiplier)
+ (token_baca_cache × cache_multiplier)
+ (token_output × output_multiplier)
token_input_baru = prompt_tokens − cached_tokens − cache_write_tokens
token_output = completion_tokens # sudah termasuk reasoning_tokensContoh perhitungan
Multiplier: input 3, tulis cache 3,75, baca cache 0,3, output 15. Provider melaporkan 1.250 token prompt (1.000 cache hit) dan 450 token output (120 reasoning).
Sumber tagihan
Harga token adalah harga tabel. Kredit yang dipotong dari saldo ditentukan oleh billing_source pada setiap request.
- provider_costnormal
- Provider melaporkan biaya request. Tagihan adalah biaya itu dalam kredit (contoh di atas: 7.790). Selisih terhadap harga tabel dicatat sebagai pricing_adjustment_credits (−10).
- token_fallbackestimasi
- Provider tidak melaporkan biaya yang kredibel. Tagihan adalah harga tabel, maksimal sebesar kredit yang di-hold. is_estimate bernilai true; nilai final ada di GET /v1/generation.
- complimentarygratis
- Paket free trial pada model free-trial. Semua kelas kredit 0; token tetap dicatat.
Cache dan reasoning
20. Response
Usage dan kredit di response
Setiap response POST /v1/chat/completions menyertakan jumlah token dari provider dan laporan kredit YupiAI di field usage. Field kredit bersifat tambahan; client yang hanya membaca token tidak terpengaruh.
Field usage berikut ada di response non-streaming dan di chunk terakhir response streaming.
"usage": {
"prompt_tokens": 1250,
"completion_tokens": 450,
"total_tokens": 1700,
"prompt_tokens_details": {
"cached_tokens": 1000,
"cache_write_tokens": 0
},
"completion_tokens_details": {
"reasoning_tokens": 120
},
"cost": 7790,
"cost_details": {
"input_credits": 750,
"cache_write_credits": 0,
"cache_read_credits": 300,
"output_credits": 6750,
"pricing_adjustment_credits": -10,
"billing_source": "provider_cost",
"is_estimate": false
},
"balance": {
"before": 10000000,
"after": 9992210,
"reserved_credits": 66315
}
}usage
- prompt_tokensnumber
- Total token input, termasuk token cache.
- completion_tokensnumber
- Total token output, termasuk token reasoning.
- total_tokensnumber
- prompt_tokens + completion_tokens.
- prompt_tokens_details.cached_tokensnumber
- Token input yang dibaca dari cache.
- prompt_tokens_details.cache_write_tokensnumber
- Token input yang ditulis ke cache. Tidak semua provider melaporkannya.
- completion_tokens_details.reasoning_tokensnumber
- Token reasoning, bagian dari completion_tokens. Hanya ada jika provider melaporkannya.
- costnumber
- Total kredit yang ditagih. Menggantikan field cost provider yang berdenominasi USD.
- cost_detailsobject
- Kredit per kelas token, pricing_adjustment_credits, billing_source, dan is_estimate. Lihat Token vs kredit.
- balance.beforenumber
- Saldo tepat sebelum request ini menahan kredit.
- balance.afternumber
- before dikurangi cost. Berbeda dari saldo di ledger hanya jika request lain milik Anda settlement di antaranya.
- balance.reserved_creditsnumber
- Kredit yang ditahan untuk request ini. Dilepas saat settlement.
Response tanpa field usage
Header response
- x-yupiai-request-idselalu
- ID request gateway (UUID), ada di setiap response sukses termasuk streaming. Dipakai di GET /v1/generation?id=.
- x-yupiai-costnon-streaming
- Total kredit sebagai string desimal. Tidak ada pada response streaming karena biaya belum diketahui saat header dikirim.
HTTP/1.1 200 OK
content-type: application/json
x-yupiai-request-id: 6f4d5e2c-9a1b-4c3d-8e7f-0a1b2c3d4e5f
x-yupiai-cost: 7790Streaming
Kirim "stream": true. Gateway mengaktifkan stream_options.include_usage ke provider, sehingga tidak perlu parameter tambahan. Chunk konten diteruskan tanpa perubahan.
Usage dikirim satu kali di chunk terakhir sebelum data: [DONE]. Chunk itu membawa finish_reason dengan delta kosong, dan objek usage-nya sama dengan response non-streaming, termasuk cost, cost_details, dan balance.
data: {"id":"gen-1757671200-Ab3dEf9h","provider":"Anthropic","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"role":"assistant","content":""},"finish_reason":"stop"}],"usage":{"prompt_tokens":1250,"completion_tokens":450,"total_tokens":1700,"prompt_tokens_details":{"cached_tokens":1000,"cache_write_tokens":0},"completion_tokens_details":{"reasoning_tokens":120},"cost":7790,"cost_details":{"input_credits":750,"cache_write_credits":0,"cache_read_credits":300,"output_credits":6750,"pricing_adjustment_credits":-10,"billing_source":"provider_cost","is_estimate":false},"balance":{"before":10000000,"after":9992210,"reserved_credits":66315}}}
data: [DONE]import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://gateway.euphy.cloud/v1",
apiKey: process.env.YUPIAI_API_KEY,
});
const stream = await client.chat.completions.create({
model: "yupiai-glm5.2",
messages: [{ role: "user", content: "Halo" }],
stream: true,
});
for await (const chunk of stream) {
const text = chunk.choices[0]?.delta?.content;
if (text) process.stdout.write(text);
if (chunk.usage) {
// Chunk terakhir. Field kredit adalah tambahan YupiAI di luar tipe SDK;
// di TypeScript, cast: chunk.usage as typeof chunk.usage & { cost: number; cost_details: any; balance: any }
const usage = chunk.usage;
console.log("\ntoken :", usage.total_tokens);
console.log("kredit:", usage.cost, usage.cost_details.billing_source);
console.log("saldo :", usage.balance.after);
}
}Jika client menutup koneksi sebelum stream selesai, chunk usage tidak terkirim. Request tetap settlement dari token yang sudah terkirim, dengan outcome: cancelled, dan dapat dibaca di GET /v1/generation.
Endpoint Anthropic dan Responses
Body POST /v1/messages (Claude Code) dan POST /v1/responses (Codex) mengikuti skema vendor tanpa field tambahan, karena SDK di sisi itu melakukan validasi ketat. Jumlah token ada di field usage masing-masing dialek.
Kredit dibaca dari header x-yupiai-cost (non-streaming) atau dari GET /v1/generation dengan header x-yupiai-request-id. Pada response non-streaming, id body (msg_... atau resp_...) juga diterima. Pada streaming, kedua dialek membuat id sendiri, sehingga hanya header yang berlaku.
21. Saldo
Cek saldo kredit
Gunakan endpoint ini untuk membaca saldo kredit akun pemilik API key.
Autentikasi dengan API key di header Authorization: Bearer, x-api-key, atau api-key. Tidak ada parameter.
curl -sS https://gateway.euphy.cloud/v1/credits \
-H "Authorization: Bearer $YUPIAI_API_KEY"{
"data": {
"total_credits": 10000000,
"total_usage": 1550000,
"remaining_credits": 8450000,
"reserved_credits": 66315,
"pending_requests": 1,
"tier": "pro",
"expires_at": "2026-10-12T00:00:00+00:00",
"cycle_started_at": "2026-09-12T00:00:00+00:00",
"is_expired": false
}
}data
- total_creditsnumber
- Total kredit pada siklus pembelian saat ini.
- total_usagenumber
- Kredit yang sudah keluar dari siklus ini, termasuk yang sedang ditahan.
- remaining_creditsnumber
- Saldo yang bisa dipakai. total_credits dikurangi total_usage.
- reserved_creditsnumber
- Bagian total_usage yang ditahan untuk request yang belum settlement.
- pending_requestsnumber
- Jumlah request yang masih menahan kredit.
- tierstring
- Paket aktif: free_trial, starter, pro, business, atau user (tanpa paket).
- expires_atstring | null
- Akhir masa aktif paket, ISO 8601.
- cycle_started_atstring | null
- Awal siklus pembelian saat ini.
- is_expiredboolean
- true jika masa aktif sudah lewat. Endpoint ini tetap bisa dibaca; inference ditolak dengan 403.
Saldo berubah setelah settlement
22. API key
Ambil informasi API key
Gunakan endpoint ini untuk membaca label, pemakaian, dan status akun dari API key yang dipakai.
Autentikasi dengan API key yang ingin diperiksa, di header Authorization: Bearer, x-api-key, atau api-key. Tidak ada parameter.
curl -sS https://gateway.euphy.cloud/v1/key \
-H "Authorization: Bearer $YUPIAI_API_KEY"{
"data": {
"id": "aaaaaaaa-bbbb-4ccc-8ddd-eeeeeeeeeeee",
"label": "Key Produksi",
"key_prefix": "yupi_ai_ab12",
"created_at": "2026-09-01T08:30:00+00:00",
"limit": null,
"limit_reset": null,
"limit_remaining": 8450000,
"usage": 1550000,
"usage_daily": 12000,
"usage_weekly": 90000,
"usage_monthly": 400000,
"is_free_tier": false,
"balance": 8450000,
"tier": "pro",
"expires_at": "2026-10-12T00:00:00+00:00",
"requests": 812,
"requests_daily": 9,
"requests_weekly": 60,
"requests_monthly": 250,
"last_used_at": "2026-09-12T10:00:00+00:00",
"is_expired": false
}
}data
- idstring
- ID key (UUID). Nilai untuk parameter api_key di /v1/usage.
- labelstring
- Nama key yang diberikan di Dashboard.
- key_prefixstring
- 12 karakter pertama key. Key lengkap tidak pernah dikembalikan.
- created_atstring
- Waktu key dibuat, ISO 8601.
- limitnull
- Selalu null. Tidak ada batas pengeluaran per key; batasnya adalah saldo akun.
- limit_resetnull
- Selalu null.
- limit_remainingnumber
- Kredit yang masih bisa dipakai key ini: saldo akun, atau 0 jika paket kedaluwarsa.
- usagenumber
- Kredit yang dipakai key ini sepanjang masa. Request yang di-refund tidak dihitung.
- usage_dailynumber
- Kredit sejak 00:00 UTC hari ini.
- usage_weeklynumber
- Kredit sejak Senin 00:00 UTC minggu ini.
- usage_monthlynumber
- Kredit sejak tanggal 1 pukul 00:00 UTC bulan ini.
- is_free_tierboolean
- true jika akun tidak memiliki paket berbayar (starter, pro, business).
- balancenumber
- Saldo akun saat ini. Sama dengan remaining_credits di /v1/credits.
- tierstring
- Paket aktif akun pemilik key.
- expires_atstring | null
- Akhir masa aktif paket, ISO 8601.
- is_expiredboolean
- true jika masa aktif sudah lewat.
- requestsnumber
- Jumlah request key ini sepanjang masa. requests_daily, requests_weekly, dan requests_monthly memakai jendela yang sama dengan usage_*.
- last_used_atstring | null
- Waktu settlement request terakhir key ini. null jika belum pernah dipakai.
Key yang dicabut atau akun yang dinonaktifkan menerima 401, bukan data. Response 200 berarti key aktif. Lihat Error response.
23. Statistik
Ambil statistik pemakaian
Gunakan endpoint ini untuk mengambil total token dan kredit dalam satu rentang waktu, dipecah per model, provider, hari, dan API key.
Default 30 hari terakhir. Hanya request yang sudah settlement yang dihitung. Request yang ditolak sebelum reservasi (key tidak valid, kredit habis, model tidak ada) tidak tercatat.
Parameter query
- fromstringopsional
- Awal rentang, ISO 8601 atau YYYY-MM-DD (UTC). Default 30 hari sebelum to.
- tostringopsional
- Akhir rentang. Nilai YYYY-MM-DD mencakup hari itu secara penuh. Default sekarang. Rentang maksimal 93 hari.
- datestringopsional
- Satu hari UTC (YYYY-MM-DD). Mengabaikan from dan to.
- modelstringopsional
- Satu Model ID, misalnya yupiai-glm5.2.
- providerstringopsional
- Satu provider sesuai nama yang dilaporkan upstream, misalnya Anthropic.
- api_keystring (UUID)opsional
- Satu key milik Anda, memakai id dari GET /v1/key. Key milik akun lain menghasilkan 404.
# 30 hari terakhir
curl -sS https://gateway.euphy.cloud/v1/usage \
-H "Authorization: Bearer $YUPIAI_API_KEY"
# Satu model, rentang tanggal tertentu
curl -sS "https://gateway.euphy.cloud/v1/usage?from=2026-09-01&to=2026-09-12&model=yupiai-glm5.2" \
-H "Authorization: Bearer $YUPIAI_API_KEY"
# Satu provider, satu key
curl -sS "https://gateway.euphy.cloud/v1/usage?provider=Anthropic&api_key=aaaaaaaa-bbbb-4ccc-8ddd-eeeeeeeeeeee" \
-H "Authorization: Bearer $YUPIAI_API_KEY"{
"data": {
"from": "2026-08-13T12:00:00.000Z",
"to": "2026-09-12T12:00:00.000Z",
"filters": {
"model": null,
"provider": null,
"api_key": null
},
"summary": {
"requests": 6,
"successful_requests": 4,
"failed_requests": 1,
"cancelled_requests": 1,
"unknown_requests": 0,
"streamed_requests": 4,
"prompt_tokens": 3400,
"cached_tokens": 2000,
"cache_write_tokens": 100,
"completion_tokens": 1000,
"reasoning_tokens": 200,
"total_tokens": 4400,
"credits": 9080,
"average_credits_per_request": 1513.33333333,
"cost_details": {
"input_credits": 1840,
"cache_write_credits": 250,
"cache_read_credits": 400,
"output_credits": 5440,
"pricing_adjustment_credits": 1150,
"estimated_requests": 1,
"complimentary_requests": 0
},
"average_latency_ms": 840
},
"pending": {
"requests": 1,
"reserved_credits": 66315
},
"by_model": [
{
"model": "yupiai-glm5.2",
"requests": 4,
"successful_requests": 2,
"failed_requests": 1,
"cancelled_requests": 1,
"unknown_requests": 0,
"streamed_requests": 3,
"prompt_tokens": 3000,
"cached_tokens": 2000,
"cache_write_tokens": 100,
"completion_tokens": 900,
"reasoning_tokens": 200,
"total_tokens": 3900,
"credits": 9000,
"average_credits_per_request": 2250,
"cost_details": {
"input_credits": 1800,
"cache_write_credits": 250,
"cache_read_credits": 400,
"output_credits": 5400,
"pricing_adjustment_credits": 1150,
"estimated_requests": 0,
"complimentary_requests": 0
},
"average_latency_ms": 1200
},
{
"model": "CHEAP_yupiai-glm5.2",
"requests": 2,
"successful_requests": 2,
"failed_requests": 0,
"cancelled_requests": 0,
"unknown_requests": 0,
"streamed_requests": 1,
"prompt_tokens": 400,
"cached_tokens": 0,
"cache_write_tokens": 0,
"completion_tokens": 100,
"reasoning_tokens": 0,
"total_tokens": 500,
"credits": 80,
"average_credits_per_request": 40,
"cost_details": {
"input_credits": 40,
"cache_write_credits": 0,
"cache_read_credits": 0,
"output_credits": 40,
"pricing_adjustment_credits": 0,
"estimated_requests": 1,
"complimentary_requests": 0
},
"average_latency_ms": 300
}
],
"by_provider": [
{
"provider": "Anthropic",
"requests": 3,
"successful_requests": 2,
"failed_requests": 0,
"cancelled_requests": 1,
"unknown_requests": 0,
"streamed_requests": 3,
"prompt_tokens": 3000,
"cached_tokens": 2000,
"cache_write_tokens": 100,
"completion_tokens": 900,
"reasoning_tokens": 200,
"total_tokens": 3900,
"credits": 9000,
"average_credits_per_request": 3000,
"cost_details": {
"input_credits": 1800,
"cache_write_credits": 250,
"cache_read_credits": 400,
"output_credits": 5400,
"pricing_adjustment_credits": 1150,
"estimated_requests": 0,
"complimentary_requests": 0
},
"average_latency_ms": 1200
},
{
"provider": "Google",
"requests": 3,
"successful_requests": 2,
"failed_requests": 1,
"cancelled_requests": 0,
"unknown_requests": 0,
"streamed_requests": 1,
"prompt_tokens": 400,
"cached_tokens": 0,
"cache_write_tokens": 0,
"completion_tokens": 100,
"reasoning_tokens": 0,
"total_tokens": 500,
"credits": 80,
"average_credits_per_request": 26.66666667,
"cost_details": {
"input_credits": 40,
"cache_write_credits": 0,
"cache_read_credits": 0,
"output_credits": 40,
"pricing_adjustment_credits": 0,
"estimated_requests": 1,
"complimentary_requests": 0
},
"average_latency_ms": 300
}
],
"by_date": [
{
"date": "2026-09-10",
"requests": 3,
"successful_requests": 2,
"failed_requests": 1,
"cancelled_requests": 0,
"unknown_requests": 0,
"streamed_requests": 1,
"prompt_tokens": 400,
"cached_tokens": 0,
"cache_write_tokens": 0,
"completion_tokens": 100,
"reasoning_tokens": 0,
"total_tokens": 500,
"credits": 80,
"average_credits_per_request": 26.66666667,
"cost_details": {
"input_credits": 40,
"cache_write_credits": 0,
"cache_read_credits": 0,
"output_credits": 40,
"pricing_adjustment_credits": 0,
"estimated_requests": 1,
"complimentary_requests": 0
},
"average_latency_ms": 300
},
{
"date": "2026-09-11",
"requests": 3,
"successful_requests": 2,
"failed_requests": 0,
"cancelled_requests": 1,
"unknown_requests": 0,
"streamed_requests": 3,
"prompt_tokens": 3000,
"cached_tokens": 2000,
"cache_write_tokens": 100,
"completion_tokens": 900,
"reasoning_tokens": 200,
"total_tokens": 3900,
"credits": 9000,
"average_credits_per_request": 3000,
"cost_details": {
"input_credits": 1800,
"cache_write_credits": 250,
"cache_read_credits": 400,
"output_credits": 5400,
"pricing_adjustment_credits": 1150,
"estimated_requests": 0,
"complimentary_requests": 0
},
"average_latency_ms": 1200
}
],
"by_api_key": [
{
"api_key": "aaaaaaaa-bbbb-4ccc-8ddd-eeeeeeeeeeee",
"label": "Key Produksi",
"key_prefix": "yupi_ai_ab12",
"requests": 4,
"successful_requests": 2,
"failed_requests": 1,
"cancelled_requests": 1,
"unknown_requests": 0,
"streamed_requests": 3,
"prompt_tokens": 3000,
"cached_tokens": 2000,
"cache_write_tokens": 100,
"completion_tokens": 900,
"reasoning_tokens": 200,
"total_tokens": 3900,
"credits": 9000,
"average_credits_per_request": 2250,
"cost_details": {
"input_credits": 1800,
"cache_write_credits": 250,
"cache_read_credits": 400,
"output_credits": 5400,
"pricing_adjustment_credits": 1150,
"estimated_requests": 0,
"complimentary_requests": 0
},
"average_latency_ms": 1200
},
{
"api_key": "bbbbbbbb-cccc-4ddd-8eee-ffffffffffff",
"label": "Key Staging",
"key_prefix": "yupi_ai_cd34",
"requests": 2,
"successful_requests": 2,
"failed_requests": 0,
"cancelled_requests": 0,
"unknown_requests": 0,
"streamed_requests": 1,
"prompt_tokens": 400,
"cached_tokens": 0,
"cache_write_tokens": 0,
"completion_tokens": 100,
"reasoning_tokens": 0,
"total_tokens": 500,
"credits": 80,
"average_credits_per_request": 40,
"cost_details": {
"input_credits": 40,
"cache_write_credits": 0,
"cache_read_credits": 0,
"output_credits": 40,
"pricing_adjustment_credits": 0,
"estimated_requests": 1,
"complimentary_requests": 0
},
"average_latency_ms": 300
}
]
}
}Field response
Setiap baris by_model, by_provider, by_date, dan by_api_key memuat field yang sama dengan summary ditambah kunci grupnya: model, provider, date, atau api_key dengan label dan key_prefix. Baris diurutkan dari kredit terbesar; by_date diurutkan berdasarkan tanggal.
summary
- requestsnumber
- Request yang sudah settlement dalam rentang waktu.
- successful_requestsnumber
- Request dengan outcome completed.
- failed_requestsnumber
- Request dengan outcome error (ditolak provider setelah reservasi).
- cancelled_requestsnumber
- Request dengan outcome cancelled (stream diputus client).
- unknown_requestsnumber
- Request yang settlement-nya dilakukan proses pemulihan tanpa mengetahui akhirnya.
- streamed_requestsnumber
- Request dengan stream: true.
- prompt_tokensnumber
- Total token input, termasuk token cache.
- cached_tokensnumber
- Token input yang dibaca dari cache.
- cache_write_tokensnumber
- Token input yang ditulis ke cache.
- completion_tokensnumber
- Total token output, termasuk token reasoning.
- reasoning_tokensnumber
- Token reasoning, bagian dari completion_tokens.
- total_tokensnumber
- prompt_tokens + completion_tokens.
- creditsnumber
- Total kredit yang ditagih.
- average_credits_per_requestnumber
- credits dibagi requests.
- cost_detailsobject
- Total kredit per kelas token (input_credits, cache_write_credits, cache_read_credits, output_credits, pricing_adjustment_credits) serta estimated_requests dan complimentary_requests.
- average_latency_msnumber | null
- Rata-rata waktu dari request dikirim ke provider sampai response selesai.
field lain
- from, tostring
- Rentang yang dipakai, ISO 8601, setelah default diterapkan.
- filtersobject
- model, provider, dan api_key yang diterapkan. null jika tidak difilter.
- pendingobject
- Request yang masih menahan kredit dalam rentang ini: requests dan reserved_credits. Belum masuk summary.
Riwayat harian
Gunakan GET /v1/activity untuk data yang sama dalam bentuk baris per hari UTC, model, dan provider. Parameter query sama dengan /v1/usage.
Baris diurutkan dari tanggal terbaru. Field usage adalah kredit. Key digabung kecuali difilter dengan api_key.
curl -sS "https://gateway.euphy.cloud/v1/activity?date=2026-09-11" \
-H "Authorization: Bearer $YUPIAI_API_KEY"{
"data": [
{
"date": "2026-09-11",
"model": "yupiai-glm5.2",
"provider_name": "Anthropic",
"requests": 3,
"prompt_tokens": 3000,
"completion_tokens": 900,
"reasoning_tokens": 200,
"cached_tokens": 2000,
"cache_write_tokens": 100,
"usage": 9000
},
{
"date": "2026-09-10",
"model": "CHEAP_yupiai-glm5.2",
"provider_name": "Google",
"requests": 2,
"prompt_tokens": 400,
"completion_tokens": 100,
"reasoning_tokens": 0,
"cached_tokens": 0,
"cache_write_tokens": 0,
"usage": 80
},
{
"date": "2026-09-10",
"model": "yupiai-glm5.2",
"provider_name": "Google",
"requests": 1,
"prompt_tokens": 0,
"completion_tokens": 0,
"reasoning_tokens": 0,
"cached_tokens": 0,
"cache_write_tokens": 0,
"usage": 0
}
]
}data[]
- datestring
- Hari UTC, YYYY-MM-DD.
- modelstring
- Model ID.
- provider_namestring | null
- Provider yang melayani request. null untuk request sebelum kolom ini ada.
- requestsnumber
- Jumlah request yang settlement.
- prompt_tokens, completion_tokens, reasoning_tokens, cached_tokens, cache_write_tokensnumber
- Total token per kelas, sama dengan summary di /v1/usage.
- usagenumber
- Total kredit untuk hari, model, dan provider tersebut.
24. Request
Lihat detail satu request
Gunakan endpoint ini untuk membaca catatan ledger satu request: token per kelas, kredit yang ditagih, sumber tagihan, dan saldo sebelum serta sesudahnya.
Parameter id menerima header x-yupiai-request-id (ada di setiap response), field id response Chat Completions (gen-...), atau id response non-streaming Anthropic (msg_...) dan Responses (resp_...).
curl -sS "https://gateway.euphy.cloud/v1/generation?id=6f4d5e2c-9a1b-4c3d-8e7f-0a1b2c3d4e5f" \
-H "Authorization: Bearer $YUPIAI_API_KEY"{
"data": {
"id": "6f4d5e2c-9a1b-4c3d-8e7f-0a1b2c3d4e5f",
"generation_id": "gen-1757671200-Ab3dEf9h",
"api_key": "aaaaaaaa-bbbb-4ccc-8ddd-eeeeeeeeeeee",
"model": "yupiai-glm5.2",
"provider_name": "Anthropic",
"created_at": "2026-09-12T10:00:00+00:00",
"settled_at": "2026-09-12T10:00:03+00:00",
"status": "settled",
"outcome": "completed",
"cancelled": false,
"streamed": true,
"latency": 1432,
"tokens_prompt": 1250,
"tokens_completion": 450,
"native_tokens_cached": 1000,
"native_tokens_cache_write": 0,
"native_tokens_reasoning": 120,
"total_cost": 7790,
"cost_details": {
"input_credits": 750,
"cache_write_credits": 0,
"cache_read_credits": 300,
"output_credits": 6750,
"pricing_adjustment_credits": -10,
"billing_source": "provider_cost",
"is_estimate": false
},
"reserved_credits": 66315,
"balance_before": 10000000,
"balance_after": 9992210,
"is_complimentary": false,
"is_refunded": false,
"billing_review_required": false,
"modality": "text",
"usage_details": null
}
}data
- idstring
- ID request gateway. Sama dengan header x-yupiai-request-id.
- generation_idstring | null
- ID generasi di sisi provider (gen-...). null jika request gagal sebelum diterima provider.
- api_keystring
- ID key yang dipakai.
- model, provider_namestring
- Model ID dan provider yang melayani request.
- statusstring
- pending, settled, atau refunded. Selama pending, total_cost dan cost_details bernilai null.
- outcomestring | null
- completed, cancelled, error, atau unknown. Field cancelled bernilai true untuk outcome cancelled.
- streamed, latencyboolean | null, number | null
- Request streaming atau tidak, dan durasi dalam milidetik dari dikirim ke provider sampai response selesai.
- tokens_prompt, tokens_completionnumber | null
- Token input total dan token output, sesuai laporan provider.
- native_tokens_cached, native_tokens_cache_write, native_tokens_reasoningnumber | null
- Token baca cache, tulis cache, dan reasoning.
- total_costnumber | null
- Kredit yang ditagih.
- cost_detailsobject | null
- Kredit per kelas token, pricing_adjustment_credits, billing_source, dan is_estimate. Sama dengan response inference.
- reserved_creditsnumber
- Kredit yang ditahan saat request dimulai.
- balance_before, balance_afternumber | null
- Saldo tepat sebelum hold dan tepat setelah settlement, dari ledger.
- is_complimentary, is_refunded, billing_review_requiredboolean
- Request free trial, request yang di-refund admin, dan request yang sedang ditinjau tim YupiAI.
ID yang tidak ada dan ID milik akun lain menerima jawaban yang sama: 404 not_found. Request yang belum settlement mengembalikan status: "pending"; ulangi permintaan beberapa detik kemudian.
25. Error
Error response
Endpoint usage & billing dan POST /v1/chat/completions memakai amplop error OpenAI. Gunakan error.code untuk logika program; error.message ditujukan untuk manusia.
{
"error": {
"message": "API key telah dicabut (revoked). Silakan buat key baru di dashboard YupiAI.",
"type": "authentication_error",
"param": null,
"code": "invalid_api_key"
}
}status · code
- 401 · missing_api_key
- Tidak ada API key di header Authorization, x-api-key, atau api-key.
- 401 · invalid_api_key
- Prefix bukan yupi_ai_ (atau rk_live_ lama), key tidak ditemukan, key dicabut (revoked), atau akun dinonaktifkan. Pesan menyebutkan alasannya.
- 402 · insufficient_quotainference
- Saldo tidak cukup untuk menahan kredit request. Tidak ada yang dipotong.
- 403 · subscription_expiredinference
- Masa aktif paket sudah lewat. Endpoint pembacaan tetap menjawab 200 dengan is_expired: true.
- 400 · invalid_queryusage, activity
- from, to, atau date tidak valid; rentang lebih dari 93 hari; to tidak lebih akhir dari from; atau model, provider, api_key bukan pengenal yang valid. error.param menyebut parameternya.
- 400 · missing_required_parametergeneration
- Parameter id kosong.
- 404 · not_foundusage, generation
- api_key atau id tidak ada pada akun ini.
- 429 · rate_limit_exceeded
- Endpoint pembacaan dibatasi 30 request per menit per akun dan mengirim header retry-after: 10. Inference memakai limiter terpisah.
- 502 · gateway_unavailable
- Ledger tidak dapat dihubungi. Ulangi beberapa detik kemudian. Endpoint pembacaan tidak menjawab dengan angka nol.
{
"error": {
"message": "Unauthorized: Header API key tidak ada. Kirim API key YupiAI lewat salah satu header: 'Authorization: Bearer yupi_ai_...', 'x-api-key: yupi_ai_...', atau 'api-key: yupi_ai_...'.",
"type": "authentication_error",
"param": null,
"code": "missing_api_key"
}
}{
"error": {
"message": "Forbidden: Kredit tidak cukup untuk menyelesaikan permintaan ini. Silakan top up di dashboard YupiAI.",
"type": "permission_error",
"param": null,
"code": "insufficient_quota"
}
}{
"error": {
"message": "Rentang waktu maksimal 93 hari.",
"type": "invalid_request_error",
"param": "from",
"code": "invalid_query"
}
}HTTP/1.1 429 Too Many Requests
retry-after: 10
{
"error": {
"message": "Terlalu banyak permintaan ke endpoint usage. Silakan coba lagi sebentar.",
"type": "rate_limit_error",
"param": null,
"code": "rate_limit_exceeded"
}
}Hindari polling saldo pada setiap request
26. Catatan
Status kompatibilitas Cursor
Panduan lama yang memakai Override OpenAI Base URL dan Model ID kustom tidak lagi menjadi jalur utama.
Pilih integrasi yang didokumentasikan
Jika Cursor masih menampilkan Override OpenAI Base URL, Anda dapat mencoba https://gateway.euphy.cloud/v1. Konfigurasi ini bersifat eksperimental dan tidak berlaku untuk Tab Completion.
Referensi: Dokumentasi API Keys Cursor
27. Kebijakan
Masa aktif dan saldo
Pembelian baru menambah kredit dan masa aktif yang tersisa. Saat masa aktif berakhir, sisa kredit kedaluwarsa dan API berhenti tanpa membuat tagihan lanjutan.
Contoh auto-stack
Tidak ada auto-debit
Butuh panduan lain?
Gunakan Quick Setup atau pilih panduan manual sesuai aplikasi Anda.