
日次AI動画のコスト計算:30日間のAPI予算ガイド
日次AI動画のコスト計算を実例で解説。リトライ、無料クレジット上限、安全なAPIポーリング、ストレージ、ユーザーレビューまで網羅した30日間の実践ガイド。
テストした設定では、1日1本のビデオを30日間続けると、生成費用は合計$2.52です。各試行は seedance-2.0-mini で 5 秒間、480p、9:16 のクリップです。単一のテスト実行は 84 reAPI クレジット($0.084)を消費し、107.2 秒で完了して 1 本のビデオ URL を返しました。[6]
これはシンプルな答えですが、本番予算ではまだです。完了した API タスクは、必ずしも公開するクリップではありません。レビューで試行の半分が却下された場合、生成予算は月 $5.04 に倍になります。ストレージ、スケジューリング、編集、人間によるレビューはこの数字の外にあります。
このガイドでは正確な数字を計算し、不確実な POST を繰り返すべきかどうか推測する代わりに、手動で調整するまで実行する単一ワーカーの例を示します。
TL;DR
- テスト済みの 5 秒、480p、9:16 の Seedance 2.0 Mini タスクは 84 クレジット = $0.084 を消費しました。30 回の完了した同一試行は $2.52 のコストになります。
- 完了した試行あたりの受け入れられたビデオ数で予算を立ててください。スケジュールされた投稿数ではなく。1.5 試行あたり 1 クリップの受け入れで、30 日間の生成予算は $3.78 です。2 試行の場合は $5.04 です。
- 対象となる新規アカウントはプロモーション テスト クレジットを受け取る場合がありますが、公開価格ページは固定額や日次リセットを保証していません。[3]これらを繰り返し容量ではなくプロトタイプの走行時間として扱います。
- タスク ID をすぐに保存してください。受け入れられたすべての繰り返される
POSTは別々のタスクとクレジット予約を作成します。完了した各タスクはそれ自身の使用を決済します。Idempotency-Keyはトレース値を記録しますが、ビデオリクエストを重複排除しません。[4] - 約 5 秒ごとに
GETでタスクをポーリングし、返されたファイルを制御下のストレージにアーカイブし、手動レビュー ステップの背後で公開を続けます。[5] - 107.2 秒の結果は 1 つのテスト実行であり、平均速度、稼働時間、または視覚的品質についての主張ではありません。
ユーザーが実際に尋ねている毎日のビデオ質問
毎日 1 本か 2 本の短い縦型クリップを作成でき、公開 HTTPS URL を返し、自動ポスト フローの内部で機能できる実際の REST API が必要ですか? 9:16 で約 4~5 秒のプロトタイプの場合、コストは質問の半分に過ぎません。回復はプロトタイプがスケジュールになるとすぐに重要になります。ワークフローには、賢いプロンプトが必要になる前に、永続的な状態と意図的なリトライ ポリシーが必要です。
1 つの 107 秒の実行、限定的な結論を持つ
テストでは、テキスト プロンプトを受け入れ、9:16 と 4~5 秒の継続時間の両方を明確にサポートする、現在見つかった最も安価な reAPI 構成を使用しました。480p の Seedance 2.0 Mini。[1]モデル ドキュメントでは 480p または 720p、9:16 出力、および 4~15 秒の継続時間を許可しています。[2]
| テストフィールド | 記録された値 |
|---|---|
| 日付 | 2026 年 9 月 3 日 |
| タスク ID | task_01a06547163473ecb7dab4478ee1abaa |
| モデル | seedance-2.0-mini |
| リクエスト | 480p、9:16、5 秒 |
| オーディオ | オフ |
| ウォーターマーク | オフ |
| 提出 | 1 |
| 最終ステータス | 完了 |
| 経過時間 | 107.2 秒 |
| 報告された使用量 | 84 クレジット / $0.084 |
| 返されたアウトプット | 1 ビデオ URL |
このテスト実行のアーカイブ出力:5 秒、480p、9:16、オーディオ オフ、ウォーターマーク オフ。技術的な完了と請求が確認されました。創造的な受け入れは評価されていません。
現在の 480p レートは $0.016625 /秒です。[1]reAPI は 1 クレジットを $0.001 と計算し、タスクを次の整数クレジットに丸めます。[2]テスト リクエストの場合:
ceil(0.016625 $ × 5 秒 × 1,000 クレジット/ドル)
= ceil(83.125 クレジット)
= 84 クレジット
= $0.084受け入れられた POST は独自のタスクのクレジットを予約します。この予約は、そのタスクが終了状態に達すると解決されます。status を usage.credits と一緒に読んで、入場ホールドを最終請求として扱わないでください。Seedance 2.0 Mini は、その文書化された請求ポリシーに基づいて失敗した生成を払い戻します。[2][5]
この 1 つの結果は、リクエスト パス、完了ステータス、返された URL、および請求を確認します。典型的なレンダリング時間、成功率、受け入れ率、または視覚品質スコアを確立することはできません。
テスト レコードをダウンロード。これには、リクエスト設定、タスク ID、経過時間、終了状態、および決済されたクレジットが含まれます。一時的なタスク URL は省略されます。レコードは、永続的な reAPI CDN ストレージの同じビデオを指しています。
価格は変わることがあります。これらの数字をカスタマー見積もりまたはハード支出制限に変える前に、ライブ Seedance 2.0 Mini モデル ページを確認してください。
30 日間予算は完了した試行から始まる
最小限の月次計算は単純です:
30 日 × 84 クレジット = 2,520 クレジット = $2.52これは、1 つの完了した試行が毎日 1 つの受け入れられたビデオになることを前提としています。より有用な計画式は:
月間生成コスト
= 日数 × 1 日あたりのビデオ × 受け入れられたビデオあたりの完了試行 × 試行あたりのコストテスト済みのレートで 1 日あたり 1 つの受け入れられたクリップの場合:
| 受け入れられたビデオあたりの完了試行 | 月間試行 | 30 日間の API 予算 |
|---|---|---|
| 1.0 | 30 | $2.52 |
| 1.5 | 45 | $3.78 |
| 2.0 | 60 | $5.04 |
| 3.0 | 90 | $7.56 |
「1.5 試行」は月平均であり、半リクエストではありません。15 クリップは初回合格し、15 は交換が必要になる可能性があります。悪い動き、構成、またはブリーフとの不一致で却下された完了生成をカウントします。
解像度と期間も開始単価を変更します。以下の数字は現在の文書化されたレートと請求式を適用します。5 秒 480p 行だけがこの記事のテストとして実行されました。
| 設定 | 試行あたりのクレジット | 試行あたりのコスト | 30 試行 |
|---|---|---|---|
| 480p、4 秒 | 67 | $0.067 | $2.01 |
| 480p、5 秒 | 84 | $0.084 | $2.52 |
| 720p、4 秒 | 144 | $0.144 | $4.32 |
| 720p、5 秒 | 180 | $0.180 | $5.40 |
これらは生成コストであり、合計コンテンツ コストではありません。プロンプト作成、ソース アセット、編集、字幕、音楽ライセンス、オブジェクト ストレージ、自動化ホスティング、プラットフォーム API 手数料、および各クリップの承認に費やした時間を除外します。
無料クレジットが持続可能な容量ではない理由
無料クレジットは、認証、リクエスト フィールド、ポーリング、およびダウンロードが機能することを証明できます。既知の数量と更新ルールなしで、定期的な約束をサポートすることはできません。
対象となる新規アカウントはプロモーション テスト クレジットを受け取る場合があります。提供可能性と金額は、サインアップまたはダッシュボードに表示されます。公開価格ページは固定金額または日次リセットを約束していません。[3]これにより、付与は信頼できる月間容量として適さなくなります。同じルールが消費者アプリの許容量に適用されます。文書化された API アクセス、制限、およびリセット動作がない場合、UI クレジットは API 予算ではありません。
フリー残高を使用して 1 つの狭いパスをテストします。次に、定常状態ワークフローを有料レートでバジェットし、無料クレジットを一時的な削減として扱います。これにより、デモ当日だけでなく、プロジェクトの起動後に実行可能になります。
最初のリクエストを自動化する前に
初心者向けのセットアップの場合、これらの部分を準備してください:
- reAPI アカウントとサーバー側の API キー。キーをブラウザー コード、パブリック リポジトリ、またはダウンロード可能なワークフローに入れないでください。
- 1 つの短いシーンを説明するプロンプト。5 秒はマルチシーン ストーリーには不十分です。
- cron、GitHub Actions、n8n、またはキュー ワーカーなどのスケジューラー。
- 毎日のジョブ キーと reAPI タスク ID を保存するための耐久性のある場所。
- 完了したファイルのための制御下のストレージ。
- クリップが公開される前にレビューする人。
以下の例は UTC 日付を使用します。コンテンツ カレンダーがローカル タイムゾーンに従う場合、そのタイムゾーンでジョブ日付を一貫して計算してください。そうしないと、真夜中の近くのジョブが間違った日付を受け取る可能性があります。
cURL で 9:16 ビデオを送信
シェルで API キーを設定することから始めます:
export REAPI_API_KEY='replace-with-your-server-side-key'タスクを送信し、何か別のことをする前に応答を保存します:
curl --fail-with-body --silent --show-error \
--request POST 'https://reapi.ai/api/v1/videos/generations' \
--header "Authorization: Bearer $REAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "seedance-2.0-mini",
"prompt": "A handmade ceramic cup beside an open notebook, soft morning window light, one slow push-in shot, natural motion, no text",
"resolution": "480p",
"aspect_ratio": "9:16",
"duration": 5,
"generate_audio": false,
"watermark": false
}' \
--output submit.jsonsubmit.json を開いて、その id をコピーします。jq がある場合は、これが抽出されます:
TASK_ID="$(jq -r '.id' submit.json)"
test -n "$TASK_ID" && test "$TASK_ID" != 'null' || exit 1
printf '%s\n' "$TASK_ID" > task-id.txtポーリングは GET を使用します。クレジットを消費しません:[5]
curl --fail-with-body --silent --show-error \
--header "Authorization: Bearer $REAPI_API_KEY" \
"https://reapi.ai/api/v1/tasks/$TASK_ID" \
--output task.json
jq '{id, status, usage, output, error}' task.jsonステータスが processing のうち、約 5 秒後に最後のコマンドをもう一度実行します。文書化された終了状態は completed と failed です。最初のポーリングにまだビデオがないからといって、POST を再送信しないでください。
Node.js で安全な毎日のワークフローを構築
cURL の例がフィールドを証明しています。以下のスクリプトは 単一ワーカー、アットモスト一度のガードです。厳密に一度のキューではありません。送信前の意図を永続化し、応答が到着するとすぐにタスク ID を記録し、各ネットワーク呼び出しを制限し、ローカルにアーカイブし、POST が受け入れられたかどうかを知ることができない場合は手動調整を停止します。Node.js 20 以降を使用し、外部パッケージはありません。同じ JSON ファイルに対して 2 つのコピーを実行しないでください。
daily-video.mjs として保存します:
import { mkdir, readFile, rename, writeFile } from 'node:fs/promises';
import { join } from 'node:path';
const API_BASE = 'https://reapi.ai/api/v1';
const STORE_PATH = './daily-video-jobs.json';
const OUTPUT_DIR = './daily-video-output';
const POLL_MS = 5_000;
const POLL_LIMIT_MS = 30 * 60 * 1_000;
const POST_TIMEOUT_MS = 30_000;
const GET_TIMEOUT_MS = 20_000;
const DOWNLOAD_TIMEOUT_MS = 120_000;
const apiKey = process.env.REAPI_API_KEY;
if (!apiKey) {
throw new Error('Set REAPI_API_KEY in the server environment.');
}
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
function retryAfterMs(value) {
if (!value) return POLL_MS;
const seconds = Number(value);
if (Number.isFinite(seconds)) return Math.max(seconds * 1_000, 0);
const date = Date.parse(value);
return Number.isNaN(date) ? POLL_MS : Math.max(date - Date.now(), 0);
}
async function loadJobs() {
try {
return JSON.parse(await readFile(STORE_PATH, 'utf8'));
} catch (error) {
if (error.code === 'ENOENT') return {};
throw error;
}
}
async function saveJobs(jobs) {
const temporaryPath = `${STORE_PATH}.tmp`;
await writeFile(temporaryPath, `${JSON.stringify(jobs, null, 2)}\n`);
await rename(temporaryPath, STORE_PATH);
}
async function requestJson(url, options) {
const response = await fetch(url, options);
const body = await response.text();
let data;
try {
data = JSON.parse(body);
} catch {
data = { raw: body };
}
if (!response.ok) {
const error = new Error(`HTTP ${response.status}: ${body.slice(0, 300)}`);
error.status = response.status;
error.retryAfterMs = retryAfterMs(response.headers.get('retry-after'));
error.requestId = data?.error?.request_id ?? null;
throw error;
}
return data;
}
async function archiveVideo(url, jobKey) {
const response = await fetch(url, {
signal: AbortSignal.timeout(DOWNLOAD_TIMEOUT_MS),
});
if (!response.ok) {
throw new Error(`Video download failed with HTTP ${response.status}.`);
}
await mkdir(OUTPUT_DIR, { recursive: true });
const safeName = jobKey.replace(/[^a-z0-9-]/gi, '_');
const outputPath = join(OUTPUT_DIR, `${safeName}.mp4`);
const bytes = Buffer.from(await response.arrayBuffer());
await writeFile(outputPath, bytes);
return outputPath;
}
async function main() {
const utcDate = new Date().toISOString().slice(0, 10);
const jobKey = `daily-short:${utcDate}`;
const jobs = await loadJobs();
if (!jobs[jobKey]) {
// Persist intent before POST. A crash after this point must not cause an
// automatic second submission on the next scheduler run.
jobs[jobKey] = {
state: 'submitting',
createdAt: new Date().toISOString(),
idempotencyKey: jobKey,
};
await saveJobs(jobs);
try {
const task = await requestJson(`${API_BASE}/videos/generations`, {
method: 'POST',
headers: {
Authorization: `Bearer ${apiKey}`,
'Content-Type': 'application/json',
// Trace-only on reAPI. This header does not deduplicate the POST.
'Idempotency-Key': jobKey,
},
signal: AbortSignal.timeout(POST_TIMEOUT_MS),
body: JSON.stringify({
model: 'seedance-2.0-mini',
prompt:
'A handmade ceramic cup beside an open notebook, soft morning ' +
'window light, one slow push-in shot, natural motion, no text',
resolution: '480p',
aspect_ratio: '9:16',
duration: 5,
generate_audio: false,
watermark: false,
}),
});
if (!task.id) throw new Error('Submission returned no task ID.');
jobs[jobKey] = {
...jobs[jobKey],
state: 'processing',
taskId: task.id,
submittedAt: new Date().toISOString(),
};
await saveJobs(jobs);
} catch (error) {
const receivedHttpResponse = Number.isInteger(error.status);
jobs[jobKey] = {
...jobs[jobKey],
state: receivedHttpResponse ? 'submit_rejected' : 'submit_uncertain',
error: error instanceof Error ? error.message : String(error),
requestId: error.requestId ?? null,
};
await saveJobs(jobs);
throw new Error(
receivedHttpResponse
? `Submission for ${jobKey} was rejected. Review the HTTP error ` +
'before creating a separately counted retry.'
: `Submission for ${jobKey} is uncertain. Use ${jobKey} and the ` +
'saved request ID, if present, to inspect logs or the dashboard. ' +
'Do not submit again until a person reconciles the result.',
);
}
}
let job = jobs[jobKey];
if (job.state === 'pending_review' || job.state === 'approved') {
console.log(`${jobKey} already has an archived output: ${job.archivePath}`);
return;
}
if (job.state === 'completed_no_output') {
throw new Error(
`${jobKey} completed without a video URL. Inspect ${job.taskId}; do not POST again.`,
);
}
if (job.state === 'failed') {
throw new Error(
`${jobKey} failed. Review its settled usage before creating a new retry key.`,
);
}
if (!job.taskId) {
throw new Error(
`${jobKey} has no task ID. Resolve ${job.state} manually; do not resubmit.`,
);
}
if (!job.outputUrl) {
const deadline = Date.now() + POLL_LIMIT_MS;
let task;
while (Date.now() < deadline) {
try {
task = await requestJson(`${API_BASE}/tasks/${job.taskId}`, {
headers: { Authorization: `Bearer ${apiKey}` },
signal: AbortSignal.timeout(GET_TIMEOUT_MS),
});
} catch (error) {
const remainingMs = Math.max(deadline - Date.now(), 0);
if (error.status === 429) {
const waitMs = Math.min(error.retryAfterMs ?? POLL_MS, remainingMs);
console.warn(`Rate limited; waiting ${waitMs} ms before another GET.`);
if (waitMs > 0) await sleep(waitMs);
continue;
}
const networkError = !Number.isInteger(error.status);
const serverError = error.status >= 500 && error.status < 600;
if (!networkError && !serverError) {
throw error;
}
const waitMs = Math.min(POLL_MS, remainingMs);
console.warn('Network or server error; retrying the same task GET.');
if (waitMs > 0) await sleep(waitMs);
continue;
}
if (task.status === 'completed' || task.status === 'failed') break;
if (task.status !== 'processing') {
throw new Error(`Unexpected task status: ${task.status}`);
}
await sleep(Math.min(POLL_MS, Math.max(deadline - Date.now(), 0)));
}
if (!task || (task.status !== 'completed' && task.status !== 'failed')) {
jobs[jobKey] = { ...job, state: 'poll_timeout' };
await saveJobs(jobs);
throw new Error(
'Polling timed out. The task may still be running; do not POST again.',
);
}
if (task.status === 'failed') {
jobs[jobKey] = {
...job,
state: 'failed',
usageCredits: task.usage?.credits ?? null,
taskError: task.error ?? null,
};
await saveJobs(jobs);
throw new Error(
'Generation failed. Review settled usage before scheduling a retry.',
);
}
const outputUrl = task.output?.video_urls?.[0];
if (!outputUrl) {
jobs[jobKey] = {
...job,
state: 'completed_no_output',
usageCredits: task.usage?.credits ?? null,
completedAt: new Date().toISOString(),
};
await saveJobs(jobs);
throw new Error('Completed task returned no video URL; do not POST again.');
}
// Save completion before downloading so storage trouble cannot trigger POST.
jobs[jobKey] = {
...job,
state: 'completed',
outputUrl,
usageCredits: task.usage?.credits ?? null,
completedAt: new Date().toISOString(),
};
await saveJobs(jobs);
job = jobs[jobKey];
}
try {
const archivePath = await archiveVideo(job.outputUrl, jobKey);
jobs[jobKey] = {
...job,
state: 'pending_review',
archivePath,
archiveError: null,
};
await saveJobs(jobs);
console.log(`Saved ${archivePath}. Review it before publishing.`);
} catch (error) {
jobs[jobKey] = {
...job,
state: 'archive_failed',
archiveError: error instanceof Error ? error.message : String(error),
};
await saveJobs(jobs);
throw new Error(
'Archiving failed. The task remains completed; rerun to retry only the download.',
);
}
}
await main();1 回実行します:
node daily-video.mjsJSON ファイルは 1 台のマシンで再読み込み可能ですが、マルチワーカー ロックではありません。本番環境では、一意の job_key を持つデータベース行を挿入し、原子的なクレームを勝ち取るワーカーのみが scheduled から submitting に移動させます。データベース クレームは、2 つのライブ ワーカーが一緒に送信するのを防ぎます。データベースの書き込みと外部 API リクエストを原子的にすることはできません。
クラッシュ後に何が起こるか
安全な次のアクションは、ストレージに到達した最後の状態に依存します:
| 最後の永続的な状態 | ワークフローが知っていること | 次のアクション |
|---|---|---|
| 行なし | インテント保存が完了しず、このコードが保存前に POST することはありません | 通常に開始 |
submitting または submit_uncertain、タスク ID なし | POST が開始されていない、または応答が失われる前に受け入れられた可能性があります | 停止して手動で調整。自動 POST しないでください |
submit_rejected | 非 2xx 応答が到着 | エラーを確認してから、別途カウントされたリトライを作成してください |
processing または poll_timeout、タスク ID 現在 | タスクが存在 | その ID のポーリングを再開 |
failed | タスクが終了エラーに達して使用量を解決 | usage.credits を確認。意識的な決定後にのみ新しいリトライ キーを使用 |
completed または archive_failed、出力 URL 現在 | 生成完了 | ダウンロードのみをリトライ |
completed_no_output | タスクが予期された URL なしで終了 | そのタスクを検査してください。再度 POST しないでください |
pending_review または approved | ファイルがアーカイブされます | API 作業なしで終了 |
不確実な状態は避けられないギャップです。接続は reAPI がリクエストを受け入れた後、タスク ID がプロセスに到達する前に失敗する可能性があります。スクリプトは日次ジョブ キーを Idempotency-Key として送信し、ログが試みを相関させることができるようにしますが、reAPI はそのヘッダーをトレースのみで記録します。重複排除しません。[4]受け入れられた 2 番目の POST は別のタスクと予約を作成し、2 番目の完了は別の料金を解決します。ログまたはダッシュボードがあいまいさを解決できない場合、オペレーターはその日のクリップをスキップするか、重複のリスクを冒すかの間で選択する必要があります。このサンプルには正直な自動厳密に 1 度の答えはありません。
タスク ルックアップは異なります。GET を再試行してもジェネレーションは作成されず、クレジットは使用されません。この例は各リクエストを上限とし、決定的な 4xx エラーで停止し、429 で Retry-After を尊重し、30 分のポーリング ウィンドウ内でネットワーク エラーまたは 5xx レスポンスを再試行します。5 秒の間隔は、タスク エンドポイントの 5 秒のイン フライト キャッシュの繰り返し読み取りを回避します。[5]
公開する前にクリップを確認して保存
API のジョブはファイルが配信されると終了します。技術的に完了したクリップは、まだブリーフを誤解したり、ソーシャル フィードで失敗したりする可能性があります。すべての結果を次の点でレビューします:
- 意図したサブジェクト、アクション、カメラ ムーブメント。
- ゆがんだオブジェクト、手、顔、パッケージ、またはロゴ。
- 不要な単語または架空の製品クレーム。
- ちらつき、突然のシーン変更、または安全でない作物。
- プロンプト、参考資料、音楽、肖像の権利。
- ターゲット プラットフォームの現在の技術およびディスクロージャ要件。
このチェック後にのみ、クリップを approved としてマークします。失敗した場合は、daily-short:2026-09-03:retry-1 のような個別にカウントされたリトライを作成します。最初の試みをコスト台帳から削除しないでください。
明日のパブリッシング キューに追加する前に MP4 を移動してください。reAPI の出力 URL はハンドオフ場所であり、永続的なメディア ライブラリではありません。[5]チュートリアルはローカルに保存します。S3、R2、またはお客様の通常のオブジェクト ストア を一時的にデプロイします。
$2.52 という数字が約束しないこと
月間の数字は透明なシナリオであり、保証ではありません。30 日間、同じ価格、期間、解像度、および完了試行の数を前提としています。それは確立していません:
- 1 つの 107.2 秒の観察からの通常のキューまたは生成時間。
- サービス稼働時間または失敗率。
- プロンプトに対する視覚的受け入れ率。
- 要求された 480p および 9:16 設定を超えた正確な出力寸法。
- 任意のソーシャル プラットフォームへのパブリッシング成功。
- 将来の価格または無料クレジット提供可能性。
これらの変数をダッシュボードに表示したままにしてください。最低限、job_key、task_id、リクエストされた設定、最終ステータス、usage.credits、レビュー決定、およびアーカイブされたオブジェクト URL を記録してください。30 日後、想定される試行あたりのビデオ数を独自に測定したユーザー受け入れ率で置き換えてください。
よくある質問
毎日 5 秒の垂直 AI ビデオはいくらですか?
テスト済みの Seedance 2.0 Mini 構成は、完了した 5 秒の 480p 9:16 タスクに対して 84 クレジット、つまり $0.084 を消費しました。1 日 1 つの完了した試行で 30 日のコストは $2.52 です。将来の月のバジェットを立てる前に、ライブ モデル価格を確認してください。
1 日に 2 つのビデオが必要な場合はどうしますか?
受け入れられたビデオあたり 1 つの完了した試行で、テスト済みのレートで 60 試行のコストは $5.04 になります。これに測定した試行をビデオあたりで掛けます。たとえば、受け入れあたり 1.5 試行は生成予算を $7.56 にします。
毎日リセットされる無料のテキストからビデオへの API はありますか?
プロバイダーが API キー アクセス、正確な無料数量、対象モデル、リセット スケジュールを文書化していない限り、想定しないでください。対象となる reAPI アカウントはプロモーション テスト クレジットを受け取る場合があります。提供可能性と金額はサインアップまたはダッシュボードに表示されます。公開価格ページは固定の付与または日次リセットを約束していません。[3]
完了した試行ではなく公開されたクリップをカウントする理由は何ですか?
API は技術的に有効なビデオを完成させることができますが、創造的、ブランド、法的、または作物レビューが失敗する可能性があります。請求はジェネレーション使用に従います。コンテンツ カレンダーは受け入れられたクリップに従います。両方の数字を記録すると、公開可能な結果あたりの実コストが明らかになります。
失敗した Seedance 2.0 Mini タスクはクレジットをコストしますか?
モデル ドキュメントは、失敗した生成が自動的に払い戻されると言っています。[2]それでも、値を想定する代わりに、タスクの最終ステータスと usage.credits を記録してください。失敗したリクエストは時間がかかる場合があり、別途請求されたリプレースメント試行につながる可能性があります。
同じ idempotency キーで送信を安全に再試行できますか?
いいえ。各受け入れられた POST は別のタスクとクレジット予約を作成します。完了した各タスクはその usage.credits を決済します。Idempotency-Key はトレース値であり、重複排除ではありません。[4]独自のジョブ キーとタスク ID を維持し、送信結果が不確実な場合は手動調査を停止します。
返されたビデオ URL から直接公開できますか?
最初にファイルをアーカイブしてください。タスク出力リンクは制御下のストレージの代替ではなく、直接公開はレビュー ステップをスキップします。ビデオを保存し、レビューして、保存されたオブジェクトをパブリッシング ワークフローに渡します。[5]
107.2 秒が通常の生成時間ですか?
わかりません。1 つのテスト実行の経過時間です。通常のレイテンシまたは信頼性の測定には、多くの日付実行と定義されたサンプルが必要です。失敗したタスクとタイムアウトしたタスクを含めます。
結論
「毎日の AI ビデオにいくらかかりますか?」という質問への有用な答えは、単に呼び出しあたり $0.084 ではありません。完璧な 30 日間の実行で $2.52、またはワークフローが受け入れられたクリップあたり平均 1.5~3 回の完了試行を平均する場合は $3.78~$7.56 です。その範囲から始めて、独自のレビュー通過率を測定し、無料クレジットを定常容量計画から外してください。
最初の本番マイルストーンは同等の実用的です。1 つの原子的に主張される毎日のジョブ キー、1 つの保存されたタスク ID、安全な GET ポーリング、1 つのアーカイブ ファイル、および 1 つの人間の承認。そのループが機能したら、毎日のスケジュール設定は簡単な部分です。
References
- reAPI. Video model catalog and Seedance 2.0 Mini model page. Retrieved September 3, 2026.
- reAPI. Seedance 2.0 Mini API documentation. Retrieved September 3, 2026.
- reAPI. Pricing. Retrieved September 3, 2026.
- reAPI. API overview. Retrieved September 3, 2026.
- reAPI. Task status and polling documentation. Retrieved September 3, 2026.
- reAPI. First-party Seedance 2.0 Mini smoke-test record. Task
task_01a06547163473ecb7dab4478ee1abaa, completed September 3, 2026. One 480p, 9:16, five-second request with audio and watermark disabled; 84 credits, 107.2 seconds, and one returned video URL.
Further reading
著者

カテゴリ
他の記事

AI動画の自然な演技をビートシートで計画する
AI動画で信頼できる会話シーンを実装するビートシート、キャラクター状態定義、カメラプログレッション、プロンプトテンプレート、検証フロー、API実装例を学べます。


DeepSeek Harness・OpenCode・Claude:ツール比較
DeepSeek Harness、OpenCode、Claude Code を、ランタイム所有権、モデル選択、プラグイン、権限、セットアップ負担、エージェントループコストで比較します。


Claudeのコンテキストウィンドウ:何がカウントされるか
Claudeのコンテキストウィンドウは現在のモデルで1M。ツール定義、保持シンキング、キャッシュがすべて消費します。より多いことが必ずしも良いわけではありません。
