計費
現金計價,凍結與結算怎麼走,失敗為什麼一定釋放,以及消費上限有哪幾層。
現金計價,不是點數
價格直接以美元標註:「每張圖 $0.008」「每輸出秒 $0.042」。預付資金、贈金與授信都以美元計量,但授信上限並不是現金餘額。
不用點數是刻意的:點數制會在「儲多少送多少」和「一點值多少錢」之間製造一層換算,讓你算不清真實成本。你看到的價就是你付的價。
API 回傳的金額是字串,但不帶 $
「$0.008」是這一頁給人看的寫法。介面回傳的是不帶貨幣符號的十進位字串:estimatedCost、cost、以及餘額的三個欄位都形如 "0.008",沒有 $、沒有千分位,貨幣恆為美元。
// 顯示時保留原始十進位字串
const usd = task.cost;用字串而不是 JSON 數字是刻意的:JSON 的數字在多數語言裡會解析成 float64,而 0.008 在二進位浮點裡不精確。對帳請用十進位型別解析:
from decimal import Decimal
usd = Decimal(task["cost"]) # 而不是 float()查詢目前 API Key 的用量
curl 'https://api.spicyapi.ai/api/v1/usage?from=2026-09-01&to=2026-09-06' \
-H "Authorization: Bearer $SPICY_API_KEY"日期按 UTC 的左閉右開區間 [from,to) 解釋,上例包含9月1日至5日。省略日期時回傳最近7天(包含今天),最長92天。只回傳目前這把 Key 的任務,不提供其他 Key 或整個帳號的查詢參數;帳號餘額仍使用 chat/credit。
data.totalCalls 是全部任務數量,data.totalSpend 是已結算實收金額;days 與 models 分別按建立日和模型分組,金額都是 USD 十進位字串。未結算預扣不計入消費,遲到結算可能更新過去日期的金額。隱藏的歷史任務仍計入,沒有任務的日期不會補上一筆零值。兩個分組描述同一批任務,不要相加兩次。
SDK 使用 client.getUsage({ from, to });CLI 使用 spicyapi usage --from 2026-09-01 --to 2026-09-06。不需要在每次生成前查詢用量或餘額,任務受理本身會執行餘額與預算檢查。
計費單位
一個模型只有一個計費單位。
| 單位 | 含義 | 數量取自 input 的哪個欄位 |
|---|---|---|
per_image | 按生成張數 | 該模型宣告的欄位,沒宣告就按 1 張 |
per_second | 按輸出時長秒數 | 讀取即時 quantityField 和 Schema,標準時長欄位為 duration_seconds;不要自行推定預設時長 |
per_request | 按次,與參數無關 | — |
per_1k_tokens | 按千 token,輸入輸出分別定價 | — |
欄位名不用猜:模型目錄介面的 quantityField 會逐模型告訴你,空字串表示按次計一單位。
同一個模型的不同級距可以有不同價格。影響價格的輸入可能包括解析度、時長、音訊選項或參考素材,具體以該模型 Schema 為準。pricing[].variant 是價卡的級距識別碼,請求本文裡沒有 variant 這個欄位。不要假設它總能直接當作 resolution,也不要只用「起價 × 時長」重新計算所有模型。將完整輸入傳送到 jobs/quote,使用回傳的精確估算與收費上限。
數量與價格始終以即時目錄為準
不要把某類模型的數量欄位寫死在用戶端。quantityField 為空時按一次呼叫計一單位;有值時,從該欄位讀取預估數量。各模型的價格級距、預設值和計費方式都可能隨目錄更新。最終收費不超過任務受理時的凍結金額:少用會釋放差額,之後不會補扣超過凍結額的金額。
各模型的確切單位與價格見價格頁與各自的模型頁。
客戶折扣與促銷
優惠可以面向所有使用者,也可以僅適用於指定帳戶;範圍可以是全部模型或選定模型。長期優惠持續到停用,限時優惠只在真實的開始與結束時間之間生效。帳戶專屬優惠只在對應帳戶登入或使用其 API Key 報價時適用,不會成為其他使用者的公開價格。
優惠不疊加,自動採用你可享的最低價格。 例如標準費用為 $10,公開活動減免 10%、帳戶優惠減免 20%,適用價格為 $8,而不是連續打折後的 $7.20。活動結束或停用後,新報價重新選擇仍有效的優惠;其他優惠也沒有時恢復標準價。
首頁、目錄和模型頁的優惠展示供選擇模型時參考,實際費用請以攜帶身分、完整模型與輸入參數的 jobs/quote 為準。倒數計時不會鎖定價格;活動、輸入或價格變化後,請重新取得報價。任務受理後按當時凍結的價格結算,活動在執行中結束不會讓該任務漲價,最終收費也不會超過受理時的凍結金額。
優惠按 API 請求的消費金額自動套用,不會讓儲值本金打折,也不是儲值返現。按日或按月展示的預算只按目前價格外推;限時活動可能在預算週期結束前到期,請同時核對優惠結束時間。
贈金與授信
GET /api/v1/chat/credit 保留 available、held、total,並可回傳 funding 資金來源明細。舊回應可能沒有 funding,缺失不等於零。SDK 使用 client.getBalance(),CLI 使用 spicyapi balance --json;不必在每次生成前先查餘額。
funding.prepaidAvailableUsd是預付或歷史通用可用資金;grantAvailableUsd是目前有效的贈金合計。每筆grants列出金額、可用、凍結、已用、狀態、生效與到期時間及modelSlugs。模型列表為空表示全部模型;非空時只能支付對應模型的消費。列表最多回傳 100 筆,優先展示仍有餘額或凍結金額的批次,再按時間從新到舊排列。grantsHasMore為真表示還有未回傳的記錄,不能用列表小計代替合計。funding.credit是經批准的先用後付額度:limitUsd為上限,availableUsd為剩餘可用授信,usedUsd為已結算欠款,heldUsd為在途任務佔用,expiresAt為到期時間。授信上限不是儲值、贈金或現金餘額。 到期、停用或超限會限制新呼叫,已有欠款仍須償還。- 贈金不可提現。折扣決定請求售價,贈金與授信決定如何支付該售價;贈金不會降低模型價卡金額。贈金只在真實有效期及模型範圍內可用,未用部分可能到期或撤銷。任務失敗或少用時按原來源釋放;已到期或撤銷的贈金不會因此重新有效。
funding.cashShortfallUsd大於零表示外部付款追回造成的待補足資金缺口,贈金和授信不能抵補,補足前不能新建呼叫。available為負也可能只是已批准授信的使用,因此不能單憑它斷言餘額不足,也不要把它與授信上限直接相加。伺服器端會在受理時檢查資金來源、模型範圍、有效期及消費上限。
所有金額仍為精確 USD 十進位字串,日期為 RFC3339;顯示時請註明時區。控制台帳單頁顯示資金與贈金明細,資金變更只有在管理員手動審核後才生效。需要贈金或授信時聯絡支援;公開 API 不提供自助增加額度或發放贈金的寫入介面。
三個階段
凍結(hold)
建任務時按預估用量凍結一筆錢,金額就是 createTask 回傳的 estimatedCost。
凍結會暫時佔用本次任務實際採用的資金來源,還沒有形成最終收費。它可能來自預付資金、適用贈金或批准的授信,不能再用於其他任務。這部分體現在 GET /api/v1/chat/credit 的 held 上。
凍結與建任務在同一筆資料庫交易裡完成。不存在「任務建了卻沒凍結金額」或者反過來的中間態。凍結不是收費。
結算(settle)或退款(refund)
succeeded→ 按實際用量結算,但實收金額以受理時的凍結額為上限。少用的部分按原資金來源釋放;之後不會再向你補扣超過凍結額的金額。failed/expired→ 全額釋放預扣。歷史資料中的canceled同樣全額退回,但目前任務一經受理即不可取消。
結算完成後 recordInfo 的 settled 變成 true,此時 cost 才是最終值。settled: false 時 cost 仍可能變動。
失敗不計費是承諾,不是盡力而為
除 succeeded 外的所有終態都必須全額釋放凍結金額。你不需要為此做任何事,也不需要來找我們對帳。
查餘額
GET /api/v1/chat/creditcurl https://api.spicyapi.ai/api/v1/chat/credit \
-H "Authorization: Bearer $SPICY_API_KEY"const res = await fetch('https://api.spicyapi.ai/api/v1/chat/credit', {
headers: { Authorization: `Bearer ${process.env.SPICY_API_KEY}` },
});
const body = await res.json();
if (body.code !== 200) throw new Error(`${body.code} ${body.msg}`);
const balance = body.data;
console.log(balance.funding ?? balance);import os, requests
res = requests.get(
"https://api.spicyapi.ai/api/v1/chat/credit",
headers={"Authorization": f"Bearer {os.environ['SPICY_API_KEY']}"},
)
body = res.json()
if body["code"] != 200:
raise RuntimeError(f'{body["code"]} {body["msg"]}')
balance = body["data"]
print(balance.get("funding", balance)){
"code": 200,
"msg": "success",
"data": {
"available": "128.42",
"held": "0.36",
"total": "128.78"
}
}| 欄位 | 含義 |
|---|---|
available | 錢包淨可用額,可能因授信使用為負;不能單獨用於判斷新任務是否可受理 |
held | 在途任務凍結的部分 |
total | 兩者之和 |
可用於該模型和時點的資金不足以覆蓋預估費用時,建任務回傳 40201。授信過期、額度用盡及需要補足的資金缺口也會影響受理資格;不要在用戶端用 available 的正負自行取代伺服器端的判斷。
消費上限
四層,任意一層觸頂都會拒絕新任務並回傳 40202:
| 層 | 誰設 | 觸頂訊息 |
|---|---|---|
| 金鑰累計上限 | 你,在控制台。這把金鑰一生的天花板 | 這把金鑰已達累計消費上限 |
| 金鑰月上限 | 你,在控制台。這個自然月的預算 | 這把金鑰已達月消費上限 |
| 金鑰日上限 | 你,在控制台。新建金鑰預設帶一個較低的值 | 這把金鑰已達日消費上限 |
| 平台日上限 | 我們。這是我們自己的止血閘 | 平台今日額度已用完,請稍後再試 |
日上限按 UTC 日期計算,零點重新起算;月上限按 UTC 自然月計算,每月 1 日零點重新起算。累計上限不會重置。
還沒結算的凍結不論落在哪一天、哪一個月,都仍然佔著日上限與月上限:錢還沒花掉,但也不能再花第二次。團隊自己的日/月預算是另一層,見Console 與團隊。
日上限設成 0 表示不限制,不是「一分錢都不能花」
建立金鑰時「沒填」會套用系統預設值,「明確填 0」表示你要求不限制。兩者是不同的意圖,我們不會拿預設值去覆蓋你的明確選擇。
上限是保護你的,不是限制你。一個寫錯的迴圈在幾小時內燒掉一大筆錢,在這個行業裡是常見事故,而它幾乎總是發生在沒設上限的帳號上。
帳務明細
控制台的帳單頁會列出每一筆餘額變動。型別有這幾種:
| 型別 | 含義 |
|---|---|
topup | 儲值入帳 |
bonus | 儲值級距的贈送額,與本金分開記帳 |
hold | 任務受理時凍結預估金額;不是收費 |
settle | 成功後按實際用量結算 |
refund | 非成功終態的退回 |
adjust | 人工衝正,必附管理員身分與原因 |
chargeback | 付款爭議扣回導致的餘額回收 |
grant_expire | 未用贈金到期後的餘額扣除 |
grant_revoke | 未用贈金被撤銷後的餘額扣除 |
帳務明細只追加不修改。已經寫下的記錄不會被改寫——退款是新增一條負向記錄,不是把原記錄抹掉。這樣任何時刻的餘額都能從頭累加重算出來,「帳對不上」變成一個可自證的問題而不是羅生門。
贈送額與儲值本金分開記帳,是因為退款只退本金:贈送部分是我們的行銷成本,不是你的錢。
控制台帳單頁保留儲值、預扣、結算、退回和人工衝正等餘額變動,便於核對與爭議處理。它不受任務 input / output 30 天清理週期影響;我們目前不對所有帳務明細承諾一個統一、固定的公開保留年限。見資料留存。

