API料金とCredits
プラットフォーム別credits、処理コストとコンテンツ制限が確認された場合の課金、無料のエラー、実際の消費量・残高ヘッダーとキャッシュ課金を説明します。
成功解析はプラットフォーム別の credits で課金されます: その他多くの対応プラットフォーム 1 credits、YouTube 3 credits、Threads 2 credits、Kuaishou / Kwai(快手) 2 credits、RedNote / Xiaohongshu(小紅書) 10 credits。リクエストの失敗、空のレスポンス、コンテンツ利用不可だけでは課金されません。メディアを返せない場合は、処理コストと明確なコンテンツ制限の両方が確認された場合に限り課金されます。この例外は現在DouyinとToutiaoのみが対象です。 非対応URL、入力検証エラー、無効なAPIトークンやプラットフォーム権限不足、一時的な障害、タイムアウト、原因不明の空結果は0 creditsです。処理コストを確認できない利用不可コンテンツも無料です。
| プラットフォーム | 課金対象リクエストごとの credits |
|---|---|
| その他多くの対応プラットフォーム | 1 credits |
| YouTube | 3 credits |
| Threads | 2 credits |
| Kuaishou / Kwai(快手) | 2 credits |
| RedNote / Xiaohongshu(小紅書) | 10 credits |
課金ルールの真の参照先: GET /api/v1/capabilities → data.billing。
Creditsが消費される条件
| リクエスト結果 | 消費credits |
|---|---|
| キャッシュを含むメディアの取得成功 | プラットフォーム料金を1回 |
| 処理コストと明確なコンテンツ制限の両方を確認(Douyin / Toutiao) | プラットフォーム料金を1回 |
| 無効・期限切れ・失効済みのAPIトークン、またはプラットフォーム権限不足 | 0 |
| 非対応URLまたは入力検証エラー | 0 |
| 一時的な障害、タイムアウト、原因不明の空結果 | 0 |
| 処理コストを確認できない利用不可コンテンツ | 0 |
APIトークンの権限エラーはコンテンツ制限とは異なり、無料です。処理費用が発生しても、非公開・削除済みなどの制限付きコンテンツを取得できるとは限りません。
各リクエストはプラットフォーム料金で1回だけ課金され、メディア数・画質・内部処理回数では増えません。メディアを返すキャッシュヒットも同じ料金です。再送信は新しいリクエストであり、無料の再試行ではありません。
レスポンス
コンテンツ利用不可の場合も、課金済みの商用APIレスポンスには実消費量と残高が含まれます:
X-Credits-Charged: {actual_credits_charged}X-Credits-Remaining: {balance}X-EasyDown-Cache: HIT | MISS | SUPABASE | BYPASS
X-Credits-Charged は課金された失敗を含む実消費量、X-Credits-Remaining は返された残高です。課金済みの利用不可レスポンスには X-Credits-Charge-Reason: content_unavailable が含まれます。
RESTとMCPは同じ料金と確認済みコンテンツ制限の例外を適用します。MCPの billing.creditsCharged は失敗した結果でも実消費量を返します。
HTTPエラー、data: null、content_unavailable だけで無料と判断しないでください。課金ヘッダーがない場合や接続が切れた場合は消費量が不明なため、再送信前にダッシュボードの利用記録を確認してください。
課金のご質問は、プラットフォーム、リクエスト日時、エラーコード、利用記録の情報を添えて [email protected] へご連絡ください。APIトークンは送信しないでください。過去の課金は元の記録で確認し、この説明によって過去の取引を変更することはありません。
失敗レスポンスの形式例
以下は形式の説明用であり、新たな有料実測ではありません。/api/v1/platforms/douyin/parse の例で、残高は仮の値です。共通APIのステータス項目は異なる場合があります。
処理コスト確認後のコンテンツ利用不可:1 credit消費
HTTP/1.1 404
Content-Type: application/json
X-Credits-Charged: 1
X-Credits-Remaining: 9
X-Credits-Charge-Reason: content_unavailable
{
"status": 404,
"data": null,
"msg": "Content unavailable after processing",
"code": "content_unavailable"
}Credits不足:0 credits消費
HTTP/1.1 402
Content-Type: application/json
X-Credits-Charged: 0
X-Credits-Remaining: 0
{
"status": 402,
"data": null,
"msg": "Insufficient credits",
"code": "insufficient_credits"
}エラー処理前に課金を確認
エラーを処理する前に課金ヘッダーを読み取ってください。課金済みのコンテンツ制限エラーを無条件に自動再試行すると、再度費用が発生する場合があります。
const response = await fetch('https://api.easydown.org/api/v1/platforms/douyin/parse', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.EASYDOWN_API_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ url: "https://v.douyin.com/f-QpBB_oD9Y/" }),
});
const chargedHeader = response.headers.get('X-Credits-Charged');
const creditsCharged = chargedHeader === null ? null : Number(chargedHeader);
const chargeReason = response.headers.get('X-Credits-Charge-Reason');
const payload = await response.json();
console.log({ httpStatus: response.status, creditsCharged, chargeReason });
if (!response.ok || payload.status !== 200) {
if (creditsCharged === null || !Number.isFinite(creditsCharged)) {
console.warn('Charge unknown: check dashboard usage before resubmitting.');
}
// No automatic retry: another submission is a new request.
throw new Error(payload.code || 'parse_failed');
}