RapidVideoMaker
アカウントを作成

API RapidVideoMaker

REST APIを使用すると、PythonスクリプトやN8nワークフローなどあらゆるHTTPクライアントからビデオを処理できます。5つのモード: 動画を結合(複数MP4)、音声を編集(1 MP4/MOV + 1 MP3)、動画を作成(1 JPG/PNG + 1 MP3)、ビデオオーバーレイ(2 MP4/MOV ピクチャーインピクチャー)。処理は非同期です。

無料でAPIトークンを取得
APIトークンを取得するためにアカウントを作成してください — 1日20リクエスト含む。
無料アカウントを作成 アカウントをお持ちですか?ログイン

完全なワークフロー

すべての統合は同じ4ステップのシーケンスに従います:

1
ジョブを作成 — POST /api/v1/render.php
Bearerトークンと共にファイルをmultipart/form-dataとして送信します。1枚のJPG/PNG画像 + 1つのMP3 + mode=image_to_video → 動画生成。1つのMP4/MOV + 1つのMP3 → 音声編集。複数のMP4/MOV → 結合。サーバーは一意のjob_idを返します。または画像1枚 + options.text + options.voice:音声はテキストから生成され、MP3は不要です。
2
ジョブを待機 — GET /api/v1/jobs.php?job_id=…
このエンドポイントを定期的(5〜10秒ごと)にポーリングします。ジョブはqueued → processing → ready(またはerror)と進みます。
3
ダウンロードURLを取得
ステータスがreadyになると、レスポンスに使用可能なdownload_urlフィールドが含まれます。
4
ファイルをダウンロード — GET /api/download.php?job_id=…
最終MP4/MOVをダウンロードします。ファイルはジョブ完了後2時間利用可能で、その後自動的に削除されます。

認証

すべてのリクエストにAPIトークンを含める必要があります。2つの形式が受け入れられます:

# 認証 — すべてのリクエストにAPIトークンを含める必要があります。2つの形式が受け入れられます: Authorization: Bearer rvm_your_token_here # Alternative X-API-Key: rvm_your_token_here

トークンはメンバーエリアで利用可能です — アカウントごとに1つのトークン、登録時に自動的に作成されます。

クォータ

各メンバーアカウントはWebインターフェースとAPI間で共有される1日20リクエストを持ちます。失敗したジョブはクォータを消費しません。カウンターはUTC深夜にリセットされます。

POSTレスポンスにはquota_usedとquota_remainingが含まれます。制限を超えると、サーバーは429で応答します。

インターフェース + API = 同じカウンター。Webインターフェースから作成した動画とAPIリクエストは、それぞれ同じ1日クォータから1クレジットを消費します。

キュー

一度に1つのジョブが処理されます。複数のジョブが同時に送信された場合、キューに入れられ順番に処理されます。待機中、ステータスレスポンスには以下が含まれます:

レート制限が適用されます:/api/v1/jobs.phpエンドポイントはトークンあたり1分間に12回までの呼び出しを受け入れます。推奨:呼び出し間隔10秒。

利用可能なトランジション

直接マージにはtransition_type=none(デフォルト)を指定し、クリップ間のフェードには以下のいずれかの種類を使用します:

none fade fadeblack dissolve wipeleft wiperight slideleft slideright zoomin circleclose

期間(transition_duration)は0.2〜2.0秒です。

エンドポイント

POST /api/v1/render.php 動画処理ジョブを作成します

5つのモードをmodeフィールドで指定します(複数MP4でmodeを省略するとfusionを自動検出):

使用法APIモード必要なファイル説明
動画を結合 fusion 2〜20個のMP4/MOVファイル クリップは提供された順序で端から端へ組み立てられます。クリップ間にオプションのトランジションを設定できます。
音声を編集 add_audio または mix_audio 1つのMP4/MOV + 1つのMP3 動画の音声トラックを置き換えまたは強化します。動画トラックは再エンコードされません。

add_audio — 元の音声が削除され、MP3に完全に置き換えられます。
mix_audio — 元の音声が保持され、MP3がオーバーレイされます。
動画を作成 image_to_video JPG/PNG 1枚 + MP3 1つ — またはJPG/PNG 1枚 + テキスト(options.text + options.voice):音声を生成 静止画像と手持ちのMP3から — またはテキスト(options.text)だけから(音声はoptions.voiceで生成)— 動画を生成します。テキストオーバーレイ(固定・単語ごと・カラオケ)、フェード、解像度、fpsはoptionsフィールドで設定可能です。
ビデオオーバーレイ overlay_video 2 MP4/MOV メイン動画の上に2本目の動画を重ねます。位置・サイズ・不透明度・音声はoptionsフィールドで設定できます。
テキスト追加 add_text MP4/MOV 1本 既存の動画にテキストを重ねます(解像度、フレームレート、音声は維持されます)。image_to_video と同じテキスト設定に加え、テキストの表示タイミングを指定できます。options.text は必須です。
テキストをMP3に text_to_mp3 (テキストのみ) テキストを音声に変換してMP3ファイルを返します。ファイルのアップロード不要 — mode=text_to_mp3、text、lang をフォームフィールドとして送信してください。サイトの20言語すべてをサポート。
厳密な検証:各モードには正確な数とファイルの種類が必要です。add_audioとmix_audioは1つのMP4/MOV + 1つのMP3のみを受け入れます。image_to_videoは1枚のJPG/PNG + 1つのMP3のみを受け入れます。例外:options.text + options.voiceを指定すると、image_to_videoは画像1枚のみを受け付けます。音声はテキストから生成されます(MP3なし)。
期間ルール:音声モードとimage_to_videoモードでは、結果の期間はMP3の期間にロックされます。options.voiceを指定した場合、image_to_videoの長さはテキストから生成した音声の長さになります(+0.6秒)。

共通パラメータ(multipart/form-data)

フィールド種類必須説明
videos[]File[]はい処理するファイル。モードによって異なります:2〜20個のMP4/MOV、または1つのMP4/MOV + 1つのMP3、または1枚の画像(JPG/PNG)+ 1つのMP3。1ファイルあたり最大500 MB。
modestring*image_to_video | add_audio | mix_audio | overlay_video | text_to_mp3。これらの非fusionモードには必須です。MP4/MOVファイルのみでmodeを省略すると、常にfusionがトリガーされます(ストリームコピー結合)— 正確に2つのMP4/MOVがアップロードされてもoverlay_videoには決してなりません。音声編集の場合:add_audioは元の音声を削除し、mix_audioは保持して重ねます。modeフィールドが指定された場合、アップロードされたファイルは正確に一致する必要があります — そうでない場合リクエストは拒否されます。 add_text も指定できます。MP4/MOV ファイルを1本だけ受け付ける唯一のモードで、options.text が必要です。
orderJSONfusionモードのみ — クリップの順序を定義するインデックスのJSON配列。
transition_typestringfusionモードのみ。デフォルト:none。
transition_durationfloatfusionモードのみ。期間0.2〜2.0秒。デフォルト:0.5。
optionsJSONimage_to_video, add_text, mix_audio、overlay_videoのレンダリングパラメータのJSONオブジェクト(下の表を参照)。
timingsFile / stringimage_to_video / add_text:カラオケのタイミングファイル(SRT または LRC、最大200 KB)。ファイル項目またはプレーンテキストで送信。表示テキストはファイルから取得し、text_mode=karaoke が適用されます。voice とは併用できません。
callback_urlstringジョブ完了時に呼び出される公開URL(http/https)。レスポンスにはwebhook_secretが含まれます。

optionsパラメータ — image_to_videoモード

すべてオプションです。指定されていない値 → ワーカーによってデフォルトが適用されます。

キー種類デフォルト説明
textstring""オーバーレイとして表示されるテキスト。空 = テキストなし。最大500文字。
fontstring"default"テキストのフォント(ID で指定)。使用できる値:default, dejavu-sans-bold, dejavu-serif, liberation-serif, dejavu-mono, amiri, noto-sans-sc (简体中文), noto-sans-tc (繁體中文), noto-sans-jp (日本語), noto-sans-kr (한국어), noto-sans-hebrew (עברית), noto-sans-thai (ไทย)。default = 標準フォント(絵文字に対応)、amiri = ナスク体フォント(アラビア語テキストに最適)。それ以外の値は invalid_option エラーを返します。絵文字は default でのみ表示されます。
font_sizeint60ピクセル単位のフォントサイズ。範囲:10〜300。
text_colorstring"white"テキストカラー(例:white、yellow、#ffffff)。
text_positionstring"center"テキスト位置:center、top、bottom。
boxbooltrueテキストの後ろの半透明の背景。
box_colorstring"black@0.4"FFmpeg形式の色 + 不透明度:color@opacity。
fade_durationfloat0.5秒単位のフェードイン/アウト期間(0〜2)。0 = エフェクトなし。
widthint1080ピクセル単位の動画幅(64〜3840、偶数に強制)。
heightint1920ピクセル単位の動画高さ(64〜3840、偶数に強制)。
fpsint24フレームレート(1〜60)。
image_fitstring"contain"contain: 画像や動画全体を表示し、余白を選択した背景で埋めます。 solid(既定)またはblur。ぼかしにはimage_fit=containが必要です。文字は鮮明に保たれます。 cover: 画像はフレームを埋めるようにズームされ、中央配置 — 端がトリミングされます。
bg_colorstring"black"background_mode=solid: 画像がターゲット解像度を満たさない場合の背景色。
background_modestring"solid"solid(既定)またはblur。ぼかしにはimage_fit=containが必要です。文字は鮮明に保たれます。
blur_strengthnumber201~50の数値。既定値は20。背景だけにガウスぼかしを適用します。
enable_image_motionboolfalse写真アニメーションを有効にします。falseの場合、画像は静止したままです。
image_motion_effectstring"ken_burns"アニメーションエフェクト。受け入れられる値:zoom_in、zoom_out、pan_left_to_right、ken_burnsなど。
motion_intensityfloat1.0写真アニメーションの強度(0.25〜2.0)。ズーム振幅とパン速度を乗算します。
text_effectstring"none"テキストオーバーレイアニメーション。受け入れられる値:none、fade_in、slide_up、slide_down、bounce。
text_effect_intensityfloat1.0テキストアニメーション強度(0.25〜2.0)。text_effectがnoneの場合は無視されます。
text_border_widthint0ピクセル単位の文字の黒いアウトラインの太さ(0 = 無効)。
text_border_colorstring"black"文字の縁取りの色(text_color と同じ形式、既定値 "black")。text_border_width > 0 のときに使われます。
text_modestring"static"テキストの表示モード。static(デフォルト):最初のフレームからテキスト全体を表示。word_by_word:word_reveal_speedの速度で1語ずつ表示。text_effectとは同時使用不可:text_mode=word_by_wordの場合、text_effectは無視されます。 "karaoke":音声に合わせてテキストの色がページごとに変わります(最大1,000文字)。voice を指定すると語ごとに同期し、指定しない場合は語の長さに応じて音声全体に割り振ります。
word_reveal_speedfloat1.51秒あたりの単語表示速度(0.3〜5.0、デフォルト1.5)。text_mode=word_by_word時のみ使用。OpenAI TTS同期の推奨値:2.0。
word_animstring"none"各単語の表示アニメーション。none(デフォルト):即座に表示。fade:各単語が0.2秒のフェードで表示されクロスフェード。text_mode=word_by_wordのみ。
karaoke_stylestring"fill"カラオケのスタイル:fill(読まれた語がハイライト色になる)、sweep(各語が徐々に塗られる。右から左に書く文字では語単位)、highlight(現在の語だけを色付け)。
highlight_colorstring"#FFD200"カラオケモードで読まれた語/現在の語の色(text_color と同じ形式)。
karaoke_linesint2カラオケモードで1ページに表示する行数(1〜4)。
voicestring""音声ID(text_to_mp3 と同じリスト、例:ja-JP-NanamiNeural):同じジョブ内で text から音声を生成します。この場合 image_to_video は画像だけで済みます(MP3を同時に送ると拒否されます)。カラオケモードでは各語が音声に同期します。
voice_rateint0生成音声の速度(%、−50〜+50)。

独自タイミングでのカラオケ(SRT / LRC)

timings 項目で SRT または LRC ファイルを送信します。各行はそれぞれの時刻に表示され、カラオケの1ページになります(最大500行・5,000文字)。SRT:行は終了時刻に消えます。LRC:行は次の行まで表示されます(空行で終了)。[offset:] と拡張LRCの語ごとのタイミング <mm:ss.xx> に対応し、ない場合は各行をその長さに割り振ります。add_text では時刻は動画の先頭基準で、text_start 分ずらされます。

# lyrics.srt 1 00:00:01,000 --> 00:00:03,500 First line of the song 2 00:00:04,000 --> 00:00:07,200 Second line, on its own page # lyrics.lrc — enhanced LRC: optional per-word times <mm:ss.xx> [00:01.00]<00:01.00>First <00:01.60>line <00:02.10>here [00:04.00]Second line [00:07.50]

optionsパラメータ — overlay_videoモード

すべて任意。アップロード順が重要: 1ファイル目はメイン動画(背景)、2ファイル目はオーバーレイ(前景)。chroma_keyでオーバーレイのグリーンスクリーンを除去できます。

キー種類デフォルト説明
positionstring"bottom-right"オーバーレイを配置するコーナー: top-left、top-right、bottom-left、bottom-right、またはcenter。
scalefloat0.30メイン動画幅に対するオーバーレイのサイズ比率。0.25 = 幅の25%。範囲: 0.05–1.0。
opacityfloat1.0オーバーレイの透明度。1.0 = 完全不透明、0.0 = 不可視。
marginint10オーバーレイとフレーム端の間のピクセル数。position=centerの場合は無視。範囲: 0–200。
audiostring"main"保持するオーディオ。main: メイン動画のみ。overlay: オーバーレイのみ。mix: 両方をミックス。
chroma_keyboolfalsetrueに設定するとオーバーレイの純緑色(#00FF00)の背景を除去します。グリーンスクリーンで撮影したウェブカメラや映像に有効です。
chroma_similarityfloat0.20グリーンスクリーンの許容範囲。低い = 厳密な一致。高い = より広い除去。推奨: デジタルグリーンは0.10–0.20、物理スクリーンは0.25–0.45。範囲: 0.01–0.60。

options パラメータ — add_text モード

テキストは必須です。既定では元の形式、フレームレート、音声を維持します。output_formatを指定するとimage_fit、bg_color、background_modeで再配置できます。width、height、fps、写真の動きは無視されます。最大動画長は15分です。

{"text":"Hello","output_format":"portrait","image_fit":"contain","background_mode":"blur","blur_strength":20}
キー種類デフォルト説明
textstringはい重ねるテキスト。必須、1〜200文字。
text_startfloat0テキストが表示される秒数(0 以上)。動画の終了より前である必要があります。
text_durationfloat0テキストが表示され続ける時間(秒、0.1〜3600)。0 = 動画の最後まで。
fontstring"default"テキストのフォント(ID で指定)。使用できる値:default, dejavu-sans-bold, dejavu-serif, liberation-serif, dejavu-mono, amiri, noto-sans-sc (简体中文), noto-sans-tc (繁體中文), noto-sans-jp (日本語), noto-sans-kr (한국어), noto-sans-hebrew (עברית), noto-sans-thai (ไทย)。default = 標準フォント(絵文字に対応)、amiri = ナスク体フォント(アラビア語テキストに最適)。それ以外の値は invalid_option エラーを返します。絵文字は default でのみ表示されます。
font_sizeint60フォントサイズ。短辺が 1080 px の動画を基準とした値で、実際の解像度に自動でスケーリングされます。同じ値なら 720p でも 4K でも同じ見た目になります。範囲:10〜300。
fade_durationfloat0.5テキスト(動画ではありません)のフェードイン/アウト時間(秒)。範囲:0〜2。
text_color, box, box_color, text_position, text_border_width, text_border_color, text_effect, text_effect_intensity, text_mode, word_reveal_speed, word_anim, karaoke_style, highlight_color, karaoke_lines, voice, voice_rate——image_to_video と同じです(上の表を参照)。
original_volumefloat0.3voice 使用時:音声の下に流れる動画の元の音の音量(0〜2、既定値 0.3、0 = 置き換え)。音声は text_start から始まり、終わるまでテキストが表示されます。動画の終わりを超える場合は最後のフレームを静止表示します。
background_modestring"solid"solid(既定)またはblur。ぼかしにはimage_fit=containが必要です。文字は鮮明に保たれます。
blur_strengthnumber201~50の数値。既定値は20。背景だけにガウスぼかしを適用します。
output_formatstring"original"add_textのみ:original(既定)、portrait(1080×1920)、square(1080×1080)、landscape(1920×1080)。ぼかしにはoriginal以外の形式が必要です。
image_fitstring"contain"contain: 画像や動画全体を表示し、余白を選択した背景で埋めます。 solid(既定)またはblur。ぼかしにはimage_fit=containが必要です。文字は鮮明に保たれます。 cover: 画像はフレームを埋めるようにズームされ、中央配置 — 端がトリミングされます。
bg_colorstring"black"background_mode=solid: 画像がターゲット解像度を満たさない場合の背景色。

optionsパラメータ — 音声編集(mix_audio)

mode=mix_audioでのみ利用可能。add_audioでは無視されます。

キー種類デフォルト説明
mp3_volumefloat1.0オーバーレイされたMP3の音量(0.0 = ミュート、1.0 = 元の音量、2.0 = 2倍)。

text_to_mp3モード — 直接パラメータ(options JSONなし)

他のモードと異なり、これらのフィールドはoptionsJSONオブジェクトの中ではなく、直接フォームフィールドとして送信されます。必須なのはtextのみです。

キー種類デフォルト説明
textstring—音声に変換するテキスト。必須。最大5,000文字。
langstring"en"voiceが省略または無効な場合にデフォルトの音声を選ぶために使われる言語コード。サイトの20言語のいずれか(下表参照)。不明な場合はenにフォールバックします。
voicestring自動edge-ttsの音声ID(下表参照)。省略または無効な場合、langの最初の音声が自動的に使用されます。
slowboolfalse話す速度を25%遅くするにはtrue(または1)を設定します。それ以外の値はfalseとして扱われます。
ファイルのアップロードは不要: 他のモードと異なり、text_to_mp3はvideos[]を必要としません。mode=text_to_mp3とtext / lang / voice / slowを通常のフォームフィールドとして送信してください。

利用可能な音声(edge-tts、Microsoft Neural)、言語コード別:

言語利用可能な音声
en en-US-AvaNeural, en-US-AndrewNeural, en-GB-LibbyNeural, en-AU-NatashaNeural, en-AU-WilliamMultilingualNeural
fr fr-FR-DeniseNeural, fr-FR-HenriNeural, fr-FR-EloiseNeural, fr-CA-SylvieNeural, fr-CA-ThierryNeural
es es-ES-ElviraNeural, es-ES-AlvaroNeural, es-MX-DaliaNeural, es-AR-ElenaNeural, es-AR-TomasNeural
ar ar-SA-ZariyahNeural, ar-SA-HamedNeural, ar-EG-SalmaNeural, ar-MA-MounaNeural, ar-MA-JamalNeural
pt pt-BR-FranciscaNeural, pt-BR-AntonioNeural, pt-PT-RaquelNeural
de de-DE-KatjaNeural, de-DE-ConradNeural, de-DE-AmalaNeural, de-AT-IngridNeural, de-AT-JonasNeural
it it-IT-ElsaNeural, it-IT-DiegoNeural, it-IT-IsabellaNeural
nl nl-NL-ColetteNeural, nl-NL-MaartenNeural, nl-BE-DenaNeural, nl-BE-ArnaudNeural
ru ru-RU-SvetlanaNeural, ru-RU-DmitryNeural
tr tr-TR-EmelNeural, tr-TR-AhmetNeural
hi hi-IN-SwaraNeural, hi-IN-MadhurNeural
bn bn-IN-TanishaaNeural, bn-IN-BashkarNeural, bn-BD-NabanitaNeural, bn-BD-PradeepNeural
ur ur-PK-UzmaNeural, ur-PK-AsadNeural, ur-IN-GulNeural, ur-IN-SalmanNeural
id id-ID-GadisNeural, id-ID-ArdiNeural
ja ja-JP-NanamiNeural, ja-JP-KeitaNeural
ko ko-KR-SunHiNeural, ko-KR-InJoonNeural
zh-CN zh-CN-XiaoxiaoNeural, zh-CN-YunxiNeural, zh-CN-XiaoyiNeural
zh-TW zh-TW-HsiaoChenNeural, zh-TW-YunJheNeural
vi vi-VN-HoaiMyNeural, vi-VN-NamMinhNeural
pl pl-PL-ZofiaNeural, pl-PL-MarekNeural

成功レスポンス(HTTP 200)

{ "success": true, "job_id": "a3f1c8d2e5b09471...", "mode": "fusion", // "fusion" | "add_audio" | "mix_audio" | "image_to_video" | "overlay_video" | "add_text" | "text_to_mp3" "file_count": 2, "transition": null, "quota_used": 1, "quota_remaining": 9, "status_url": "https://rapidvideomaker.com/api/v1/jobs.php?job_id=a3f1c8..." }
text_to_mp3の場合、レスポンスにfile_countやtransitionフィールドは含まれません(ファイルがアップロードされないため)— それ以外は同じです: job_id、quota_used、quota_remaining、status_url、webhook_secret。

curlの例 — image_to_videoモード

curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@scene.jpg" \ -F "videos[]=@narration.mp3" \ -F "mode=image_to_video" \ -F 'options={"text":"Chapter 1","font_size":72,"text_color":"white","text_position":"bottom","box":true,"box_color":"black@0.4","fade_duration":0.5,"width":1080,"height":1920,"image_fit":"contain","bg_color":"black","enable_image_motion":true,"image_motion_effect":"ken_burns","motion_intensity":1.0,"text_effect":"slide_up","text_effect_intensity":1.0}' # image_fit : "contain" | "cover" # background_mode : "solid" | "blur" (blur requires contain) # blur_strength : 1–50, default 20 # bg_color : ignored if image_fit="cover" # enable_image_motion : true = animation on, false (default) = static image # image_motion_effect : zoom_in | zoom_out | pan_left_to_right | pan_right_to_left | pan_top_to_bottom | pan_bottom_to_top | zoom_pan_soft | ken_burns # motion_intensity : 0.25–2.0 — photo animation amplitude (default 1.0) # text_effect : none | fade_in | slide_up | slide_down | slide_left | bounce (ignored if text_mode=word_by_word) # text_effect_intensity : 0.25–2.0 — text animation intensity (default 1.0) # text_border_width : 0–10 px — outline around characters (0 = disabled) # text_border_color : outline color, default "black" (e.g. "#FF3366", "white@0.8") # text_mode : "static" (default) | "word_by_word" — reveal words one by one # word_reveal_speed : 0.3–5.0 w/s — speed for word_by_word mode (default 1.5, ~2.0 for OpenAI TTS) # word_anim : "none" (default) | "fade" — fade-in crossfade on each word (word_by_word only)

生成音声付きのカラオケテキスト(image_to_video、MP3なし)

curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@scene.jpg" \ -F "mode=image_to_video" \ -F 'options={"text":"Every word lights up as the voice reads it.","voice":"en-US-AvaNeural","text_mode":"karaoke","karaoke_style":"sweep","highlight_color":"#FFD200","karaoke_lines":2,"text_position":"bottom","font_size":72}' # no MP3: the voice is generated from "text" and gives the timing of every word # text_mode="karaoke" : text up to 1000 characters, shown page by page (karaoke_lines: 1–4) # karaoke_style : "fill" (default) | "sweep" | "highlight" # voice_rate : -50…+50 (%), default 0 # with your own MP3 (no "voice"): karaoke timing is spread over the audio by word length # add_text: same options + "original_volume" (0–2, default 0.3) = original sound under the voice

SRTファイルでカラオケ(image_to_video + お手持ちのMP3)

curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@cover.jpg" \ -F "videos[]=@song.mp3" \ -F "timings=@lyrics.srt" \ -F "mode=image_to_video" \ -F 'options={"karaoke_style":"sweep","karaoke_lines":2,"text_position":"bottom","font_size":72}' # timings : SRT or LRC file (200 KB max), or its content as a plain text field: -F "timings=<lyrics.lrc" # the displayed text comes from the file ("text" is ignored), text_mode is forced to "karaoke" # not compatible with "voice" (the timings follow your own audio) # add_text: times are relative to the video start, shifted by "text_start"

curlの例 — 音声編集

# Replace audio (deletes original) curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@my_video.mp4" \ -F "videos[]=@my_music.mp3" \ -F "mode=add_audio" # Keep original audio + overlay MP3 curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@my_video.mp4" \ -F "videos[]=@my_music.mp3" \ -F "mode=mix_audio" \ -F 'options={"mp3_volume":0.7}' # mp3_volume : 0.0 (muted) → 1.0 (original volume, default) → 2.0 (amplified)

curlの例 — overlay_videoモード

curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@main_video.mp4" \ -F "videos[]=@overlay_video.mp4" \ -F "mode=overlay_video" \ -F 'options={"position":"bottom-right","scale":0.25,"opacity":1.0,"margin":20,"audio":"main"}' # Green screen overlay curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@main_video.mp4" \ -F "videos[]=@webcam_greenscreen.mp4" \ -F "mode=overlay_video" \ -F 'options={"position":"bottom-left","scale":0.35,"chroma_key":true,"chroma_similarity":0.15,"audio":"mix"}' # position : top-left | top-right | bottom-left | bottom-right | center (default: bottom-right) # scale : 0.05–1.0 — overlay width as fraction of main video (default 0.30) # opacity : 0.0–1.0 — overlay transparency (default 1.0) # margin : 0–200 px — gap from frame edge, ignored if center (default 10) # audio : main | overlay | mix — audio to keep (default: main) # chroma_key : true | false — remove green (#00FF00) background from overlay (default false) # chroma_similarity : 0.01–0.60 — green screen tolerance (default 0.20)

curl の例 — add_text モード

curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@my_video.mp4" \ -F "mode=add_text" \ -F 'options={"text":"Hello world","text_position":"bottom","font_size":72,"text_color":"#ffd700","text_start":2,"text_duration":5,"text_effect":"slide_up"}' # text : required, 1–200 characters # text_start : second at which the text appears (default 0) # text_duration : seconds the text stays visible, 0 = until the end (default 0) # the video keeps its resolution, frame rate and audio track

curlの例 — 動画結合

curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@clip1.mp4" \ -F "videos[]=@clip2.mp4" \ -F "transition_type=fade" \ -F "transition_duration=0.5"

curlの例 — text_to_mp3モード

# No file upload — text + lang + voice as plain form fields curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "mode=text_to_mp3" \ -F "text=Welcome to Rapid Video Maker." \ -F "lang=en" \ -F "voice=en-US-AvaNeural" \ -F "slow=false" # voice omitted or invalid -> falls back to the first voice of "lang" curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "mode=text_to_mp3" \ -F "text=Bienvenue sur Rapid Video Maker." \ -F "lang=fr"
GET /api/v1/jobs.php?job_id=<hex32> ジョブステータス

ステータスには実際の工程と経過時間が含まれます。見積もりは目安で、クライアントのタイムアウトは失敗を意味しません。同じジョブIDの確認を再開してください。ファイルは完了の2時間後に期限切れになります。

可能なステータス

ステータス意味追加フィールド
queued キュー待ち、未処理 queue_position, queue_total, eta_minutes
processing FFmpeg処理中 processing_stage, processing_elapsed_seconds, stage_elapsed_seconds, last_activity_at, processed_media_seconds, eta_overrun
ready 完了 — ファイル利用可能 download_url, media_available, created_at, expires_at
error 処理失敗 error (message), quota_refund_status: pending | confirmed | not_required
cancelled キャンセル済み quota_refund_status: pending | confirmed | not_required

ステータス別レスポンス

{ "job_id": "a3f1c8...", "status": "queued", "queue_position": 2, "queue_total": 3, "eta_minutes": 7 }
{ "job_id": "a3f1c8...", "status": "ready", "download_url": "https://rapidvideomaker.com/api/download.php?job_id=a3f1c8...", "created_at": "2026-06-02T10:00:00+00:00", "expires_at": "2026-06-02T12:00:00+00:00" }

curlの例

curl -H "Authorization: Bearer rvm_your_token" \ "https://rapidvideomaker.com/api/v1/jobs.php?job_id=a3f1c8..."
GET /api/v1/jobs.php このトークンで作成したすべてのジョブの一覧(ページ分割、日付の新しい順)

共通パラメータ(multipart/form-data)

パラメータ種類デフォルト説明
pageinteger1ページ番号(1から)
limitinteger201ページあたりの件数(最大50、既定値20)

ステータス別レスポンス

{ "success": true, "jobs": [ { "job_id": "a3f1c8...", "status": "ready", "mode": "fusion", "created_at": "2026-06-02T10:00:00+00:00", "expires_at": "2026-06-02T12:00:00+00:00", "download_url": "https://..." }, ... ], "total": 12, "page": 1, "limit": 20 }
GET /api/download.php?job_id=<hex32> 最終ファイルをダウンロード

最終ファイルをストリーム配信します。Content-Typeは動画モードではvideo/mp4、text_to_mp3ではaudio/mpegになります。トークン不要。ステータスがreadyの場合のみ利用可能。

ファイルはジョブ完了後2時間保持され、その後削除されます。ステータスがreadyになったらすぐにダウンロードしてください。

オプションパラメータ

パラメータ説明
filenameダウンロードするファイルの推奨名(例:my-video.mp4)
previewダウンロードを開始する代わりにインライン再生する場合は1を設定します(Content-Disposition: attachmentを省略)— ブラウザ内プレビューに使用します。

curlの例

curl -o "output.mp4" \ "https://rapidvideomaker.com/api/download.php?job_id=a3f1c8...&filename=output.mp4"

Webhooks

Webhookはポーリングの代替手段です:X秒ごとにステータスを確認する代わりに、URLを指定するとサーバーがジョブ完了時に自動的に通知します。

仕組み

  1. callback_urlを/api/v1/render.phpへのPOSTに含めます
  2. レスポンスにはwebhook_secretが含まれます — 署名の検証のために保存してください
  3. ジョブがreadyまたはerrorになると、サーバーはあなたのURLに署名されたJSON POSTを送信します
  4. HMAC-SHA256(webhook_secret, raw_body)で署名を検証します
制約:callback_urlは公開アクセス可能なURL(httpまたはhttps)である必要があります。プライベート、ループバック、予約済みIPアドレスはサーバー側でブロックされます。タイムアウト:10秒。

受信ペイロード

{ "job_id": "a3f1c8...", "status": "ready", "download_url": "https://rapidvideomaker.com /api/download.php?job_id=a3f1c8...", "timestamp": "2026-04-04T12:00:00+00:00" }
{ "job_id": "a3f1c8...", "status": "error", "error": "FFmpeg xfade failed:...", "timestamp": "2026-04-04T12:00:00+00:00" }

サーバーが送信するヘッダー

ヘッダー値
Content-Typeapplication/json
X-RVM-Signaturesha256=<hmac_hex> — 生のボディのHMAC-SHA256署名
X-RVM-Job-Id関連するjob_id

署名の検証

# Python import hmac, hashlib def verify_webhook(secret: str, body: bytes, signature_header: str) -> bool: expected = "sha256=" + hmac.new( secret.encode(), body, hashlib.sha256 ).hexdigest() return hmac.compare_digest(expected, signature_header) # Flask/FastAPI endpoint: sig = request.headers.get("X-RVM-Signature", "") if not verify_webhook(WEBHOOK_SECRET, request.data, sig): return "Invalid signature", 403 data = request.get_json()

エラーコード

HTTPJSONコード原因
401unauthorizedトークンが不足、無効、または取り消されています
400missing_filesファイルが受信されていません
400too_few_files送信されたファイルが2個未満です
400too_many_files送信されたファイルが20個を超えています
400invalid_mimeサポートされていないファイル — MP4、MP3、JPG/PNGのみ受け入れられます
400wrong_file_countファイル数が選択したモードに一致しません
400wrong_file_typesファイルの種類が選択したモードに一致しません
400invalid_file_combination指定されたモードなしのファイルの組み合わせがサポートされているモードに一致しません
400invalid_optionsoptionsフィールドが有効なJSONではありません
400invalid_optionoptions内の値が無効です
400file_too_largeファイルが500 MBを超えています
400text_requiredoptions.text フィールドがないか空です(add_text モード)
400video_too_long動画が15分を超えています(add_text モード)
400text_start_out_of_rangetext_start が動画の終了を超えています
400invalid_voice不明な voice ID です。
400invalid_timingsタイミングファイルを読み取れません(形式が不明、時刻付きの行がない、終了が開始より前、長すぎる など)。
400invalid_orderorder配列が有効な順列ではありません
400invalid_job_idjob_idの形式が正しくありません(32文字の16進数である必要があります)
404job_not_foundジョブが見つかりません — job_idが不明または存在したことがありません
410job_expiredジョブが期限切れ — 存在しましたが2時間の回復ウィンドウが過ぎています
429quota_exceeded1日20件の成功ジョブ制限に達しました
429rate_limited/api/v1/jobs.phpで1分あたり12回を超える呼び出しがありました
500server_error内部サーバーエラー

統合例

各モードの例 — pip install requestsでrequestsをインストール。

共通設定

import requests, time, sys, json API_BASE = "https://rapidvideomaker.com" API_TOKEN = "rvm_your_token_here" HEADERS = {"Authorization": f"Bearer {API_TOKEN}"}

image_to_videoモード — 画像 + 音声 → 動画

with open("scene.jpg", "rb") as fi, open("narration.mp3", "rb") as fa: resp = requests.post( f"{API_BASE}/api/v1/render.php", headers=HEADERS, files=[ ("videos[]", ("scene.jpg", fi, "image/jpeg")), ("videos[]", ("narration.mp3", fa, "audio/mpeg")), ], data={ "mode": "image_to_video", "options": json.dumps({ "text": "Chapter 1", "font_size": 72, "text_color": "white", "text_position": "bottom", "box": True, "box_color": "black@0.4", "fade_duration": 0.5, "width": 1080, "height": 1920, "image_fit": "contain", # "contain" | "cover" "background_mode": "solid", # or "blur" with contain "blur_strength": 20, "bg_color": "black", # ignored if image_fit="cover" "enable_image_motion": True, "image_motion_effect": "ken_burns", "motion_intensity": 1.0, # 0.25–2.0 — photo animation amplitude "text_effect": "slide_up", # none | fade_in | slide_up | slide_down | slide_left | bounce (ignored if text_mode=word_by_word) "text_effect_intensity": 1.0, # 0.25–2.0 — text animation intensity # word-by-word reveal (mutually exclusive with text_effect): # "text_mode": "word_by_word", "word_reveal_speed": 2.0, "word_anim": "fade" }), }, )

音声編集

# Replace audio (deletes original) — mode=add_audio with open("video.mp4", "rb") as fv, open("music.mp3", "rb") as fa: resp = requests.post( f"{API_BASE}/api/v1/render.php", headers=HEADERS, files=[ ("videos[]", ("video.mp4", fv, "video/mp4")), ("videos[]", ("music.mp3", fa, "audio/mpeg")), ], data={"mode": "add_audio"}, ) # Keep original audio + overlay MP3 — mode=mix_audio with open("video.mp4", "rb") as fv, open("music.mp3", "rb") as fa: resp = requests.post( f"{API_BASE}/api/v1/render.php", headers=HEADERS, files=[ ("videos[]", ("video.mp4", fv, "video/mp4")), ("videos[]", ("music.mp3", fa, "audio/mpeg")), ], data={"mode": "mix_audio", "options": json.dumps({"mp3_volume": 0.7})}, # mp3_volume : 0.0 = muted, 1.0 = original volume (default), 2.0 = amplified )

overlay_videoモード — ピクチャーインピクチャー

with open("main.mp4", "rb") as fm, open("overlay.mp4", "rb") as fo: resp = requests.post( f"{API_BASE}/api/v1/render.php", headers=HEADERS, files=[ ("videos[]", ("main.mp4", fm, "video/mp4")), ("videos[]", ("overlay.mp4", fo, "video/mp4")), ], data={ "mode": "overlay_video", "options": json.dumps({ "position": "bottom-right", # top-left | top-right | bottom-left | bottom-right | center "scale": 0.25, # 0.05–1.0 — overlay width fraction "opacity": 1.0, # 0.0–1.0 — transparency "margin": 20, # 0–200 px — gap from frame edge "audio": "main", # main | overlay | mix # green screen: "chroma_key": True, "chroma_similarity": 0.15 }), }, )

add_text モード — 動画にテキストを追加

with open("video.mp4", "rb") as fv: resp = requests.post( f"{API_BASE}/api/v1/render.php", headers=HEADERS, files=[("videos[]", ("video.mp4", fv, "video/mp4"))], data={ "mode": "add_text", "options": json.dumps({ "text": "Hello world", # required "text_position": "bottom", # center | top | bottom "font": "amiri", # font id (see the table above) "font_size": 72, "text_start": 2, # appears at 2 s "text_duration": 5, # stays 5 s (0 = until the end) }), }, )

動画結合

with open("clip1.mp4", "rb") as f1, open("clip2.mp4", "rb") as f2: resp = requests.post( f"{API_BASE}/api/v1/render.php", headers=HEADERS, files=[ ("videos[]", ("clip1.mp4", f1, "video/mp4")), ("videos[]", ("clip2.mp4", f2, "video/mp4")), ], data={"transition_type": "fade", "transition_duration": "0.5"}, )

text_to_mp3モード — テキスト読み上げ

# No files — text + lang (+ optional voice / slow) as form fields resp = requests.post( f"{API_BASE}/api/v1/render.php", headers=HEADERS, data={ "mode": "text_to_mp3", "text": "Welcome to Rapid Video Maker.", "lang": "en", # one of the 20 site language codes "voice": "en-US-AvaNeural", # optional — falls back to the first voice of "lang" "slow": "false", # "true" = -25% speech rate }, )

ポーリング + ダウンロード(すべてのモードに共通)

resp.raise_for_status() job_id = resp.json()["job_id"] print(f"Job created: {job_id}") for _ in range(120): # timeout 10 min (120 × 5s) r = requests.get( f"{API_BASE}/api/v1/jobs.php", headers=HEADERS, params={"job_id": job_id}, ) data = r.json() status = data["status"] if status == "queued": pos = data.get("queue_position", "?") eta = data.get("eta_minutes", "?") print(f"Queued — position {pos}, ETA ~{eta} min") elif status == "processing": print("Processing…") elif status == "ready": download_url = data["download_url"] break elif status == "error": sys.exit(f"Error: {data.get('error')}") time.sleep(5) else: sys.exit("Timeout: job not completed after 10 min") r = requests.get(download_url, stream=True) with open("output.mp4", "wb") as f: for chunk in r.iter_content(65536): f.write(chunk) print("Downloaded: output.mp4")

n8nでの2つのアプローチ:ポーリング(ステータスループ)またはWebhook(サーバーがn8nを呼び出す)。Webhookを推奨。

アプローチA — Webhook(推奨)

ノード3つのみ、ループなし。

ノード1 — Webhookトリガー
ワークフロー入力としてWebhookノードを追加します(メソッドPOST)。

ノード2 — ジョブを作成(HTTPリクエスト)

メソッドPOST
URLhttps://rapidvideomaker.com/api/v1/render.php
認証Header Auth — Authorization: Bearer rvm_…
ボディコンテンツタイプForm-Data Multipart
Body params各クリップのバイナリフィールドvideos[] + テキストフィールドcallback_url

署名を検証するために、レスポンスのwebhook_secretをワークフロー変数に保存してください。

ノード3 — 結果を処理(Webhookがトリガーするワークフロー内)
n8nがサーバーのPOSTを受信すると、$json.statusはreadyまたはerrorです。

署名を検証するには:{{ $headers['x-rvm-signature'] }}とwebhook_secretからHMAC-SHA256を比較します。

アプローチB — ポーリング(Webhookなし)

5ノード、10秒ごとのステータスループ。

ノード1 — ジョブを作成 — callback_urlなしで同じ設定。

ノード2 — 待機 — 10秒。

ノード3 — ステータスをポーリング(HTTPリクエストGET)

URLhttps://rapidvideomaker.com/api/v1/jobs.php
クエリパラメータjob_id = {{ $('ノード1').item.json.job_id }}
認証ヘッダー認証 — 同じトークン

ノード4 — If:{{ $json.status }} === 'ready' → true:ノード5 / false:ノード2に戻る。

無限ループを避けるため、Setノードに繰り返しカウンターを追加してください。

ノード5 — ダウンロード:{{ $json.download_url }}でHTTPリクエストGET。

ステップ1 — ジョブを作成(モードを選択)

# fusion JOB=$(curl -s -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@clip1.mp4" -F "videos[]=@clip2.mp4") # add_audio (replace audio) JOB=$(curl -s -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@video.mp4" -F "videos[]=@music.mp3" \ -F "mode=add_audio") # mix_audio (overlay music at 70% volume) JOB=$(curl -s -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@video.mp4" -F "videos[]=@music.mp3" \ -F "mode=mix_audio" -F 'options={"mp3_volume":0.7}') # image_to_video JOB=$(curl -s -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@scene.jpg" -F "videos[]=@narration.mp3" \ -F "mode=image_to_video" \ -F 'options={"text":"Chapter 1","font_size":72,"text_position":"bottom","fade_duration":0.5,"width":1080,"height":1920}') JOB_ID=$(echo $JOB | grep -o '"job_id":"[^"]*"' | cut -d'"' -f4) echo "Job ID: $JOB_ID"

ステップ2 — ポーリング

while true; do STATUS=$(curl -s \ -H "Authorization: Bearer rvm_your_token" \ "https://rapidvideomaker.com/api/v1/jobs.php?job_id=$JOB_ID") STATE=$(echo $STATUS | grep -o '"status":"[^"]*"' | cut -d'"' -f4) echo "Status: $STATE" [ "$STATE" = "ready" ] && break [ "$STATE" = "error" ] && { echo "Error"; exit 1; } sleep 10 done

ステップ3 — ダウンロード

DOWNLOAD_URL=$(echo $STATUS | grep -o '"download_url":"[^"]*"' | cut -d'"' -f4) curl -o output.mp4 "$DOWNLOAD_URL"

ベストプラクティス

結果ファイルはジョブ完了後2時間保持され、その後自動的に削除されます。