ブログ/developers·2026年9月9日·2分·執筆:eroqチーム
AI生成メディアの保存と配信:レンダリングからCDNまで
eroq APIが実際に返すもの、無料の作品ライブラリとeroq Storeの違い、CDN配信のコスト、自分の側で保持すべきデータを解説します。
メディアの生成は、誰もが計画を立てる半分です。不意を突いてくるのは、その後の90秒に起きるもう半分のほうです。受け取ったのはバイト列かリンクか、そのリンクはいつまで有効か、ファイルはどこに置かれるのか、そして金曜の夜に10万人へ配信する費用は誰が払うのか。
この記事では、eroq APIがメディアの種類ごとに返すもの、無料の作品ライブラリと有料のStoreの違い、そして何を選ぶにしても自分の側で保持しておくべきものを短くまとめます。
APIが実際に返すもの
3つのエンドポイントが、それぞれ異なる形で応答します。
画像:POST /v1/images/generationsは、デフォルトで画像をb64_jsonにbase64としてインラインで返します。エンジンがURLで応答する場合はURLを返します。response_formatでURL形式を指定することもできます。詳しくは/docs/imagesをご覧ください。
{
"created": 1756118400,
"model": "eroq-image-one",
"data": [{ "b64_json": "UklGRl4jAABXRUJQ…" }],
"usage": { "credits_spent": 10, "credits_remaining": 987 }
}
動画:非同期です。ジョブを送信してポーリングすると、完了したジョブにクリップがbase64のMP4としてインラインで含まれます。このペイロードの保持期間は24時間です。それを過ぎると、ジョブはファイルではなく単なる記録になります。/docs/videoを参照してください。
音声:POST /v1/audio/speechはJSONをまったく返しません。レスポンスボディそのものがMP3(audio/mpeg)で、そのままファイルやaudio要素に流し込めます。ボイスのパラメーターは/docs/speechにあります。
このセクションで覚えておくべきことは1つだけです。自分で求めない限り、ここに恒久的なURLは1つもありません。base64のペイロードは受け渡しの手段であってストレージではありません。24時間という期間はパイプラインが処理するための猶予であり、プロダクトの土台にできる保持ポリシーではありません。
作品ライブラリ:無料だが、ストレージ層ではない
/v1で生成した画像、動画、音声はすべて、自動的かつ無料で作品ライブラリにも保存されます。metaには完全なレシピが記録されます。モデル、演出ラックの設定、秒数、リファレンスなど、再現に必要なものすべてです。生成された各アイテムにはlibrary_idが付きます。
curl https://eroq.ai/v1/creations \
-H "Authorization: Bearer $EROQ_API_KEY"
{
"folders": [{ "id": "…", "name": "Campaign A" }],
"creations": [{
"id": "…", "kind": "video", "url": "https://…", "model": "eroq-motion-one",
"prompt": "slow pan over the rooftop", "meta": { "seconds": 10, "shot": "push-in" }
}]
}
GET /v1/creations/{id}はレシピ付きで1件を取得し、PATCHはフォルダ間で移動し、DELETEはアイテムとそのファイルを削除します。フォルダ用のCRUDも同じように用意されています。これはスタジオに表示されるのと同じライブラリです。つまり、バックエンドが作ったレンダリングはチームから見え、チームが作ったレンダリングはバックエンドから見えます。
ライブラリは、プロダクトのCDNとしてではなく、レシピの記録とチームで共有する作業場として使いましょう。「これを作るのに、正確には何を送ったのか」という疑問への答えになります。この疑問は思った以上に頻繁に浮かびます。たいていは、クライアントがあるルックを承認し、同じようなものがあと40本必要になった翌週です。
eroq Store:CDN上の永続的なURL
リクエストが終わったあとも残るリンクが必要なら、アップロードします。
curl -X POST https://eroq.ai/v1/storage/objects \
-H "Authorization: Bearer $EROQ_API_KEY" \
-F [email protected] \
-F name="poster.webp"
{
"id": "0b52…",
"object": "storage.object",
"url": "https://store.eroq.ai/acc_…/8c1f2-poster.webp",
"bytes": 482133,
"content_type": "image/webp",
"usage": { "credits_spent": 2, "credits_remaining": 880 }
}
URLはすぐに有効になり、グローバルCDN経由で配信されます。ファイルは1オブジェクトあたり最大100 MBです。GET /v1/storage/objectsは公開中のオブジェクトをURL付きで一覧表示し、DELETE /v1/storage/objects/{id}はオブジェクトを削除します。オリジンからは即座に削除され、エッジキャッシュも数分以内に消えます。
料金は、10 MBのブロックごとに2クレジットの一回払いです。使い始めたブロックは1ブロックとして数えます。ここが肝心な点です。1024×1024の画像は1ブロックなので2クレジット。4 MBのクリップも1ブロックです。11 MBのクリップは2ブロックなので4クレジットになります。課金はアップロード時の1回だけで、その後はアカウントがある限り保存され、フェアユースの範囲内で配信も含まれます。ストレージはすでに消費されているため、削除しても返金されません。
1回の呼び出しで済ませる近道もあります。画像と動画の生成エンドポイントはどちらもstore: trueを受け付けます。指定するとレンダリングが保存され、base64の代わりに永続的なCDN URLが返されます。Storeの料金は上乗せで課金され、利用明細には別の項目として記録されます。
curl -X POST https://eroq.ai/v1/videos/generations \
-H "Authorization: Bearer $EROQ_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "eroq-motion-one",
"prompt": "Rain crawls down a diner window while a waitress refills a cup without looking up, street neon bleeding through the glass. Static shot, 35mm film, practicals, neon noir palette, calm tempo.",
"seconds": 5,
"aspect": "9:16",
"store": true
}'
出力を常に保存するパイプラインなら、往復が2回から1回に減り、レンダリングがメモリ上にしか存在しない時間帯もなくなります。
ホスティングが生成と同じポリシーに従う理由
生成とホスティングは、通常2つのベンダーが提供します。利用ポリシーも2つ、請求書も2つ、キーも2組です。そしてその継ぎ目こそ、レンダリングが失われたり、他社のプロダクト向けに書かれたルールで二度目の審査を受けたりする場所です。
Storeはその継ぎ目をなくします。Storeは生成に組み込まれたオブジェクトストレージとCDNで、モデルそのものと同じ、明文化された利用ポリシーに従います。ポリシーの範囲内でAPIが生成するものは、Storeがホストします。それこそがStoreが存在する本当の理由で、CDNはあって当然の機能にすぎません。
また、デフォルトで非公開です。レンダリングは作品ライブラリに保存され、公開するまではワークスペース内だけに表示されます。さらにプライベートモード(スタジオのトグル、または画像・動画エンドポイントのprivate: true)を使えば、それすら省かれます。ファイルもライブラリの項目も残らず、利用明細のプロンプトは星印に置き換えられます。検閲なしのプロダクト向けにインフラを選んでいるなら、検閲なしAI APIガイドでトレードオフを詳しく解説しています。
自分の側で保持すべきもの
ファイル本体をどこに置くにしても、次のものは自分のデータベースに保存しておきましょう。どれも保存するのは安く、あとから復元するのは高くつきます。
- リクエストのペイロード全体。プロンプト、モデル、秒数、アスペクト比、演出ラックのすべてのパラメーター。ライブラリにもレシピは残りますが、プロバイダーを乗り換えても残るのは自分で保存したものです。
- ジョブIDと、それがどの顧客のものだったか。共有ウォレットでは、顧客ごとのコスト計算はあなたの仕事です。そしてこれは、あとから結合(JOIN)できないデータです。
usage.credits_spent(レンダリングごと)。レスポンスからコピーしておきましょう。あとで料金表から支出を再構成しようとすると、請求トラブルの元になります。- シード(シードに対応したエンジンの場合)。「同じようなテイクをもう1本作れる」と「一度だけ運が良かった」の差はここにあります。詳しくは/glossary/seedを、エンジンごとの対応機能は/modelsをご覧ください。
- ファイル本体のコピー(そのメディアが誰かに納品すべき成果物の場合)。特定のURLが切れるからではなく、クライアントが代金を払ったファイルの保管場所が1か所だけであってはならないからです。
二重に支払わずに配信する
<img>タグと<video>タグには、CDNのURLを直接指定しましょう。メディアをアプリケーションサーバー経由でプロキシしてはいけません。帯域幅の料金を二重に払うことになり、レイテンシーが1ホップ分増え、静的アセットがオートスケーラーの考慮すべきリクエストに変わってしまいます。
動画について、実用的な注意点が2つあります。1つ目は、すべてのクリップにポスター画像を設定することです。ポスターのないvideo要素は最初のフレームがデコードされるまでグレーの四角形で、フィードではページが壊れているように見えます。2つ目は、レンダリングが届いた瞬間に永続URLを設定することです。コピーや保存を行うべき場所はWebhookハンドラーかポーリングループであり、24時間の期間が終わったあとに走る夜間ジョブではありません。
よくある質問
eroqは生成した動画をどのくらいの期間保持しますか?
完成したクリップは、ジョブ上で24時間インラインで取得できます。永続的なURLが必要なら、それまでに保存してください。生成の呼び出しでstore: trueを指定するか、あとからeroq Storeにアップロードします。
eroq Storeでメディアをホスティングする費用は?
10 MBのブロックごとに2クレジットの一回払いで(使い始めたブロックも1つと数えます)、アップロード時に課金されます。一般的な1024×1024の画像は1ブロック、11 MBのクリップは2ブロックです。CDNでの配信はフェアユースの範囲内で料金に含まれ、オブジェクトを削除してもアップロード料金は返金されません。
作品ライブラリとStoreは同じものですか?
いいえ。ライブラリはすべてのレンダリングを完全なレシピ付きで自動的かつ無料で保存し、検索やリミックスに使うためのものです。Storeは有料の永続的なオブジェクトホスティングで、ユーザーにそのまま提供できるCDN URLを発行します。
/docsでストレージとメディアのエンドポイントを確認し、レンダリングする前に、それぞれのレンダリングの行き先を決めておきましょう。
この記事で使ったモデルで作ってみましょう。無料の50クレジットで始めるか、全エンジンと料金をご覧ください。